Skip to content

Commit 5f107f3

Browse files
authored
feat: TT-401-Post-v2-time-entries (#344)
* feat: TT-401 Implemented service, end-point, dao, test- time entries * feat: TT-401 validated request create time entry * fix: TT-401 implemented faker url * refactor: TT-401 changed the variable name * fix: implementation of the database connection * refactor: TT-401 fixtures changed * fix: TT-401 solution of comments, change of config * ci: TT-401 fix inject secrets * refactor: TT-401 rename of functions and imports * fix: TT-401 changed test db storage
1 parent 10cc426 commit 5f107f3

File tree

32 files changed

+388
-166
lines changed

32 files changed

+388
-166
lines changed

.github/workflows/python-package.yml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ jobs:
1414
runs-on: ubuntu-latest
1515
strategy:
1616
max-parallel: 5
17+
env:
18+
ENVIRONMENT: ${{ secrets.ENVIRONMENT }}
19+
TEST_DB_CONNECTION: ${{ secrets.TEST_DB_CONNECTION }}
1720
steps:
1821
- uses: actions/checkout@v2
1922
- name: Set up Python 3.10.0
@@ -29,14 +32,6 @@ jobs:
2932
run: |
3033
pip install -r V2/requirements.txt
3134
32-
- name: Inject Secrets
33-
env:
34-
ENVIRONMENT: ${{ secrets.environment }}
35-
TEST_DB_CONNECTION: ${{ secrets.test_db_connection }}
36-
run: |
37-
echo $ENVIRONMENT
38-
echo $TEST_DB_CONNECTION
39-
4035
- name: Lint with flake8
4136
run: |
4237
cd V2

V2/create_activity/function.json

Lines changed: 0 additions & 22 deletions
This file was deleted.

V2/delete_activity/function.json

Lines changed: 0 additions & 22 deletions
This file was deleted.

V2/get_activities/function.json

Lines changed: 0 additions & 22 deletions
This file was deleted.

V2/serverless.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,13 @@ functions:
7676
- POST
7777
route: activities/
7878
authLevel: anonymous
79+
80+
create_time_entry:
81+
handler: time_tracker/time_entries/interface.create_time_entry
82+
events:
83+
- http: true
84+
x-azure-settings:
85+
methods:
86+
- POST
87+
route: time-entries/
88+
authLevel: anonymous

V2/tests/api/azure/activity_azure_endpoints_test.py

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,24 @@
1-
import pytest
21
import json
32
from faker import Faker
43

54
import azure.functions as func
65

76
import time_tracker.activities._application._activities as azure_activities
8-
import time_tracker.activities._infrastructure as infrastructure
9-
from time_tracker._infrastructure import DB
10-
from time_tracker.activities import _domain
117

128
ACTIVITY_URL = '/api/activities/'
139

1410

15-
@pytest.fixture(name='insert_activity')
16-
def _insert_activity() -> dict:
17-
def _new_activity(activity: _domain.Activity, database: DB):
18-
dao = infrastructure.ActivitiesSQLDao(database)
19-
new_activity = dao.create(activity)
20-
return new_activity.__dict__
21-
return _new_activity
22-
23-
2411
def test__activity_azure_endpoint__returns_all_activities(
25-
create_fake_database, activity_factory, insert_activity
12+
test_db, activity_factory, insert_activity
2613
):
27-
fake_database = create_fake_database
2814
existent_activities = [activity_factory(), activity_factory()]
2915
inserted_activities = [
30-
insert_activity(existent_activities[0], fake_database),
31-
insert_activity(existent_activities[1], fake_database)
16+
insert_activity(existent_activities[0], test_db).__dict__,
17+
insert_activity(existent_activities[1], test_db).__dict__
3218
]
3319

34-
azure_activities._get_activities.DATABASE = fake_database
20+
azure_activities._get_activities.DATABASE = test_db
21+
3522
req = func.HttpRequest(method='GET', body=None, url=ACTIVITY_URL)
3623
response = azure_activities._get_activities.get_activities(req)
3724
activities_json_data = response.get_body().decode("utf-8")
@@ -41,13 +28,12 @@ def test__activity_azure_endpoint__returns_all_activities(
4128

4229

4330
def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_its_id(
44-
create_fake_database, activity_factory, insert_activity
31+
test_db, activity_factory, insert_activity
4532
):
46-
fake_database = create_fake_database
4733
existent_activity = activity_factory()
48-
inserted_activity = insert_activity(existent_activity, fake_database)
34+
inserted_activity = insert_activity(existent_activity, test_db).__dict__
4935

50-
azure_activities._get_activities.DATABASE = fake_database
36+
azure_activities._get_activities.DATABASE = test_db
5137
req = func.HttpRequest(
5238
method='GET',
5339
body=None,
@@ -63,13 +49,12 @@ def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_it
6349

6450

6551
def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__when_an_activity_matching_its_id_is_found(
66-
create_fake_database, activity_factory, insert_activity
52+
test_db, activity_factory, insert_activity
6753
):
68-
fake_database = create_fake_database
6954
existent_activity = activity_factory()
70-
inserted_activity = insert_activity(existent_activity, fake_database)
55+
inserted_activity = insert_activity(existent_activity, test_db).__dict__
7156

72-
azure_activities._delete_activity.DATABASE = fake_database
57+
azure_activities._delete_activity.DATABASE = test_db
7358
req = func.HttpRequest(
7459
method='DELETE',
7560
body=None,
@@ -86,13 +71,12 @@ def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__whe
8671

8772

8873
def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_activity_to_update(
89-
create_fake_database, activity_factory, insert_activity
74+
test_db, activity_factory, insert_activity
9075
):
91-
fake_database = create_fake_database
9276
existent_activity = activity_factory()
93-
inserted_activity = insert_activity(existent_activity, fake_database)
77+
inserted_activity = insert_activity(existent_activity, test_db).__dict__
9478

95-
azure_activities._update_activity.DATABASE = fake_database
79+
azure_activities._update_activity.DATABASE = test_db
9680
activity_body = {"description": Faker().sentence()}
9781
req = func.HttpRequest(
9882
method='PUT',
@@ -109,10 +93,7 @@ def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_act
10993
assert activitiy_json_data == json.dumps(inserted_activity)
11094

11195

112-
def test__activity_azure_endpoint__creates_an_activity__when_activity_has_all_attributes(
113-
create_fake_database,
114-
):
115-
azure_activities._create_activity.DATABASE = create_fake_database
96+
def test__activity_azure_endpoint__creates_an_activity__when_activity_has_all_attributes():
11697
activity_body = {
11798
'id': None,
11899
'name': Faker().user_name(),
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import json
2+
3+
import azure.functions as func
4+
5+
import time_tracker.time_entries._application._time_entries as azure_time_entries
6+
7+
TIME_ENTRY_URL = "/api/time-entries/"
8+
9+
10+
def test__time_entry_azure_endpoint__creates_an_time_entry__when_time_entry_has_all_attributes(
11+
test_db, time_entry_factory, activity_factory, insert_activity
12+
):
13+
inserted_activity = insert_activity(activity_factory(), test_db)
14+
time_entry_body = time_entry_factory(activity_id=inserted_activity.id, technologies="[jira,sql]").__dict__
15+
16+
body = json.dumps(time_entry_body).encode("utf-8")
17+
req = func.HttpRequest(
18+
method='POST',
19+
body=body,
20+
url=TIME_ENTRY_URL,
21+
)
22+
23+
response = azure_time_entries._create_time_entry.create_time_entry(req)
24+
time_entry_json_data = json.loads(response.get_body())
25+
time_entry_body['id'] = time_entry_json_data['id']
26+
27+
assert response.status_code == 201
28+
assert time_entry_json_data == time_entry_body

V2/tests/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
# flake8: noqa
2-
from fixtures import _activity_factory, _create_fake_dao, _create_fake_database
2+
from fixtures import _activity_factory, _test_db, _insert_activity
3+
from fixtures import _time_entry_factory

V2/tests/fixtures.py

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import pytest
2+
from faker import Faker
23

3-
import time_tracker.activities._domain as domain
4-
import time_tracker.activities._infrastructure as infrastructure
4+
import time_tracker.activities._domain as activities_domain
5+
import time_tracker.activities._infrastructure as activities_infrastructure
6+
import time_tracker.time_entries._domain as time_entries_domain
57
from time_tracker._infrastructure import DB
6-
from faker import Faker
78

89

910
@pytest.fixture(name='activity_factory')
10-
def _activity_factory() -> domain.Activity:
11+
def _activity_factory() -> activities_domain.Activity:
1112
def _make_activity(
1213
name: str = Faker().name(), description: str = Faker().sentence(), deleted: bool = False, status: int = 1
1314
):
14-
activity = domain.Activity(
15+
activity = activities_domain.Activity(
1516
id=None,
1617
name=name,
1718
description=description,
@@ -22,14 +23,49 @@ def _make_activity(
2223
return _make_activity
2324

2425

25-
@pytest.fixture(name='create_fake_dao')
26-
def _create_fake_dao() -> domain.ActivitiesDao:
27-
db_fake = DB('sqlite:///:memory:')
28-
dao = infrastructure.ActivitiesSQLDao(db_fake)
29-
return dao
26+
@pytest.fixture(name='test_db')
27+
def _test_db() -> DB:
28+
db_fake = DB()
29+
db_fake.get_session().execute("pragma foreign_keys=ON")
30+
return db_fake
3031

3132

32-
@pytest.fixture(name='create_fake_database')
33-
def _create_fake_database() -> domain.ActivitiesDao:
34-
db_fake = DB('sqlite:///:memory:')
35-
return db_fake
33+
@pytest.fixture(name='time_entry_factory')
34+
def _time_entry_factory() -> time_entries_domain.TimeEntry:
35+
def _make_time_entry(
36+
id=Faker().random_int(),
37+
start_date=str(Faker().date_time()),
38+
owner_id=Faker().random_int(),
39+
description=Faker().sentence(),
40+
activity_id=Faker().random_int(),
41+
uri=Faker().domain_name(),
42+
technologies=["jira", "git"],
43+
end_date=str(Faker().date_time()),
44+
deleted=False,
45+
timezone_offset="300",
46+
project_id=Faker().random_int(),
47+
):
48+
time_entry = time_entries_domain.TimeEntry(
49+
id=id,
50+
start_date=start_date,
51+
owner_id=owner_id,
52+
description=description,
53+
activity_id=activity_id,
54+
uri=uri,
55+
technologies=technologies,
56+
end_date=end_date,
57+
deleted=deleted,
58+
timezone_offset=timezone_offset,
59+
project_id=project_id,
60+
)
61+
return time_entry
62+
return _make_time_entry
63+
64+
65+
@pytest.fixture(name='insert_activity')
66+
def _insert_activity() -> dict:
67+
def _new_activity(activity: activities_domain.Activity, database: DB):
68+
dao = activities_infrastructure.ActivitiesSQLDao(database)
69+
new_activity = dao.create(activity)
70+
return new_activity
71+
return _new_activity

V2/tests/integration/daos/activities_sql_dao_test.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
from time_tracker._infrastructure import DB
88

99

10-
@pytest.fixture(name='insert_activity')
11-
def _insert_activity() -> domain.Activity:
12-
def _new_activity(activity: domain.Activity, dao: domain.ActivitiesDao):
13-
new_activity = dao.create(activity)
14-
return new_activity
15-
return _new_activity
10+
@pytest.fixture(name='create_fake_dao')
11+
def _create_fake_dao() -> domain.ActivitiesDao:
12+
db_fake = DB('sqlite:///:memory:')
13+
dao = infrastructure.ActivitiesSQLDao(db_fake)
14+
return dao
1615

1716

1817
@pytest.fixture(name='clean_database', autouse=True)
@@ -41,7 +40,7 @@ def test_update__returns_an_update_activity__when_an_activity_matching_its_id_is
4140
):
4241
dao = create_fake_dao
4342
existent_activity = activity_factory()
44-
inserted_activity = insert_activity(existent_activity, dao)
43+
inserted_activity = insert_activity(existent_activity, dao.db)
4544

4645
expected_description = Faker().sentence()
4746
updated_activity = dao.update(inserted_activity.id, None, expected_description, None, None)
@@ -68,8 +67,8 @@ def test__get_all__returns_a_list_of_activity_dto_objects__when_one_or_more_acti
6867
dao = create_fake_dao
6968
existent_activities = [activity_factory(), activity_factory()]
7069
inserted_activities = [
71-
insert_activity(existent_activities[0], dao),
72-
insert_activity(existent_activities[1], dao)
70+
insert_activity(existent_activities[0], dao.db),
71+
insert_activity(existent_activities[1], dao.db)
7372
]
7473

7574
activities = dao.get_all()
@@ -83,7 +82,7 @@ def test_get_by_id__returns_an_activity_dto__when_found_one_activity_that_matche
8382
):
8483
dao = create_fake_dao
8584
existent_activity = activity_factory()
86-
inserted_activity = insert_activity(existent_activity, dao)
85+
inserted_activity = insert_activity(existent_activity, dao.db)
8786

8887
activity = dao.get_by_id(inserted_activity.id)
8988

@@ -117,7 +116,7 @@ def test_delete__returns_an_activity_with_inactive_status__when_an_activity_matc
117116
):
118117
dao = create_fake_dao
119118
existent_activity = activity_factory()
120-
inserted_activity = insert_activity(existent_activity, dao)
119+
inserted_activity = insert_activity(existent_activity, dao.db)
121120

122121
activity = dao.delete(inserted_activity.id)
123122

0 commit comments

Comments
 (0)