|
import os |
|
import unittest |
|
from io import BytesIO |
|
from unittest import mock |
|
|
|
import app.image_classifier_app as ui_app |
|
from PIL import Image |
|
|
|
path_tests = os.path.dirname(os.path.abspath(__file__)) |
|
|
|
|
|
class TestMLService(unittest.TestCase): |
|
|
|
def setUp(self): |
|
self.token = "dummy_token" |
|
self.image_file = Image.open(path_tests + "/dog.jpeg") |
|
self.uploaded_file = mock.MagicMock(spec=BytesIO) |
|
self.uploaded_file.getvalue.return_value = BytesIO() |
|
self.uploaded_file.name = "dog.jpeg" |
|
self.image_file.save(self.uploaded_file, format="JPEG") |
|
self.headers = {"Authorization": f"Bearer {self.token}"} |
|
|
|
|
|
def test_login_success(self): |
|
|
|
expected_token = "dummy_token" |
|
response_data = {"access_token": expected_token} |
|
with mock.patch("requests.post") as mock_post: |
|
mock_post.return_value.status_code = 200 |
|
mock_post.return_value.json.return_value = response_data |
|
|
|
token = ui_app.login("username", "password") |
|
|
|
headers = { |
|
"accept": "application/json", |
|
"Content-Type": "application/x-www-form-urlencoded", |
|
} |
|
|
|
self.assertEqual(token, expected_token) |
|
mock_post.assert_called_once_with( |
|
ui_app.API_BASE_URL + "/login", |
|
headers=headers, |
|
data={ |
|
"grant_type": "", |
|
"username": "username", |
|
"password": "password", |
|
"scope": "", |
|
"client_id": "", |
|
"client_secret": "", |
|
}, |
|
) |
|
|
|
def test_login_failure(self): |
|
|
|
with mock.patch("requests.post") as mock_post: |
|
mock_post.return_value.status_code = 401 |
|
|
|
token = ui_app.login("username", "password") |
|
|
|
headers = { |
|
"accept": "application/json", |
|
"Content-Type": "application/x-www-form-urlencoded", |
|
} |
|
|
|
self.assertIsNone(token) |
|
mock_post.assert_called_once_with( |
|
ui_app.API_BASE_URL + "/login", |
|
headers=headers, |
|
data={ |
|
"grant_type": "", |
|
"username": "username", |
|
"password": "password", |
|
"scope": "", |
|
"client_id": "", |
|
"client_secret": "", |
|
}, |
|
) |
|
|
|
def test_predict_success(self): |
|
|
|
expected_response = {"prediction": "Eskimo_dog", "score": 0.9346} |
|
with mock.patch("requests.post") as mock_post: |
|
mock_post.return_value.status_code = 200 |
|
mock_post.return_value.json.return_value = expected_response |
|
|
|
response = ui_app.predict(self.token, self.uploaded_file) |
|
|
|
self.assertEqual(response.status_code, 200) |
|
self.assertEqual(response.json(), expected_response) |
|
mock_post.assert_called_once_with( |
|
ui_app.API_BASE_URL + "/model/predict", |
|
files={ |
|
"file": (self.uploaded_file.name, self.uploaded_file.getvalue()) |
|
}, |
|
headers=self.headers, |
|
) |
|
|
|
def test_predict_failure(self): |
|
|
|
with mock.patch("requests.post") as mock_post: |
|
mock_post.return_value.status_code = 500 |
|
|
|
response = ui_app.predict(self.token, self.uploaded_file) |
|
|
|
self.assertEqual(response.status_code, 500) |
|
mock_post.assert_called_once_with( |
|
ui_app.API_BASE_URL + "/model/predict", |
|
files={ |
|
"file": (self.uploaded_file.name, self.uploaded_file.getvalue()) |
|
}, |
|
headers=self.headers, |
|
) |
|
|
|
def test_send_feedback_success(self): |
|
|
|
expected_response = {"status": "success"} |
|
feedback = "This is a feedback" |
|
score = 0.9346 |
|
prediction = "Eskimo_dog" |
|
image_file_name = "dog.jpeg" |
|
with mock.patch("requests.post") as mock_post: |
|
mock_post.return_value.status_code = 201 |
|
mock_post.return_value.json.return_value = expected_response |
|
|
|
response = ui_app.send_feedback( |
|
self.token, feedback, score, prediction, image_file_name |
|
) |
|
|
|
self.assertEqual(response.status_code, 201) |
|
self.assertEqual(response.json(), expected_response) |
|
mock_post.assert_called_once_with( |
|
ui_app.API_BASE_URL + "/feedback", |
|
json={ |
|
"feedback": feedback, |
|
"score": score, |
|
"predicted_class": prediction, |
|
"image_file_name": image_file_name, |
|
}, |
|
headers=self.headers, |
|
) |
|
|
|
def test_send_feedback_failure(self): |
|
|
|
feedback = "This is a feedback" |
|
score = 0.9346 |
|
prediction = "Eskimo_dog" |
|
image_file_name = "dog.jpeg" |
|
with mock.patch("requests.post") as mock_post: |
|
mock_post.return_value.status_code = 500 |
|
|
|
response = ui_app.send_feedback( |
|
self.token, feedback, score, prediction, image_file_name |
|
) |
|
|
|
self.assertEqual(response.status_code, 500) |
|
mock_post.assert_called_once_with( |
|
ui_app.API_BASE_URL + "/feedback", |
|
json={ |
|
"feedback": feedback, |
|
"score": score, |
|
"predicted_class": prediction, |
|
"image_file_name": image_file_name, |
|
}, |
|
headers=self.headers, |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
unittest.main(verbosity=2) |
|
|