Skip to content

Commit aedf3d2

Browse files
Jobziararcos
andauthored
feat: TT-414 get latest projects (#363)
feat: TT-414 created get latest project, use case, service, dao test: TT-414 add test to get latest projects Co-authored-by: Alexander <[email protected]>
1 parent 1db51d6 commit aedf3d2

File tree

26 files changed

+334
-124
lines changed

26 files changed

+334
-124
lines changed

V2/serverless.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ functions:
225225

226226
authLevel: anonymous
227227

228+
get_latest_projects:
229+
handler: time_tracker/projects/interface.get_latest_projects
230+
events:
231+
- http: true
232+
x-azure-settings:
233+
methods:
234+
- GET
235+
route: projects/latest
236+
authLevel: anonymous
237+
228238
#endregion End Functions Projects
229239

230-
#endregion End Functions
240+
#endregion End Functions

V2/tests/api/azure/project_azure_endpoints_test.py

Lines changed: 39 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

@@ -249,3 +232,40 @@ def test__project_azure_endpoint__returns_a_status_code_500__when_project_receiv
249232

250233
assert response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR
251234
assert response.get_body() == b"could not be created"
235+
236+
237+
def test__get_latest_projects_azure_endpoint__returns_a_list_of_latest_projects__when_an_owner_id_match(
238+
insert_time_entry
239+
):
240+
inserted_time_entry = insert_time_entry().__dict__
241+
242+
req = func.HttpRequest(
243+
method='GET',
244+
body=None,
245+
url=PROJECT_URL+"latest/",
246+
params={"owner_id": inserted_time_entry["owner_id"]},
247+
)
248+
249+
response = azure_projects._get_latest_projects.get_latest_projects(req)
250+
projects_json_data = json.loads(response.get_body().decode("utf-8"))
251+
252+
assert response.status_code == HTTPStatus.OK
253+
assert inserted_time_entry["project_id"] == projects_json_data[0]["id"]
254+
255+
256+
def test__get_latest_projects_azure_endpoint__returns_an_empty_list__when_an_owner_id_not_match(
257+
insert_time_entry
258+
):
259+
insert_time_entry().__dict__
260+
261+
req = func.HttpRequest(
262+
method='GET',
263+
body=None,
264+
url=PROJECT_URL+"latest/",
265+
)
266+
267+
response = azure_projects._get_latest_projects.get_latest_projects(req)
268+
projects_json_data = json.loads(response.get_body().decode("utf-8"))
269+
270+
assert response.status_code == HTTPStatus.OK
271+
assert projects_json_data == []

V2/tests/api/azure/time_entry_azure_endpoints_test.py

Lines changed: 60 additions & 36 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(
@@ -82,10 +83,11 @@ def test__delete_time_entries_azure_endpoint__returns_a_status_code_400__when_ti
8283

8384

8485
def test__time_entry_azure_endpoint__returns_all_time_entries(
85-
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
86+
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
8687
):
88+
inserted_project = insert_project()
8789
inserted_activity = insert_activity(activity_factory(), test_db)
88-
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id)
90+
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
8991
inserted_time_entries = insert_time_entry(time_entries_to_insert, test_db).__dict__
9092

9193
req = func.HttpRequest(method="GET", body=None, url=TIME_ENTRY_URL)
@@ -99,10 +101,11 @@ def test__time_entry_azure_endpoint__returns_all_time_entries(
99101

100102

101103
def test__time_entry_azure_endpoint__returns_an_time_entry__when_time_entry_matches_its_id(
102-
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
104+
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
103105
):
106+
inserted_project = insert_project()
104107
inserted_activity = insert_activity(activity_factory(), test_db)
105-
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id)
108+
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
106109
inserted_time_entries = insert_time_entry(time_entries_to_insert, test_db).__dict__
107110

108111
req = func.HttpRequest(
@@ -120,10 +123,11 @@ def test__time_entry_azure_endpoint__returns_an_time_entry__when_time_entry_matc
120123

121124

122125
def test__get_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_id(
123-
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
126+
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
124127
):
128+
inserted_project = insert_project()
125129
inserted_activity = insert_activity(activity_factory(), test_db)
126-
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id)
130+
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
127131
insert_time_entry(time_entries_to_insert, test_db).__dict__
128132

129133
req = func.HttpRequest(
@@ -139,28 +143,69 @@ def test__get_time_entries_azure_endpoint__returns_a_status_code_400__when_time_
139143
assert response.get_body() == b'Invalid Format ID'
140144

141145

146+
def test__get_latest_entries_azure_endpoint__returns_a_list_of_latest_time_entries__when_an_owner_id_match(
147+
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory, insert_project
148+
):
149+
inserted_project = insert_project()
150+
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
151+
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
152+
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__
153+
154+
req = func.HttpRequest(
155+
method='GET',
156+
body=None,
157+
url=TIME_ENTRY_URL+"latest/",
158+
params={"owner_id": inserted_time_entry["owner_id"]},
159+
)
160+
161+
response = azure_time_entries._get_latest_entries.get_latest_entries(req)
162+
time_entry_json_data = json.loads(response.get_body().decode("utf-8"))
163+
164+
assert response.status_code == 200
165+
assert time_entry_json_data == [inserted_time_entry]
166+
167+
168+
def test__get_latest_entries_azure_endpoint__returns_no_time_entries_found__when_recieve_an_invalid_owner_id(
169+
test_db, insert_activity, activity_factory,
170+
):
171+
insert_activity(activity_factory(), test_db)
172+
173+
req = func.HttpRequest(
174+
method='GET',
175+
body=None,
176+
url=TIME_ENTRY_URL+"latest/",
177+
params={"owner_id": Faker().pyint()},
178+
)
179+
180+
response = azure_time_entries._get_latest_entries.get_latest_entries(req)
181+
182+
assert response.status_code == 404
183+
assert response.get_body() == b'Not found'
184+
185+
142186
def test__update_time_entry_azure_endpoint__returns_an_time_entry__when_found_an_time_entry_to_update(
143-
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
187+
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
144188
):
145-
inserted_activity = insert_activity(activity_factory(), test_db)
146-
existent_time_entries = time_entry_factory(activity_id=inserted_activity.id)
147-
inserted_time_entries = insert_time_entry(existent_time_entries, test_db).__dict__
189+
inserted_project = insert_project()
190+
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
191+
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
192+
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__
148193

149194
time_entry_body = {"description": Faker().sentence()}
150195

151196
req = func.HttpRequest(
152197
method='PUT',
153198
body=json.dumps(time_entry_body).encode("utf-8"),
154199
url=TIME_ENTRY_URL,
155-
route_params={"id": inserted_time_entries["id"]},
200+
route_params={"id": inserted_time_entry["id"]},
156201
)
157202

158203
response = azure_time_entries._update_time_entry.update_time_entry(req)
159204
activitiy_json_data = response.get_body().decode("utf-8")
160-
inserted_time_entries.update(time_entry_body)
205+
inserted_time_entry.update(time_entry_body)
161206

162207
assert response.status_code == 200
163-
assert activitiy_json_data == json.dumps(inserted_time_entries)
208+
assert activitiy_json_data == json.dumps(inserted_time_entry)
164209

165210

166211
def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_format_id():
@@ -211,27 +256,6 @@ def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_ti
211256
assert response.get_body() == b'Incorrect time entry body'
212257

213258

214-
def test__get_latest_entries_azure_endpoint__returns_a_list_of_latest_time_entries__when_an_owner_id_match(
215-
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory,
216-
):
217-
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
218-
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], technologies="[jira,sql]")
219-
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__
220-
221-
req = func.HttpRequest(
222-
method='GET',
223-
body=None,
224-
url=TIME_ENTRY_URL+"latest/",
225-
params={"owner_id": inserted_time_entry["owner_id"]},
226-
)
227-
228-
response = azure_time_entries._get_latest_entries.get_latest_entries(req)
229-
time_entry_json_data = json.loads(response.get_body().decode("utf-8"))
230-
231-
assert response.status_code == HTTPStatus.OK
232-
assert time_entry_json_data == [inserted_time_entry]
233-
234-
235259
def test__get_latest_entries_azure_endpoint__returns_not_found__when_recieve_an_invalid_owner_id(
236260
test_db, insert_activity, activity_factory,
237261
):

V2/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# flake8: noqa
22
from fixtures import _activity_factory, _test_db, _insert_activity
3-
from fixtures import _time_entry_factory
3+
from fixtures import _time_entry_factory, _insert_time_entry
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: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33

44
import time_tracker.activities._domain as activities_domain
55
import time_tracker.time_entries._domain as time_entries_domain
6+
import time_tracker.time_entries._infrastructure as time_entries_infrastructure
67
import time_tracker.customers._domain as customers_domain
78
import time_tracker.activities._infrastructure as activities_infrastructure
89
import time_tracker.customers._infrastructure as customers_infrastructure
910
import time_tracker.projects._domain as projects_domain
11+
import time_tracker.projects._infrastructure as projects_infrastructure
1012
from time_tracker._infrastructure import DB
1113

1214

@@ -108,7 +110,8 @@ def _make_project(
108110
customer_id=Faker().pyint(),
109111
status=Faker().pyint(),
110112
deleted=False,
111-
technologies=str(Faker().pylist())
113+
technologies=str(Faker().pylist()),
114+
customer=None
112115
):
113116
project = projects_domain.Project(
114117
id=id,
@@ -118,7 +121,8 @@ def _make_project(
118121
customer_id=customer_id,
119122
status=status,
120123
deleted=deleted,
121-
technologies=technologies
124+
technologies=technologies,
125+
customer=customer
122126
)
123127
return project
124128
return _make_project
@@ -131,3 +135,34 @@ def _new_customer(customer: customers_domain.Customer, database: DB):
131135
new_customer = dao.create(customer)
132136
return new_customer
133137
return _new_customer
138+
139+
140+
@pytest.fixture(name='insert_project')
141+
def _insert_project(test_db, insert_customer, project_factory, customer_factory) -> projects_domain.Project:
142+
inserted_customer = insert_customer(customer_factory(), test_db)
143+
144+
def _new_project():
145+
project_to_insert = project_factory(id=None, customer_id=inserted_customer.id, deleted=False)
146+
dao = projects_infrastructure.ProjectsSQLDao(test_db)
147+
inserted_project = dao.create(project_to_insert)
148+
return inserted_project
149+
return _new_project
150+
151+
152+
@pytest.fixture(name='insert_time_entry')
153+
def _insert_time_entry(
154+
test_db, insert_project, activity_factory, insert_activity, time_entry_factory
155+
) -> time_entries_domain.TimeEntry:
156+
157+
inserted_project = insert_project()
158+
inserted_activity = insert_activity(activity_factory(), test_db)
159+
160+
def _new_time_entry(owner_id: int = Faker().pyint()):
161+
dao = time_entries_infrastructure.TimeEntriesSQLDao(test_db)
162+
time_entries_to_insert = time_entry_factory(
163+
activity_id=inserted_activity.id, project_id=inserted_project.id, owner_id=owner_id
164+
)
165+
166+
inserted_time_entries = dao.create(time_entries_to_insert)
167+
return inserted_time_entries
168+
return _new_time_entry

0 commit comments

Comments
 (0)