Skip to content

Commit 63371fb

Browse files
authored
fix: TT-219 Refactoring find_all for time entries (#282)
* fix: TT-219 Refactoring find_all for time entries * fix: TT-219 automatic code formating Co-authored-by: Pablo <Solorzano>
1 parent 6bac0bf commit 63371fb

File tree

7 files changed

+345
-43
lines changed

7 files changed

+345
-43
lines changed

tests/time_tracker_api/time_entries/time_entries_model_test.py

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -275,12 +275,41 @@ def test_updated_item_without_deleted_key_should_call_validate_data(
275275
@patch(
276276
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.get_page_size_or'
277277
)
278+
@patch(
279+
'commons.data_access_layer.cosmos_db.CosmosDBRepository.generate_params'
280+
)
281+
@patch(
282+
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_sql_condition_for_visibility'
283+
)
284+
@patch(
285+
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_sql_where_conditions'
286+
)
287+
@patch(
288+
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_custom_sql_conditions'
289+
)
290+
@patch(
291+
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.add_complementary_info'
292+
)
293+
@patch(
294+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
295+
)
296+
@patch(
297+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
298+
)
278299
def test_find_all_v2(
300+
is_toggle_enabled_for_user_mock,
301+
get_azure_app_configuration_client_mock,
302+
add_complementary_info_mock,
303+
create_custom_sql_conditions_mock,
304+
create_sql_where_conditions_mock,
305+
create_sql_condition_for_visibility_mock,
306+
generate_params_mock,
279307
get_page_size_or_mock,
280308
find_partition_key_value_mock,
281309
event_context: EventContext,
282310
time_entry_repository: TimeEntryCosmosDBRepository,
283311
):
312+
is_toggle_enabled_for_user_mock.return_value = True
284313
expected_item = {
285314
'id': 'id',
286315
'start_date': '2021-03-22T10:00:00.000Z',
@@ -295,21 +324,28 @@ def test_find_all_v2(
295324
time_entry_repository.container = Mock()
296325
time_entry_repository.container.query_items = query_items_mock
297326

298-
result = time_entry_repository.find_all_v2(
299-
event_context,
300-
['owner_id'],
301-
{
327+
time_entry_repository.add_complementary_info = query_items_mock
328+
329+
result = time_entry_repository.find_all(
330+
conditions={"user_id": "*"},
331+
custom_sql_conditions=[],
332+
event_context=event_context,
333+
date_range={
302334
'start_date': "2021-03-22T10:00:00.000Z",
303335
'end_date': "2021-03-22T11:00:00.000Z",
304336
},
337+
custom_params={},
305338
)
306339

307340
find_partition_key_value_mock.assert_called_once()
308341
get_page_size_or_mock.assert_called_once()
309342
assert len(result) == 1
310343
time_entry = result[0]
311-
assert isinstance(time_entry, TimeEntryCosmosDBModel)
312-
assert time_entry.__dict__ == expected_item
344+
assert time_entry == expected_item
345+
346+
create_sql_condition_for_visibility_mock.assert_called_once()
347+
create_sql_where_conditions_mock.assert_called_once()
348+
create_custom_sql_conditions_mock.assert_called_once()
313349

314350

315351
@patch(
@@ -334,7 +370,9 @@ def test_get_last_entry(
334370
time_entry_repository.container = Mock()
335371
time_entry_repository.container.query_items = query_items_mock
336372

337-
time_entry = time_entry_repository.get_last_entry('id1', ['id1'], event_context)
373+
time_entry = time_entry_repository.get_last_entry(
374+
'id1', ['id1'], event_context
375+
)
338376

339377
find_partition_key_value_mock.assert_called_once()
340378
assert isinstance(time_entry, TimeEntryCosmosDBModel)

tests/time_tracker_api/time_entries/time_entries_namespace_test.py

Lines changed: 149 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,22 @@ def test_create_time_entry_with_missing_req_field_should_return_bad_request(
137137
repository_create_mock.assert_not_called()
138138

139139

140+
@patch(
141+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
142+
)
143+
@patch(
144+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
145+
)
140146
def test_list_all_time_entries(
147+
is_toggle_enabled_for_user_mock,
148+
get_azure_app_configuration_client_mock,
141149
client: FlaskClient,
142150
mocker: MockFixture,
143151
valid_header: dict,
144152
time_entries_dao,
145153
):
154+
is_toggle_enabled_for_user_mock.return_value = True
155+
146156
dao_get_all_mock = mocker.patch.object(
147157
time_entries_dao, 'get_all', return_value=[]
148158
)
@@ -204,18 +214,33 @@ def test_get_time_entry_should_succeed_with_valid_id(
204214
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.handle_date_filter_args',
205215
Mock(),
206216
)
217+
@patch(
218+
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.create_sql_date_range_filter',
219+
Mock(),
220+
)
221+
@patch(
222+
'commons.data_access_layer.cosmos_db.CosmosDBRepository.generate_params',
223+
Mock(),
224+
)
207225
@patch('msal.ConfidentialClientApplication', Mock())
208226
@patch('utils.azure_users.AzureConnection.get_token', Mock())
209227
@patch('utils.azure_users.AzureConnection.is_test_user')
210228
@patch('utils.azure_users.AzureConnection.get_test_user_ids')
211229
@pytest.mark.parametrize(
212230
'current_user_is_tester, expected_user_ids',
213231
[
214-
(True, ['id1', 'id2']),
215-
(False, ['id2']),
232+
(True, ['id1', 'id1']),
216233
],
217234
)
218-
def test_get_time_entries_by_type_of_user(
235+
@patch(
236+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
237+
)
238+
@patch(
239+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
240+
)
241+
def test_get_time_entries_by_type_of_user_when_is_user_tester(
242+
is_toggle_enabled_for_user_mock,
243+
get_azure_app_configuration_client_mock,
219244
get_test_user_ids_mock,
220245
is_test_user_mock,
221246
client: FlaskClient,
@@ -224,6 +249,7 @@ def test_get_time_entries_by_type_of_user(
224249
current_user_is_tester,
225250
expected_user_ids,
226251
):
252+
is_toggle_enabled_for_user_mock.return_value = True
227253
test_user_id = "id1"
228254
non_test_user_id = "id2"
229255
te1 = TimeEntryCosmosDBModel(
@@ -239,7 +265,97 @@ def test_get_time_entries_by_type_of_user(
239265
{
240266
"id": '2',
241267
"project_id": "2",
242-
"owner_id": non_test_user_id,
268+
"owner_id": test_user_id,
269+
"tenant_id": '2',
270+
"start_date": "",
271+
}
272+
)
273+
274+
find_all_mock = Mock()
275+
find_all_mock.return_value = [te1, te2]
276+
277+
time_entries_dao.repository.find_all = find_all_mock
278+
279+
is_test_user_mock.return_value = current_user_is_tester
280+
281+
response = client.get(
282+
"/time-entries?user_id=*", headers=valid_header, follow_redirects=True
283+
)
284+
285+
get_test_user_ids_mock.assert_not_called()
286+
find_all_mock.assert_called()
287+
288+
expected_user_ids_in_time_entries = expected_user_ids
289+
actual_user_ids_in_time_entries = [
290+
time_entry["owner_id"] for time_entry in json.loads(response.data)
291+
]
292+
assert expected_user_ids_in_time_entries == actual_user_ids_in_time_entries
293+
294+
295+
@patch(
296+
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.create_event_context',
297+
Mock(),
298+
)
299+
@patch(
300+
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.build_custom_query',
301+
Mock(),
302+
)
303+
@patch(
304+
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.handle_date_filter_args',
305+
Mock(),
306+
)
307+
@patch(
308+
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.create_sql_date_range_filter',
309+
Mock(),
310+
)
311+
@patch(
312+
'commons.data_access_layer.cosmos_db.CosmosDBRepository.generate_params',
313+
Mock(),
314+
)
315+
@patch('msal.ConfidentialClientApplication', Mock())
316+
@patch('utils.azure_users.AzureConnection.get_token', Mock())
317+
@patch('utils.azure_users.AzureConnection.is_test_user')
318+
@patch('utils.azure_users.AzureConnection.get_test_user_ids')
319+
@pytest.mark.parametrize(
320+
'current_user_is_tester, expected_user_ids',
321+
[
322+
(False, ['id1', 'id1']),
323+
],
324+
)
325+
@patch(
326+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
327+
)
328+
@patch(
329+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
330+
)
331+
def test_get_time_entries_by_type_of_user_when_is_not_user_tester(
332+
is_toggle_enabled_for_user_mock,
333+
get_azure_app_configuration_client_mock,
334+
get_test_user_ids_mock,
335+
is_test_user_mock,
336+
client: FlaskClient,
337+
valid_header: dict,
338+
time_entries_dao,
339+
current_user_is_tester,
340+
expected_user_ids,
341+
):
342+
is_toggle_enabled_for_user_mock.return_value = True
343+
test_user_id = "id1"
344+
non_test_user_id = "id2"
345+
te1 = TimeEntryCosmosDBModel(
346+
{
347+
"id": '1',
348+
"project_id": "1",
349+
"owner_id": test_user_id,
350+
"tenant_id": '1',
351+
"start_date": "",
352+
}
353+
)
354+
te2 = TimeEntryCosmosDBModel(
355+
{
356+
"id": '2',
357+
"project_id": "2",
358+
"owner_id": test_user_id,
243359
"tenant_id": '2',
244360
"start_date": "",
245361
}
@@ -257,7 +373,7 @@ def test_get_time_entries_by_type_of_user(
257373
"/time-entries?user_id=*", headers=valid_header, follow_redirects=True
258374
)
259375

260-
is_test_user_mock.assert_called()
376+
get_test_user_ids_mock.assert_called()
261377
find_all_mock.assert_called()
262378

263379
expected_user_ids_in_time_entries = expected_user_ids
@@ -690,12 +806,21 @@ def test_create_with_valid_uuid_format_should_return_created(
690806
('/time-entries'),
691807
],
692808
)
809+
@patch(
810+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
811+
)
812+
@patch(
813+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
814+
)
693815
def test_get_all_passes_date_range_built_from_params_to_find_all(
816+
is_toggle_enabled_for_user_mock,
817+
get_azure_app_configuration_client_mock,
694818
client: FlaskClient,
695819
valid_header: dict,
696820
url: str,
697821
time_entries_dao,
698822
):
823+
is_toggle_enabled_for_user_mock.return_value = True
699824
time_entries_dao.repository.find_all = Mock(return_value=[])
700825

701826
response = client.get(url, headers=valid_header)
@@ -727,14 +852,24 @@ def test_get_all_passes_date_range_built_from_params_to_find_all(
727852
),
728853
],
729854
)
855+
@patch(
856+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
857+
)
858+
@patch(
859+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
860+
)
730861
def test_get_all_passes_date_range_to_find_all_with_default_tz_offset(
862+
is_toggle_enabled_for_user_mock,
863+
get_azure_app_configuration_client_mock,
731864
client: FlaskClient,
732865
valid_header: dict,
733866
time_entries_dao,
734867
url: str,
735868
start_date: str,
736869
end_date: str,
737870
):
871+
is_toggle_enabled_for_user_mock.return_value = True
872+
738873
time_entries_dao.repository.find_all = Mock(return_value=[])
739874

740875
response = client.get(url, headers=valid_header)
@@ -788,14 +923,23 @@ def test_get_all_passes_date_range_to_find_all_with_default_tz_offset(
788923
),
789924
],
790925
)
926+
@patch(
927+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
928+
)
929+
@patch(
930+
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
931+
)
791932
def test_get_all_passes_date_range_to_find_all_with_given_tz_offset(
933+
is_toggle_enabled_for_user_mock,
934+
get_azure_app_configuration_client_mock,
792935
client: FlaskClient,
793936
valid_header: dict,
794937
time_entries_dao,
795938
url: str,
796939
start_date: str,
797940
end_date: str,
798941
):
942+
is_toggle_enabled_for_user_mock.return_value = True
799943
time_entries_dao.repository.find_all = Mock(return_value=[])
800944

801945
response = client.get(url, headers=valid_header)

tests/time_tracker_api/time_entries/time_entries_query_builder_test.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ def test_TimeEntryQueryBuilder_is_subclass_CosmosDBQueryBuilder():
1818
def test_add_sql_date_range_condition_should_update_where_list():
1919
time_entry_query_builder = (
2020
TimeEntryQueryBuilder().add_sql_date_range_condition(
21-
("2021-03-19T05:07:00.000Z", "2021-03-25T10:00:00.000Z")
21+
{
22+
"start_date": "2021-03-19T05:07:00.000Z",
23+
"end_date": "2021-03-25T10:00:00.000Z",
24+
}
2225
)
2326
)
2427
expected_params = [
@@ -34,7 +37,10 @@ def test_build_with_add_sql_date_range_condition():
3437
time_entry_query_builder = (
3538
TimeEntryQueryBuilder()
3639
.add_sql_date_range_condition(
37-
("2021-03-19T05:00:00.000Z", "2021-03-20T10:00:00.000Z")
40+
{
41+
"start_date": "2021-03-19T05:00:00.000Z",
42+
"end_date": "2021-03-20T10:00:00.000Z",
43+
}
3844
)
3945
.build()
4046
)

0 commit comments

Comments
 (0)