Skip to content

Commit 262ace0

Browse files
committed
test: TT-185 add test methods for TimeEntryQueryBuilder and new function in repository
1 parent 031b883 commit 262ace0

File tree

5 files changed

+200
-21
lines changed

5 files changed

+200
-21
lines changed

tests/time_tracker_api/time_entries/time_entries_model_test.py

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -269,26 +269,15 @@ def test_updated_item_without_deleted_key_should_call_validate_data(
269269
time_entry_repository.validate_data.assert_called_once()
270270

271271

272-
@pytest.mark.parametrize(
273-
'owner_list,expected_result',
274-
[
275-
([], ""),
276-
(None, ""),
277-
(["id"], "AND c.owner_id IN ('id')"),
278-
(["id1", "id2"], "AND c.owner_id IN ('id1', 'id2')"),
279-
],
272+
@patch(
273+
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.find_partition_key_value'
274+
)
275+
@patch(
276+
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.get_page_size_or'
280277
)
281-
def test_create_owner_condition(
282-
owner_list,
283-
expected_result,
284-
event_context: EventContext,
285-
time_entry_repository: TimeEntryCosmosDBRepository,
286-
):
287-
result = time_entry_repository.create_owner_condition(owner_list)
288-
assert result == expected_result
289-
290-
291278
def test_find_all_v2(
279+
get_page_size_or_mock,
280+
find_partition_key_value_mock,
292281
event_context: EventContext,
293282
time_entry_repository: TimeEntryCosmosDBRepository,
294283
):
@@ -315,9 +304,9 @@ def test_find_all_v2(
315304
},
316305
)
317306

318-
print(result)
307+
find_partition_key_value_mock.assert_called_once()
308+
get_page_size_or_mock.assert_called_once()
319309
assert len(result) == 1
320310
time_entry = result[0]
321-
print(time_entry.__dict__)
322311
assert isinstance(time_entry, TimeEntryCosmosDBModel)
323312
assert time_entry.__dict__ == expected_item
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import pytest
2+
from unittest.mock import patch
3+
from utils.query_builder import CosmosDBQueryBuilder
4+
from time_tracker_api.time_entries.time_entries_query_builder import (
5+
TimeEntryQueryBuilder,
6+
)
7+
from utils.repository import get_string_without_empty_spaces
8+
9+
10+
def test_TimeEntryQueryBuilder_is_subclass_CosmosDBQueryBuilder():
11+
query_builder = CosmosDBQueryBuilder()
12+
time_entries_query_builder = TimeEntryQueryBuilder()
13+
14+
assert issubclass(TimeEntryQueryBuilder, CosmosDBQueryBuilder) == True
15+
16+
17+
@pytest.mark.parametrize(
18+
"start_date,end_date,expected_params",
19+
[
20+
(
21+
"2021-03-19T05:07:00.000Z",
22+
"2021-03-25T10:00:00.000Z",
23+
[
24+
{"name": "@start_date", "value": "2021-03-19T05:07:00.000Z"},
25+
{"name": "@end_date", "value": "2021-03-25T10:00:00.000Z"},
26+
],
27+
),
28+
(
29+
"2021-02-10T05:08:00.000Z",
30+
"2021-03-20T11:00:00.000Z",
31+
[
32+
{"name": "@start_date", "value": "2021-02-10T05:08:00.000Z"},
33+
{"name": "@end_date", "value": "2021-03-20T11:00:00.000Z"},
34+
],
35+
),
36+
(
37+
"2021-01-02T05:09:00.000Z",
38+
"2021-01-26T12:00:00.000Z",
39+
[
40+
{"name": "@start_date", "value": "2021-01-02T05:09:00.000Z"},
41+
{"name": "@end_date", "value": "2021-01-26T12:00:00.000Z"},
42+
],
43+
),
44+
],
45+
)
46+
def test_add_sql_date_range_condition_should_update_where_list(
47+
start_date, end_date, expected_params
48+
):
49+
time_entry_query_builder = (
50+
TimeEntryQueryBuilder().add_sql_date_range_condition(
51+
(start_date, end_date)
52+
)
53+
)
54+
55+
assert len(time_entry_query_builder.where_conditions) == 1
56+
assert len(time_entry_query_builder.parameters) == len(expected_params)
57+
assert time_entry_query_builder.get_parameters() == expected_params
58+
59+
60+
def test_build_with_add_sql_date_range_condition():
61+
time_entry_query_builder = (
62+
TimeEntryQueryBuilder()
63+
.add_sql_date_range_condition(
64+
("2021-03-19T05:00:00.000Z", "2021-03-20T10:00:00.000Z")
65+
)
66+
.build()
67+
)
68+
69+
expected_query = """
70+
SELECT * FROM c
71+
WHERE ((c.start_date BETWEEN @start_date AND @end_date) OR
72+
(c.end_date BETWEEN @start_date AND @end_date))
73+
"""
74+
query = time_entry_query_builder.get_query()
75+
76+
assert get_string_without_empty_spaces(
77+
query
78+
) == get_string_without_empty_spaces(expected_query)
79+
80+
assert len(time_entry_query_builder.where_conditions) == 1
81+
assert len(time_entry_query_builder.get_parameters()) == 2

tests/utils/query_builder_test.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from unittest.mock import patch
22
from utils.query_builder import CosmosDBQueryBuilder
3+
from utils.repository import get_string_without_empty_spaces
34
import pytest
45

56

@@ -178,3 +179,88 @@ def test__build_where_should_return_concatenate_conditions(
178179
result = query_builder._CosmosDBQueryBuilder__build_where()
179180

180181
assert result == expected_condition
182+
183+
184+
@pytest.mark.parametrize(
185+
"offset,expected_condition,expected_params",
186+
[(1, "OFFSET @offset", [{'name': '@offset', 'value': 1}]), (None, "", [])],
187+
)
188+
def test__build_offset(
189+
offset,
190+
expected_condition,
191+
expected_params,
192+
):
193+
query_builder = CosmosDBQueryBuilder().add_sql_offset_condition(offset)
194+
195+
result = query_builder._CosmosDBQueryBuilder__build_offset()
196+
assert result == expected_condition
197+
assert len(query_builder.parameters) == len(expected_params)
198+
assert query_builder.get_parameters() == expected_params
199+
200+
201+
@pytest.mark.parametrize(
202+
"limit,expected_condition,expected_params",
203+
[(1, "LIMIT @limit", [{'name': '@limit', 'value': 1}]), (None, "", [])],
204+
)
205+
def test__build_limit(
206+
limit,
207+
expected_condition,
208+
expected_params,
209+
):
210+
query_builder = CosmosDBQueryBuilder().add_sql_limit_condition(limit)
211+
212+
result = query_builder._CosmosDBQueryBuilder__build_limit()
213+
assert result == expected_condition
214+
assert len(query_builder.parameters) == len(expected_params)
215+
assert query_builder.get_parameters() == expected_params
216+
217+
218+
def test_build_with_all_calls_return_query_with_all_conditions():
219+
query_builder = (
220+
CosmosDBQueryBuilder()
221+
.add_select_conditions(["c.description"])
222+
.add_sql_in_condition("id", ["id1", "id2"])
223+
.add_sql_where_equal_condition({'name': 'test'})
224+
.add_sql_offset_condition(2)
225+
.add_sql_limit_condition(10)
226+
.add_sql_visibility_condition(True)
227+
.build()
228+
)
229+
query = query_builder.get_query()
230+
expected_query = """
231+
SELECT c.description FROM c
232+
WHERE c.id IN ('id1', 'id2') AND c.name = @name AND NOT IS_DEFINED(c.deleted)
233+
OFFSET @offset
234+
LIMIT @limit
235+
"""
236+
237+
assert get_string_without_empty_spaces(
238+
query
239+
) == get_string_without_empty_spaces(expected_query)
240+
241+
assert len(query_builder.get_parameters()) > 0
242+
assert len(query_builder.where_conditions) > 0
243+
assert len(query_builder.select_conditions) > 0
244+
245+
246+
def test_build_with_empty_and_None_attributes_return_query_select_all():
247+
248+
query_builder = (
249+
CosmosDBQueryBuilder()
250+
.add_select_conditions()
251+
.add_sql_in_condition()
252+
.add_sql_where_equal_condition()
253+
.add_sql_limit_condition(None)
254+
.add_sql_offset_condition(None)
255+
.build()
256+
)
257+
258+
query = query_builder.get_query()
259+
260+
expected_query = """SELECT * FROM c"""
261+
query = get_string_without_empty_spaces(query)
262+
expected_query = get_string_without_empty_spaces(expected_query)
263+
264+
assert query == expected_query
265+
assert len(query_builder.get_parameters()) == 0
266+
assert len(query_builder.where_conditions) == 0

tests/utils/repository_test.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
from unittest.mock import patch
2-
from utils.repository import convert_list_to_tuple_string
2+
from utils.repository import (
3+
convert_list_to_tuple_string,
4+
get_string_without_empty_spaces,
5+
)
36
import pytest
47

58

@@ -34,3 +37,16 @@ def test_convert_list_to_tuple_string_should_success(
3437
result = convert_list_to_tuple_string(ids_list)
3538

3639
assert expected_result == result
40+
41+
42+
@pytest.mark.parametrize(
43+
"string,expected_string",
44+
[
45+
(" text with \t tab", "text with tab"),
46+
(" text with \n new line", "text with new line"),
47+
(""" SELECT * from c """, "SELECT * from c"),
48+
],
49+
)
50+
def test_get_string_without_empty_spaces(string, expected_string):
51+
string = get_string_without_empty_spaces(string)
52+
assert string == expected_string

utils/repository.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,10 @@ def convert_list_to_tuple_string(ids_list):
77
else str(tuple(ids_list))
88
)
99
return result
10+
11+
12+
def get_string_without_empty_spaces(string: str):
13+
from re import sub
14+
15+
string = string.replace("\n", "")
16+
return sub("[\s]+", ' ', string).rstrip().lstrip()

0 commit comments

Comments
 (0)