Skip to content

Commit 47edb1a

Browse files
committed
test: TT-404 add time entries test
1 parent d3abc38 commit 47edb1a

File tree

6 files changed

+282
-7
lines changed

6 files changed

+282
-7
lines changed

V2/tests/api/api_fixtures.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import json
2+
import pytest
3+
import shutil
4+
5+
6+
@pytest.fixture
7+
def create_temp_activities(tmpdir_factory):
8+
temporary_directory = tmpdir_factory.mktemp("tmp")
9+
json_file = temporary_directory.join("activities.json")
10+
activities = [
11+
{
12+
'id': 'c61a4a49-3364-49a3-a7f7-0c5f2d15072b',
13+
'name': 'Development',
14+
'description': 'Development',
15+
'deleted': 'b4327ba6-9f96-49ee-a9ac-3c1edf525172',
16+
'status': 'active',
17+
'tenant_id': 'cc925a5d-9644-4a4f-8d99-0bee49aadd05',
18+
},
19+
{
20+
'id': '94ec92e2-a500-4700-a9f6-e41eb7b5507c',
21+
'name': 'Management',
22+
'description': 'Description of management',
23+
'deleted': '7cf6efe5-a221-4fe4-b94f-8945127a489a',
24+
'status': 'active',
25+
'tenant_id': 'cc925a5d-9644-4a4f-8d99-0bee49aadd05',
26+
},
27+
{
28+
'id': 'd45c770a-b1a0-4bd8-a713-22c01a23e41b',
29+
'name': 'Operations',
30+
'description': 'Operation activities performed.',
31+
'deleted': '7cf6efe5-a221-4fe4-b94f-8945127a489a',
32+
'status': 'active',
33+
'tenant_id': 'cc925a5d-9644-4a4f-8d99-0bee49aadd05',
34+
},
35+
]
36+
37+
with open(json_file, 'w') as outfile:
38+
json.dump(activities, outfile)
39+
40+
yield activities, json_file
41+
shutil.rmtree(temporary_directory)
42+
43+
44+
@pytest.fixture
45+
def create_temp_time_entries(tmpdir_factory):
46+
temporary_directory = tmpdir_factory.mktemp("tmp")
47+
json_file = temporary_directory.join("time_entries.json")
48+
activities = [
49+
{
50+
"id": 1,
51+
"start_date": "12/07/2021",
52+
"owner_id": 2,
53+
"description": "No se que poner jajaj ",
54+
"activity_id": 2,
55+
"uri": "http://hola.que.hace.com",
56+
"technologies": ["git", "jira", "python"],
57+
"end_date": "12/07/2021",
58+
"deleted": "asdasdsaadssa",
59+
"timezone_offset": "asdasdsa",
60+
"project_id": 1
61+
}, {
62+
"id": 2,
63+
"start_date": "12/07/2021",
64+
"owner_id": 2,
65+
"description": "No se que poner jajaj ",
66+
"activity_id": 2,
67+
"uri": "http://hola.que.hace.com",
68+
"technologies": ["git", "jira", "python"],
69+
"end_date": "12/07/2021",
70+
"deleted": "asdasdsaadssa",
71+
"timezone_offset": "asdasdsa",
72+
"project_id": 1
73+
}, {
74+
"id": 3,
75+
"start_date": "12/07/2021",
76+
"owner_id": 2,
77+
"description": "No se que poner jajaj ",
78+
"activity_id": 2,
79+
"uri": "http://hola.que.hace.com",
80+
"technologies": ["git", "jira", "python"],
81+
"end_date": "12/07/2021",
82+
"deleted": "asdasdsaadssa",
83+
"timezone_offset": "asdasdsa",
84+
"project_id": 1
85+
}
86+
]
87+
88+
with open(json_file, 'w') as outfile:
89+
json.dump(activities, outfile)
90+
91+
yield activities, json_file
92+
shutil.rmtree(temporary_directory)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from time_tracker.time_entries._application import _time_entries as time_entries
2+
3+
import azure.functions as func
4+
import json
5+
6+
7+
TIME_ENTRY_URL = "/api/time_entries/"
8+
9+
10+
def test__time_entry_azure_endpoint__returns_all_time_entries(
11+
create_temp_time_entries,
12+
):
13+
time_entries_json, tmp_directory = create_temp_time_entries
14+
time_entries._get_time_entries.JSON_PATH = tmp_directory
15+
req = func.HttpRequest(method="GET", body=None, url=TIME_ENTRY_URL)
16+
17+
response = time_entries.get_time_entries(req)
18+
time_entries_json_data = response.get_body().decode("utf-8")
19+
20+
assert response.status_code == 200
21+
assert time_entries_json_data == json.dumps(time_entries_json)
22+
23+
24+
def test__time_entry_azure_endpoint__returns_an_time_entry__when_time_entry_matches_its_id(
25+
create_temp_time_entries,
26+
):
27+
time_entries_json, tmp_directory = create_temp_time_entries
28+
time_entries._get_time_entries.JSON_PATH = tmp_directory
29+
req = func.HttpRequest(
30+
method="GET",
31+
body=None,
32+
url=TIME_ENTRY_URL,
33+
route_params={"id": time_entries_json[0]["id"]},
34+
)
35+
36+
response = time_entries.get_time_entries(req)
37+
time_entry_json_data = response.get_body().decode("utf-8")
38+
39+
assert response.status_code == 200
40+
assert time_entry_json_data == json.dumps(time_entries_json[0])
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from time_tracker.time_entries._infrastructure import TimeEntriesJsonDao
2+
from time_tracker.time_entries._domain import TimeEntry
3+
from faker import Faker
4+
import json
5+
import pytest
6+
import typing
7+
import random
8+
9+
fake_time_entries = [
10+
{
11+
"id": Faker().uuid4(),
12+
"start_date": str(Faker().date_time()),
13+
"owner_id": Faker().uuid4(),
14+
"description": Faker().sentence(),
15+
"activity_id": Faker().uuid4(),
16+
"uri": Faker().uri(),
17+
"technologies": [Faker().name() for x in range(random.randrange(5))],
18+
"end_date": str(Faker().date_time()),
19+
"deleted": Faker().uuid4(),
20+
"timezone_offset": str(Faker().date_time()),
21+
"project_id": Faker().uuid4(),
22+
}
23+
]
24+
25+
26+
@pytest.fixture(name="create_fake_time_entries")
27+
def _create_fake_time_entries(mocker) -> typing.List[TimeEntry]:
28+
def _creator(time_entries):
29+
read_data = json.dumps(time_entries)
30+
mocker.patch("builtins.open", mocker.mock_open(read_data=read_data))
31+
return [TimeEntry(**time_entry) for time_entry in time_entries]
32+
33+
return _creator
34+
35+
36+
def test_get_by_id__returns_an_time_entry_dto__when_found_one_time_entry_that_matches_its_id(
37+
create_fake_time_entries,
38+
):
39+
print(fake_time_entries)
40+
time_entries_json_dao = TimeEntriesJsonDao(Faker().file_path())
41+
time_entries = create_fake_time_entries(fake_time_entries)
42+
time_entries_dto = time_entries.pop()
43+
44+
result = time_entries_json_dao.get_by_id(time_entries_dto.id)
45+
46+
assert result == time_entries_dto
47+
48+
49+
def test__get_by_id__returns_none__when_no_time_entry_matches_its_id(
50+
create_fake_time_entries,
51+
):
52+
time_entries_json_dao = TimeEntriesJsonDao(Faker().file_path())
53+
create_fake_time_entries([])
54+
55+
result = time_entries_json_dao.get_by_id(Faker().uuid4())
56+
57+
assert result is None
58+
59+
60+
def test__get_all__returns_a_list_of_time_entry_dto_objects__when_one_or_more_time_entries_are_found(
61+
create_fake_time_entries,
62+
):
63+
time_entries_json_dao = TimeEntriesJsonDao(Faker().file_path())
64+
number_of_time_entries = 3
65+
time_entries = create_fake_time_entries(fake_time_entries * number_of_time_entries)
66+
67+
result = time_entries_json_dao.get_all()
68+
69+
assert result == time_entries
70+
71+
72+
def test_get_all__returns_an_empty_list__when_doesnt_found_any_time_entries(
73+
create_fake_time_entries,
74+
):
75+
time_entries_json_dao = TimeEntriesJsonDao(Faker().file_path())
76+
time_entries = create_fake_time_entries([])
77+
78+
result = time_entries_json_dao.get_all()
79+
80+
assert result == time_entries
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from time_tracker.time_entries._domain import TimeEntryService
2+
from faker import Faker
3+
4+
5+
def test__get_all__uses_the_time_entry_dao__to_retrieve_time_entries(mocker):
6+
expected_time_entries = mocker.Mock()
7+
time_entry_dao = mocker.Mock(
8+
get_all=mocker.Mock(return_value=expected_time_entries)
9+
)
10+
time_activity_service = TimeEntryService(time_entry_dao)
11+
12+
actual_activities = time_activity_service.get_all()
13+
14+
assert time_entry_dao.get_all.called
15+
assert expected_time_entries == actual_activities
16+
17+
18+
def test__get_by_id__uses_the_time_entry_dao__to_retrieve_one_time_entry(mocker):
19+
expected_time_entry = mocker.Mock()
20+
time_entry_dao = mocker.Mock(
21+
get_by_id=mocker.Mock(return_value=expected_time_entry)
22+
)
23+
time_entry_service = TimeEntryService(time_entry_dao)
24+
25+
actual_time_entry = time_entry_service.get_by_id(Faker().uuid4())
26+
27+
assert time_entry_dao.get_by_id.called
28+
assert expected_time_entry == actual_time_entry
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from time_tracker.time_entries._domain import _use_cases
2+
from pytest_mock import MockFixture
3+
from faker import Faker
4+
5+
fake = Faker()
6+
7+
8+
def test__get_list_time_entries_function__uses_the_time_entry_service__to_retrieve_time_entries(
9+
mocker: MockFixture,
10+
):
11+
expected_time_entries = mocker.Mock()
12+
time_entry_service = mocker.Mock(
13+
get_all=mocker.Mock(return_value=expected_time_entries)
14+
)
15+
16+
time_entries_use_case = _use_cases.GetTimeEntriesUseCase(time_entry_service)
17+
actual_time_entries = time_entries_use_case.get_time_entries()
18+
19+
assert time_entry_service.get_all.called
20+
assert expected_time_entries == actual_time_entries
21+
22+
23+
def test__get_time_entry_by_id_function__uses_the_time_entry_service__to_retrieve_time_entry(
24+
mocker: MockFixture,
25+
):
26+
expected_time_entries = mocker.Mock()
27+
time_entry_service = mocker.Mock(
28+
get_by_id=mocker.Mock(return_value=expected_time_entries)
29+
)
30+
31+
time_entry_use_case = _use_cases.GetTimeEntryUseCase(time_entry_service)
32+
actual_time_entry = time_entry_use_case.get_time_entry_by_id(fake.uuid4())
33+
34+
assert time_entry_service.get_by_id.called
35+
assert expected_time_entries == actual_time_entry

V2/time_tracker/time_entries/_infrastructure/_data_persistence/time_entries_data.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[{
2-
"id": null,
2+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072b",
33
"start_date": "12/07/2021",
44
"owner_id": 2,
55
"tenant_id": "asdasdsa",
@@ -12,7 +12,7 @@
1212
"timezone_offset": "asdasdsa",
1313
"project_id": 1
1414
}, {
15-
"id": null,
15+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072c",
1616
"start_date": "12/07/2021",
1717
"owner_id": 2,
1818
"tenant_id": "asdasdsa",
@@ -25,7 +25,7 @@
2525
"timezone_offset": "asdasdsa",
2626
"project_id": 1
2727
}, {
28-
"id": null,
28+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072e",
2929
"start_date": "12/07/2021",
3030
"owner_id": 2,
3131
"tenant_id": "asdasdsa",
@@ -38,7 +38,7 @@
3838
"timezone_offset": "asdasdsa",
3939
"project_id": 1
4040
}, {
41-
"id": null,
41+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072f",
4242
"start_date": "12/07/2021",
4343
"owner_id": 2,
4444
"tenant_id": "asdasdsa",
@@ -51,7 +51,7 @@
5151
"timezone_offset": "asdasdsa",
5252
"project_id": 1
5353
}, {
54-
"id": null,
54+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072g",
5555
"start_date": "12/07/2021",
5656
"owner_id": 2,
5757
"tenant_id": "asdasdsa",
@@ -64,7 +64,7 @@
6464
"timezone_offset": "asdasdsa",
6565
"project_id": 1
6666
}, {
67-
"id": null,
67+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072h",
6868
"start_date": "12/07/2021",
6969
"owner_id": 2,
7070
"tenant_id": "asdasdsa",
@@ -77,7 +77,7 @@
7777
"timezone_offset": "asdasdsa",
7878
"project_id": 1
7979
}, {
80-
"id": null,
80+
"id": "c61a4a49-3364-49a3-a7f7-0c5f2d15072i",
8181
"start_date": "12/07/2021",
8282
"owner_id": 2,
8383
"tenant_id": "asdasdsa",

0 commit comments

Comments
 (0)