Skip to content

Commit

Permalink
Fix #1049 by correcting request body format and next_cursor extraction (
Browse files Browse the repository at this point in the history
  • Loading branch information
seratch committed Jul 14, 2021
1 parent 44e5554 commit df9d71b
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 26 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -40,3 +40,5 @@ tmp.txt
logs/

.pytype/
*.db
.env*
16 changes: 8 additions & 8 deletions slack_sdk/web/async_client.py
Expand Up @@ -393,7 +393,7 @@ async def admin_conversations_rename(

async def admin_conversations_search(self, **kwargs) -> AsyncSlackResponse:
"""Search for public or private channels in an Enterprise organization."""
return await self.api_call("admin.conversations.search", json=kwargs)
return await self.api_call("admin.conversations.search", params=kwargs)

async def admin_conversations_convertToPrivate(
self, *, channel_id: str, **kwargs
Expand Down Expand Up @@ -538,7 +538,7 @@ async def admin_conversations_getTeams(
"""
kwargs.update({"channel_id": channel_id})
return await self.api_call("admin.conversations.getTeams", json=kwargs)
return await self.api_call("admin.conversations.getTeams", params=kwargs)

async def admin_emoji_add(self, **kwargs) -> AsyncSlackResponse:
"""Add an emoji."""
Expand Down Expand Up @@ -668,11 +668,11 @@ async def admin_inviteRequests_approve(

async def admin_inviteRequests_approved_list(self, **kwargs) -> AsyncSlackResponse:
"""List all approved workspace invite requests."""
return await self.api_call("admin.inviteRequests.approved.list", json=kwargs)
return await self.api_call("admin.inviteRequests.approved.list", params=kwargs)

async def admin_inviteRequests_denied_list(self, **kwargs) -> AsyncSlackResponse:
"""List all denied workspace invite requests."""
return await self.api_call("admin.inviteRequests.denied.list", json=kwargs)
return await self.api_call("admin.inviteRequests.denied.list", params=kwargs)

async def admin_inviteRequests_deny(
self, *, invite_request_id: str, **kwargs
Expand All @@ -687,7 +687,7 @@ async def admin_inviteRequests_deny(

async def admin_inviteRequests_list(self, **kwargs) -> AsyncSlackResponse:
"""List all pending workspace invite requests."""
return await self.api_call("admin.inviteRequests.list", json=kwargs)
return await self.api_call("admin.inviteRequests.list", params=kwargs)

async def admin_teams_admins_list(
self, *, team_id: str, **kwargs
Expand Down Expand Up @@ -716,7 +716,7 @@ async def admin_teams_create(

async def admin_teams_list(self, **kwargs) -> AsyncSlackResponse:
"""List all teams on an Enterprise organization."""
return await self.api_call("admin.teams.list", json=kwargs)
return await self.api_call("admin.teams.list", params=kwargs)

async def admin_teams_owners_list(
self, *, team_id: str, **kwargs
Expand Down Expand Up @@ -904,7 +904,7 @@ async def admin_users_list(self, *, team_id: str, **kwargs) -> AsyncSlackRespons
team_id (str): ID of the team. e.g. 'T1234'
"""
kwargs.update({"team_id": team_id})
return await self.api_call("admin.users.list", json=kwargs)
return await self.api_call("admin.users.list", params=kwargs)

async def admin_users_remove(
self, *, team_id: str, user_id: str, **kwargs
Expand Down Expand Up @@ -1392,7 +1392,7 @@ async def chat_update(

async def chat_scheduledMessages_list(self, **kwargs) -> AsyncSlackResponse:
"""Lists all scheduled messages."""
return await self.api_call("chat.scheduledMessages.list", json=kwargs)
return await self.api_call("chat.scheduledMessages.list", params=kwargs)

async def conversations_archive(
self, *, channel: str, **kwargs
Expand Down
16 changes: 8 additions & 8 deletions slack_sdk/web/client.py
Expand Up @@ -364,7 +364,7 @@ def admin_conversations_rename(

def admin_conversations_search(self, **kwargs) -> SlackResponse:
"""Search for public or private channels in an Enterprise organization."""
return self.api_call("admin.conversations.search", json=kwargs)
return self.api_call("admin.conversations.search", params=kwargs)

def admin_conversations_convertToPrivate(
self, *, channel_id: str, **kwargs
Expand Down Expand Up @@ -505,7 +505,7 @@ def admin_conversations_getTeams(
"""
kwargs.update({"channel_id": channel_id})
return self.api_call("admin.conversations.getTeams", json=kwargs)
return self.api_call("admin.conversations.getTeams", params=kwargs)

def admin_emoji_add(self, **kwargs) -> SlackResponse:
"""Add an emoji."""
Expand Down Expand Up @@ -631,11 +631,11 @@ def admin_inviteRequests_approve(

def admin_inviteRequests_approved_list(self, **kwargs) -> SlackResponse:
"""List all approved workspace invite requests."""
return self.api_call("admin.inviteRequests.approved.list", json=kwargs)
return self.api_call("admin.inviteRequests.approved.list", params=kwargs)

def admin_inviteRequests_denied_list(self, **kwargs) -> SlackResponse:
"""List all denied workspace invite requests."""
return self.api_call("admin.inviteRequests.denied.list", json=kwargs)
return self.api_call("admin.inviteRequests.denied.list", params=kwargs)

def admin_inviteRequests_deny(
self, *, invite_request_id: str, **kwargs
Expand All @@ -650,7 +650,7 @@ def admin_inviteRequests_deny(

def admin_inviteRequests_list(self, **kwargs) -> SlackResponse:
"""List all pending workspace invite requests."""
return self.api_call("admin.inviteRequests.list", json=kwargs)
return self.api_call("admin.inviteRequests.list", params=kwargs)

def admin_teams_admins_list(self, *, team_id: str, **kwargs) -> SlackResponse:
"""List all of the admins on a given workspace.
Expand All @@ -675,7 +675,7 @@ def admin_teams_create(

def admin_teams_list(self, **kwargs) -> SlackResponse:
"""List all teams on an Enterprise organization."""
return self.api_call("admin.teams.list", json=kwargs)
return self.api_call("admin.teams.list", params=kwargs)

def admin_teams_owners_list(self, *, team_id: str, **kwargs) -> SlackResponse:
"""List all of the admins on a given workspace.
Expand Down Expand Up @@ -855,7 +855,7 @@ def admin_users_list(self, *, team_id: str, **kwargs) -> SlackResponse:
team_id (str): ID of the team. e.g. 'T1234'
"""
kwargs.update({"team_id": team_id})
return self.api_call("admin.users.list", json=kwargs)
return self.api_call("admin.users.list", params=kwargs)

def admin_users_remove(
self, *, team_id: str, user_id: str, **kwargs
Expand Down Expand Up @@ -1313,7 +1313,7 @@ def chat_update(self, *, channel: str, ts: str, **kwargs) -> SlackResponse:

def chat_scheduledMessages_list(self, **kwargs) -> SlackResponse:
"""Lists all scheduled messages."""
return self.api_call("chat.scheduledMessages.list", json=kwargs)
return self.api_call("chat.scheduledMessages.list", params=kwargs)

def conversations_archive(self, *, channel: str, **kwargs) -> SlackResponse:
"""Archives a conversation.
Expand Down
3 changes: 2 additions & 1 deletion slack_sdk/web/internal_utils.py
Expand Up @@ -219,7 +219,8 @@ def _next_cursor_is_present(data) -> bool:
Returns:
A boolean value.
"""
present = (
# Only admin.conversations.search returns next_cursor at the top level
present = ("next_cursor" in data and data["next_cursor"] != "") or (
"response_metadata" in data
and "next_cursor" in data["response_metadata"]
and data["response_metadata"]["next_cursor"] != ""
Expand Down
16 changes: 8 additions & 8 deletions slack_sdk/web/legacy_client.py
Expand Up @@ -381,7 +381,7 @@ def admin_conversations_rename(

def admin_conversations_search(self, **kwargs) -> Union[Future, SlackResponse]:
"""Search for public or private channels in an Enterprise organization."""
return self.api_call("admin.conversations.search", json=kwargs)
return self.api_call("admin.conversations.search", params=kwargs)

def admin_conversations_convertToPrivate(
self, *, channel_id: str, **kwargs
Expand Down Expand Up @@ -522,7 +522,7 @@ def admin_conversations_getTeams(
"""
kwargs.update({"channel_id": channel_id})
return self.api_call("admin.conversations.getTeams", json=kwargs)
return self.api_call("admin.conversations.getTeams", params=kwargs)

def admin_emoji_add(self, **kwargs) -> Union[Future, SlackResponse]:
"""Add an emoji."""
Expand Down Expand Up @@ -652,13 +652,13 @@ def admin_inviteRequests_approved_list(
self, **kwargs
) -> Union[Future, SlackResponse]:
"""List all approved workspace invite requests."""
return self.api_call("admin.inviteRequests.approved.list", json=kwargs)
return self.api_call("admin.inviteRequests.approved.list", params=kwargs)

def admin_inviteRequests_denied_list(
self, **kwargs
) -> Union[Future, SlackResponse]:
"""List all denied workspace invite requests."""
return self.api_call("admin.inviteRequests.denied.list", json=kwargs)
return self.api_call("admin.inviteRequests.denied.list", params=kwargs)

def admin_inviteRequests_deny(
self, *, invite_request_id: str, **kwargs
Expand All @@ -673,7 +673,7 @@ def admin_inviteRequests_deny(

def admin_inviteRequests_list(self, **kwargs) -> Union[Future, SlackResponse]:
"""List all pending workspace invite requests."""
return self.api_call("admin.inviteRequests.list", json=kwargs)
return self.api_call("admin.inviteRequests.list", params=kwargs)

def admin_teams_admins_list(
self, *, team_id: str, **kwargs
Expand All @@ -700,7 +700,7 @@ def admin_teams_create(

def admin_teams_list(self, **kwargs) -> Union[Future, SlackResponse]:
"""List all teams on an Enterprise organization."""
return self.api_call("admin.teams.list", json=kwargs)
return self.api_call("admin.teams.list", params=kwargs)

def admin_teams_owners_list(
self, *, team_id: str, **kwargs
Expand Down Expand Up @@ -886,7 +886,7 @@ def admin_users_list(
team_id (str): ID of the team. e.g. 'T1234'
"""
kwargs.update({"team_id": team_id})
return self.api_call("admin.users.list", json=kwargs)
return self.api_call("admin.users.list", params=kwargs)

def admin_users_remove(
self, *, team_id: str, user_id: str, **kwargs
Expand Down Expand Up @@ -1378,7 +1378,7 @@ def chat_update(

def chat_scheduledMessages_list(self, **kwargs) -> Union[Future, SlackResponse]:
"""Lists all scheduled messages."""
return self.api_call("chat.scheduledMessages.list", json=kwargs)
return self.api_call("chat.scheduledMessages.list", params=kwargs)

def conversations_archive(
self, *, channel: str, **kwargs
Expand Down
5 changes: 4 additions & 1 deletion slack_sdk/web/slack_response.py
Expand Up @@ -142,7 +142,10 @@ def __next__(self):
params = self.req_args.get("params", {})
if params is None:
params = {}
params.update({"cursor": self.data["response_metadata"]["next_cursor"]})
next_cursor = self.data.get("response_metadata", {}).get(
"next_cursor"
) or self.data.get("next_cursor")
params.update({"cursor": next_cursor})
self.req_args.update({"params": params})

# This method sends a request in a synchronous way
Expand Down
26 changes: 26 additions & 0 deletions tests/slack_sdk/web/test_web_client_issue_1049.py
@@ -0,0 +1,26 @@
import json
import unittest

from slack_sdk.web import WebClient
from tests.slack_sdk.web.mock_web_api_server import (
setup_mock_web_api_server,
cleanup_mock_web_api_server,
)


class TestWebClient_Issue_1049(unittest.TestCase):
def setUp(self):
setup_mock_web_api_server(self)

def tearDown(self):
cleanup_mock_web_api_server(self)

def test_the_pattern(self):
client = WebClient(
base_url="http://localhost:8888",
token="xoxb-admin_convo_pagination",
)
pages = []
for page in client.admin_conversations_search(query="announcement"):
pages.append(page)
self.assertEqual(len(pages), 2)
28 changes: 28 additions & 0 deletions tests/slack_sdk_fixture/web_response_admin_convo_pagination.json
@@ -0,0 +1,28 @@
{
"ok": true,
"conversations": [
{
"id": "C013T0FTKU3",
"name": "random",
"purpose": "test",
"member_count": 11,
"created": 1589700571,
"creator_id": "W111",
"is_private": false,
"is_archived": false,
"is_general": false,
"last_activity_ts": 1599130434000900,
"is_ext_shared": false,
"is_global_shared": false,
"is_org_default": false,
"is_org_mandatory": false,
"is_org_shared": false,
"is_frozen": false,
"internal_team_ids_count": 1,
"internal_team_ids_sample_team": "T111",
"pending_connected_team_ids": [],
"is_pending_ext_shared": false
}
],
"next_cursor": "1"
}
@@ -0,0 +1,5 @@
{
"ok": true,
"conversations": [],
"next_cursor": ""
}

0 comments on commit df9d71b

Please sign in to comment.