Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
refactor: TT-357 Refactor update and create activity
  • Loading branch information
dsgarcia8 committed Nov 12, 2021
commit dcf14dfd1aa749987d71fedae7cc0da36bc09c1f
2 changes: 1 addition & 1 deletion V2/.flake8
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[flake8]
exclude = .git,__pycache__,./node_modules,
exclude = .git,__pycache__,./node_modules,.venv
max-complexity = 10
max_line_length = 120
22 changes: 22 additions & 0 deletions V2/create_activity/function.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"disabled": false,
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "activities/",
"authLevel": "anonymous",
"methods": [
"POST"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
],
"entryPoint": "create_activity",
"scriptFile": "../time_tracker/activities/interface.py"
}
22 changes: 22 additions & 0 deletions V2/delete_activity/function.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"disabled": false,
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "activities/{id}",
"authLevel": "anonymous",
"methods": [
"DELETE"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
],
"entryPoint": "delete_activity",
"scriptFile": "../time_tracker/activities/interface.py"
}
22 changes: 22 additions & 0 deletions V2/get_activities/function.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"disabled": false,
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "activities/{id:?}",
"authLevel": "anonymous",
"methods": [
"GET"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
],
"entryPoint": "get_activities",
"scriptFile": "../time_tracker/activities/interface.py"
}
13 changes: 7 additions & 6 deletions V2/tests/api/azure/activity_azure_endpoints_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
import time_tracker.activities._application._activities as azure_activities
import time_tracker.activities._infrastructure as infrastructure
from time_tracker._infrastructure import DB
from time_tracker.activities import _domain

ACTIVITY_URL = '/api/activities/'


@pytest.fixture(name='insert_activity')
def _insert_activity() -> dict:
def _new_activity(activity: dict, database: DB):
def _new_activity(activity: _domain.Activity, database: DB):
dao = infrastructure.ActivitiesSQLDao(database)
new_activity = dao.create(activity)
return new_activity.__dict__
Expand All @@ -26,8 +27,8 @@ def test__activity_azure_endpoint__returns_all_activities(
fake_database = create_fake_database
existent_activities = [activity_factory(), activity_factory()]
inserted_activities = [
insert_activity(existent_activities[0].__dict__, fake_database),
insert_activity(existent_activities[1].__dict__, fake_database)
insert_activity(existent_activities[0], fake_database),
insert_activity(existent_activities[1], fake_database)
]

azure_activities._get_activities.DATABASE = fake_database
Expand All @@ -44,7 +45,7 @@ def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_it
):
fake_database = create_fake_database
existent_activity = activity_factory()
inserted_activity = insert_activity(existent_activity.__dict__, fake_database)
inserted_activity = insert_activity(existent_activity, fake_database)

azure_activities._get_activities.DATABASE = fake_database
req = func.HttpRequest(
Expand All @@ -66,7 +67,7 @@ def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__whe
):
fake_database = create_fake_database
existent_activity = activity_factory()
inserted_activity = insert_activity(existent_activity.__dict__, fake_database)
inserted_activity = insert_activity(existent_activity, fake_database)

azure_activities._delete_activity.DATABASE = fake_database
req = func.HttpRequest(
Expand All @@ -89,7 +90,7 @@ def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_act
):
fake_database = create_fake_database
existent_activity = activity_factory()
inserted_activity = insert_activity(existent_activity.__dict__, fake_database)
inserted_activity = insert_activity(existent_activity, fake_database)

azure_activities._update_activity.DATABASE = fake_database
activity_body = {"description": Faker().sentence()}
Expand Down
2 changes: 1 addition & 1 deletion V2/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# flake8: noqa
from api_fixtures import _activity_factory, _create_fake_dao, _create_fake_database
from fixtures import _activity_factory, _create_fake_dao, _create_fake_database
File renamed without changes.
22 changes: 12 additions & 10 deletions V2/tests/integration/daos/activities_sql_dao_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pytest
import typing
from faker import Faker

import time_tracker.activities._domain as domain
import time_tracker.activities._infrastructure as infrastructure
Expand All @@ -8,7 +9,7 @@

@pytest.fixture(name='insert_activity')
def _insert_activity() -> domain.Activity:
def _new_activity(activity: dict, dao: domain.ActivitiesDao):
def _new_activity(activity: domain.Activity, dao: domain.ActivitiesDao):
new_activity = dao.create(activity)
return new_activity
return _new_activity
Expand All @@ -29,7 +30,7 @@ def test__create_activity__returns_a_activity_dto__when_saves_correctly_with_sql
dao = create_fake_dao
existent_activity = activity_factory()

inserted_activity = dao.create(existent_activity.__dict__)
inserted_activity = dao.create(existent_activity)

assert isinstance(inserted_activity, domain.Activity)
assert inserted_activity == existent_activity
Expand All @@ -40,13 +41,14 @@ def test_update__returns_an_update_activity__when_an_activity_matching_its_id_is
):
dao = create_fake_dao
existent_activity = activity_factory()
inserted_activity = insert_activity(existent_activity.__dict__, dao)
inserted_activity = insert_activity(existent_activity, dao)

updated_activity = dao.update(inserted_activity.id, {'description': 'test demo 2 create an new activity'})
expected_description = Faker().sentence()
updated_activity = dao.update(inserted_activity.id, None, expected_description, None, None)

assert isinstance(updated_activity, domain.Activity)
assert updated_activity.id == inserted_activity.id
assert updated_activity.description == 'test demo 2 create an new activity'
assert updated_activity.description == expected_description


def test_update__returns_none__when_no_activity_matching_its_id_is_found_with_sql_database(
Expand All @@ -55,7 +57,7 @@ def test_update__returns_none__when_no_activity_matching_its_id_is_found_with_sq
dao = create_fake_dao
existent_activity = activity_factory()

results = dao.update(existent_activity.id, {'description': 'test demo'})
results = dao.update(existent_activity.id, Faker().name(), None, None, None)

assert results is None

Expand All @@ -66,8 +68,8 @@ def test__get_all__returns_a_list_of_activity_dto_objects__when_one_or_more_acti
dao = create_fake_dao
existent_activities = [activity_factory(), activity_factory()]
inserted_activities = [
insert_activity(existent_activities[0].__dict__, dao),
insert_activity(existent_activities[1].__dict__, dao)
insert_activity(existent_activities[0], dao),
insert_activity(existent_activities[1], dao)
]

activities = dao.get_all()
Expand All @@ -81,7 +83,7 @@ def test_get_by_id__returns_an_activity_dto__when_found_one_activity_that_matche
):
dao = create_fake_dao
existent_activity = activity_factory()
inserted_activity = insert_activity(existent_activity.__dict__, dao)
inserted_activity = insert_activity(existent_activity, dao)

activity = dao.get_by_id(inserted_activity.id)

Expand Down Expand Up @@ -115,7 +117,7 @@ def test_delete__returns_an_activity_with_inactive_status__when_an_activity_matc
):
dao = create_fake_dao
existent_activity = activity_factory()
inserted_activity = insert_activity(existent_activity.__dict__, dao)
inserted_activity = insert_activity(existent_activity, dao)

activity = dao.delete(inserted_activity.id)

Expand Down
2 changes: 1 addition & 1 deletion V2/tests/unit/services/activity_service_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def test__update_activity__uses_the_activity_dao__to_update_one_activity(
activity_service = ActivityService(activity_dao)

updated_activity = activity_service.update(
Faker().uuid4(), Faker().pydict()
Faker().uuid4(), Faker().name(), Faker().sentence(), Faker().pyint(), Faker().pybool()
)

assert activity_dao.update.called
Expand Down
14 changes: 8 additions & 6 deletions V2/tests/unit/use_cases/activities_use_case_test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from time_tracker.activities._domain import _use_cases
from pytest_mock import MockFixture
from faker import Faker
from pytest_mock import MockFixture

from time_tracker.activities._domain import _use_cases

fake = Faker()

Expand Down Expand Up @@ -36,15 +37,15 @@ def test__get_activity_by_id_function__uses_the_activity_service__to_retrieve_ac


def test__create_activity_function__uses_the_activities_service__to_create_activity(
mocker: MockFixture,
mocker: MockFixture, activity_factory
):
expected_activity = mocker.Mock()
activity_service = mocker.Mock(
create=mocker.Mock(return_value=expected_activity)
)

activity_use_case = _use_cases.CreateActivityUseCase(activity_service)
actual_activity = activity_use_case.create_activity(fake.pydict())
actual_activity = activity_use_case.create_activity(activity_factory())

assert activity_service.create.called
assert expected_activity == actual_activity
Expand All @@ -66,16 +67,17 @@ def test__delete_activity_function__uses_the_activity_service__to_change_activit


def test__update_activity_function__uses_the_activities_service__to_update_an_activity(
mocker: MockFixture,
mocker: MockFixture, activity_factory
):
expected_activity = mocker.Mock()
activity_service = mocker.Mock(
update=mocker.Mock(return_value=expected_activity)
)
new_activity = activity_factory()

activity_use_case = _use_cases.UpdateActivityUseCase(activity_service)
updated_activity = activity_use_case.update_activity(
fake.uuid4(), fake.pydict()
fake.uuid4(), new_activity.name, new_activity.description, new_activity.status, new_activity.deleted
)

assert activity_service.update.called
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def create_activity(req: func.HttpRequest) -> func.HttpResponse:
deleted=activity_data['deleted']
)

created_activity = use_case.create_activity(activity_to_create.__dict__)
created_activity = use_case.create_activity(activity_to_create)
if not create_activity:
return func.HttpResponse(
body={'error': 'activity could not be created'},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,21 @@ def delete_activity(req: func.HttpRequest) -> func.HttpResponse:
logging.info(
'Python HTTP trigger function processed a request to delete an activity.'
)
activity_id = req.route_params.get('id')
response = _delete(activity_id)
status_code = 200 if response != b'Not found' else 404
try:
activity_id = int(req.route_params.get('id'))
response = _delete(activity_id)
status_code = 200 if response != b'Not found' else 404

return func.HttpResponse(
body=response, status_code=status_code, mimetype="application/json"
)
return func.HttpResponse(
body=response, status_code=status_code, mimetype="application/json"
)
except ValueError:
return func.HttpResponse(
body=b"Invalid format id", status_code=400, mimetype="application/json"
)


def _delete(activity_id: str) -> str:
def _delete(activity_id: int) -> str:
activity_use_case = _domain._use_cases.DeleteActivityUseCase(
_create_activity_service(DATABASE)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,24 @@ def get_activities(req: func.HttpRequest) -> func.HttpResponse:
activity_id = req.route_params.get('id')
status_code = 200

if activity_id:
response = _get_by_id(activity_id)
if response == b'Not Found':
status_code = 404
else:
response = _get_all()

return func.HttpResponse(
body=response, status_code=status_code, mimetype="application/json"
)


def _get_by_id(activity_id: str) -> str:
try:
if activity_id:
response = _get_by_id(int(activity_id))
if response == b'Not Found':
status_code = 404
else:
response = _get_all()

return func.HttpResponse(
body=response, status_code=status_code, mimetype="application/json"
)
except ValueError:
return func.HttpResponse(
body=b"Invalid format id", status_code=400, mimetype="application/json"
)


def _get_by_id(activity_id: int) -> str:
activity_use_case = _domain._use_cases.GetActivityUseCase(
_create_activity_service(DATABASE)
)
Expand Down
Loading