Skip to content

Commit 00ed5ae

Browse files
authored
fix: TT-288 Fix and improve tests on find_interception_with_date_range function (#308)
1 parent f397b9d commit 00ed5ae

File tree

2 files changed

+42
-205
lines changed

2 files changed

+42
-205
lines changed

tests/time_tracker_api/time_entries/time_entries_model_test.py

Lines changed: 36 additions & 202 deletions
Original file line numberDiff line numberDiff line change
@@ -11,221 +11,55 @@
1111
)
1212

1313

14-
def create_time_entry(
15-
start_date: str,
16-
end_date: str,
17-
owner_id: str,
18-
tenant_id: str,
19-
mocker,
20-
event_context: EventContext,
21-
time_entry_repository: TimeEntryCosmosDBRepository,
22-
) -> TimeEntryCosmosDBModel:
23-
data = {
14+
def test_find_interception_with_date_range_should_return_true_if_there_are_collisions():
15+
owner_id = Faker().uuid4()
16+
tenant_id = Faker().uuid4()
17+
entry_start_date = "2020-10-01T05:00:00.000Z"
18+
entry_end_date = "2020-10-01T10:00:00.000Z"
19+
20+
collision_entry = {
2421
"project_id": Faker().uuid4(),
2522
"activity_id": Faker().uuid4(),
2623
"description": Faker().paragraph(nb_sentences=2),
27-
"start_date": start_date,
28-
"end_date": end_date,
29-
"owner_id": owner_id,
24+
"start_date": entry_start_date,
25+
"end_date": entry_end_date,
26+
"owner_id": Faker().uuid4(),
3027
"tenant_id": tenant_id,
3128
}
29+
time_entry_repository = TimeEntryCosmosDBRepository()
30+
query_items_mock = Mock(return_value=[collision_entry])
31+
time_entry_repository.container = Mock()
32+
time_entry_repository.container.query_items = query_items_mock
3233

33-
mocker.patch(
34-
'time_tracker_api.time_entries.time_entries_repository.are_related_entry_entities_valid',
35-
return_value={
36-
"is_valid": True,
37-
"status_code": HTTPStatus.OK,
38-
"message": "Related entry entities valid",
39-
},
40-
)
41-
42-
created_item = time_entry_repository.create(
43-
data, event_context, mapper=TimeEntryCosmosDBModel
44-
)
45-
return created_item
46-
47-
48-
@pytest.mark.parametrize(
49-
'start_date,end_date,start_date_,end_date_',
50-
[
51-
(
52-
"2020-10-01T05:00:00.000Z",
53-
"2020-10-01T10:00:00.000Z",
54-
"2020-10-01T05:00:00.000Z",
55-
"2020-10-01T10:00:00.000Z",
56-
),
57-
(
58-
"2020-10-01T05:00:00.000Z",
59-
"2020-10-01T10:00:00.000Z",
60-
"2020-10-01T07:00:00.000Z",
61-
"2020-10-01T12:00:00.000Z",
62-
),
63-
(
64-
"2020-10-01T05:00:00.000Z",
65-
"2020-10-01T10:00:00.000Z",
66-
"2020-10-01T02:00:00.000Z",
67-
"2020-10-01T07:00:00.000Z",
68-
),
69-
(
70-
"2020-10-01T05:00:00.000Z",
71-
"2020-10-01T10:00:00.000Z",
72-
"2020-10-01T02:00:00.000Z",
73-
"2020-10-01T12:00:00.000Z",
74-
),
75-
(
76-
"2020-10-01T05:00:00.000Z",
77-
"2020-10-01T10:00:00.000Z",
78-
"2020-10-01T06:00:00.000Z",
79-
"2020-10-01T07:00:00.000Z",
80-
),
81-
],
82-
)
83-
def test_find_interception_with_date_range_should_find(
84-
start_date: str,
85-
end_date: str,
86-
start_date_: str,
87-
end_date_: str,
88-
owner_id: str,
89-
tenant_id: str,
90-
mocker,
91-
time_entry_repository: TimeEntryCosmosDBRepository,
92-
event_context: EventContext,
93-
):
94-
existing_item = create_time_entry(
95-
start_date,
96-
end_date,
97-
owner_id,
98-
tenant_id,
99-
mocker,
100-
event_context,
101-
time_entry_repository,
102-
)
103-
104-
try:
105-
result = time_entry_repository.find_interception_with_date_range(
106-
start_date_, end_date_, owner_id, tenant_id
107-
)
108-
109-
assert result is not None
110-
assert len(result) > 0
111-
assert any([existing_item.id == item.id for item in result])
112-
finally:
113-
time_entry_repository.delete_permanently(
114-
existing_item.id, event_context
34+
exist_collision_entries = (
35+
time_entry_repository.find_interception_with_date_range(
36+
start_date=entry_start_date,
37+
end_date=entry_end_date,
38+
owner_id=owner_id,
39+
tenant_id=tenant_id,
11540
)
116-
117-
118-
@pytest.mark.parametrize(
119-
'start_date,end_date,start_date_,end_date_',
120-
[
121-
(
122-
"2020-10-01T05:00:00.000Z",
123-
"2020-10-01T10:00:00.000Z",
124-
"2020-10-01T10:00:00.000Z",
125-
"2020-10-01T15:00:00.000Z",
126-
),
127-
(
128-
"2020-10-01T05:00:00.000Z",
129-
"2020-10-01T10:00:00.000Z",
130-
"2020-10-01T12:00:00.000Z",
131-
"2020-10-01T15:00:00.000Z",
132-
),
133-
(
134-
"2020-10-01T05:00:00.000Z",
135-
"2020-10-01T10:00:00.000Z",
136-
"2020-10-01T02:00:00.000Z",
137-
"2020-10-01T05:00:00.000Z",
138-
),
139-
(
140-
"2020-10-01T05:00:00.000Z",
141-
"2020-10-01T10:00:00.000Z",
142-
"2020-10-01T02:00:00.000Z",
143-
"2020-10-01T04:00:00.000Z",
144-
),
145-
],
146-
)
147-
def test_find_interception_with_date_range_should_not_find(
148-
start_date: str,
149-
end_date: str,
150-
start_date_: str,
151-
end_date_: str,
152-
owner_id: str,
153-
tenant_id: str,
154-
time_entry_repository: TimeEntryCosmosDBRepository,
155-
event_context: EventContext,
156-
mocker,
157-
):
158-
existing_item = create_time_entry(
159-
start_date,
160-
end_date,
161-
owner_id,
162-
tenant_id,
163-
mocker,
164-
event_context,
165-
time_entry_repository,
16641
)
42+
assert exist_collision_entries is True
16743

168-
try:
169-
result = time_entry_repository.find_interception_with_date_range(
170-
start_date_, end_date_, owner_id, tenant_id
171-
)
172-
173-
assert result == []
174-
assert len(result) == 0
175-
assert not any([existing_item.id == item.id for item in result])
176-
finally:
177-
time_entry_repository.delete_permanently(
178-
existing_item.id, event_context
179-
)
180-
181-
182-
def test_find_interception_should_ignore_id_of_existing_item(
183-
owner_id: str,
184-
tenant_id: str,
185-
time_entry_repository: TimeEntryCosmosDBRepository,
186-
event_context: EventContext,
187-
mocker,
188-
):
189-
start_date = "2020-10-01T05:00:00.000Z"
190-
end_date = "2020-10-01T10:00:00.000Z"
191-
192-
existing_item = create_time_entry(
193-
start_date,
194-
end_date,
195-
owner_id,
196-
tenant_id,
197-
mocker,
198-
event_context,
199-
time_entry_repository,
200-
)
20144

202-
try:
203-
colliding_result = (
204-
time_entry_repository.find_interception_with_date_range(
205-
start_date, end_date, owner_id, tenant_id
206-
)
207-
)
45+
def test_find_interception_with_date_range_should_return_false_if_there_are_not_collisions():
46+
entry_start_date = "2020-10-01T05:00:00.000Z"
47+
entry_end_date = "2020-10-01T10:00:00.000Z"
20848

209-
non_colliding_result = (
210-
time_entry_repository.find_interception_with_date_range(
211-
start_date,
212-
end_date,
213-
owner_id,
214-
tenant_id,
215-
ignore_id=existing_item.id,
216-
)
217-
)
49+
time_entry_repository = TimeEntryCosmosDBRepository()
50+
query_items_mock = Mock(return_value=[])
51+
time_entry_repository.container = Mock()
52+
time_entry_repository.container.query_items = query_items_mock
21853

219-
assert colliding_result is not None
220-
assert any([existing_item.id == item.id for item in colliding_result])
221-
assert non_colliding_result is not None
222-
assert not any(
223-
[existing_item.id == item.id for item in non_colliding_result]
224-
)
225-
finally:
226-
time_entry_repository.delete_permanently(
227-
existing_item.id, event_context
54+
exist_collision_entries = (
55+
time_entry_repository.find_interception_with_date_range(
56+
start_date=entry_start_date,
57+
end_date=entry_end_date,
58+
owner_id=Faker().uuid4(),
59+
tenant_id=Faker().uuid4(),
22860
)
61+
)
62+
assert exist_collision_entries is False
22963

23064

23165
def test_find_running_should_return_running_time_entry(

time_tracker_api/time_entries/time_entries_repository.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,9 @@ def find_interception_with_date_range(
265265
)
266266

267267
function_mapper = self.get_mapper_or_dict(mapper)
268-
return list(map(function_mapper, result))
268+
collision_entries = list(map(function_mapper, result))
269+
exist_collision_entries = len(collision_entries) > 0
270+
return exist_collision_entries
269271

270272
def find_running(
271273
self, tenant_id: str, owner_id: str, mapper: Callable = None
@@ -331,14 +333,15 @@ def validate_data(self, data, event_context: EventContext):
331333
description="You cannot end a time entry in the future",
332334
)
333335

334-
collision = self.find_interception_with_date_range(
336+
exist_collision_entries = self.find_interception_with_date_range(
335337
start_date=start_date,
336338
end_date=data.get('end_date'),
337339
owner_id=event_context.user_id,
338340
tenant_id=event_context.tenant_id,
339341
ignore_id=data.get('id'),
340342
)
341-
if len(collision) > 0:
343+
344+
if exist_collision_entries:
342345
raise CustomError(
343346
HTTPStatus.UNPROCESSABLE_ENTITY,
344347
description="There is another time entry in that date range",

0 commit comments

Comments
 (0)