diff --git a/V2/tests/api/azure/activity_azure_endpoints_test.py b/V2/tests/api/azure/activity_azure_endpoints_test.py index 98d853f1..05b22801 100644 --- a/V2/tests/api/azure/activity_azure_endpoints_test.py +++ b/V2/tests/api/azure/activity_azure_endpoints_test.py @@ -85,18 +85,17 @@ def test__activity_azure_endpoint__creates_an_activity__when_activity_has_all_at create_temp_activities, ): activities_json, tmp_directory = create_temp_activities - activities._create_activity.JSON_PATH = tmp_directory + activities._create_activity._JSON_PATH = tmp_directory - activity_body = {'id': Faker().uuid4(), 'name': Faker().user_name(), 'description': Faker().sentence(),'deleted': Faker().uuid4() ,'status': 'active', 'tenant_id': Faker().uuid4()} + activity_body = {'id': None, 'name': Faker().user_name(), 'description': Faker().sentence(),'deleted': Faker().uuid4() ,'status': 'active', 'tenant_id': Faker().uuid4()} body = json.dumps(activity_body).encode("utf-8") req = func.HttpRequest( method='POST', body= body, - url='/api/activities/', + url=ACTIVITY_URL, ) - response = activities._create_activity.create_activity(req) + response = activities.create_activity(req) activitiy_json_data = response.get_body() - - assert response.status_code == 200 + assert response.status_code == 201 assert activitiy_json_data == body \ No newline at end of file diff --git a/V2/tests/integration/daos/activities_sql_dao_test.py b/V2/tests/integration/daos/activities_sql_dao_test.py new file mode 100644 index 00000000..98d41d8f --- /dev/null +++ b/V2/tests/integration/daos/activities_sql_dao_test.py @@ -0,0 +1,35 @@ +from time_entries._infrastructure import ActivitiesJsonDao +from time_entries._domain import Activity +from sqlalchemy import create_engine, MetaData +import pytest +import typing + +@pytest.fixture(name='create_fake_activities') +def _create_fake_activities(mocker) -> typing.List[Activity]: + def _creator(activities): + read_data = json.dumps(activities) + mocker.patch('builtins.open', mocker.mock_open(read_data=read_data)) + return [Activity(**activity) for activity in activities] + + return _creator + +def test_get_by_id__returns_an_activity_dto__when_found_one_activity_that_matches_its_id(): + pass + +def test__get_by_id__returns_none__when_no_activity_matches_its_id(): + pass + +def test__get_all__returns_a_list_of_activity_dto_objects__when_one_or_more_activities_are_found(): + pass + +def test_get_all__returns_an_empty_list__when_doesnt_found_any_activities(): + pass + +def test_delete__returns_an_activity_with_inactive_status__when_an_activity_matching_its_id_is_found(): + pass + +def test_delete__returns_none__when_no_activity_matching_its_id_is_found(): + pass + + + diff --git a/V2/time_entries/_application/_activities/_create_activity.py b/V2/time_entries/_application/_activities/_create_activity.py index 88bb8181..29594e27 100644 --- a/V2/time_entries/_application/_activities/_create_activity.py +++ b/V2/time_entries/_application/_activities/_create_activity.py @@ -1,48 +1,59 @@ -from time_entries._infrastructure import ActivitiesJsonDao -from time_entries._domain import ActivityService, _use_cases, Activity - -import azure.functions as func import json import logging import dataclasses +import typing +import azure.functions as func -JSON_PATH = ( +from ... import _domain +from ... import _infrastructure + +_JSON_PATH = ( 'time_entries/_infrastructure/_data_persistence/activities_data.json' ) - def create_activity(req: func.HttpRequest) -> func.HttpResponse: + activity_dao = _infrastructure.ActivitiesJsonDao(_JSON_PATH) + activity_service = _domain.ActivityService(activity_dao) + use_case = _domain._use_cases.CreateActivityUseCase(activity_service) logging.info( 'Python HTTP trigger function processed a request to create an activity.' ) activity_data = req.get_json() - status_code = 200 - if _validate_activity(activity_data): - response = _create_activity(activity_data) - else: - status_code = 404 - response = b'Not possible to create activity, attributes are not correct ' - - return func.HttpResponse( - body=response, status_code=status_code, mimetype="application/json" + validation_errors = _validate_activity(activity_data) + if validation_errors: + return func.HttpResponse( + body=validation_errors, status_code=400, mimetype="application/json" + ) + activity_to_create = _domain.Activity( + id= None, + name=activity_data['name'], + description=activity_data['description'], + status=activity_data['status'], + deleted=activity_data['deleted'], + tenant_id=activity_data['tenant_id'] ) -def _create_activity(activity_data: dict) -> str: - activity_use_case = _use_cases.CreateActivityUseCase( - _create_activity_service(JSON_PATH) + created_activity = use_case.create_activity(activity_to_create.__dict__) + if not create_activity: + return func.HttpResponse( + body={'error': 'activity could not be created'}, + status_code=500, + mimetype="application/json", + ) + return func.HttpResponse( + body=json.dumps(created_activity.__dict__), + status_code=201, + mimetype="application/json" ) - activity = activity_use_case.create_activity(activity_data) - return json.dumps(activity.__dict__) if activity else b'Not Found' - -def _validate_activity(activity_data: dict) -> bool: - activity_keys = [field.name for field in dataclasses.fields(Activity)] - new_activity_keys = list(activity_data.keys()) - return all(map(lambda key: key in activity_keys, new_activity_keys)) and len(activity_keys) == len(new_activity_keys) -def _create_activity_service(path: str): - activity_json = ActivitiesJsonDao(path) - return ActivityService(activity_json) +def _validate_activity(activity_data: dict) -> typing.List[str]: + activity_fields = [field.name for field in dataclasses.fields(_domain.Activity)] + missing_keys = [field for field in activity_fields if field not in activity_data] + return [ + f'The {missing_key} key is missing in the input data' + for missing_key in missing_keys + ] \ No newline at end of file