Skip to content

Commit 10a5cbd

Browse files
committed
removes code duplication
1 parent 51a40ab commit 10a5cbd

4 files changed

Lines changed: 91 additions & 77 deletions

File tree

tests/apimatic_core/pagination_tests/strategies/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
'test_offset_pagination',
33
'test_page_pagination',
44
'test_cursor_pagination',
5-
'test_link_pagination'
5+
'test_link_pagination',
6+
'strategy_base'
67
]
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from apimatic_core.pagination.pagination_strategy import PaginationStrategy
2+
from apimatic_core.utilities.api_helper import ApiHelper
3+
4+
5+
class StrategyBase:
6+
7+
@staticmethod
8+
def assert_initial_param_extraction(
9+
mocker,
10+
mock_request_builder,
11+
mock_metadata_wrapper,
12+
input_pointer,
13+
initial_params,
14+
expected_value,
15+
json_pointer_return_value,
16+
default_value,
17+
pagination_instance_creator
18+
):
19+
# Set request builder params
20+
if "$request.path" in input_pointer:
21+
mock_request_builder._template_params = initial_params
22+
elif "$request.query" in input_pointer:
23+
mock_request_builder._query_params = initial_params
24+
elif "$request.headers" in input_pointer:
25+
mock_request_builder._header_params = initial_params
26+
27+
# Mock helper methods
28+
mock_split = mocker.patch.object(ApiHelper, 'split_into_parts',
29+
return_value=(input_pointer.split('#')[0], input_pointer.split('#')[1]))
30+
mock_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer',
31+
return_value=json_pointer_return_value)
32+
33+
# Run
34+
pagination_instance = pagination_instance_creator(input_pointer, mock_metadata_wrapper)
35+
result = pagination_instance._get_initial_request_param_value(
36+
mock_request_builder, input_pointer, default_value
37+
) if default_value is not None else pagination_instance._get_initial_request_param_value(
38+
mock_request_builder, input_pointer)
39+
40+
# Assert
41+
mock_split.assert_called_once_with(input_pointer)
42+
43+
if input_pointer.startswith((
44+
PaginationStrategy.PATH_PARAMS_IDENTIFIER,
45+
PaginationStrategy.QUERY_PARAMS_IDENTIFIER,
46+
PaginationStrategy.HEADER_PARAMS_IDENTIFIER
47+
)):
48+
if PaginationStrategy.PATH_PARAMS_IDENTIFIER in input_pointer:
49+
accessed = mock_request_builder.template_params
50+
mock_json_pointer.assert_called_once_with(accessed, f"{input_pointer.split('#')[1]}/value")
51+
elif PaginationStrategy.QUERY_PARAMS_IDENTIFIER in input_pointer:
52+
accessed = mock_request_builder.query_params
53+
mock_json_pointer.assert_called_once_with(accessed, input_pointer.split('#')[1])
54+
elif PaginationStrategy.HEADER_PARAMS_IDENTIFIER in input_pointer:
55+
accessed = mock_request_builder.header_params
56+
mock_json_pointer.assert_called_once_with(accessed, input_pointer.split('#')[1])
57+
else:
58+
mock_json_pointer.assert_not_called()
59+
60+
assert result == expected_value

tests/apimatic_core/pagination_tests/strategies/test_offset_pagination.py

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import pytest
22

33
from apimatic_core.pagination.paginated_data import PaginatedData
4-
from apimatic_core.pagination.pagination_strategy import PaginationStrategy
5-
from apimatic_core.utilities.api_helper import ApiHelper
64
from apimatic_core.request_builder import RequestBuilder
75
from apimatic_core.pagination.strategies.offset_pagination import OffsetPagination
6+
from tests.apimatic_core.pagination_tests.strategies.strategy_base import StrategyBase
87

9-
class TestOffsetPagination:
8+
9+
class TestOffsetPagination(StrategyBase):
1010

1111
@pytest.fixture
1212
def mock_metadata_wrapper(self, mocker):
@@ -153,39 +153,14 @@ def test_apply_metadata_wrapper(self, mock_metadata_wrapper, mocker):
153153
)
154154
def test_get_initial_offset_various_scenarios(self, mocker, mock_request_builder, mock_metadata_wrapper,
155155
input_pointer, initial_params, expected_value, json_pointer_return_value):
156-
# Dynamically set params based on the test case
157-
if PaginationStrategy.PATH_PARAMS_IDENTIFIER in input_pointer:
158-
mock_request_builder._template_params = initial_params
159-
elif PaginationStrategy.QUERY_PARAMS_IDENTIFIER in input_pointer:
160-
mock_request_builder._query_params = initial_params
161-
elif PaginationStrategy.HEADER_PARAMS_IDENTIFIER in input_pointer:
162-
mock_request_builder._header_params = initial_params
163-
164-
# Mocks
165-
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
166-
return_value=(input_pointer.split('#')[0], input_pointer.split('#')[1]))
167-
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer',
168-
return_value=json_pointer_return_value)
169-
170-
op = self._create_offset_pagination_instance(input_pointer, mock_metadata_wrapper)
171-
result = op._get_initial_request_param_value(mock_request_builder, input_pointer)
172-
173-
mock_split_into_parts.assert_called_once_with(input_pointer)
174-
175-
# Assertions for mock calls based on prefix validity
176-
if input_pointer.startswith((PaginationStrategy.PATH_PARAMS_IDENTIFIER, PaginationStrategy.QUERY_PARAMS_IDENTIFIER, PaginationStrategy.HEADER_PARAMS_IDENTIFIER)):
177-
# Determine which params dict was accessed
178-
if PaginationStrategy.PATH_PARAMS_IDENTIFIER in input_pointer:
179-
accessed_params = mock_request_builder.template_params
180-
mock_get_value_by_json_pointer.assert_called_once_with(
181-
accessed_params, f"{input_pointer.split('#')[1]}/value")
182-
elif PaginationStrategy.QUERY_PARAMS_IDENTIFIER in input_pointer:
183-
accessed_params = mock_request_builder.query_params
184-
mock_get_value_by_json_pointer.assert_called_once_with(accessed_params, input_pointer.split('#')[1])
185-
elif PaginationStrategy.HEADER_PARAMS_IDENTIFIER in input_pointer:
186-
accessed_params = mock_request_builder.header_params
187-
mock_get_value_by_json_pointer.assert_called_once_with(accessed_params, input_pointer.split('#')[1])
188-
else:
189-
mock_get_value_by_json_pointer.assert_not_called()
190-
191-
assert result == expected_value
156+
self.assert_initial_param_extraction(
157+
mocker,
158+
mock_request_builder,
159+
mock_metadata_wrapper,
160+
input_pointer,
161+
initial_params,
162+
expected_value,
163+
json_pointer_return_value,
164+
default_value=0,
165+
pagination_instance_creator=self._create_offset_pagination_instance
166+
)

tests/apimatic_core/pagination_tests/strategies/test_page_pagination.py

Lines changed: 15 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import pytest
22

33
from apimatic_core.pagination.paginated_data import PaginatedData
4-
from apimatic_core.pagination.pagination_strategy import PaginationStrategy
54
from apimatic_core.pagination.strategies.page_pagination import PagePagination
6-
from apimatic_core.utilities.api_helper import ApiHelper
75
from apimatic_core.request_builder import RequestBuilder
6+
from tests.apimatic_core.pagination_tests.strategies.strategy_base import StrategyBase
87

98

10-
class TestPagePagination:
9+
class TestPagePagination(StrategyBase):
1110

1211
@pytest.fixture
1312
def mock_metadata_wrapper(self, mocker):
@@ -171,41 +170,20 @@ def test_apply_metadata_wrapper(self, mock_metadata_wrapper, mocker):
171170
("$request.path#/page", {"page": {"value": 2, "encoded": True}}, 2, "2"),
172171
("$request.query#/page", {"page": 3, "limit": 10}, 3, "3"),
173172
("$request.headers#/page", {"page": 4}, 4, "4"),
174-
("$request.query#/page", {"limit": 10}, 1, None),
175-
("invalid_prefix#/page", {"page": 10}, 1, "10"),
173+
("$request.query#/page", {"limit": 10}, 0, None),
174+
("invalid_prefix#/page", {"page": 10}, 0, "10"),
176175
]
177176
)
178177
def test_get_initial_page_offset_various_scenarios(self, mocker, mock_request_builder, mock_metadata_wrapper,
179178
input_pointer, initial_params, expected_value, json_pointer_return_value):
180-
if PaginationStrategy.PATH_PARAMS_IDENTIFIER in input_pointer:
181-
mock_request_builder._template_params = initial_params
182-
elif PaginationStrategy.QUERY_PARAMS_IDENTIFIER in input_pointer:
183-
mock_request_builder._query_params = initial_params
184-
elif PaginationStrategy.HEADER_PARAMS_IDENTIFIER in input_pointer:
185-
mock_request_builder._header_params = initial_params
186-
187-
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
188-
return_value=(input_pointer.split('#')[0], input_pointer.split('#')[1]))
189-
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer',
190-
return_value=json_pointer_return_value)
191-
192-
pp = self._create_page_pagination_instance(input_pointer, mock_metadata_wrapper)
193-
result = pp._get_initial_request_param_value(mock_request_builder, input_pointer, 1)
194-
195-
mock_split_into_parts.assert_called_once_with(input_pointer)
196-
197-
if input_pointer.startswith((PaginationStrategy.PATH_PARAMS_IDENTIFIER, PaginationStrategy.QUERY_PARAMS_IDENTIFIER, PaginationStrategy.HEADER_PARAMS_IDENTIFIER)):
198-
if PaginationStrategy.PATH_PARAMS_IDENTIFIER in input_pointer:
199-
accessed_params = mock_request_builder.template_params
200-
mock_get_value_by_json_pointer.assert_called_once_with(
201-
accessed_params, f"{input_pointer.split('#')[1]}/value")
202-
elif PaginationStrategy.QUERY_PARAMS_IDENTIFIER in input_pointer:
203-
accessed_params = mock_request_builder.query_params
204-
mock_get_value_by_json_pointer.assert_called_once_with(accessed_params, input_pointer.split('#')[1])
205-
elif PaginationStrategy.HEADER_PARAMS_IDENTIFIER in input_pointer:
206-
accessed_params = mock_request_builder.header_params
207-
mock_get_value_by_json_pointer.assert_called_once_with(accessed_params, input_pointer.split('#')[1])
208-
else:
209-
mock_get_value_by_json_pointer.assert_not_called()
210-
211-
assert result == expected_value
179+
self.assert_initial_param_extraction(
180+
mocker,
181+
mock_request_builder,
182+
mock_metadata_wrapper,
183+
input_pointer,
184+
initial_params,
185+
expected_value,
186+
json_pointer_return_value,
187+
default_value=0,
188+
pagination_instance_creator=self._create_page_pagination_instance
189+
)

0 commit comments

Comments
 (0)