Skip to content

Commit 9e0fa3d

Browse files
authored
Fix #1297 Building user_auth_blocks with slack_sdk.models class objects for chat.unfurl API call fails (#1301)
1 parent 3610592 commit 9e0fa3d

File tree

7 files changed

+46
-10
lines changed

7 files changed

+46
-10
lines changed

slack_sdk/web/async_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2131,7 +2131,7 @@ async def chat_unfurl(
21312131
ts: Optional[str] = None,
21322132
source: Optional[str] = None,
21332133
unfurl_id: Optional[str] = None,
2134-
unfurls: Dict[str, Dict],
2134+
unfurls: Optional[Dict[str, Dict]] = None, # or user_auth_*
21352135
user_auth_blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21362136
user_auth_message: Optional[str] = None,
21372137
user_auth_required: Optional[bool] = None,
@@ -2154,6 +2154,7 @@ async def chat_unfurl(
21542154
"user_auth_url": user_auth_url,
21552155
}
21562156
)
2157+
_parse_web_class_objects(kwargs) # for user_auth_blocks
21572158
kwargs = _remove_none_values(kwargs)
21582159
# NOTE: intentionally using json over params for API methods using blocks/attachments
21592160
return await self.api_call("chat.unfurl", json=kwargs)

slack_sdk/web/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2122,7 +2122,7 @@ def chat_unfurl(
21222122
ts: Optional[str] = None,
21232123
source: Optional[str] = None,
21242124
unfurl_id: Optional[str] = None,
2125-
unfurls: Dict[str, Dict],
2125+
unfurls: Optional[Dict[str, Dict]] = None, # or user_auth_*
21262126
user_auth_blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21272127
user_auth_message: Optional[str] = None,
21282128
user_auth_required: Optional[bool] = None,
@@ -2145,6 +2145,7 @@ def chat_unfurl(
21452145
"user_auth_url": user_auth_url,
21462146
}
21472147
)
2148+
_parse_web_class_objects(kwargs) # for user_auth_blocks
21482149
kwargs = _remove_none_values(kwargs)
21492150
# NOTE: intentionally using json over params for API methods using blocks/attachments
21502151
return self.api_call("chat.unfurl", json=kwargs)

slack_sdk/web/internal_utils.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,11 @@ def to_dict(obj: Union[Dict, Block, Attachment, Metadata]):
194194
return obj.to_dict()
195195
return obj
196196

197-
blocks = kwargs.get("blocks", None)
198-
if blocks is not None and isinstance(blocks, Sequence) and (not isinstance(blocks, str)):
199-
dict_blocks = [to_dict(b) for b in blocks]
200-
kwargs.update({"blocks": dict_blocks})
197+
for blocks_name in ["blocks", "user_auth_blocks"]:
198+
blocks = kwargs.get(blocks_name, None)
199+
if blocks is not None and isinstance(blocks, Sequence) and (not isinstance(blocks, str)):
200+
dict_blocks = [to_dict(b) for b in blocks]
201+
kwargs.update({blocks_name: dict_blocks})
201202

202203
attachments = kwargs.get("attachments", None)
203204
if attachments is not None and isinstance(attachments, Sequence) and (not isinstance(attachments, str)):

slack_sdk/web/legacy_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2133,7 +2133,7 @@ def chat_unfurl(
21332133
ts: Optional[str] = None,
21342134
source: Optional[str] = None,
21352135
unfurl_id: Optional[str] = None,
2136-
unfurls: Dict[str, Dict],
2136+
unfurls: Optional[Dict[str, Dict]] = None, # or user_auth_*
21372137
user_auth_blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
21382138
user_auth_message: Optional[str] = None,
21392139
user_auth_required: Optional[bool] = None,
@@ -2156,6 +2156,7 @@ def chat_unfurl(
21562156
"user_auth_url": user_auth_url,
21572157
}
21582158
)
2159+
_parse_web_class_objects(kwargs) # for user_auth_blocks
21592160
kwargs = _remove_none_values(kwargs)
21602161
# NOTE: intentionally using json over params for API methods using blocks/attachments
21612162
return self.api_call("chat.unfurl", json=kwargs)

tests/slack_sdk/web/test_internal_utils.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66

77
from slack_sdk.models.attachments import Attachment
8-
from slack_sdk.models.blocks import Block
8+
from slack_sdk.models.blocks import Block, DividerBlock
99
from slack_sdk.web.internal_utils import _build_unexpected_body_error_message, _parse_web_class_objects
1010

1111

@@ -62,3 +62,13 @@ def test_can_parse_str_attachments(self):
6262
_parse_web_class_objects(kwargs)
6363
assert isinstance(kwargs["attachments"], str)
6464
assert input == kwargs["attachments"]
65+
66+
def test_can_parse_user_auth_blocks(self):
67+
kwargs = {
68+
"channel": "C12345",
69+
"ts": "1111.2222",
70+
"unfurls": {},
71+
"user_auth_blocks": [DividerBlock(), DividerBlock()],
72+
}
73+
_parse_web_class_objects(kwargs)
74+
assert isinstance(kwargs["user_auth_blocks"][0], dict)

tests/slack_sdk/web/test_web_client.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import slack_sdk.errors as err
77
from slack_sdk import WebClient
8+
from slack_sdk.models.blocks import DividerBlock
89
from slack_sdk.models.metadata import Metadata
910
from tests.slack_sdk.web.mock_web_api_server import (
1011
setup_mock_web_api_server,
@@ -218,3 +219,13 @@ def test_message_metadata(self):
218219
),
219220
)
220221
self.assertIsNone(scheduled.get("error"))
222+
223+
def test_user_auth_blocks(self):
224+
client = self.client
225+
new_message = client.chat_unfurl(
226+
channel="C12345",
227+
ts="1111.2222",
228+
unfurls={},
229+
user_auth_blocks=[DividerBlock(), DividerBlock()],
230+
)
231+
self.assertIsNone(new_message.get("error"))

tests/slack_sdk_async/web/test_async_web_client.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import re
22
import unittest
33

4-
import aiohttp
5-
64
import slack_sdk.errors as err
5+
from slack_sdk.models.blocks import DividerBlock
76
from slack_sdk.web.async_client import AsyncWebClient
87
from tests.slack_sdk_async.helpers import async_test
98
from tests.slack_sdk.web.mock_web_api_server import (
@@ -153,3 +152,15 @@ async def test_default_team_id(self):
153152
client = AsyncWebClient(base_url="http://localhost:8888", team_id="T_DEFAULT")
154153
resp = await client.users_list(token="xoxb-users_list_pagination")
155154
self.assertIsNone(resp["error"])
155+
156+
@async_test
157+
async def test_user_auth_blocks(self):
158+
self.client.token = "xoxb-api_test"
159+
client = self.client
160+
new_message = await client.chat_unfurl(
161+
channel="C12345",
162+
ts="1111.2222",
163+
unfurls={},
164+
user_auth_blocks=[DividerBlock(), DividerBlock()],
165+
)
166+
self.assertIsNone(new_message.get("error"))

0 commit comments

Comments
 (0)