Skip to content

Commit db7a973

Browse files
committed
feat: TT-243 Add functions and testing to base query builder
1 parent d4abe83 commit db7a973

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed

tests/utils/query_builder_test.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,88 @@ def test_add_sql_where_equal_condition_with_None_should_not_update_lists():
9090
assert query_builder.parameters == []
9191

9292

93+
@pytest.mark.parametrize(
94+
"data,expected_where_list,expected_params",
95+
[
96+
([], [], []),
97+
(
98+
[
99+
{
100+
"field_name": "end_date",
101+
"compare_field_name": "start_date",
102+
"compare_field_value": "nomatter",
103+
},
104+
{
105+
"field_name": "start_date",
106+
"compare_field_name": "end_date",
107+
"compare_field_value": "nomatter",
108+
},
109+
],
110+
[
111+
"c.end_date != @start_date",
112+
"c.start_date != @end_date",
113+
],
114+
[
115+
{'name': '@start_date', 'value': 'nomatter'},
116+
{'name': '@end_date', 'value': 'nomatter'},
117+
],
118+
),
119+
],
120+
)
121+
def test_add_sql_where_not_equal_condition_should_update_where_conditions_list(
122+
data, expected_where_list, expected_params
123+
):
124+
query_builder = CosmosDBQueryBuilder().add_sql_where_not_equal_condition(
125+
data
126+
)
127+
128+
assert len(query_builder.where_conditions) == len(expected_where_list)
129+
assert len(query_builder.parameters) == len(expected_params)
130+
assert query_builder.where_conditions == expected_where_list
131+
assert query_builder.parameters == expected_params
132+
133+
134+
def test_add_sql_where_not_equal_condition_with_none_data_should_not_update_lists():
135+
query_builder = CosmosDBQueryBuilder().add_sql_where_not_equal_condition(
136+
None
137+
)
138+
139+
assert len(query_builder.where_conditions) == 0
140+
assert len(query_builder.parameters) == 0
141+
assert query_builder.parameters == []
142+
assert query_builder.where_conditions == []
143+
144+
145+
@pytest.mark.parametrize(
146+
"data,expected_params",
147+
[
148+
(
149+
[
150+
{
151+
"field_name": "end_date",
152+
"compare_field_name": "start_date",
153+
"compare_field_value": "nomatter",
154+
}
155+
],
156+
[
157+
{'name': '@start_date', 'value': 'nomatter'},
158+
],
159+
)
160+
],
161+
)
162+
def test_add_sql_where_not_equal_conditions_should_not_update_parameters_if_already_exists(
163+
data, expected_params
164+
):
165+
query_builder = CosmosDBQueryBuilder()
166+
query_builder.parameters = [
167+
{'name': '@start_date', 'value': 'nomatter'},
168+
]
169+
170+
query_builder.add_sql_where_not_equal_condition(data)
171+
172+
assert len(query_builder.parameters) == len(expected_params)
173+
174+
93175
@pytest.mark.parametrize(
94176
"visibility_bool,expected_where_list",
95177
[(True, ['NOT IS_DEFINED(c.deleted)']), (False, [])],
@@ -331,3 +413,30 @@ def test_add_sql_not_in_condition(
331413
)
332414
assert len(query_builder.where_conditions) == len(expected_not_in_list)
333415
assert query_builder.where_conditions == expected_not_in_list
416+
417+
418+
def test_add_sql_non_existent_attribute_condition_should_update_where_conditions_list():
419+
query_builder = (
420+
CosmosDBQueryBuilder().add_sql_non_existent_attribute_condition('name')
421+
)
422+
expected_condition = "(NOT IS_DEFINED(c.name) OR c.name = null)"
423+
424+
assert len(query_builder.where_conditions) == 1
425+
assert query_builder.where_conditions[0].strip() == expected_condition
426+
427+
428+
@pytest.mark.parametrize(
429+
"expected_condition,expected_params",
430+
[("c.id!=@ignore_id", {"name": "@ignore_id", "value": "nomatter"})],
431+
)
432+
def test_add_sql_ignore_id_condition_should_update_where_conditions_list(
433+
expected_condition, expected_params
434+
):
435+
query_builder = CosmosDBQueryBuilder().add_sql_ignore_id_condition(
436+
'nomatter'
437+
)
438+
439+
assert len(query_builder.where_conditions) == 1
440+
assert len(query_builder.parameters) == 1
441+
assert query_builder.where_conditions[0].strip() == expected_condition
442+
assert query_builder.parameters[0] == expected_params

utils/query_builder.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ def add_sql_where_equal_condition(self, data: dict = None):
4242
self.parameters.append({'name': f'@{k}', 'value': v})
4343
return self
4444

45+
def add_sql_where_not_equal_condition(self, conditions: list = None):
46+
if conditions:
47+
for condition_values in conditions:
48+
field_name = condition_values['field_name']
49+
compare_field_name = condition_values['compare_field_name']
50+
compare_field_value = condition_values['compare_field_value']
51+
condition = f"c.{field_name} != @{compare_field_name}"
52+
self.where_conditions.append(condition)
53+
parameter = {
54+
'name': f'@{compare_field_name}',
55+
'value': compare_field_value,
56+
}
57+
if parameter not in self.parameters:
58+
self.parameters.append(parameter)
59+
return self
60+
4561
def add_sql_visibility_condition(self, visible_only: bool):
4662
if visible_only:
4763
self.where_conditions.append('NOT IS_DEFINED(c.deleted)')
@@ -69,6 +85,19 @@ def add_sql_not_in_condition(
6985
self.where_conditions.append(f"c.{attribute} NOT IN {ids_values}")
7086
return self
7187

88+
def add_sql_non_existent_attribute_condition(self, attribute: str):
89+
condition = f"""
90+
(NOT IS_DEFINED(c.{attribute}) OR c.{attribute} = null)
91+
"""
92+
self.where_conditions.append(condition)
93+
return self
94+
95+
def add_sql_ignore_id_condition(self, id: str = None):
96+
if id:
97+
self.where_conditions.append("c.id!=@ignore_id")
98+
self.parameters.append({'name': '@ignore_id', 'value': id})
99+
return self
100+
72101
def __build_select(self):
73102
if len(self.select_conditions) < 1:
74103
self.select_conditions.append("*")

0 commit comments

Comments
 (0)