From e852a6495d179d8d96ce25ae69e793aad555370f Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 25 Nov 2021 13:09:04 -0500 Subject: [PATCH] test: TT-417 add missing tests and resolve comments --- .../api/azure/project_azure_endpoints_test.py | 120 +++++++++++++++--- .../_application/_projects/_create_project.py | 8 +- .../_application/_projects/_delete_project.py | 4 +- .../_application/_projects/_get_projects.py | 5 +- .../_application/_projects/_update_project.py | 13 +- .../_data_persistence/_projects_dao.py | 9 +- 6 files changed, 128 insertions(+), 31 deletions(-) diff --git a/V2/tests/api/azure/project_azure_endpoints_test.py b/V2/tests/api/azure/project_azure_endpoints_test.py index e31e6279..a0cbc186 100644 --- a/V2/tests/api/azure/project_azure_endpoints_test.py +++ b/V2/tests/api/azure/project_azure_endpoints_test.py @@ -7,6 +7,7 @@ from time_tracker.projects._application import _projects as azure_projects from time_tracker.projects import _domain as domain from time_tracker.projects import _infrastructure as infrastructure +from time_tracker.utils.enums import ResponseEnums as enums PROJECT_URL = '/api/projects/' @@ -35,7 +36,7 @@ def test__project_azure_endpoint__returns_all_projects( response = azure_projects._get_projects.get_projects(req) projects_json_data = response.get_body().decode("utf-8") - assert response.status_code == 200 + assert response.status_code == enums.STATUS_OK.value assert projects_json_data == json.dumps(inserted_projects) @@ -54,7 +55,7 @@ def test__project_azure_endpoint__returns_an_project__when_project_matches_its_i response = azure_projects._get_projects.get_projects(req) activitiy_json_data = response.get_body().decode("utf-8") - assert response.status_code == 200 + assert response.status_code == enums.STATUS_OK.value assert activitiy_json_data == json.dumps(inserted_project) @@ -69,11 +70,11 @@ def test__projects_azure_endpoint__returns_a_status_code_400__when_project_reciv response = azure_projects._get_projects.get_projects(req) - assert response.status_code == 400 - assert response.get_body() == b'Invalid Format ID' + assert response.status_code == enums.STATUS_BAD_REQUEST.value + assert response.get_body() == enums.INVALID_ID.value.encode() -def test__project_azure_endpoint__returns_an_project_with_inactive_status__when_an_project_matching_its_id_is_found( +def test__project_azure_endpoint__returns_an_project_with_inactive_status__when_a_project_matching_its_id_is_found( insert_project ): inserted_project = insert_project().__dict__ @@ -88,7 +89,7 @@ def test__project_azure_endpoint__returns_an_project_with_inactive_status__when_ response = azure_projects._delete_project.delete_project(req) project_json_data = json.loads(response.get_body().decode("utf-8")) - assert response.status_code == 200 + assert response.status_code == enums.STATUS_OK.value assert project_json_data['status'] == 0 assert project_json_data['deleted'] is True @@ -104,11 +105,26 @@ def test__delete_projects_azure_endpoint__returns_a_status_code_400__when_projec response = azure_projects._delete_project.delete_project(req) - assert response.status_code == 400 - assert response.get_body() == b'Invalid Format ID' + assert response.status_code == enums.STATUS_BAD_REQUEST.value + assert response.get_body() == enums.INVALID_ID.value.encode() -def test__update_project_azure_endpoint__returns_an_project__when_found_an_project_to_update( +def test__delete_projects_azure_endpoint__returns_a_status_code_404__when_no_found_a_project_to_delete( +): + req = func.HttpRequest( + method="DELETE", + body=None, + url=PROJECT_URL, + route_params={"id": Faker().pyint()}, + ) + + response = azure_projects._delete_project.delete_project(req) + + assert response.status_code == enums.STATUS_NOT_FOUND.value + assert response.get_body() == enums.NOT_FOUND.value.encode() + + +def test__update_project_azure_endpoint__returns_an_project__when_found_a_project_to_update( insert_project ): inserted_project = insert_project().__dict__ @@ -125,10 +141,44 @@ def test__update_project_azure_endpoint__returns_an_project__when_found_an_proje activitiy_json_data = response.get_body().decode("utf-8") inserted_project.update(project_body) - assert response.status_code == 200 + assert response.status_code == enums.STATUS_OK.value assert activitiy_json_data == json.dumps(inserted_project) +def test__update_projects_azure_endpoint__returns_a_status_code_404__when_no_found_a_project_to_update( + project_factory +): + project_body = project_factory().__dict__ + + req = func.HttpRequest( + method="PUT", + body=json.dumps(project_body).encode("utf-8"), + url=PROJECT_URL, + route_params={"id": Faker().pyint()}, + ) + + response = azure_projects._update_project.update_project(req) + + assert response.status_code == enums.STATUS_NOT_FOUND.value + assert response.get_body() == enums.NOT_FOUND.value.encode() + + +def test__update_projects_azure_endpoint__returns_a_status_code_400__when_recive_an_incorrect_body( +): + project_body = Faker().pydict(5, True, str) + req = func.HttpRequest( + method="PUT", + body=json.dumps(project_body).encode("utf-8"), + url=PROJECT_URL, + route_params={"id": Faker().pyint()}, + ) + + response = azure_projects._update_project.update_project(req) + + assert response.status_code == enums.STATUS_BAD_REQUEST.value + assert response.get_body() == enums.INCORRECT_BODY.value.encode() + + def test__update_projects_azure_endpoint__returns_a_status_code_400__when_project_recive_invalid_id( ): req = func.HttpRequest( @@ -140,15 +190,15 @@ def test__update_projects_azure_endpoint__returns_a_status_code_400__when_projec response = azure_projects._update_project.update_project(req) - assert response.status_code == 400 - assert response.get_body() == b'Invalid Format ID' + assert response.status_code == enums.STATUS_BAD_REQUEST.value + assert response.get_body() == enums.INVALID_ID.value.encode() def test__project_azure_endpoint__creates_an_project__when_project_has_all_attributes( test_db, project_factory, insert_customer, customer_factory ): - inserted_customer = insert_customer(customer_factory(), test_db) - project_body = project_factory(customer_id=inserted_customer.id).__dict__ + insert_customer(customer_factory(), test_db) + project_body = project_factory().__dict__ body = json.dumps(project_body).encode("utf-8") req = func.HttpRequest( method='POST', @@ -160,5 +210,45 @@ def test__project_azure_endpoint__creates_an_project__when_project_has_all_attri project_json_data = json.loads(response.get_body()) project_body['id'] = project_json_data['id'] - assert response.status_code == 201 + assert response.status_code == enums.STATUS_CREATED.value assert project_json_data == project_body + + +def test__project_azure_endpoint__returns_a_status_code_400__when_project_does_not_all_attributes( + test_db, project_factory, insert_customer, customer_factory +): + inserted_customer = insert_customer(customer_factory(), test_db) + project_body = project_factory(customer_id=inserted_customer.id).__dict__ + project_body.pop('name') + + body = json.dumps(project_body).encode("utf-8") + req = func.HttpRequest( + method='POST', + body=body, + url=PROJECT_URL, + ) + + response = azure_projects._create_project.create_project(req) + + assert response.status_code == enums.STATUS_BAD_REQUEST.value + assert response.get_body() == json.dumps(['The name key is missing in the input data']).encode() + + +def test__project_azure_endpoint__returns_a_status_code_500__when_project_recive_incorrect_type_data( + project_factory, insert_customer, customer_factory, test_db +): + insert_customer(customer_factory(), test_db) + project_body = project_factory(technologies=Faker().pylist(2, True, str)).__dict__ + + body = json.dumps(project_body).encode("utf-8") + print(project_body) + req = func.HttpRequest( + method='POST', + body=body, + url=PROJECT_URL, + ) + + response = azure_projects._create_project.create_project(req) + + assert response.status_code == enums.INTERNAL_SERVER_ERROR.value + assert response.get_body() == enums.NOT_CREATED.value.encode() diff --git a/V2/time_tracker/projects/_application/_projects/_create_project.py b/V2/time_tracker/projects/_application/_projects/_create_project.py index 8b5612e8..7ed423ce 100644 --- a/V2/time_tracker/projects/_application/_projects/_create_project.py +++ b/V2/time_tracker/projects/_application/_projects/_create_project.py @@ -6,13 +6,13 @@ from ... import _domain from ... import _infrastructure -from time_tracker._infrastructure import DB +from time_tracker._infrastructure import DB as database from time_tracker.utils.enums import ResponseEnums as enums def create_project(req: func.HttpRequest) -> func.HttpResponse: - database = DB() - project_dao = _infrastructure.ProjectsSQLDao(database) + + project_dao = _infrastructure.ProjectsSQLDao(database()) project_service = _domain.ProjectService(project_dao) use_case = _domain._use_cases.CreateProjectUseCase(project_service) @@ -37,7 +37,7 @@ def create_project(req: func.HttpRequest) -> func.HttpResponse: created_project = use_case.create_project(project_to_create) status_code, response = [ - enums.INTERNAL_SERVER_ERROR.value, json.dumps({'error': f'project {enums.NOT_CREATED.value}'}) + enums.INTERNAL_SERVER_ERROR.value, enums.NOT_CREATED.value.encode() ] if not created_project else [enums.STATUS_CREATED.value, json.dumps(created_project.__dict__)] return func.HttpResponse( diff --git a/V2/time_tracker/projects/_application/_projects/_delete_project.py b/V2/time_tracker/projects/_application/_projects/_delete_project.py index f4c378ea..9a1275d5 100644 --- a/V2/time_tracker/projects/_application/_projects/_delete_project.py +++ b/V2/time_tracker/projects/_application/_projects/_delete_project.py @@ -4,12 +4,12 @@ from ... import _domain from ... import _infrastructure -from time_tracker._infrastructure import DB +from time_tracker._infrastructure import DB as database from time_tracker.utils.enums import ResponseEnums as enums def delete_project(req: func.HttpRequest) -> func.HttpResponse: - project_dao = _infrastructure.ProjectsSQLDao(DB()) + project_dao = _infrastructure.ProjectsSQLDao(database()) project_service = _domain.ProjectService(project_dao) use_case = _domain._use_cases.DeleteProjectUseCase(project_service) diff --git a/V2/time_tracker/projects/_application/_projects/_get_projects.py b/V2/time_tracker/projects/_application/_projects/_get_projects.py index 0909479b..2297609d 100644 --- a/V2/time_tracker/projects/_application/_projects/_get_projects.py +++ b/V2/time_tracker/projects/_application/_projects/_get_projects.py @@ -5,13 +5,12 @@ from ... import _domain from ... import _infrastructure -from time_tracker._infrastructure import DB +from time_tracker._infrastructure import DB as database from time_tracker.utils.enums import ResponseEnums as enums def get_projects(req: func.HttpRequest) -> func.HttpResponse: - database = DB() - project_dao = _infrastructure.ProjectsSQLDao(database) + project_dao = _infrastructure.ProjectsSQLDao(database()) project_service = _domain.ProjectService(project_dao) project_id = req.route_params.get("id") diff --git a/V2/time_tracker/projects/_application/_projects/_update_project.py b/V2/time_tracker/projects/_application/_projects/_update_project.py index 59240a6c..64048140 100644 --- a/V2/time_tracker/projects/_application/_projects/_update_project.py +++ b/V2/time_tracker/projects/_application/_projects/_update_project.py @@ -5,13 +5,12 @@ from ... import _domain from ... import _infrastructure -from time_tracker._infrastructure import DB +from time_tracker._infrastructure import DB as database from time_tracker.utils.enums import ResponseEnums as enums def update_project(req: func.HttpRequest) -> func.HttpResponse: - database = DB() - project_dao = _infrastructure.ProjectsSQLDao(database) + project_dao = _infrastructure.ProjectsSQLDao(database()) project_service = _domain.ProjectService(project_dao) use_case = _domain._use_cases.UpdateProjectUseCase(project_service) @@ -21,7 +20,7 @@ def update_project(req: func.HttpRequest) -> func.HttpResponse: if not _validate_project(project_data): status_code = enums.STATUS_BAD_REQUEST.value - response = bytes(f"{enums.INCORRECT_BODY.value} project") + response = enums.INCORRECT_BODY.value.encode() else: updated_project = use_case.update_project(project_id, project_data) @@ -41,6 +40,12 @@ def update_project(req: func.HttpRequest) -> func.HttpResponse: status_code=enums.STATUS_BAD_REQUEST.value, mimetype=enums.MIME_TYPE.value, ) + except Exception as error: + return func.HttpResponse( + body=str(error).encode(), + status_code=enums.STATUS_BAD_REQUEST.value, + mimetype=enums.MIME_TYPE.value, + ) def _validate_project(project_data: dict) -> bool: diff --git a/V2/time_tracker/projects/_infrastructure/_data_persistence/_projects_dao.py b/V2/time_tracker/projects/_infrastructure/_data_persistence/_projects_dao.py index 3f7950ed..2ec61186 100644 --- a/V2/time_tracker/projects/_infrastructure/_data_persistence/_projects_dao.py +++ b/V2/time_tracker/projects/_infrastructure/_data_persistence/_projects_dao.py @@ -65,9 +65,12 @@ def delete(self, id: int) -> domain.Project: return self.get_by_id(id) def update(self, id: int, project_data: dict) -> domain.Project: - query = self.project.update().where(self.project.c.id == id).values(project_data) - self.db.get_session().execute(query) - return self.get_by_id(id) + try: + query = self.project.update().where(self.project.c.id == id).values(project_data) + self.db.get_session().execute(query) + return self.get_by_id(id) + except sq.exc.SQLAlchemyError as error: + raise Exception(error.orig) def __create_project_dto(self, project: dict) -> domain.Project: project = {key: project.get(key) for key in self.project_key}