Skip to content

Commit 0f85e13

Browse files
test: mock chat_stream in say_stream tests to avoid asserting against SDK internals
1 parent 2e6e1f7 commit 0f85e13

2 files changed

Lines changed: 128 additions & 135 deletions

File tree

Lines changed: 54 additions & 67 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,19 +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-
"icon_emoji": None,
48-
"icon_url": None,
49-
"username": None,
50-
}
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+
)
5142

5243
def test_parameter_overrides(self):
5344
say_stream = SayStream(
@@ -57,19 +48,17 @@ def test_parameter_overrides(self):
5748
recipient_user_id="U111",
5849
thread_ts="111.222",
5950
)
60-
stream = say_stream(channel="C222", thread_ts="333.444", recipient_team_id="T222", recipient_user_id="U222")
61-
62-
assert stream._buffer_size == self.default_chat_stream_buffer_size
63-
assert stream._stream_args == {
64-
"channel": "C222",
65-
"thread_ts": "333.444",
66-
"recipient_team_id": "T222",
67-
"recipient_user_id": "U222",
68-
"task_display_mode": None,
69-
"icon_emoji": None,
70-
"icon_url": None,
71-
"username": None,
72-
}
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+
)
7362

7463
def test_buffer_size_overrides(self):
7564
say_stream = SayStream(
@@ -79,25 +68,24 @@ def test_buffer_size_overrides(self):
7968
recipient_user_id="U111",
8069
thread_ts="111.222",
8170
)
82-
stream = say_stream(
83-
buffer_size=100,
84-
channel="C222",
85-
thread_ts="333.444",
86-
recipient_team_id="T222",
87-
recipient_user_id="U222",
88-
)
89-
90-
assert stream._buffer_size == 100
91-
assert stream._stream_args == {
92-
"channel": "C222",
93-
"thread_ts": "333.444",
94-
"recipient_team_id": "T222",
95-
"recipient_user_id": "U222",
96-
"task_display_mode": None,
97-
"icon_emoji": None,
98-
"icon_url": None,
99-
"username": None,
100-
}
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+
)
10189

10290
def test_authorship_overrides(self):
10391
say_stream = SayStream(
@@ -107,15 +95,14 @@ def test_authorship_overrides(self):
10795
recipient_user_id="U111",
10896
thread_ts="111.222",
10997
)
110-
stream = say_stream(icon_emoji=":maple_leaf:", username="Charlie Brown")
111-
112-
assert stream._stream_args == {
113-
"channel": "C111",
114-
"thread_ts": "111.222",
115-
"recipient_team_id": "T111",
116-
"recipient_user_id": "U111",
117-
"task_display_mode": None,
118-
"icon_emoji": ":maple_leaf:",
119-
"icon_url": None,
120-
"username": "Charlie Brown",
121-
}
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+
)
Lines changed: 74 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,20 @@
11
import pytest
2+
from unittest.mock import patch, MagicMock
3+
24
from slack_sdk.web.async_client import AsyncWebClient
35

46
from slack_bolt.context.say_stream.async_say_stream import AsyncSayStream
5-
from tests.mock_web_api_server import (
6-
cleanup_mock_web_api_server,
7-
setup_mock_web_api_server,
8-
)
97
from tests.utils import remove_os_env_temporarily, restore_os_env
108

119

1210
class TestAsyncSayStream:
13-
default_chat_stream_buffer_size = AsyncWebClient.chat_stream.__kwdefaults__["buffer_size"]
14-
1511
@pytest.fixture(scope="function", autouse=True)
1612
def setup_teardown(self):
1713
old_os_env = remove_os_env_temporarily()
18-
setup_mock_web_api_server(self)
19-
valid_token = "xoxb-valid"
20-
mock_api_server_base_url = "http://localhost:8888"
2114
try:
22-
self.web_client = AsyncWebClient(token=valid_token, base_url=mock_api_server_base_url)
23-
yield # run the test here
15+
self.web_client = AsyncWebClient(token="xoxb-valid")
16+
yield
2417
finally:
25-
cleanup_mock_web_api_server(self)
2618
restore_os_env(old_os_env)
2719

2820
@pytest.mark.asyncio
@@ -46,19 +38,22 @@ async def test_default_params(self):
4638
recipient_user_id="U111",
4739
thread_ts="111.222",
4840
)
49-
stream = await say_stream()
50-
51-
assert stream._buffer_size == self.default_chat_stream_buffer_size
52-
assert stream._stream_args == {
53-
"channel": "C111",
54-
"thread_ts": "111.222",
55-
"recipient_team_id": "T111",
56-
"recipient_user_id": "U111",
57-
"task_display_mode": None,
58-
"icon_emoji": None,
59-
"icon_url": None,
60-
"username": None,
61-
}
41+
mock_chat_stream = MagicMock()
42+
43+
async def fake_chat_stream(**kwargs):
44+
return mock_chat_stream(**kwargs)
45+
46+
with patch.object(self.web_client, "chat_stream", side_effect=fake_chat_stream):
47+
await say_stream()
48+
mock_chat_stream.assert_called_once_with(
49+
channel="C111",
50+
recipient_team_id="T111",
51+
recipient_user_id="U111",
52+
thread_ts="111.222",
53+
icon_emoji=None,
54+
icon_url=None,
55+
username=None,
56+
)
6257

6358
@pytest.mark.asyncio
6459
async def test_parameter_overrides(self):
@@ -69,19 +64,22 @@ async def test_parameter_overrides(self):
6964
recipient_user_id="U111",
7065
thread_ts="111.222",
7166
)
72-
stream = await say_stream(channel="C222", thread_ts="333.444", recipient_team_id="T222", recipient_user_id="U222")
73-
74-
assert stream._buffer_size == self.default_chat_stream_buffer_size
75-
assert stream._stream_args == {
76-
"channel": "C222",
77-
"thread_ts": "333.444",
78-
"recipient_team_id": "T222",
79-
"recipient_user_id": "U222",
80-
"task_display_mode": None,
81-
"icon_emoji": None,
82-
"icon_url": None,
83-
"username": None,
84-
}
67+
mock_chat_stream = MagicMock()
68+
69+
async def fake_chat_stream(**kwargs):
70+
return mock_chat_stream(**kwargs)
71+
72+
with patch.object(self.web_client, "chat_stream", side_effect=fake_chat_stream):
73+
await say_stream(channel="C222", thread_ts="333.444", recipient_team_id="T222", recipient_user_id="U222")
74+
mock_chat_stream.assert_called_once_with(
75+
channel="C222",
76+
recipient_team_id="T222",
77+
recipient_user_id="U222",
78+
thread_ts="333.444",
79+
icon_emoji=None,
80+
icon_url=None,
81+
username=None,
82+
)
8583

8684
@pytest.mark.asyncio
8785
async def test_buffer_size_overrides(self):
@@ -92,25 +90,29 @@ async def test_buffer_size_overrides(self):
9290
recipient_user_id="U111",
9391
thread_ts="111.222",
9492
)
95-
stream = await say_stream(
96-
buffer_size=100,
97-
channel="C222",
98-
thread_ts="333.444",
99-
recipient_team_id="T222",
100-
recipient_user_id="U222",
101-
)
93+
mock_chat_stream = MagicMock()
94+
95+
async def fake_chat_stream(**kwargs):
96+
return mock_chat_stream(**kwargs)
10297

103-
assert stream._buffer_size == 100
104-
assert stream._stream_args == {
105-
"channel": "C222",
106-
"thread_ts": "333.444",
107-
"recipient_team_id": "T222",
108-
"recipient_user_id": "U222",
109-
"task_display_mode": None,
110-
"icon_emoji": None,
111-
"icon_url": None,
112-
"username": None,
113-
}
98+
with patch.object(self.web_client, "chat_stream", side_effect=fake_chat_stream):
99+
await say_stream(
100+
buffer_size=100,
101+
channel="C222",
102+
thread_ts="333.444",
103+
recipient_team_id="T222",
104+
recipient_user_id="U222",
105+
)
106+
mock_chat_stream.assert_called_once_with(
107+
buffer_size=100,
108+
channel="C222",
109+
recipient_team_id="T222",
110+
recipient_user_id="U222",
111+
thread_ts="333.444",
112+
icon_emoji=None,
113+
icon_url=None,
114+
username=None,
115+
)
114116

115117
@pytest.mark.asyncio
116118
async def test_authorship_overrides(self):
@@ -121,15 +123,19 @@ async def test_authorship_overrides(self):
121123
recipient_user_id="U111",
122124
thread_ts="111.222",
123125
)
124-
stream = await say_stream(icon_emoji=":maple_leaf:", username="Charlie Brown")
125-
126-
assert stream._stream_args == {
127-
"channel": "C111",
128-
"thread_ts": "111.222",
129-
"recipient_team_id": "T111",
130-
"recipient_user_id": "U111",
131-
"task_display_mode": None,
132-
"icon_emoji": ":maple_leaf:",
133-
"icon_url": None,
134-
"username": "Charlie Brown",
135-
}
126+
mock_chat_stream = MagicMock()
127+
128+
async def fake_chat_stream(**kwargs):
129+
return mock_chat_stream(**kwargs)
130+
131+
with patch.object(self.web_client, "chat_stream", side_effect=fake_chat_stream):
132+
await say_stream(icon_emoji=":maple_leaf:", username="Charlie Brown")
133+
mock_chat_stream.assert_called_once_with(
134+
channel="C111",
135+
recipient_team_id="T111",
136+
recipient_user_id="U111",
137+
thread_ts="111.222",
138+
icon_emoji=":maple_leaf:",
139+
icon_url=None,
140+
username="Charlie Brown",
141+
)

0 commit comments

Comments
 (0)