@@ -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