Skip to content

Commit f3eeefe

Browse files
feat: add authorship arguments to say_stream (#1502)
Co-authored-by: William Bergamin <wbergamin@slack-corp.com>
1 parent 3319330 commit f3eeefe

8 files changed

Lines changed: 192 additions & 89 deletions

File tree

slack_bolt/context/say_stream/async_say_stream.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ async def __call__(
3434
recipient_team_id: Optional[str] = None,
3535
recipient_user_id: Optional[str] = None,
3636
thread_ts: Optional[str] = None,
37+
icon_emoji: Optional[str] = None,
38+
icon_url: Optional[str] = None,
39+
username: Optional[str] = None,
3740
**kwargs,
3841
) -> AsyncChatStream:
3942
"""Starts a new chat stream with context."""
@@ -51,12 +54,18 @@ async def __call__(
5154
recipient_team_id=recipient_team_id or self.recipient_team_id,
5255
recipient_user_id=recipient_user_id or self.recipient_user_id,
5356
thread_ts=thread_ts,
57+
icon_emoji=icon_emoji,
58+
icon_url=icon_url,
59+
username=username,
5460
**kwargs,
5561
)
5662
return await self.client.chat_stream(
5763
channel=channel,
5864
recipient_team_id=recipient_team_id or self.recipient_team_id,
5965
recipient_user_id=recipient_user_id or self.recipient_user_id,
6066
thread_ts=thread_ts,
67+
icon_emoji=icon_emoji,
68+
icon_url=icon_url,
69+
username=username,
6170
**kwargs,
6271
)

slack_bolt/context/say_stream/say_stream.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ def __call__(
3434
recipient_team_id: Optional[str] = None,
3535
recipient_user_id: Optional[str] = None,
3636
thread_ts: Optional[str] = None,
37+
icon_emoji: Optional[str] = None,
38+
icon_url: Optional[str] = None,
39+
username: Optional[str] = None,
3740
**kwargs,
3841
) -> ChatStream:
3942
"""Starts a new chat stream with context."""
@@ -51,12 +54,18 @@ def __call__(
5154
recipient_team_id=recipient_team_id or self.recipient_team_id,
5255
recipient_user_id=recipient_user_id or self.recipient_user_id,
5356
thread_ts=thread_ts,
57+
icon_emoji=icon_emoji,
58+
icon_url=icon_url,
59+
username=username,
5460
**kwargs,
5561
)
5662
return self.client.chat_stream(
5763
channel=channel,
5864
recipient_team_id=recipient_team_id or self.recipient_team_id,
5965
recipient_user_id=recipient_user_id or self.recipient_user_id,
6066
thread_ts=thread_ts,
67+
icon_emoji=icon_emoji,
68+
icon_url=icon_url,
69+
username=username,
6170
**kwargs,
6271
)

slack_bolt/context/set_status/async_set_status.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,18 @@ async def __call__(
2323
self,
2424
status: str,
2525
loading_messages: Optional[List[str]] = None,
26+
icon_emoji: Optional[str] = None,
27+
icon_url: Optional[str] = None,
28+
username: Optional[str] = None,
2629
**kwargs,
2730
) -> AsyncSlackResponse:
2831
return await self.client.assistant_threads_setStatus(
2932
channel_id=self.channel_id,
3033
thread_ts=self.thread_ts,
3134
status=status,
3235
loading_messages=loading_messages,
36+
icon_emoji=icon_emoji,
37+
icon_url=icon_url,
38+
username=username,
3339
**kwargs,
3440
)

slack_bolt/context/set_status/set_status.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,18 @@ def __call__(
2323
self,
2424
status: str,
2525
loading_messages: Optional[List[str]] = None,
26+
icon_emoji: Optional[str] = None,
27+
icon_url: Optional[str] = None,
28+
username: Optional[str] = None,
2629
**kwargs,
2730
) -> SlackResponse:
2831
return self.client.assistant_threads_setStatus(
2932
channel_id=self.channel_id,
3033
thread_ts=self.thread_ts,
3134
status=status,
3235
loading_messages=loading_messages,
36+
icon_emoji=icon_emoji,
37+
icon_url=icon_url,
38+
username=username,
3339
**kwargs,
3440
)
Lines changed: 62 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
import pytest
2+
from unittest.mock import patch, MagicMock
3+
24
from slack_sdk import WebClient
35

46
from slack_bolt.context.say_stream.say_stream import SayStream
5-
from tests.mock_web_api_server import cleanup_mock_web_api_server, setup_mock_web_api_server
67

78

89
class TestSayStream:
9-
default_chat_stream_buffer_size = WebClient.chat_stream.__kwdefaults__["buffer_size"]
10-
1110
def setup_method(self):
12-
setup_mock_web_api_server(self)
13-
valid_token = "xoxb-valid"
14-
mock_api_server_base_url = "http://localhost:8888"
15-
self.web_client = WebClient(token=valid_token, base_url=mock_api_server_base_url)
16-
17-
def teardown_method(self):
18-
cleanup_mock_web_api_server(self)
11+
self.web_client = WebClient(token="xoxb-valid")
1912

2013
def test_missing_channel_raises(self):
2114
say_stream = SayStream(client=self.web_client, channel=None, thread_ts="111.222")
@@ -35,16 +28,17 @@ def test_default_params(self):
3528
recipient_user_id="U111",
3629
thread_ts="111.222",
3730
)
38-
stream = say_stream()
39-
40-
assert stream._buffer_size == self.default_chat_stream_buffer_size
41-
assert stream._stream_args == {
42-
"channel": "C111",
43-
"thread_ts": "111.222",
44-
"recipient_team_id": "T111",
45-
"recipient_user_id": "U111",
46-
"task_display_mode": None,
47-
}
31+
with patch.object(self.web_client, "chat_stream", return_value=MagicMock()) as mock_chat_stream:
32+
say_stream()
33+
mock_chat_stream.assert_called_once_with(
34+
channel="C111",
35+
recipient_team_id="T111",
36+
recipient_user_id="U111",
37+
thread_ts="111.222",
38+
icon_emoji=None,
39+
icon_url=None,
40+
username=None,
41+
)
4842

4943
def test_parameter_overrides(self):
5044
say_stream = SayStream(
@@ -54,16 +48,17 @@ def test_parameter_overrides(self):
5448
recipient_user_id="U111",
5549
thread_ts="111.222",
5650
)
57-
stream = say_stream(channel="C222", thread_ts="333.444", recipient_team_id="T222", recipient_user_id="U222")
58-
59-
assert stream._buffer_size == self.default_chat_stream_buffer_size
60-
assert stream._stream_args == {
61-
"channel": "C222",
62-
"thread_ts": "333.444",
63-
"recipient_team_id": "T222",
64-
"recipient_user_id": "U222",
65-
"task_display_mode": None,
66-
}
51+
with patch.object(self.web_client, "chat_stream", return_value=MagicMock()) as mock_chat_stream:
52+
say_stream(channel="C222", thread_ts="333.444", recipient_team_id="T222", recipient_user_id="U222")
53+
mock_chat_stream.assert_called_once_with(
54+
channel="C222",
55+
recipient_team_id="T222",
56+
recipient_user_id="U222",
57+
thread_ts="333.444",
58+
icon_emoji=None,
59+
icon_url=None,
60+
username=None,
61+
)
6762

6863
def test_buffer_size_overrides(self):
6964
say_stream = SayStream(
@@ -73,19 +68,41 @@ def test_buffer_size_overrides(self):
7368
recipient_user_id="U111",
7469
thread_ts="111.222",
7570
)
76-
stream = say_stream(
77-
buffer_size=100,
78-
channel="C222",
79-
thread_ts="333.444",
80-
recipient_team_id="T222",
81-
recipient_user_id="U222",
82-
)
71+
with patch.object(self.web_client, "chat_stream", return_value=MagicMock()) as mock_chat_stream:
72+
say_stream(
73+
buffer_size=100,
74+
channel="C222",
75+
thread_ts="333.444",
76+
recipient_team_id="T222",
77+
recipient_user_id="U222",
78+
)
79+
mock_chat_stream.assert_called_once_with(
80+
buffer_size=100,
81+
channel="C222",
82+
recipient_team_id="T222",
83+
recipient_user_id="U222",
84+
thread_ts="333.444",
85+
icon_emoji=None,
86+
icon_url=None,
87+
username=None,
88+
)
8389

84-
assert stream._buffer_size == 100
85-
assert stream._stream_args == {
86-
"channel": "C222",
87-
"thread_ts": "333.444",
88-
"recipient_team_id": "T222",
89-
"recipient_user_id": "U222",
90-
"task_display_mode": None,
91-
}
90+
def test_authorship_overrides(self):
91+
say_stream = SayStream(
92+
client=self.web_client,
93+
channel="C111",
94+
recipient_team_id="T111",
95+
recipient_user_id="U111",
96+
thread_ts="111.222",
97+
)
98+
with patch.object(self.web_client, "chat_stream", return_value=MagicMock()) as mock_chat_stream:
99+
say_stream(icon_emoji=":maple_leaf:", username="Charlie Brown")
100+
mock_chat_stream.assert_called_once_with(
101+
channel="C111",
102+
recipient_team_id="T111",
103+
recipient_user_id="U111",
104+
thread_ts="111.222",
105+
icon_emoji=":maple_leaf:",
106+
icon_url=None,
107+
username="Charlie Brown",
108+
)

tests/slack_bolt/context/test_set_status.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ def test_set_status_loading_messages(self):
3232
)
3333
assert response.status_code == 200
3434

35+
def test_set_status_authorship(self):
36+
set_status = SetStatus(client=self.web_client, channel_id="C111", thread_ts="123.123")
37+
response: SlackResponse = set_status(
38+
status="Thinking...",
39+
icon_emoji=":maple_leaf:",
40+
username="Charlie Brown",
41+
)
42+
assert response.status_code == 200
43+
3544
def test_set_status_invalid(self):
3645
set_status = SetStatus(client=self.web_client, channel_id="C111", thread_ts="123.123")
3746
with pytest.raises(TypeError):

0 commit comments

Comments
 (0)