Skip to content

Commit 449a250

Browse files
authored
refactor: TT-181 create method to find all projects with list of customers id (#267)
1 parent b657fc3 commit 449a250

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

tests/conftest.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
from time_tracker_api.activities.activities_model import (
1818
ActivityCosmosDBRepository,
1919
)
20+
from time_tracker_api.projects.projects_model import (
21+
ProjectCosmosDBRepository,
22+
)
2023

2124
fake = Faker()
2225
Faker.seed()
@@ -193,6 +196,17 @@ def time_entry_repository(app: Flask) -> TimeEntryCosmosDBRepository:
193196
return TimeEntryCosmosDBRepository()
194197

195198

199+
@pytest.fixture(scope="module")
200+
def project_repository(app: Flask) -> ProjectCosmosDBRepository:
201+
with app.app_context():
202+
from commons.data_access_layer.cosmos_db import init_app, cosmos_helper
203+
204+
if cosmos_helper is None:
205+
init_app(app)
206+
207+
return ProjectCosmosDBRepository()
208+
209+
196210
@pytest.fixture
197211
def time_entries_dao():
198212
from time_tracker_api.time_entries.time_entries_namespace import (
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from unittest.mock import Mock, patch
2+
import pytest
3+
4+
from commons.data_access_layer.database import EventContext
5+
from time_tracker_api.projects.projects_model import (
6+
ProjectCosmosDBRepository,
7+
ProjectCosmosDBModel,
8+
)
9+
10+
11+
@pytest.mark.parametrize(
12+
"customer_ids_list,expected_result",
13+
[
14+
(["id1"], "c.customer_id IN ('id1')"),
15+
(["id1", "id2"], "c.customer_id IN ('id1', 'id2')"),
16+
(["id1", "id2", "id3", "id4"], "c.customer_id IN ('id1', 'id2', 'id3', 'id4')"),
17+
],
18+
)
19+
def test_create_sql_in_condition(
20+
project_repository: ProjectCosmosDBRepository,
21+
customer_ids_list,
22+
expected_result,
23+
):
24+
result = project_repository.create_sql_customer_id_in_condition(customer_ids_list)
25+
assert expected_result == result
26+
27+
28+
@patch(
29+
'time_tracker_api.projects.projects_model.ProjectCosmosDBRepository.create_sql_condition_for_visibility'
30+
)
31+
@patch(
32+
'time_tracker_api.projects.projects_model.ProjectCosmosDBRepository.create_sql_customer_id_in_condition'
33+
)
34+
@patch(
35+
'time_tracker_api.projects.projects_model.ProjectCosmosDBRepository.find_partition_key_value'
36+
)
37+
def test_find_all_with_customer_id_in_list(
38+
find_partition_key_value_mock,
39+
create_sql_customer_id_in_condition_mock,
40+
create_sql_condition_for_visibility_mock,
41+
event_context: EventContext,
42+
project_repository: ProjectCosmosDBRepository,
43+
):
44+
expected_item = {
45+
'customer_id': 'id1',
46+
'name': 'testing',
47+
'description': 'do some testing',
48+
'project_type_id': "id2",
49+
'tenant_id': 'tenantid1',
50+
}
51+
52+
query_items_mock = Mock(return_value=[expected_item])
53+
project_repository.container = Mock()
54+
project_repository.container.query_items = query_items_mock
55+
56+
result = project_repository.find_all_with_customer_id_in_list(event_context, [])
57+
58+
create_sql_condition_for_visibility_mock.assert_called_once()
59+
create_sql_customer_id_in_condition_mock.assert_called_once()
60+
find_partition_key_value_mock.assert_called_once()
61+
query_items_mock.assert_called_once()
62+
63+
assert len(result) == 1
64+
project = result[0]
65+
assert isinstance(project, ProjectCosmosDBModel)
66+
assert project.__dict__ == expected_item

time_tracker_api/projects/projects_model.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
CosmosDBRepository,
77
)
88
from time_tracker_api.database import CRUDDao, APICosmosDBDao
9+
from typing import List, Callable
10+
from commons.data_access_layer.database import EventContext
11+
from utils.repository import convert_list_to_tuple_string
912
from time_tracker_api.customers.customers_model import (
1013
create_dao as customers_create_dao,
1114
)
@@ -63,6 +66,36 @@ def __init__(self):
6366
mapper=ProjectCosmosDBModel,
6467
)
6568

69+
def create_sql_customer_id_in_condition(self, customer_ids_list):
70+
id_values = convert_list_to_tuple_string(customer_ids_list)
71+
72+
return "c.customer_id IN {value_condition}".format(value_condition=id_values)
73+
74+
def find_all_with_customer_id_in_list(
75+
self,
76+
event_context: EventContext,
77+
customer_ids_list: List[str],
78+
visible_only=True,
79+
mapper: Callable = None,
80+
):
81+
visibility = self.create_sql_condition_for_visibility(visible_only)
82+
query_str = """
83+
SELECT * FROM c
84+
WHERE {condition}
85+
{visibility_condition}
86+
""".format(
87+
condition=self.create_sql_customer_id_in_condition(customer_ids_list),
88+
visibility_condition=visibility,
89+
)
90+
91+
tenant_id_value = self.find_partition_key_value(event_context)
92+
result = self.container.query_items(
93+
query=query_str,
94+
partition_key=tenant_id_value,
95+
)
96+
function_mapper = self.get_mapper_or_dict(mapper)
97+
return list(map(function_mapper, result))
98+
6699

67100
class ProjectCosmosDBDao(APICosmosDBDao, ProjectDao):
68101
def __init__(self, repository):

0 commit comments

Comments
 (0)