Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 4 additions & 4 deletions stripe/_list_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ def _auto_paging_iter(self) -> Iterator[T]:

while True:
if (
"ending_before" in self._retrieve_params
and "starting_after" not in self._retrieve_params
self._retrieve_params.get("ending_before") is not None
and self._retrieve_params.get("starting_after") is None
):
for item in reversed(page):
yield item
Expand All @@ -151,8 +151,8 @@ async def _auto_paging_iter_async(self) -> AsyncIterator[T]:

while True:
if (
"ending_before" in self._retrieve_params
and "starting_after" not in self._retrieve_params
self._retrieve_params.get("ending_before") is not None
and self._retrieve_params.get("starting_after") is None
):
for item in reversed(page):
yield item
Expand Down
65 changes: 65 additions & 0 deletions tests/api_resources/test_list_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,38 @@ def test_iter_reverse(self, http_client_mock):

assert seen == ["pm_126", "pm_125", "pm_124", "pm_123"]

def test_iter_reverse_none_starting_after(self, http_client_mock):
"""Test that if `starting_after` is present in the retrieve params, but is
`None`, that reverse pagination still occurs as expected.
"""
lo = stripe.ListObject.construct_from(
self.pageable_model_response(["pm_125", "pm_126"], True), "mykey"
)
lo._retrieve_params = {
"foo": "bar",
"ending_before": "pm_127",
"starting_after": None,
}

http_client_mock.stub_request(
"get",
path="/v1/pageablemodels",
query_string="ending_before=pm_125&foo=bar",
rbody=json.dumps(
self.pageable_model_response(["pm_123", "pm_124"], False)
),
)

seen = [item["id"] for item in lo.auto_paging_iter()]

http_client_mock.assert_requested(
"get",
path="/v1/pageablemodels",
query_string="ending_before=pm_125&foo=bar",
)

assert seen == ["pm_126", "pm_125", "pm_124", "pm_123"]

def test_class_method_two_pages(self, http_client_mock):
http_client_mock.stub_request(
"get",
Expand Down Expand Up @@ -566,3 +598,36 @@ async def test_iter_reverse(self, http_client_mock):
)

assert seen == ["pm_126", "pm_125", "pm_124", "pm_123"]

@pytest.mark.anyio
async def test_iter_reverse_none_starting_after(self, http_client_mock):
"""Test that if `starting_after` is present in the retrieve params, but is
`None`, that reverse pagination still occurs as expected.
"""
lo = stripe.ListObject.construct_from(
self.pageable_model_response(["pm_125", "pm_126"], True), "mykey"
)
lo._retrieve_params = {
"foo": "bar",
"ending_before": "pm_127",
"starting_after": None,
}

http_client_mock.stub_request(
"get",
path="/v1/pageablemodels",
query_string="ending_before=pm_125&foo=bar",
rbody=json.dumps(
self.pageable_model_response(["pm_123", "pm_124"], False)
),
)

seen = [item["id"] async for item in lo.auto_paging_iter()]

http_client_mock.assert_requested(
"get",
path="/v1/pageablemodels",
query_string="ending_before=pm_125&foo=bar",
)

assert seen == ["pm_126", "pm_125", "pm_124", "pm_123"]