Skip to content

Commit 6f2e96a

Browse files
ararcosJobzi
authored andcommitted
feat: TT-414 created get latest project, use case, service, dao
1 parent 5e71d90 commit 6f2e96a

File tree

20 files changed

+190
-90
lines changed

20 files changed

+190
-90
lines changed

V2/serverless.yml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,13 @@ functions:
109109

110110
get_latest_time_entry:
111111
handler: time_tracker/time_entries/interface.get_latest_entries
112-
- http: true
112+
events:
113+
- http: true
113114
x-azure-settings:
114115
methods:
115-
- GET
116+
- GET
116117
route: time-entries/latest
117-
authLevel: anonymous
118+
authLevel: anonymous
118119

119120
update_time_entry:
120121
handler: time_tracker/time_entries/interface.update_time_entry
@@ -186,4 +187,13 @@ functions:
186187
route: projects/
187188

188189
authLevel: anonymous
189-
190+
191+
get_latest_projects:
192+
handler: time_tracker/projects/interface.get_latest_projects
193+
events:
194+
- http: true
195+
x-azure-settings:
196+
methods:
197+
- GET
198+
route: projects/latest
199+
authLevel: anonymous

V2/tests/api/azure/project_azure_endpoints_test.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,14 @@
11
import json
22
from http import HTTPStatus
33

4-
import pytest
54
from faker import Faker
65
import azure.functions as func
76

87
from time_tracker.projects._application import _projects as azure_projects
9-
from time_tracker.projects import _domain as domain
10-
from time_tracker.projects import _infrastructure as infrastructure
118

129
PROJECT_URL = '/api/projects/'
1310

1411

15-
@pytest.fixture(name='insert_project')
16-
def _insert_project(test_db, insert_customer, project_factory, customer_factory) -> domain.Project:
17-
inserted_customer = insert_customer(customer_factory(), test_db)
18-
19-
def _new_project():
20-
project_to_insert = project_factory(customer_id=inserted_customer.id)
21-
dao = infrastructure.ProjectsSQLDao(test_db)
22-
inserted_project = dao.create(project_to_insert)
23-
return inserted_project
24-
return _new_project
25-
26-
2712
def test__project_azure_endpoint__returns_all_projects(
2813
insert_project
2914
):
@@ -146,19 +131,17 @@ def test__update_project_azure_endpoint__returns_a_project__when_found_a_project
146131

147132

148133
def test__update_projects_azure_endpoint__returns_a_status_code_404__when_no_found_a_project_to_update(
149-
project_factory
150134
):
151-
project_body = project_factory().__dict__
135+
project_body = {"description": Faker().sentence()}
152136

153137
req = func.HttpRequest(
154138
method="PUT",
155139
body=json.dumps(project_body).encode("utf-8"),
156140
url=PROJECT_URL,
157-
route_params={"id": project_body["id"]},
141+
route_params={"id": Faker().pyint()},
158142
)
159143

160144
response = azure_projects._update_project.update_project(req)
161-
162145
assert response.status_code == HTTPStatus.NOT_FOUND
163146
assert response.get_body() == b"Not found"
164147

V2/tests/api/azure/time_entry_azure_endpoints_test.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ def test__time_entry_azure_endpoint__creates_an_time_entry__when_time_entry_has_
4646

4747

4848
def test__delete_time_entries_azure_endpoint__returns_an_time_entry_with_true_deleted__when_its_id_is_found(
49-
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory,
49+
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory, insert_project
5050
):
51+
inserted_project = insert_project()
5152
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
52-
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"])
53+
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
5354
inserted_time_entry = insert_time_entry(time_entry_body, test_db)
5455

5556
req = func.HttpRequest(
@@ -140,10 +141,11 @@ def test__get_time_entries_azure_endpoint__returns_a_status_code_400__when_time_
140141

141142

142143
def test__get_latest_entries_azure_endpoint__returns_a_list_of_latest_time_entries__when_an_owner_id_match(
143-
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory,
144+
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory, insert_project
144145
):
146+
inserted_project = insert_project()
145147
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
146-
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], technologies="[jira,sql]")
148+
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
147149
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__
148150

149151
req = func.HttpRequest(
@@ -179,27 +181,28 @@ def test__get_latest_entries_azure_endpoint__returns_no_time_entries_found__when
179181

180182

181183
def test__update_time_entry_azure_endpoint__returns_an_time_entry__when_found_an_time_entry_to_update(
182-
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
184+
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
183185
):
184-
inserted_activity = insert_activity(activity_factory(), test_db)
185-
existent_time_entries = time_entry_factory(activity_id=inserted_activity.id)
186-
inserted_time_entries = insert_time_entry(existent_time_entries, test_db).__dict__
186+
inserted_project = insert_project()
187+
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
188+
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
189+
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__
187190

188191
time_entry_body = {"description": Faker().sentence()}
189192

190193
req = func.HttpRequest(
191194
method='PUT',
192195
body=json.dumps(time_entry_body).encode("utf-8"),
193196
url=TIME_ENTRY_URL,
194-
route_params={"id": inserted_time_entries["id"]},
197+
route_params={"id": inserted_time_entry["id"]},
195198
)
196199

197200
response = azure_time_entries._update_time_entry.update_time_entry(req)
198201
activitiy_json_data = response.get_body().decode("utf-8")
199-
inserted_time_entries.update(time_entry_body)
202+
inserted_time_entry.update(time_entry_body)
200203

201204
assert response.status_code == 200
202-
assert activitiy_json_data == json.dumps(inserted_time_entries)
205+
assert activitiy_json_data == json.dumps(inserted_time_entry)
203206

204207

205208
def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_format_id():

V2/tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
from fixtures import _activity_factory, _test_db, _insert_activity
33
from fixtures import _time_entry_factory
44
from fixtures import _customer_factory, _insert_customer
5-
from fixtures import _project_factory
5+
from fixtures import _project_factory, _insert_project

V2/tests/fixtures.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import time_tracker.customers._domain as customers_domain
88
import time_tracker.customers._infrastructure as customers_infrastructure
99
import time_tracker.projects._domain as projects_domain
10+
import time_tracker.projects._infrastructure as projects_infrastructure
1011
from time_tracker._infrastructure import DB
1112

1213

@@ -108,7 +109,8 @@ def _make_project(
108109
customer_id=Faker().pyint(),
109110
status=Faker().pyint(),
110111
deleted=False,
111-
technologies=str(Faker().pylist())
112+
technologies=str(Faker().pylist()),
113+
customer=None
112114
):
113115
project = projects_domain.Project(
114116
id=id,
@@ -118,7 +120,8 @@ def _make_project(
118120
customer_id=customer_id,
119121
status=status,
120122
deleted=deleted,
121-
technologies=technologies
123+
technologies=technologies,
124+
customer=customer
122125
)
123126
return project
124127
return _make_project
@@ -131,3 +134,15 @@ def _new_customer(customer: customers_domain.Customer, database: DB):
131134
new_customer = dao.create(customer)
132135
return new_customer
133136
return _new_customer
137+
138+
139+
@pytest.fixture(name='insert_project')
140+
def _insert_project(test_db, insert_customer, project_factory, customer_factory) -> projects_domain.Project:
141+
inserted_customer = insert_customer(customer_factory(), test_db)
142+
143+
def _new_project():
144+
project_to_insert = project_factory(id=None, customer_id=inserted_customer.id, deleted=False)
145+
dao = projects_infrastructure.ProjectsSQLDao(test_db)
146+
inserted_project = dao.create(project_to_insert)
147+
return inserted_project
148+
return _new_project

V2/tests/integration/daos/projects_dao_test.py

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

99

10-
@pytest.fixture(name='insert_project')
11-
def _insert_project(customer_factory, test_db, insert_customer, create_fake_dao, project_factory) -> domain.Project:
12-
inserted_customer = insert_customer(customer_factory(), test_db)
13-
14-
def _new_project():
15-
project_to_insert = project_factory(customer_id=inserted_customer.id)
16-
inserted_project = create_fake_dao.create(project_to_insert)
17-
return inserted_project
18-
19-
return _new_project
20-
21-
2210
@pytest.fixture(name='create_fake_dao')
2311
def _create_fake_dao() -> domain.ProjectsDao:
2412
db_fake = DB()
@@ -44,6 +32,9 @@ def test__create_project__returns_a_project_dto__when_saves_correctly_with_sql_d
4432

4533
inserted_project = dao.create(project_to_insert)
4634

35+
expected_project = project_to_insert.__dict__
36+
expected_project.update({"customer": inserted_customer.__dict__})
37+
4738
assert isinstance(inserted_project, domain.Project)
4839
assert inserted_project == project_to_insert
4940

@@ -85,6 +76,7 @@ def test__get_all__returns_a_list_of_project_dto_objects__when_one_or_more_proje
8576
]
8677

8778
projects = dao.get_all()
79+
8880
assert isinstance(projects, typing.List)
8981
assert projects == inserted_projects
9082

V2/tests/integration/daos/time_entries_dao_test.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ def _clean_database():
2626

2727

2828
def test__time_entry__returns_a_time_entry_dto__when_saves_correctly_with_sql_database(
29-
test_db, time_entry_factory, create_fake_dao, insert_activity, activity_factory
29+
test_db, time_entry_factory, create_fake_dao, insert_activity, activity_factory, insert_project
3030
):
3131
dao = create_fake_dao(test_db)
3232
inserted_activity = insert_activity(activity_factory(), dao.db)
33-
34-
time_entry_to_insert = time_entry_factory(activity_id=inserted_activity.id)
33+
inserted_project = insert_project()
34+
time_entry_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
3535

3636
inserted_time_entry = dao.create(time_entry_to_insert)
3737

@@ -51,12 +51,13 @@ def test__time_entry__returns_None__when_not_saves_correctly(
5151

5252

5353
def test_delete__returns_an_time_entry_with_true_deleted__when_an_time_entry_matching_its_id_is_found(
54-
create_fake_dao, test_db, time_entry_factory, insert_activity, activity_factory
54+
create_fake_dao, test_db, time_entry_factory, insert_activity, activity_factory, insert_project
5555
):
5656
dao = create_fake_dao(test_db)
57+
inserted_project = insert_project()
5758
inserted_activity = insert_activity(activity_factory(), dao.db)
58-
existent_time_entry = time_entry_factory(activity_id=inserted_activity.id)
59-
inserted_time_entry = dao.create(existent_time_entry)
59+
time_entry_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
60+
inserted_time_entry = dao.create(time_entry_to_insert)
6061

6162
result = dao.delete(inserted_time_entry.id)
6263

@@ -74,18 +75,17 @@ def test_delete__returns_none__when_no_time_entry_matching_its_id_is_found(
7475

7576

7677
def test_get_latest_entries__returns_a_list_of_latest_time_entries__when_an_owner_id_match(
77-
create_fake_dao, time_entry_factory, insert_activity, activity_factory, test_db
78+
create_fake_dao, time_entry_factory, insert_activity, activity_factory, test_db, insert_project
7879
):
7980
dao = create_fake_dao(test_db)
81+
inserted_project = insert_project()
8082
inserted_activity = insert_activity(activity_factory(), dao.db)
81-
time_entry_to_insert = time_entry_factory(
82-
activity_id=inserted_activity.id,
83-
technologies="[jira,sql]")
84-
inserted_time_entry = dao.create(time_entry_to_insert)
83+
time_entry_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
84+
inserted_time_entry = dao.create(time_entry_to_insert).__dict__
8585

86-
result = dao.get_latest_entries(int(inserted_time_entry.owner_id))
86+
result = dao.get_latest_entries(int(inserted_time_entry["owner_id"]))
8787

88-
assert result == [inserted_time_entry.__dict__]
88+
assert result == [inserted_time_entry]
8989

9090

9191
def test_get_latest_entries__returns_none__when_an_owner_id_is_not_found(
@@ -100,30 +100,33 @@ def test_get_latest_entries__returns_none__when_an_owner_id_is_not_found(
100100

101101

102102
def test_update__returns_an_time_entry_dto__when_found_one_time_entry_to_update(
103-
test_db, create_fake_dao, time_entry_factory, insert_activity, activity_factory
103+
test_db, create_fake_dao, time_entry_factory, insert_activity, activity_factory, insert_project
104104
):
105105
dao = create_fake_dao(test_db)
106+
inserted_project = insert_project()
106107
inserted_activity = insert_activity(activity_factory(), dao.db)
107-
existent_time_entries = time_entry_factory(activity_id=inserted_activity.id)
108-
inserted_time_entries = dao.create(existent_time_entries).__dict__
109-
time_entry_id = inserted_time_entries["id"]
110-
inserted_time_entries.update({"description": "description updated"})
108+
time_entry_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
109+
inserted_time_entry = dao.create(time_entry_to_insert).__dict__
110+
111+
time_entry_id = inserted_time_entry["id"]
112+
inserted_time_entry.update({"description": "description updated"})
111113

112-
time_entry = dao.update(time_entry_id=time_entry_id, time_entry_data=inserted_time_entries)
114+
time_entry = dao.update(time_entry_id=time_entry_id, time_entry_data=inserted_time_entry)
113115

114116
assert time_entry.id == time_entry_id
115-
assert time_entry.description == inserted_time_entries.get("description")
117+
assert time_entry.description == inserted_time_entry.get("description")
116118

117119

118120
def test_update__returns_none__when_doesnt_found_one_time_entry_to_update(
119-
test_db, create_fake_dao, time_entry_factory, insert_activity, activity_factory
121+
test_db, create_fake_dao, time_entry_factory, insert_activity, activity_factory, insert_project
120122
):
121123
dao = create_fake_dao(test_db)
124+
inserted_project = insert_project()
122125
inserted_activity = insert_activity(activity_factory(), dao.db)
123-
existent_time_entries = time_entry_factory(activity_id=inserted_activity.id)
124-
inserted_time_entries = dao.create(existent_time_entries).__dict__
126+
time_entry_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
127+
inserted_time_entry = dao.create(time_entry_to_insert).__dict__
125128

126-
time_entry = dao.update(0, inserted_time_entries)
129+
time_entry = dao.update(0, inserted_time_entry)
127130

128131
assert time_entry is None
129132

V2/time_tracker/projects/_application/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
from ._projects import create_project
33
from ._projects import delete_project
44
from ._projects import get_projects
5-
from ._projects import update_project
5+
from ._projects import update_project
6+
from ._projects import get_latest_projects

V2/time_tracker/projects/_application/_projects/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
from ._create_project import create_project
33
from ._delete_project import delete_project
44
from ._get_projects import get_projects
5-
from ._update_project import update_project
5+
from ._update_project import update_project
6+
from ._get_latest_projects import get_latest_projects

V2/time_tracker/projects/_application/_projects/_create_project.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ def create_project(req: func.HttpRequest) -> func.HttpResponse:
3131
customer_id=project_data["customer_id"],
3232
status=project_data["status"],
3333
deleted=False,
34-
technologies=project_data["technologies"]
34+
technologies=project_data["technologies"],
35+
customer=None
3536
)
3637

3738
created_project = use_case.create_project(project_to_create)

0 commit comments

Comments
 (0)