Skip to content

Commit da64eef

Browse files
committed
test: TT-417 add test of projects
1 parent 237d47e commit da64eef

File tree

14 files changed

+514
-43
lines changed

14 files changed

+514
-43
lines changed
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
import json
2+
3+
import pytest
4+
from faker import Faker
5+
import azure.functions as func
6+
7+
from time_tracker.projects._application import _projects as azure_projects
8+
from time_tracker.projects import _domain as domain
9+
from time_tracker.projects import _infrastructure as infrastructure
10+
from time_tracker._infrastructure import DB
11+
12+
PROJECT_URL = '/api/projects/'
13+
14+
15+
@pytest.fixture(name='insert_project')
16+
def _insert_project() -> domain.Project:
17+
def _new_project(project: domain.Project, database: DB):
18+
dao = infrastructure.ProjectsSQLDao(database)
19+
new_project = dao.create(project)
20+
return new_project
21+
return _new_project
22+
23+
24+
def test__project_azure_endpoint__returns_all_projects(
25+
test_db, project_factory, insert_project
26+
):
27+
project_to_insert = [project_factory(), project_factory()]
28+
inserted_projects = [
29+
insert_project(project_to_insert[0], test_db).__dict__,
30+
insert_project(project_to_insert[1], test_db).__dict__
31+
]
32+
33+
req = func.HttpRequest(method='GET', body=None, url=PROJECT_URL)
34+
response = azure_projects._get_projects.get_projects(req)
35+
projects_json_data = response.get_body().decode("utf-8")
36+
37+
assert response.status_code == 200
38+
assert projects_json_data == json.dumps(inserted_projects)
39+
40+
41+
def test__project_azure_endpoint__returns_an_project__when_project_matches_its_id(
42+
test_db, project_factory, insert_project
43+
):
44+
project_to_insert = project_factory()
45+
inserted_project = insert_project(project_to_insert, test_db).__dict__
46+
47+
req = func.HttpRequest(
48+
method='GET',
49+
body=None,
50+
url=PROJECT_URL,
51+
route_params={"id": inserted_project["id"]},
52+
)
53+
54+
response = azure_projects._get_projects.get_projects(req)
55+
activitiy_json_data = response.get_body().decode("utf-8")
56+
57+
assert response.status_code == 200
58+
assert activitiy_json_data == json.dumps(inserted_project)
59+
60+
61+
def test__projects_azure_endpoint__returns_a_status_code_400__when_project_recive_invalid_id(
62+
):
63+
req = func.HttpRequest(
64+
method="GET",
65+
body=None,
66+
url=PROJECT_URL,
67+
route_params={"id": "invalid id"},
68+
)
69+
70+
response = azure_projects._get_projects.get_projects(req)
71+
72+
assert response.status_code == 400
73+
assert response.get_body() == b'Invalid Format ID'
74+
75+
76+
def test__project_azure_endpoint__returns_an_project_with_inactive_status__when_an_project_matching_its_id_is_found(
77+
test_db, project_factory, insert_project
78+
):
79+
project_to_insert = project_factory()
80+
inserted_project = insert_project(project_to_insert, test_db).__dict__
81+
82+
req = func.HttpRequest(
83+
method='DELETE',
84+
body=None,
85+
url=PROJECT_URL,
86+
route_params={"id": inserted_project["id"]},
87+
)
88+
89+
response = azure_projects._delete_project.delete_project(req)
90+
project_json_data = json.loads(response.get_body().decode("utf-8"))
91+
92+
assert response.status_code == 200
93+
assert project_json_data['status'] == 0
94+
assert project_json_data['deleted'] is True
95+
96+
97+
def test__delete_projects_azure_endpoint__returns_a_status_code_400__when_project_recive_invalid_id(
98+
):
99+
req = func.HttpRequest(
100+
method="DELETE",
101+
body=None,
102+
url=PROJECT_URL,
103+
route_params={"id": "invalid id"},
104+
)
105+
106+
response = azure_projects._delete_project.delete_project(req)
107+
108+
assert response.status_code == 400
109+
assert response.get_body() == b'Invalid Format ID'
110+
111+
112+
def test__update_project_azure_endpoint__returns_an_project__when_found_an_project_to_update(
113+
test_db, project_factory, insert_project
114+
):
115+
project_to_insert = project_factory()
116+
inserted_project = insert_project(project_to_insert, test_db).__dict__
117+
118+
project_body = {"description": Faker().sentence()}
119+
req = func.HttpRequest(
120+
method='PUT',
121+
body=json.dumps(project_body).encode("utf-8"),
122+
url=PROJECT_URL,
123+
route_params={"id": inserted_project["id"]},
124+
)
125+
126+
response = azure_projects._update_project.update_project(req)
127+
activitiy_json_data = response.get_body().decode("utf-8")
128+
inserted_project.update(project_body)
129+
130+
assert response.status_code == 200
131+
assert activitiy_json_data == json.dumps(inserted_project)
132+
133+
134+
def test__update_projects_azure_endpoint__returns_a_status_code_400__when_project_recive_invalid_id(
135+
):
136+
req = func.HttpRequest(
137+
method="PUT",
138+
body=None,
139+
url=PROJECT_URL,
140+
route_params={"id": "invalid id"},
141+
)
142+
143+
response = azure_projects._update_project.update_project(req)
144+
145+
assert response.status_code == 400
146+
assert response.get_body() == b'Invalid Format ID'
147+
148+
149+
def test__project_azure_endpoint__creates_an_project__when_project_has_all_attributes(
150+
project_factory
151+
):
152+
project_body = project_factory().__dict__
153+
body = json.dumps(project_body).encode("utf-8")
154+
req = func.HttpRequest(
155+
method='POST',
156+
body=body,
157+
url=PROJECT_URL,
158+
)
159+
160+
response = azure_projects._create_project.create_project(req)
161+
project_json_data = json.loads(response.get_body())
162+
project_body['id'] = project_json_data['id']
163+
164+
assert response.status_code == 201
165+
assert project_json_data == project_body

V2/tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +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
5+
from fixtures import _project_factory

V2/tests/fixtures.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
from faker import Faker
33

44
import time_tracker.activities._domain as activities_domain
5+
import time_tracker.activities._infrastructure as activities_infrastructure
56
import time_tracker.time_entries._domain as time_entries_domain
67
import time_tracker.customers._domain as customers_domain
7-
import time_tracker.activities._infrastructure as activities_infrastructure
8+
import time_tracker.projects._domain as projects_domain
89
from time_tracker._infrastructure import DB
910

1011

@@ -94,3 +95,27 @@ def _make_customer(
9495
return customer
9596

9697
return _make_customer
98+
@pytest.fixture(name='project_factory')
99+
def _project_factory() -> projects_domain.Project:
100+
def _make_project(
101+
id=Faker().pyint(),
102+
name=Faker().name(),
103+
description=Faker().sentence(),
104+
project_type_id=Faker().pyint(),
105+
customer_id=Faker().pyint(),
106+
status=Faker().pyint(),
107+
deleted=False,
108+
technologies=str(Faker().pylist())
109+
):
110+
project = projects_domain.Project(
111+
id=id,
112+
name=name,
113+
description=description,
114+
project_type_id=project_type_id,
115+
customer_id=customer_id,
116+
status=status,
117+
deleted=deleted,
118+
technologies=technologies
119+
)
120+
return project
121+
return _make_project
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import pytest
2+
import typing
3+
from faker import Faker
4+
5+
from time_tracker.projects import _domain as domain
6+
from time_tracker.projects import _infrastructure as infrastructure
7+
from time_tracker._infrastructure import DB
8+
9+
10+
@pytest.fixture(name='create_fake_dao')
11+
def _create_fake_dao() -> domain.ProjectsDao:
12+
db_fake = DB()
13+
dao = infrastructure.ProjectsSQLDao(db_fake)
14+
return dao
15+
16+
17+
@pytest.fixture(name='clean_database', autouse=True)
18+
def _clean_database():
19+
yield
20+
db_fake = DB()
21+
dao = infrastructure.ProjectsSQLDao(db_fake)
22+
query = dao.project.delete()
23+
dao.db.get_session().execute(query)
24+
25+
26+
def test__create_project__returns_a_project_dto__when_saves_correctly_with_sql_database(
27+
create_fake_dao, project_factory
28+
):
29+
dao = create_fake_dao
30+
project_to_insert = project_factory()
31+
32+
inserted_project = dao.create(project_to_insert)
33+
34+
assert isinstance(inserted_project, domain.Project)
35+
assert inserted_project == project_to_insert
36+
37+
38+
def test_update__returns_an_update_project__when_an_project_matching_its_id_is_found_with_sql_database(
39+
create_fake_dao, project_factory
40+
):
41+
dao = create_fake_dao
42+
project_to_insert = project_factory()
43+
inserted_project = dao.create(project_to_insert)
44+
45+
expected_description = Faker().sentence()
46+
updated_project = dao.update(inserted_project.id, {"description": expected_description})
47+
48+
assert isinstance(updated_project, domain.Project)
49+
assert updated_project.id == inserted_project.id
50+
assert updated_project.description == expected_description
51+
52+
53+
def test_update__returns_none__when_no_project_matching_its_id_is_found_with_sql_database(
54+
create_fake_dao, project_factory
55+
):
56+
dao = create_fake_dao
57+
project_to_insert = project_factory()
58+
59+
results = dao.update(project_to_insert.id, {"description": Faker().sentence()})
60+
61+
assert results is None
62+
63+
64+
def test__get_all__returns_a_list_of_project_dto_objects__when_one_or_more_projects_are_found_with_sql_database(
65+
create_fake_dao, project_factory
66+
):
67+
dao = create_fake_dao
68+
project_to_inserts = [project_factory(), project_factory()]
69+
inserted_projects = [
70+
dao.create(project_to_inserts[0]),
71+
dao.create(project_to_inserts[1])
72+
]
73+
74+
projects = dao.get_all()
75+
assert isinstance(projects, typing.List)
76+
assert projects == inserted_projects
77+
78+
79+
def test_get_by_id__returns_an_project_dto__when_found_one_project_that_matches_its_id_with_sql_database(
80+
create_fake_dao, project_factory
81+
):
82+
dao = create_fake_dao
83+
project_to_insert = project_factory()
84+
inserted_project = dao.create(project_to_insert)
85+
86+
project = dao.get_by_id(inserted_project.id)
87+
88+
assert isinstance(project, domain.Project)
89+
assert project.id == inserted_project.id
90+
assert project == inserted_project
91+
92+
93+
def test__get_by_id__returns_none__when_no_project_matches_its_id_with_sql_database(
94+
create_fake_dao, project_factory
95+
):
96+
dao = create_fake_dao
97+
project_to_insert = project_factory()
98+
99+
project = dao.get_by_id(project_to_insert.id)
100+
101+
assert project is None
102+
103+
104+
def test_get_all__returns_an_empty_list__when_doesnt_found_any_projects_with_sql_database(
105+
create_fake_dao
106+
):
107+
projects = create_fake_dao.get_all()
108+
109+
assert isinstance(projects, typing.List)
110+
assert projects == []
111+
112+
113+
def test_delete__returns_an_project_with_inactive_status__when_an_project_matching_its_id_is_found_with_sql_database(
114+
create_fake_dao, project_factory
115+
):
116+
dao = create_fake_dao
117+
project_to_insert = project_factory()
118+
inserted_project = dao.create(project_to_insert)
119+
120+
project = dao.delete(inserted_project.id)
121+
122+
assert isinstance(project, domain.Project)
123+
assert project.id == inserted_project.id
124+
assert project.status == 0
125+
assert project.deleted is True
126+
127+
128+
def test_delete__returns_none__when_no_project_matching_its_id_is_found_with_sql_database(
129+
create_fake_dao, project_factory
130+
):
131+
dao = create_fake_dao
132+
project_to_insert = project_factory()
133+
134+
results = dao.delete(project_to_insert.id)
135+
136+
assert results is None

0 commit comments

Comments
 (0)