Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 43 additions & 6 deletions tests/time_tracker_api/time_entries/time_entries_model_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,12 +275,41 @@ def test_updated_item_without_deleted_key_should_call_validate_data(
@patch(
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.get_page_size_or'
)
@patch(
'commons.data_access_layer.cosmos_db.CosmosDBRepository.generate_params'
)
@patch(
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_sql_condition_for_visibility'
)
@patch(
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_sql_where_conditions'
)
@patch(
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_custom_sql_conditions'
)
@patch(
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.add_complementary_info'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
)
def test_find_all_v2(
is_toggle_enabled_for_user_mock,
get_azure_app_configuration_client_mock,
add_complementary_info_mock,
create_custom_sql_conditions_mock,
create_sql_where_conditions_mock,
create_sql_condition_for_visibility_mock,
generate_params_mock,
get_page_size_or_mock,
find_partition_key_value_mock,
event_context: EventContext,
time_entry_repository: TimeEntryCosmosDBRepository,
):
is_toggle_enabled_for_user_mock.return_value = True
expected_item = {
'id': 'id',
'start_date': '2021-03-22T10:00:00.000Z',
Expand All @@ -295,21 +324,29 @@ def test_find_all_v2(
time_entry_repository.container = Mock()
time_entry_repository.container.query_items = query_items_mock

result = time_entry_repository.find_all_v2(
event_context,
['owner_id'],
{
time_entry_repository.add_complementary_info = Mock()
time_entry_repository.add_complementary_info = query_items_mock

result = time_entry_repository.find_all(
conditions={"user_id": "*"},
custom_sql_conditions=[],
event_context=event_context,
date_range={
'start_date': "2021-03-22T10:00:00.000Z",
'end_date': "2021-03-22T11:00:00.000Z",
},
custom_params={},
)

find_partition_key_value_mock.assert_called_once()
get_page_size_or_mock.assert_called_once()
assert len(result) == 1
time_entry = result[0]
assert isinstance(time_entry, TimeEntryCosmosDBModel)
assert time_entry.__dict__ == expected_item
assert time_entry == expected_item

create_sql_condition_for_visibility_mock.assert_called_once()
create_sql_where_conditions_mock.assert_called_once()
create_custom_sql_conditions_mock.assert_called_once()


@patch(
Expand Down
61 changes: 58 additions & 3 deletions tests/time_tracker_api/time_entries/time_entries_namespace_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,22 @@ def test_create_time_entry_with_missing_req_field_should_return_bad_request(
repository_create_mock.assert_not_called()


@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
)
def test_list_all_time_entries(
is_toggle_enabled_for_user_mock,
get_azure_app_configuration_client_mock,
client: FlaskClient,
mocker: MockFixture,
valid_header: dict,
time_entries_dao,
):
is_toggle_enabled_for_user_mock.return_value = True

dao_get_all_mock = mocker.patch.object(
time_entries_dao, 'get_all', return_value=[]
)
Expand Down Expand Up @@ -204,18 +214,34 @@ def test_get_time_entry_should_succeed_with_valid_id(
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.handle_date_filter_args',
Mock(),
)
@patch(
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.create_sql_date_range_filter',
Mock(),
)
@patch(
'commons.data_access_layer.cosmos_db.CosmosDBRepository.generate_params',
Mock(),
)
@patch('msal.ConfidentialClientApplication', Mock())
@patch('utils.azure_users.AzureConnection.get_token', Mock())
@patch('utils.azure_users.AzureConnection.is_test_user')
@patch('utils.azure_users.AzureConnection.get_test_user_ids')
@pytest.mark.parametrize(
'current_user_is_tester, expected_user_ids',
[
(True, ['id1', 'id2']),
(False, ['id2']),
(True, ['id1', 'id1']),
(False, ['id1', 'id1']),
],
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
)
def test_get_time_entries_by_type_of_user(
is_toggle_enabled_for_user_mock,
get_azure_app_configuration_client_mock,
get_test_user_ids_mock,
is_test_user_mock,
client: FlaskClient,
Expand All @@ -224,6 +250,7 @@ def test_get_time_entries_by_type_of_user(
current_user_is_tester,
expected_user_ids,
):
is_toggle_enabled_for_user_mock.return_value = True
test_user_id = "id1"
non_test_user_id = "id2"
te1 = TimeEntryCosmosDBModel(
Expand All @@ -239,7 +266,7 @@ def test_get_time_entries_by_type_of_user(
{
"id": '2',
"project_id": "2",
"owner_id": non_test_user_id,
"owner_id": test_user_id,
"tenant_id": '2',
"start_date": "",
}
Expand Down Expand Up @@ -690,12 +717,21 @@ def test_create_with_valid_uuid_format_should_return_created(
('/time-entries'),
],
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
)
def test_get_all_passes_date_range_built_from_params_to_find_all(
is_toggle_enabled_for_user_mock,
get_azure_app_configuration_client_mock,
client: FlaskClient,
valid_header: dict,
url: str,
time_entries_dao,
):
is_toggle_enabled_for_user_mock.return_value = True
time_entries_dao.repository.find_all = Mock(return_value=[])

response = client.get(url, headers=valid_header)
Expand Down Expand Up @@ -727,14 +763,24 @@ def test_get_all_passes_date_range_built_from_params_to_find_all(
),
],
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
)
def test_get_all_passes_date_range_to_find_all_with_default_tz_offset(
is_toggle_enabled_for_user_mock,
get_azure_app_configuration_client_mock,
client: FlaskClient,
valid_header: dict,
time_entries_dao,
url: str,
start_date: str,
end_date: str,
):
is_toggle_enabled_for_user_mock.return_value = True

time_entries_dao.repository.find_all = Mock(return_value=[])

response = client.get(url, headers=valid_header)
Expand Down Expand Up @@ -788,14 +834,23 @@ def test_get_all_passes_date_range_to_find_all_with_default_tz_offset(
),
],
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.get_azure_app_configuration_client'
)
@patch(
'commons.feature_toggles.feature_toggle_manager.FeatureToggleManager.is_toggle_enabled_for_user'
)
def test_get_all_passes_date_range_to_find_all_with_given_tz_offset(
is_toggle_enabled_for_user_mock,
get_azure_app_configuration_client_mock,
client: FlaskClient,
valid_header: dict,
time_entries_dao,
url: str,
start_date: str,
end_date: str,
):
is_toggle_enabled_for_user_mock.return_value = True
time_entries_dao.repository.find_all = Mock(return_value=[])

response = client.get(url, headers=valid_header)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ def test_TimeEntryQueryBuilder_is_subclass_CosmosDBQueryBuilder():
def test_add_sql_date_range_condition_should_update_where_list():
time_entry_query_builder = (
TimeEntryQueryBuilder().add_sql_date_range_condition(
("2021-03-19T05:07:00.000Z", "2021-03-25T10:00:00.000Z")
{
"start_date": "2021-03-19T05:07:00.000Z",
"end_date": "2021-03-25T10:00:00.000Z",
}
)
)
expected_params = [
Expand All @@ -34,7 +37,10 @@ def test_build_with_add_sql_date_range_condition():
time_entry_query_builder = (
TimeEntryQueryBuilder()
.add_sql_date_range_condition(
("2021-03-19T05:00:00.000Z", "2021-03-20T10:00:00.000Z")
{
"start_date": "2021-03-19T05:00:00.000Z",
"end_date": "2021-03-20T10:00:00.000Z",
}
)
.build()
)
Expand Down
46 changes: 44 additions & 2 deletions time_tracker_api/time_entries/time_entries_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from commons.data_access_layer.cosmos_db import (
CosmosDBDao,
CustomError,
CosmosDBRepository,
)
from utils.extend_model import (
add_project_info_to_time_entries,
Expand Down Expand Up @@ -91,7 +92,7 @@ def build_custom_query(self, is_admin: bool, conditions: dict = None):
)
return custom_query

def get_all(self, conditions: dict = None, **kwargs) -> list:
def get_all_old(self, conditions: dict = None, **kwargs) -> list:
event_ctx = self.create_event_context("read-many")
conditions.update({"owner_id": event_ctx.user_id})
is_complete_query = conditions.get("user_id") == '*'
Expand All @@ -106,7 +107,7 @@ def get_all(self, conditions: dict = None, **kwargs) -> list:
current_user_is_tester = azure_connection.is_test_user(
event_ctx.user_id
)
time_entries_list = self.repository.find_all(
time_entries_list = self.repository.find_all_old(
event_ctx,
conditions=conditions,
custom_sql_conditions=custom_query,
Expand All @@ -124,6 +125,47 @@ def get_all(self, conditions: dict = None, **kwargs) -> list:
else:
return time_entries_list

def get_all(self, conditions: dict = None, **kwargs) -> list:
event_ctx = self.create_event_context("read-many")
conditions.update({"owner_id": event_ctx.user_id})
is_complete_query = conditions.get("user_id") == '*'
custom_query = self.build_custom_query(
is_admin=event_ctx.is_admin,
conditions=conditions,
)
date_range = self.handle_date_filter_args(args=conditions)
limit = conditions.get("limit", None)
conditions.pop("limit", None)
azure_connection = AzureConnection()
current_user_is_tester = azure_connection.is_test_user(
event_ctx.user_id
)

custom_query.append(
TimeEntryCosmosDBRepository.create_sql_date_range_filter(
date_range
)
)
custom_params = CosmosDBRepository.generate_params(date_range)

test_user_ids = (
azure_connection.get_test_user_ids()
if not current_user_is_tester and is_complete_query
else None
)

time_entries_list = self.repository.find_all(
conditions=conditions,
custom_sql_conditions=custom_query,
test_user_ids=test_user_ids,
date_range=date_range,
max_count=limit,
custom_params=custom_params,
event_context=event_ctx,
)

return time_entries_list

def get_lastest_entries_by_project(
self, conditions: dict = None, **kwargs
) -> list:
Expand Down
8 changes: 7 additions & 1 deletion time_tracker_api/time_entries/time_entries_namespace.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
)
from time_tracker_api.time_entries.time_entries_dao import create_dao

from commons.feature_toggles.feature_toggle_manager import FeatureToggleManager

faker = Faker()

ns = api.namespace(
Expand Down Expand Up @@ -237,7 +239,11 @@ class TimeEntries(Resource):
def get(self):
"""List all time entries"""
conditions = attributes_filter.parse_args()
return time_entries_dao.get_all(conditions=conditions)
find_all_version = FeatureToggleManager('find_all_version')
if find_all_version.is_toggle_enabled_for_user():
return time_entries_dao.get_all(conditions=conditions)
else:
return time_entries_dao.get_all_old(conditions=conditions)

@ns.doc('create_time_entry')
@ns.expect(time_entry_input)
Expand Down
3 changes: 2 additions & 1 deletion time_tracker_api/time_entries/time_entries_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ def __init__(self):

def add_sql_date_range_condition(self, date_range: tuple = None):
if date_range and len(date_range) == 2:
start_date, end_date = date_range
start_date = date_range['start_date']
end_date = date_range['end_date']
condition = """
((c.start_date BETWEEN @start_date AND @end_date) OR
(c.end_date BETWEEN @start_date AND @end_date))
Expand Down
Loading