| | 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) |
| |
|