Skip to content

Commit 4c781f1

Browse files
committed
reduced the duplication and removed the python 3.7 testing on the changes
1 parent 6bd7f57 commit 4c781f1

3 files changed

Lines changed: 120 additions & 190 deletions

File tree

.github/workflows/test-runner.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
strategy:
1717
matrix:
1818
os: [ubuntu-22.04]
19-
python: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
19+
python: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
2020
steps:
2121
- uses: actions/checkout@v3
2222
- name: Setup Python

tests/apimatic_core/pagination_tests/strategies/test_offset_pagination.py

Lines changed: 62 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,10 @@ class TestOffsetPagination:
99

1010
@pytest.fixture
1111
def mock_metadata_wrapper(self, mocker):
12-
# Reusing the mock_metadata_wrapper from previous context
1312
return mocker.Mock(name="metadata_wrapper_mock")
1413

1514
@pytest.fixture
1615
def mock_request_builder(self, mocker):
17-
# Reusing the mock_request_builder from previous context
1816
class MockRequestBuilder(RequestBuilder):
1917
@property
2018
def template_params(self):
@@ -36,12 +34,10 @@ def __init__(self, template_params=None, query_params=None, header_params=None):
3634

3735
def clone_with(self, **kwargs):
3836
new_rb = MockRequestBuilder()
39-
# Copy existing attributes
4037
new_rb._template_params = self.template_params.copy()
4138
new_rb._query_params = self.query_params.copy()
4239
new_rb._header_params = self.header_params.copy()
4340

44-
# Apply updates from kwargs
4541
if 'template_params' in kwargs:
4642
new_rb.template_params.update(kwargs['template_params'])
4743
if 'query_params' in kwargs:
@@ -67,158 +63,127 @@ def mock_last_response(self, mocker):
6763
@pytest.fixture
6864
def mock_paginated_data_initial_call(self, mocker, mock_request_builder):
6965
paginated_data = mocker.Mock(spec=PaginatedData)
70-
paginated_data.last_response = None # Indicates initial call
66+
paginated_data.last_response = None
7167
paginated_data.request_builder = mock_request_builder
72-
paginated_data.page_size = 0 # Not relevant for initial call
68+
paginated_data.page_size = 0
7369
return paginated_data
7470

7571
@pytest.fixture
7672
def mock_paginated_data_subsequent_call(self, mocker, mock_request_builder, mock_last_response):
7773
paginated_data = mocker.Mock(spec=PaginatedData)
7874
paginated_data.last_response = mock_last_response
7975
paginated_data.request_builder = mock_request_builder
80-
paginated_data.page_size = 10 # Assume previous page had 10 items
76+
paginated_data.page_size = 10
8177
return paginated_data
8278

83-
# Test __init__
79+
def _create_offset_pagination_instance(self, input_value, metadata_wrapper):
80+
"""Helper to create an OffsetPagination instance."""
81+
return OffsetPagination(input_=input_value, metadata_wrapper=metadata_wrapper)
82+
83+
# --- Test __init__ ---
8484
def test_init_success(self, mock_metadata_wrapper):
85-
op = OffsetPagination(input_="$request.query#/offset", metadata_wrapper=mock_metadata_wrapper)
85+
op = self._create_offset_pagination_instance("$request.query#/offset", mock_metadata_wrapper)
8686
assert op._input == "$request.query#/offset"
8787
assert op._metadata_wrapper == mock_metadata_wrapper
8888
assert op._offset == 0
8989

9090
def test_init_input_none_raises_error(self, mock_metadata_wrapper):
9191
with pytest.raises(ValueError, match="Input pointer for offset based pagination cannot be None"):
92-
OffsetPagination(input_=None, metadata_wrapper=mock_metadata_wrapper)
92+
self._create_offset_pagination_instance(None, mock_metadata_wrapper)
9393

94-
def test_init_metadata_wrapper_none_raises_error(self, mock_metadata_wrapper):
94+
def test_init_metadata_wrapper_none_raises_error(self):
9595
with pytest.raises(ValueError, match="Metadata wrapper for the pagination cannot be None"):
96-
OffsetPagination(input_=None, metadata_wrapper=None)
96+
self._create_offset_pagination_instance("$request.query#/offset", None)
9797

98-
# Test apply
98+
# --- Test apply ---
9999
def test_apply_initial_call_with_offset_from_query(self, mocker, mock_paginated_data_initial_call,
100100
mock_request_builder):
101-
# Mock _get_initial_offset to return a specific value
102101
mock_get_initial_request_param_value = mocker.patch.object(OffsetPagination, '_get_initial_request_param_value', return_value=100)
103102

104-
op = OffsetPagination(input_="$request.query#/offset", metadata_wrapper=mocker.Mock())
103+
op = self._create_offset_pagination_instance("$request.query#/offset", mocker.Mock())
105104
result_rb = op.apply(mock_paginated_data_initial_call)
106105

107-
# Assert that _get_initial_offset was called
108106
mock_get_initial_request_param_value.assert_called_once_with(mock_request_builder, "$request.query#/offset")
109107
assert op._offset == 100
110-
assert result_rb == mock_request_builder # Should return the original request_builder
108+
assert result_rb == mock_request_builder
111109

112110
def test_apply_subsequent_call_increments_offset_and_updates_builder(self, mocker,
113111
mock_paginated_data_subsequent_call,
114112
mock_request_builder):
115-
# Initialize the offset to simulate it being set by a previous call (e.g., test_apply_initial_call)
116-
# or just set it to 0 and let apply handle the first increment
117-
op = OffsetPagination(input_="$request.query#/offset", metadata_wrapper=mocker.Mock())
118-
op._offset = 10 # Simulate offset after 1st page
113+
op = self._create_offset_pagination_instance("$request.query#/offset", mocker.Mock())
114+
op._offset = 10
119115

120-
# Patch get_updated_request_builder to simulate its behavior
121116
mock_get_updated_request_builder = mocker.patch.object(
122117
OffsetPagination, 'get_updated_request_builder',
123118
return_value=mock_request_builder.clone_with(query_params={"offset": 20, "limit": 10})
124119
)
125120

126121
result_rb = op.apply(mock_paginated_data_subsequent_call)
127122

128-
# Expected offset: initial (10) + last_page_size (10) = 20
129123
assert op._offset == 20
130124
mock_get_updated_request_builder.assert_called_once_with(
131125
mock_request_builder, "$request.query#/offset", 20
132126
)
133-
# Verify that the returned request builder has the updated offset
134127
assert result_rb.query_params["offset"] == 20
135128

136-
# Test apply_metadata_wrapper
129+
# --- Test apply_metadata_wrapper ---
137130
def test_apply_metadata_wrapper(self, mock_metadata_wrapper, mocker):
138131
mock_metadata_wrapper.return_value = "wrapped_response_with_offset"
139132

140-
op = OffsetPagination(
141-
input_="$request.query#/offset",
142-
metadata_wrapper=mock_metadata_wrapper
143-
)
144-
op._offset = 50 # Set an offset value for the test
133+
op = self._create_offset_pagination_instance("$request.query#/offset", mock_metadata_wrapper)
134+
op._offset = 50
145135
mock_page_response = mocker.Mock()
146136

147137
result = op.apply_metadata_wrapper(mock_page_response)
148138

149139
mock_metadata_wrapper.assert_called_once_with(mock_page_response, 50)
150140
assert result == "wrapped_response_with_offset"
151141

152-
# Test _get_initial_offset
153-
def test_get_initial_offset_from_path(self, mocker, mock_request_builder):
154-
# Ensure the mock_request_builder has the value in template_params for this test
155-
mock_request_builder._template_params = {"offset": 50}
156-
157-
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
158-
return_value=("$request.path", "/offset"))
159-
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer', return_value="50")
160-
161-
op = OffsetPagination(input_="$request.path#/offset", metadata_wrapper=mocker.Mock())
162-
result = op._get_initial_request_param_value(mock_request_builder, "$request.path#/offset")
163-
164-
mock_split_into_parts.assert_called_once_with("$request.path#/offset")
165-
mock_get_value_by_json_pointer.assert_called_once_with(mock_request_builder.template_params, "/offset")
166-
assert result == 50
167-
168-
def test_get_initial_offset_from_query(self, mocker, mock_request_builder, mock_metadata_wrapper):
169-
# Ensure the mock_request_builder has the value in query_params for this test
170-
mock_request_builder._query_params = {"offset": 100, "limit": 20}
171-
172-
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
173-
return_value=("$request.query", "/offset"))
174-
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer', return_value="100")
175-
176-
op = OffsetPagination(input_="$request.query#/offset", metadata_wrapper=mock_metadata_wrapper)
177-
result = op._get_initial_request_param_value(mock_request_builder, "$request.query#/offset")
178-
179-
mock_split_into_parts.assert_called_once_with("$request.query#/offset")
180-
mock_get_value_by_json_pointer.assert_called_once_with(mock_request_builder.query_params, "/offset")
181-
assert result == 100
182-
183-
def test_get_initial_offset_from_headers(self, mocker, mock_request_builder, mock_metadata_wrapper):
184-
# Ensure the mock_request_builder has the value in header_params for this test
185-
mock_request_builder._header_params = {"offset": 200}
186-
187-
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
188-
return_value=("$request.headers", "/offset"))
189-
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer', return_value="200")
190-
191-
op = OffsetPagination(input_="$request.headers#/offset", metadata_wrapper=mock_metadata_wrapper)
192-
result = op._get_initial_request_param_value(mock_request_builder, "$request.headers#/offset")
193-
194-
mock_split_into_parts.assert_called_once_with("$request.headers#/offset")
195-
mock_get_value_by_json_pointer.assert_called_once_with(mock_request_builder.header_params, "/offset")
196-
assert result == 200
197-
198-
def test_get_initial_offset_no_value_found(self, mocker, mock_request_builder, mock_metadata_wrapper):
199-
# Ensure the mock_request_builder has no 'offset' in the relevant params
200-
mock_request_builder._query_params = {"limit": 20}
201-
142+
# --- Test _get_initial_request_param_value ---
143+
@pytest.mark.parametrize(
144+
"input_pointer, initial_params, expected_value, json_pointer_return_value",
145+
[
146+
("$request.path#/offset", {"offset": 50}, 50, "50"),
147+
("$request.query#/offset", {"offset": 100, "limit": 20}, 100, "100"),
148+
("$request.headers#/offset", {"offset": 200}, 200, "200"),
149+
("$request.query#/offset", {"limit": 20}, 0, None), # No value found
150+
("invalid_prefix#/offset", {"offset": 10}, 0, "10"), # Invalid prefix, should default to 0
151+
]
152+
)
153+
def test_get_initial_offset_various_scenarios(self, mocker, mock_request_builder, mock_metadata_wrapper,
154+
input_pointer, initial_params, expected_value, json_pointer_return_value):
155+
# Dynamically set params based on the test case
156+
if "$request.path" in input_pointer:
157+
mock_request_builder._template_params = initial_params
158+
elif "$request.query" in input_pointer:
159+
mock_request_builder._query_params = initial_params
160+
elif "$request.headers" in input_pointer:
161+
mock_request_builder._header_params = initial_params
162+
163+
# Mocks
202164
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
203-
return_value=("$request.query", "/offset"))
165+
return_value=(input_pointer.split('#')[0], input_pointer.split('#')[1]))
204166
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer',
205-
return_value=None) # Simulate not found
167+
return_value=json_pointer_return_value)
206168

207-
op = OffsetPagination(input_="$request.query#/offset", metadata_wrapper=mock_metadata_wrapper)
208-
result = op._get_initial_request_param_value(mock_request_builder, "$request.query#/offset")
209-
mock_split_into_parts.assert_called_once_with("$request.query#/offset")
210-
mock_get_value_by_json_pointer.assert_called_once_with(mock_request_builder.query_params, "/offset")
211-
assert result == 0 # Should default to 0 if not found
169+
op = self._create_offset_pagination_instance(input_pointer, mock_metadata_wrapper)
170+
result = op._get_initial_request_param_value(mock_request_builder, input_pointer)
212171

213-
def test_get_initial_offset_invalid_prefix(self, mocker, mock_request_builder, mock_metadata_wrapper):
214-
mock_split_into_parts = mocker.patch.object(ApiHelper, 'split_into_parts',
215-
return_value=("invalid_prefix", "/offset"))
216-
# Ensure get_value_by_json_pointer is not called for invalid prefixes
217-
mock_get_value_by_json_pointer = mocker.patch.object(ApiHelper, 'get_value_by_json_pointer')
172+
mock_split_into_parts.assert_called_once_with(input_pointer)
173+
174+
# Assertions for mock calls based on prefix validity
175+
if input_pointer.startswith(("$request.path", "$request.query", "$request.headers")):
176+
# Determine which params dict was accessed
177+
accessed_params = None
178+
if "$request.path" in input_pointer:
179+
accessed_params = mock_request_builder.template_params
180+
elif "$request.query" in input_pointer:
181+
accessed_params = mock_request_builder.query_params
182+
elif "$request.headers" in input_pointer:
183+
accessed_params = mock_request_builder.header_params
218184

219-
op = OffsetPagination(input_="invalid_prefix#/offset", metadata_wrapper=mock_metadata_wrapper)
220-
result = op._get_initial_request_param_value(mock_request_builder, "invalid_prefix#/offset")
185+
mock_get_value_by_json_pointer.assert_called_once_with(accessed_params, input_pointer.split('#')[1])
186+
else:
187+
mock_get_value_by_json_pointer.assert_not_called()
221188

222-
mock_split_into_parts.assert_called_once_with("invalid_prefix#/offset")
223-
mock_get_value_by_json_pointer.assert_not_called()
224-
assert result == 0
189+
assert result == expected_value

0 commit comments

Comments
 (0)