Skip to content

Commit 70883cb

Browse files
smaeda-ksRodneyU215
authored andcommitted
Fix Web Client custom iterator (#521)
* Fix Web Client custom iterator * Add a test suite verifying #521 fix * Fix typo
1 parent d9183dc commit 70883cb

2 files changed

Lines changed: 43 additions & 0 deletions

File tree

slack/web/slack_response.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def __init__(
7070
self.data = data
7171
self.headers = headers
7272
self.status_code = status_code
73+
self._initial_data = data
7374
self._client = client
7475
self._logger = logging.getLogger(__name__)
7576

@@ -101,6 +102,7 @@ def __iter__(self):
101102
(SlackResponse) self
102103
"""
103104
self._iteration = 0
105+
self.data = self._initial_data
104106
return self
105107

106108
def __next__(self):

tests/web/test_web_client.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,47 @@ def test_requests_can_be_paginated(self, mock_request):
8686
users = users + page["members"]
8787
self.assertTrue(len(users) == 4)
8888

89+
def test_response_can_be_paginated_multiple_times(self, mock_request):
90+
# This test suite verifies the changes in #521 work as expected
91+
page1 = {
92+
"data": {
93+
"ok": True,
94+
"channels": [{"id": "C1"}],
95+
"response_metadata": {"next_cursor": "has_page2"},
96+
},
97+
"status_code": 200,
98+
"headers": {},
99+
}
100+
page2 = {
101+
"data": {
102+
"ok": True,
103+
"channels": [{"id": "C2"}],
104+
"response_metadata": {"next_cursor": "has_page3"},
105+
},
106+
"status_code": 200,
107+
"headers": {},
108+
}
109+
page3 = {
110+
"data": {"ok": True, "channels": [{"id": "C3"}]},
111+
"status_code": 200,
112+
"headers": {},
113+
}
114+
# The initial pagination
115+
mock_request.response.side_effect = [page1, page2, page3]
116+
response = self.client.channels_list(limit=1)
117+
ids = []
118+
for page in response:
119+
ids.append(page["channels"][0]["id"])
120+
self.assertEqual(ids, ["C1", "C2", "C3"])
121+
122+
# The second iteration starting with page 2
123+
# (page1 is already cached in `response`)
124+
mock_request.response.side_effect = [page2, page3]
125+
ids = []
126+
for page in response:
127+
ids.append(page["channels"][0]["id"])
128+
self.assertEqual(ids, ["C1", "C2", "C3"])
129+
89130
def test_request_pagination_stops_when_next_cursor_is_missing(self, mock_request):
90131
mock_request.response.side_effect = [
91132
{

0 commit comments

Comments
 (0)