Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
eb62162
refactor: TT-185 create SQLBuilder, TimeEntryQueryBuilder and find_al…
kellycastrof Mar 24, 2021
031b883
test: TT-185 query_builder tests
kellycastrof Mar 25, 2021
262ace0
test: TT-185 add test methods for TimeEntryQueryBuilder and new funct…
kellycastrof Mar 26, 2021
7914fdf
build: TT-199 build(deps): bump jinja2 in /requirements/time_tracker…
dependabot[bot] Mar 26, 2021
2b57549
refactor: TT-185 create SQLBuilder, TimeEntryQueryBuilder and find_al…
kellycastrof Mar 24, 2021
7606663
test: TT-185 query_builder tests
kellycastrof Mar 25, 2021
f1fc8a6
test: TT-185 add test methods for TimeEntryQueryBuilder and new funct…
kellycastrof Mar 26, 2021
be72ff8
refactor: TT-185 rename get_string_without_empty_spaces to remove_whi…
kellycastrof Mar 26, 2021
3401b39
refactor: TT-185 add time_entries_id in condition
kellycastrof Mar 26, 2021
2342ce9
refactor: TT-185 delete empty lines
kellycastrof Mar 26, 2021
5358c40
refactor: TT-185 delete isintance validation
kellycastrof Mar 26, 2021
a403edb
refactor: TT-185 improve function remove_white_spaces
Angeluz-07 Mar 26, 2021
d538899
refactor: TT-185 change column to columns
Angeluz-07 Mar 26, 2021
06cbca7
refactor: TT-185 add more scenarios to test_add_sql_in_condition_shou…
Angeluz-07 Mar 26, 2021
a1331fc
refactor: TT-185 add more scenarios to test__build_where_should_retur…
Angeluz-07 Mar 26, 2021
c44f20e
refactor: TT-185 improve test_TimeEntryQueryBuilder_is_subclass_Cosmo…
Angeluz-07 Mar 26, 2021
f17d841
refactor: TT-185 rename args in TimeEntriesRepository
Angeluz-07 Mar 26, 2021
be6e9b1
refactor: TT-185 change the scenarios in test_add_sql_date_range_cond…
kellycastrof Mar 26, 2021
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
Prev Previous commit
Next Next commit
test: TT-185 add test methods for TimeEntryQueryBuilder and new funct…
…ion in repository
  • Loading branch information
kellycastrof committed Mar 26, 2021
commit f1fc8a6d9de36bb457ecfc144dec42d343e3c9cf
29 changes: 9 additions & 20 deletions tests/time_tracker_api/time_entries/time_entries_model_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,26 +269,15 @@ def test_updated_item_without_deleted_key_should_call_validate_data(
time_entry_repository.validate_data.assert_called_once()


@pytest.mark.parametrize(
'owner_list,expected_result',
[
([], ""),
(None, ""),
(["id"], "AND c.owner_id IN ('id')"),
(["id1", "id2"], "AND c.owner_id IN ('id1', 'id2')"),
],
@patch(
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.find_partition_key_value'
)
@patch(
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.get_page_size_or'
)
def test_create_owner_condition(
owner_list,
expected_result,
event_context: EventContext,
time_entry_repository: TimeEntryCosmosDBRepository,
):
result = time_entry_repository.create_owner_condition(owner_list)
assert result == expected_result


def test_find_all_v2(
get_page_size_or_mock,
find_partition_key_value_mock,
event_context: EventContext,
time_entry_repository: TimeEntryCosmosDBRepository,
):
Expand All @@ -315,9 +304,9 @@ def test_find_all_v2(
},
)

print(result)
find_partition_key_value_mock.assert_called_once()
get_page_size_or_mock.assert_called_once()
assert len(result) == 1
time_entry = result[0]
print(time_entry.__dict__)
assert isinstance(time_entry, TimeEntryCosmosDBModel)
assert time_entry.__dict__ == expected_item
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import pytest
from unittest.mock import patch
from utils.query_builder import CosmosDBQueryBuilder
from time_tracker_api.time_entries.time_entries_query_builder import (
TimeEntryQueryBuilder,
)
from utils.repository import get_string_without_empty_spaces


def test_TimeEntryQueryBuilder_is_subclass_CosmosDBQueryBuilder():
query_builder = CosmosDBQueryBuilder()
time_entries_query_builder = TimeEntryQueryBuilder()

assert issubclass(TimeEntryQueryBuilder, CosmosDBQueryBuilder) == True


@pytest.mark.parametrize(
"start_date,end_date,expected_params",
[
(
"2021-03-19T05:07:00.000Z",
"2021-03-25T10:00:00.000Z",
[
{"name": "@start_date", "value": "2021-03-19T05:07:00.000Z"},
{"name": "@end_date", "value": "2021-03-25T10:00:00.000Z"},
],
),
(
"2021-02-10T05:08:00.000Z",
"2021-03-20T11:00:00.000Z",
[
{"name": "@start_date", "value": "2021-02-10T05:08:00.000Z"},
{"name": "@end_date", "value": "2021-03-20T11:00:00.000Z"},
],
),
(
"2021-01-02T05:09:00.000Z",
"2021-01-26T12:00:00.000Z",
[
{"name": "@start_date", "value": "2021-01-02T05:09:00.000Z"},
{"name": "@end_date", "value": "2021-01-26T12:00:00.000Z"},
],
),
],
)
def test_add_sql_date_range_condition_should_update_where_list(
start_date, end_date, expected_params
):
time_entry_query_builder = (
TimeEntryQueryBuilder().add_sql_date_range_condition(
(start_date, end_date)
)
)

assert len(time_entry_query_builder.where_conditions) == 1
assert len(time_entry_query_builder.parameters) == len(expected_params)
assert time_entry_query_builder.get_parameters() == expected_params


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")
)
.build()
)

expected_query = """
SELECT * FROM c
WHERE ((c.start_date BETWEEN @start_date AND @end_date) OR
(c.end_date BETWEEN @start_date AND @end_date))
"""
query = time_entry_query_builder.get_query()

assert get_string_without_empty_spaces(
query
) == get_string_without_empty_spaces(expected_query)

assert len(time_entry_query_builder.where_conditions) == 1
assert len(time_entry_query_builder.get_parameters()) == 2
86 changes: 86 additions & 0 deletions tests/utils/query_builder_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from unittest.mock import patch
from utils.query_builder import CosmosDBQueryBuilder
from utils.repository import get_string_without_empty_spaces
import pytest


Expand Down Expand Up @@ -178,3 +179,88 @@ def test__build_where_should_return_concatenate_conditions(
result = query_builder._CosmosDBQueryBuilder__build_where()

assert result == expected_condition


@pytest.mark.parametrize(
"offset,expected_condition,expected_params",
[(1, "OFFSET @offset", [{'name': '@offset', 'value': 1}]), (None, "", [])],
)
def test__build_offset(
offset,
expected_condition,
expected_params,
):
query_builder = CosmosDBQueryBuilder().add_sql_offset_condition(offset)

result = query_builder._CosmosDBQueryBuilder__build_offset()
assert result == expected_condition
assert len(query_builder.parameters) == len(expected_params)
assert query_builder.get_parameters() == expected_params


@pytest.mark.parametrize(
"limit,expected_condition,expected_params",
[(1, "LIMIT @limit", [{'name': '@limit', 'value': 1}]), (None, "", [])],
)
def test__build_limit(
limit,
expected_condition,
expected_params,
):
query_builder = CosmosDBQueryBuilder().add_sql_limit_condition(limit)

result = query_builder._CosmosDBQueryBuilder__build_limit()
assert result == expected_condition
assert len(query_builder.parameters) == len(expected_params)
assert query_builder.get_parameters() == expected_params


def test_build_with_all_calls_return_query_with_all_conditions():
query_builder = (
CosmosDBQueryBuilder()
.add_select_conditions(["c.description"])
.add_sql_in_condition("id", ["id1", "id2"])
.add_sql_where_equal_condition({'name': 'test'})
.add_sql_offset_condition(2)
.add_sql_limit_condition(10)
.add_sql_visibility_condition(True)
.build()
)
query = query_builder.get_query()
expected_query = """
SELECT c.description FROM c
WHERE c.id IN ('id1', 'id2') AND c.name = @name AND NOT IS_DEFINED(c.deleted)
OFFSET @offset
LIMIT @limit
"""

assert get_string_without_empty_spaces(
query
) == get_string_without_empty_spaces(expected_query)

assert len(query_builder.get_parameters()) > 0
assert len(query_builder.where_conditions) > 0
assert len(query_builder.select_conditions) > 0


def test_build_with_empty_and_None_attributes_return_query_select_all():

query_builder = (
CosmosDBQueryBuilder()
.add_select_conditions()
.add_sql_in_condition()
.add_sql_where_equal_condition()
.add_sql_limit_condition(None)
.add_sql_offset_condition(None)
.build()
)

query = query_builder.get_query()

expected_query = """SELECT * FROM c"""
query = get_string_without_empty_spaces(query)
expected_query = get_string_without_empty_spaces(expected_query)

assert query == expected_query
assert len(query_builder.get_parameters()) == 0
assert len(query_builder.where_conditions) == 0
22 changes: 19 additions & 3 deletions tests/utils/repository_test.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from unittest.mock import patch
from utils.repository import convert_list_to_tuple_string, create_sql_in_condition
from utils.repository import get_string_without_empty_spaces
import pytest


Expand Down Expand Up @@ -41,10 +42,12 @@ def test_convert_list_to_tuple_string_should_success(
[
("customer_id", ["id1"], "c.customer_id IN ('id1')"),
("customer_id", ["id1", "id2"], "c.customer_id IN ('id1', 'id2')"),
("customer_id", ["id1", "id2", "id3", "id4"], "c.customer_id IN ('id1', 'id2', 'id3', 'id4')"),
("customer_id", ["id1", "id2", "id3", "id4"],
"c.customer_id IN ('id1', 'id2', 'id3', 'id4')"),
("id", ["id1"], "c.id IN ('id1')"),
("id", ["id1", "id4"], "c.id IN ('id1', 'id4')"),
("id", ["id1", "id2", "id3", "id4"], "c.id IN ('id1', 'id2', 'id3', 'id4')"),
("id", ["id1", "id2", "id3", "id4"],
"c.id IN ('id1', 'id2', 'id3', 'id4')"),
],
)
def test_create_sql_in_condition(
Expand All @@ -53,4 +56,17 @@ def test_create_sql_in_condition(
expected_result,
):
result = create_sql_in_condition(field, values)
assert expected_result == result
assert expected_result == result


@pytest.mark.parametrize(
"string,expected_string",
[
(" text with \t tab", "text with tab"),
(" text with \n new line", "text with new line"),
(""" SELECT * from c """, "SELECT * from c"),
],
)
def test_get_string_without_empty_spaces(string, expected_string):
string = get_string_without_empty_spaces(string)
assert string == expected_string
10 changes: 9 additions & 1 deletion utils/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,15 @@ def convert_list_to_tuple_string(ids_list):
)
return result


def create_sql_in_condition(field, values):
tuple_string = convert_list_to_tuple_string(values)

return "c.{field} IN {list}".format(field=field, list=tuple_string)
return "c.{field} IN {list}".format(field=field, list=tuple_string)


def get_string_without_empty_spaces(string: str):
from re import sub

string = string.replace("\n", "")
return sub("[\s]+", ' ', string).rstrip().lstrip()