Skip to content

Commit 8b014b5

Browse files
authored
Merge branch 'master' into TT-384-refactor-tables
2 parents f2a48a0 + 9be546f commit 8b014b5

36 files changed

+220
-165
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Time Tacker V2 CI
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
8+
pull_request:
9+
branches:
10+
- master
11+
12+
jobs:
13+
build-ci-time-tracker:
14+
runs-on: ubuntu-latest
15+
strategy:
16+
max-parallel: 5
17+
steps:
18+
- uses: actions/checkout@v2
19+
- name: Set up Python 3.10.0
20+
uses: actions/setup-python@v2
21+
with:
22+
python-version: 3.10.0
23+
24+
- name: Add conda to system path
25+
run: |
26+
echo $CONDA/bin >> $GITHUB_PATH
27+
28+
- name: Install dependencies
29+
run: |
30+
pip install -r V2/requirements.txt
31+
32+
- name: Lint with flake8
33+
run: |
34+
cd V2
35+
flake8 . --show-source --statistics
36+
- name: Test with pytest
37+
run: |
38+
cd V2
39+
python -m pytest -v

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
<!--next-version-placeholder-->
44

5+
## v0.43.0 (2021-11-11)
6+
### Feature
7+
* TT-384 Refactor Tables ([#337](https://github.com/ioet/time-tracker-backend/issues/337)) ([`568e047`](https://github.com/ioet/time-tracker-backend/commit/568e0479859b0a92cc2780fb5cb522da664c0a92))
8+
59
## v0.42.1 (2021-11-04)
610
### Fix
711
* TT-365 v2 post method fix ([#333](https://github.com/ioet/time-tracker-backend/issues/333)) ([`cb892c3`](https://github.com/ioet/time-tracker-backend/commit/cb892c338c1139640a5527772b398b3b34ff68a7))

V2/.flake8

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[flake8]
2+
exclude = .git,__pycache__,./node_modules,
3+
max-complexity = 10
4+
max_line_length = 120

V2/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ azure-functions-worker
44

55
# Tests
66
pytest
7+
flake8==4.0.1
78

89
# Mocking
910
pytest-mock

V2/serverless.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ package:
3838

3939
functions:
4040
get_activities:
41-
handler: time_entries/interface.get_activities
41+
handler: time_tracker/activities/interface.get_activities
4242
events:
4343
- http: true
4444
x-azure-settings:
@@ -48,7 +48,7 @@ functions:
4848
authLevel: anonymous
4949

5050
delete_activity:
51-
handler: time_entries/interface.delete_activity
51+
handler: time_tracker/activities/interface.delete_activity
5252
events:
5353
- http: true
5454
x-azure-settings:
@@ -58,7 +58,7 @@ functions:
5858
authLevel: anonymous
5959

6060
update_activity:
61-
handler: time_entries/interface.update_activity
61+
handler: time_tracker/activities/interface.update_activity
6262
events:
6363
- http: true
6464
x-azure-settings:
@@ -68,7 +68,7 @@ functions:
6868
authLevel: anonymous
6969

7070
create_activity:
71-
handler: time_entries/interface.create_activity
71+
handler: time_tracker/activities/interface.create_activity
7272
events:
7373
- http: true
7474
x-azure-settings:
Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
from time_entries._application import _activities as activities
1+
from time_tracker.activities._application import _activities as activities
22
from faker import Faker
33

44
import azure.functions as func
55
import json
6-
import typing
76

87

9-
ACTIVITY_URL = '/api/activities/'
8+
ACTIVITY_URL = "/api/activities/"
109

1110

1211
def test__activity_azure_endpoint__returns_all_activities(
1312
create_temp_activities,
1413
):
1514
activities_json, tmp_directory = create_temp_activities
1615
activities._get_activities.JSON_PATH = tmp_directory
17-
req = func.HttpRequest(method='GET', body=None, url=ACTIVITY_URL)
16+
req = func.HttpRequest(method="GET", body=None, url=ACTIVITY_URL)
1817

1918
response = activities.get_activities(req)
2019
activities_json_data = response.get_body().decode("utf-8")
@@ -29,10 +28,10 @@ def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_it
2928
activities_json, tmp_directory = create_temp_activities
3029
activities._get_activities.JSON_PATH = tmp_directory
3130
req = func.HttpRequest(
32-
method='GET',
31+
method="GET",
3332
body=None,
3433
url=ACTIVITY_URL,
35-
route_params={"id": activities_json[0]['id']},
34+
route_params={"id": activities_json[0]["id"]},
3635
)
3736

3837
response = activities.get_activities(req)
@@ -48,17 +47,17 @@ def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__whe
4847
activities_json, tmp_directory = create_temp_activities
4948
activities._delete_activity.JSON_PATH = tmp_directory
5049
req = func.HttpRequest(
51-
method='DELETE',
50+
method="DELETE",
5251
body=None,
5352
url=ACTIVITY_URL,
54-
route_params={"id": activities_json[0]['id']},
53+
route_params={"id": activities_json[0]["id"]},
5554
)
5655

5756
response = activities.delete_activity(req)
5857
activity_json_data = json.loads(response.get_body().decode("utf-8"))
5958

6059
assert response.status_code == 200
61-
assert activity_json_data['status'] == 'inactive'
60+
assert activity_json_data["status"] == "inactive"
6261

6362

6463
def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_activity_to_update(
@@ -68,10 +67,10 @@ def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_act
6867
activities._update_activity.JSON_PATH = tmp_directory
6968
activity_data = {"description": Faker().sentence()}
7069
req = func.HttpRequest(
71-
method='PUT',
70+
method="PUT",
7271
body=json.dumps(activity_data).encode("utf-8"),
7372
url=ACTIVITY_URL,
74-
route_params={"id": activities_json[0]['id']},
73+
route_params={"id": activities_json[0]["id"]},
7574
)
7675

7776
response = activities.update_activity(req)
@@ -81,21 +80,29 @@ def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_act
8180
assert response.status_code == 200
8281
assert activitiy_json_data == json.dumps(new_activity)
8382

83+
8484
def test__activity_azure_endpoint__creates_an_activity__when_activity_has_all_attributes(
85-
create_temp_activities,
86-
):
87-
activities_json, tmp_directory = create_temp_activities
88-
activities._create_activity._JSON_PATH = tmp_directory
89-
90-
activity_body = {'id': None, 'name': Faker().user_name(), 'description': Faker().sentence(),'deleted': Faker().uuid4() ,'status': 'active', 'tenant_id': Faker().uuid4()}
91-
body = json.dumps(activity_body).encode("utf-8")
92-
req = func.HttpRequest(
93-
method='POST',
94-
body= body,
95-
url=ACTIVITY_URL,
96-
)
97-
98-
response = activities.create_activity(req)
99-
activitiy_json_data = response.get_body()
100-
assert response.status_code == 201
101-
assert activitiy_json_data == body
85+
create_temp_activities,
86+
):
87+
activities_json, tmp_directory = create_temp_activities
88+
activities._create_activity._JSON_PATH = tmp_directory
89+
90+
activity_body = {
91+
"id": None,
92+
"name": Faker().user_name(),
93+
"description": Faker().sentence(),
94+
"deleted": Faker().uuid4(),
95+
"status": "active",
96+
"tenant_id": Faker().uuid4(),
97+
}
98+
body = json.dumps(activity_body).encode("utf-8")
99+
req = func.HttpRequest(
100+
method="POST",
101+
body=body,
102+
url=ACTIVITY_URL,
103+
)
104+
105+
response = activities.create_activity(req)
106+
activitiy_json_data = response.get_body()
107+
assert response.status_code == 201
108+
assert activitiy_json_data == body

V2/tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
# flake8: noqa
12
from tests.api.api_fixtures import create_temp_activities

V2/tests/integration/daos/activities_json_dao_test.py

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from time_entries._infrastructure import ActivitiesJsonDao
2-
from time_entries._domain import Activity
1+
from time_tracker.activities._infrastructure import ActivitiesJsonDao
2+
from time_tracker.activities._domain import Activity
33
from faker import Faker
44
import json
55
import pytest
@@ -8,21 +8,21 @@
88

99
fake_activities = [
1010
{
11-
'id': Faker().uuid4(),
12-
'name': Faker().user_name(),
13-
'description': Faker().sentence(),
14-
'deleted': Faker().uuid4(),
15-
'status': 'active',
16-
'tenant_id': Faker().uuid4(),
11+
"id": Faker().uuid4(),
12+
"name": Faker().user_name(),
13+
"description": Faker().sentence(),
14+
"deleted": Faker().uuid4(),
15+
"status": "active",
16+
"tenant_id": Faker().uuid4(),
1717
}
1818
]
1919

2020

21-
@pytest.fixture(name='create_fake_activities')
21+
@pytest.fixture(name="create_fake_activities")
2222
def _create_fake_activities(mocker) -> typing.List[Activity]:
2323
def _creator(activities):
2424
read_data = json.dumps(activities)
25-
mocker.patch('builtins.open', mocker.mock_open(read_data=read_data))
25+
mocker.patch("builtins.open", mocker.mock_open(read_data=read_data))
2626
return [Activity(**activity) for activity in activities]
2727

2828
return _creator
@@ -94,7 +94,7 @@ def test_delete__returns_an_activity_with_inactive_status__when_an_activity_matc
9494
activity_dto = activities.pop()
9595
result = activities_json_dao.delete(activity_dto.id)
9696

97-
assert result.status == 'inactive'
97+
assert result.status == "inactive"
9898

9999

100100
def test_delete__returns_none__when_no_activity_matching_its_id_is_found(
@@ -129,21 +129,24 @@ def test_update__returns_none__when_doesnt_found_one_activity_to_update(
129129
create_fake_activities([])
130130
activity_data = {"description": Faker().sentence()}
131131

132-
result = activities_json_dao.update('', activity_data)
132+
result = activities_json_dao.update("", activity_data)
133133

134-
assert result == None
134+
assert result is None
135135

136-
def test_create_activity__returns_an_activity_dto__when_create_an_activity_that_matches_attributes(create_fake_activities):
137-
create_fake_activities([])
138136

139-
activities_json_dao = ActivitiesJsonDao(Faker().file_path())
140-
activity_data = {
141-
"name": "test_name",
142-
"description": "test_description",
143-
"tenant_id": "test_tenant_id",
144-
"id": "test_id",
145-
"deleted": "test_deleted",
146-
"status": "test_status",
147-
}
148-
result = activities_json_dao.create_activity(activity_data)
149-
assert result == Activity(**activity_data)
137+
def test_create_activity__returns_an_activity_dto__when_create_an_activity_that_matches_attributes(
138+
create_fake_activities,
139+
):
140+
create_fake_activities([])
141+
142+
activities_json_dao = ActivitiesJsonDao(Faker().file_path())
143+
activity_data = {
144+
"name": "test_name",
145+
"description": "test_description",
146+
"tenant_id": "test_tenant_id",
147+
"id": "test_id",
148+
"deleted": "test_deleted",
149+
"status": "test_status",
150+
}
151+
result = activities_json_dao.create_activity(activity_data)
152+
assert result == Activity(**activity_data)

V2/tests/unit/services/activity_service_test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from time_entries._domain import ActivityService
1+
from time_tracker.activities._domain import ActivityService
22
from faker import Faker
33

44

@@ -59,6 +59,7 @@ def test__update_activity__uses_the_activity_dao__to_update_one_activity(
5959
assert activity_dao.update.called
6060
assert expected_activity == updated_activity
6161

62+
6263
def test__create_activity__uses_the_activity_dao__to_create_an_activity(mocker):
6364
expected_activity = mocker.Mock()
6465
activity_dao = mocker.Mock(

V2/tests/unit/use_cases/activities_use_case_test.py

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from time_entries._domain import ActivityService
2-
from time_entries._domain import _use_cases
1+
from time_tracker.activities._domain import _use_cases
32
from pytest_mock import MockFixture
43
from faker import Faker
54

@@ -37,45 +36,41 @@ def test__get_activity_by_id_function__uses_the_activity_service__to_retrieve_ac
3736

3837

3938
def test__create_activity_function__uses_the_activities_service__to_create_activity(
40-
mocker: MockFixture,
41-
):
42-
expected_activity = mocker.Mock()
43-
activity_service = mocker.Mock(
44-
create_activity=mocker.Mock(return_value=expected_activity)
45-
)
39+
mocker: MockFixture,
40+
):
41+
expected_activity = mocker.Mock()
42+
activity_service = mocker.Mock(
43+
create_activity=mocker.Mock(return_value=expected_activity)
44+
)
45+
46+
activity_use_case = _use_cases.CreateActivityUseCase(activity_service)
47+
actual_activity = activity_use_case.create_activity(fake.pydict())
4648

47-
activity_use_case = _use_cases.CreateActivityUseCase(activity_service)
48-
actual_activity = activity_use_case.create_activity(fake.pydict())
49+
assert activity_service.create_activity.called
50+
assert expected_activity == actual_activity
4951

50-
assert activity_service.create_activity.called
51-
assert expected_activity == actual_activity
5252

5353
def test__delete_activity_function__uses_the_activity_service__to_change_activity_status(
5454
mocker: MockFixture,
5555
):
5656
expected_activity = mocker.Mock()
57-
activity_service = mocker.Mock(
58-
delete=mocker.Mock(return_value=expected_activity)
59-
)
57+
activity_service = mocker.Mock(delete=mocker.Mock(return_value=expected_activity))
6058

6159
activity_use_case = _use_cases.DeleteActivityUseCase(activity_service)
6260
deleted_activity = activity_use_case.delete_activity(fake.uuid4())
6361

6462
assert activity_service.delete.called
6563
assert expected_activity == deleted_activity
6664

65+
6766
def test__update_activity_function__uses_the_activities_service__to_update_an_activity(
6867
mocker: MockFixture,
6968
):
7069
expected_activity = mocker.Mock()
71-
activity_service = mocker.Mock(
72-
update=mocker.Mock(return_value=expected_activity)
73-
)
70+
activity_service = mocker.Mock(update=mocker.Mock(return_value=expected_activity))
7471

7572
activity_use_case = _use_cases.UpdateActivityUseCase(activity_service)
76-
updated_activity = activity_use_case.update_activity(
77-
fake.uuid4(), fake.pydict()
78-
)
73+
updated_activity = activity_use_case.update_activity(fake.uuid4(), fake.pydict())
7974

8075
assert activity_service.update.called
8176
assert expected_activity == updated_activity

0 commit comments

Comments
 (0)