Skip to content

Commit 9c2ae69

Browse files
Fix #1258 Tuple value for blocks argument does not work for Web API calls (#1259)
1 parent d2fd7ac commit 9c2ae69

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

slack_sdk/web/internal_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import sys
55
import warnings
66
from ssl import SSLContext
7-
from typing import Dict, Union, Optional, Any, Sequence
7+
from typing import Any, Dict, Optional, Sequence, Union
88
from urllib.parse import urljoin
99

1010
from slack_sdk import version
@@ -189,12 +189,12 @@ def to_dict(obj: Union[Dict, Block, Attachment, Metadata]):
189189
return obj
190190

191191
blocks = kwargs.get("blocks", None)
192-
if blocks is not None and isinstance(blocks, list):
192+
if blocks is not None and isinstance(blocks, Sequence):
193193
dict_blocks = [to_dict(b) for b in blocks]
194194
kwargs.update({"blocks": dict_blocks})
195195

196196
attachments = kwargs.get("attachments", None)
197-
if attachments is not None and isinstance(attachments, list):
197+
if attachments is not None and isinstance(attachments, Sequence):
198198
dict_attachments = [to_dict(a) for a in attachments]
199199
kwargs.update({"attachments": dict_attachments})
200200

tests/slack_sdk/web/test_internal_utils.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import unittest
2-
from slack_sdk.web.internal_utils import _build_unexpected_body_error_message
2+
from typing import Dict, Sequence, Union
3+
4+
import pytest
5+
6+
from slack_sdk.models.attachments import Attachment
7+
from slack_sdk.models.blocks import Block
8+
from slack_sdk.web.internal_utils import (
9+
_build_unexpected_body_error_message,
10+
_parse_web_class_objects
11+
)
312

413

514
class TestInternalUtils(unittest.TestCase):
@@ -16,3 +25,33 @@ def test_build_unexpected_body_error_message(self):
1625
assert message.startswith(
1726
"""Received a response in a non-JSON format: <!DOCTYPE html><html lang="en"><head><meta charset="utf-8">"""
1827
)
28+
29+
30+
@pytest.mark.parametrize("initial_blocks", [
31+
[Block(block_id="42"), Block(block_id="24")], # list
32+
(Block(block_id="42"), Block(block_id="24"),), # tuple
33+
])
34+
def test_can_parse_sequence_of_blocks(initial_blocks: Sequence[Union[Dict, Block]]):
35+
kwargs = {"blocks": initial_blocks}
36+
37+
_parse_web_class_objects(kwargs)
38+
39+
assert kwargs["blocks"]
40+
41+
for block in kwargs["blocks"]:
42+
assert isinstance(block, Dict)
43+
44+
45+
@pytest.mark.parametrize("initial_attachments", [
46+
[Attachment(text="foo"), Attachment(text="bar")], # list
47+
(Attachment(text="foo"), Attachment(text="bar"),), # tuple
48+
])
49+
def test_can_parse_sequence_of_attachments(initial_attachments: Sequence[Union[Dict, Attachment]]):
50+
kwargs = {"attachments": initial_attachments}
51+
52+
_parse_web_class_objects(kwargs)
53+
54+
assert kwargs["attachments"]
55+
56+
for attachment in kwargs["attachments"]:
57+
assert isinstance(attachment, Dict)

0 commit comments

Comments
 (0)