Skip to content

Commit c661cef

Browse files
Merge branch 'main' into fix-some-test-warnings
2 parents faf5993 + 6e57716 commit c661cef

File tree

6 files changed

+222
-286
lines changed

6 files changed

+222
-286
lines changed

tests/scenario_tests/test_events_assistant.py

Lines changed: 44 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
1-
import time
2-
from time import sleep
1+
from threading import Event
32
from typing import Callable
43

54
from slack_sdk.web import WebClient
65

7-
from slack_bolt import App, BoltRequest, Assistant, Say, SetSuggestedPrompts, SetStatus, BoltContext
6+
from slack_bolt import App, Assistant, BoltContext, BoltRequest, Say, SetStatus, SetSuggestedPrompts
87
from slack_bolt.middleware import Middleware
98
from slack_bolt.request import BoltRequest as BoltRequestType
109
from slack_bolt.response import BoltResponse
11-
from tests.mock_web_api_server import (
12-
setup_mock_web_api_server,
13-
cleanup_mock_web_api_server,
14-
)
10+
from tests.mock_web_api_server import cleanup_mock_web_api_server, setup_mock_web_api_server
1511
from tests.utils import remove_os_env_temporarily, restore_os_env
1612

1713

18-
def assert_target_called(called: dict, timeout: float = 0.5):
19-
deadline = time.time() + timeout
20-
while called["value"] is not True and time.time() < deadline:
21-
time.sleep(0.1)
22-
assert called["value"] is True
23-
24-
2514
class TestEventsAssistant:
2615
valid_token = "xoxb-valid"
2716
mock_api_server_base_url = "http://localhost:8888"
@@ -41,7 +30,7 @@ def teardown_method(self):
4130
def test_thread_started(self):
4231
app = App(client=self.web_client)
4332
assistant = Assistant()
44-
called = {"value": False}
33+
listener_called = Event()
4534

4635
@assistant.thread_started
4736
def start_thread(say: Say, set_suggested_prompts: SetSuggestedPrompts, set_status: SetStatus, context: BoltContext):
@@ -54,37 +43,37 @@ def start_thread(say: Say, set_suggested_prompts: SetSuggestedPrompts, set_statu
5443
set_suggested_prompts(
5544
prompts=[{"title": "What does SLACK stand for?", "message": "What does SLACK stand for?"}], title="foo"
5645
)
57-
called["value"] = True
46+
listener_called.set()
5847

5948
app.assistant(assistant)
6049

6150
request = BoltRequest(body=thread_started_event_body, mode="socket_mode")
6251
response = app.dispatch(request)
6352
assert response.status == 200
64-
assert_target_called(called)
53+
assert listener_called.wait(timeout=0.1) is True
6554

6655
def test_thread_context_changed(self):
6756
app = App(client=self.web_client)
6857
assistant = Assistant()
69-
called = {"value": False}
58+
listener_called = Event()
7059

7160
@assistant.thread_context_changed
7261
def handle_thread_context_changed(context: BoltContext):
7362
assert context.channel_id == "D111"
7463
assert context.thread_ts == "1726133698.626339"
75-
called["value"] = True
64+
listener_called.set()
7665

7766
app.assistant(assistant)
7867

7968
request = BoltRequest(body=thread_context_changed_event_body, mode="socket_mode")
8069
response = app.dispatch(request)
8170
assert response.status == 200
82-
assert_target_called(called)
71+
assert listener_called.wait(timeout=0.1) is True
8372

8473
def test_user_message(self):
8574
app = App(client=self.web_client)
8675
assistant = Assistant()
87-
called = {"value": False}
76+
listener_called = Event()
8877

8978
@assistant.user_message
9079
def handle_user_message(say: Say, set_status: SetStatus, context: BoltContext):
@@ -94,7 +83,7 @@ def handle_user_message(say: Say, set_status: SetStatus, context: BoltContext):
9483
try:
9584
set_status("is typing...")
9685
say("Here you are!")
97-
called["value"] = True
86+
listener_called.set()
9887
except Exception as e:
9988
say(f"Oops, something went wrong (error: {e})")
10089

@@ -103,12 +92,12 @@ def handle_user_message(say: Say, set_status: SetStatus, context: BoltContext):
10392
request = BoltRequest(body=user_message_event_body, mode="socket_mode")
10493
response = app.dispatch(request)
10594
assert response.status == 200
106-
assert_target_called(called)
95+
assert listener_called.wait(timeout=0.1) is True
10796

10897
def test_user_message_with_assistant_thread(self):
10998
app = App(client=self.web_client)
11099
assistant = Assistant()
111-
called = {"value": False}
100+
listener_called = Event()
112101

113102
@assistant.user_message
114103
def handle_user_message(say: Say, set_status: SetStatus, context: BoltContext):
@@ -118,7 +107,7 @@ def handle_user_message(say: Say, set_status: SetStatus, context: BoltContext):
118107
try:
119108
set_status("is typing...")
120109
say("Here you are!")
121-
called["value"] = True
110+
listener_called.set()
122111
except Exception as e:
123112
say(f"Oops, something went wrong (error: {e})")
124113

@@ -127,77 +116,77 @@ def handle_user_message(say: Say, set_status: SetStatus, context: BoltContext):
127116
request = BoltRequest(body=user_message_event_body_with_assistant_thread, mode="socket_mode")
128117
response = app.dispatch(request)
129118
assert response.status == 200
130-
assert_target_called(called)
119+
assert listener_called.wait(timeout=0.1) is True
131120

132121
def test_message_changed(self):
133122
app = App(client=self.web_client)
134123
assistant = Assistant()
135-
called = {"value": False}
124+
listener_called = Event()
136125

137126
@assistant.user_message
138127
def handle_user_message():
139-
called["value"] = True
128+
listener_called.set()
140129

141130
@assistant.bot_message
142131
def handle_bot_message():
143-
called["value"] = True
132+
listener_called.set()
144133

145134
app.assistant(assistant)
146135

147136
request = BoltRequest(body=message_changed_event_body, mode="socket_mode")
148137
response = app.dispatch(request)
149138
assert response.status == 200
150-
assert called["value"] is False
139+
assert listener_called.wait(timeout=0.1) is False
151140

152141
def test_channel_user_message_ignored(self):
153142
app = App(client=self.web_client)
154143
assistant = Assistant()
155-
called = {"value": False}
144+
listener_called = Event()
156145

157146
@assistant.user_message
158147
def handle_user_message():
159-
called["value"] = True
148+
listener_called.set()
160149

161150
@assistant.bot_message
162151
def handle_bot_message():
163-
called["value"] = True
152+
listener_called.set()
164153

165154
app.assistant(assistant)
166155

167156
request = BoltRequest(body=channel_user_message_event_body, mode="socket_mode")
168157
response = app.dispatch(request)
169158
assert response.status == 404
170-
assert called["value"] is False
159+
assert listener_called.wait(timeout=0.1) is False
171160

172161
def test_channel_message_changed_ignored(self):
173162
app = App(client=self.web_client)
174163
assistant = Assistant()
175-
called = {"value": False}
164+
listener_called = Event()
176165

177166
@assistant.user_message
178167
def handle_user_message():
179-
called["value"] = True
168+
listener_called.set()
180169

181170
@assistant.bot_message
182171
def handle_bot_message():
183-
called["value"] = True
172+
listener_called.set()
184173

185174
app.assistant(assistant)
186175

187176
request = BoltRequest(body=channel_message_changed_event_body, mode="socket_mode")
188177
response = app.dispatch(request)
189178
assert response.status == 404
190-
assert called["value"] is False
179+
assert listener_called.wait(timeout=0.1) is False
191180

192181
def test_assistant_with_custom_listener_middleware(self):
193182
app = App(client=self.web_client)
194183
assistant = Assistant()
195-
handler_called = {"value": False}
196-
middleware_called = {"value": False}
184+
listener_called = Event()
185+
middleware_called = Event()
197186

198187
class TestMiddleware(Middleware):
199188
def process(self, *, req: BoltRequestType, resp: BoltResponse, next: Callable[[], BoltResponse]):
200-
middleware_called["value"] = True
189+
middleware_called.set()
201190
# Verify assistant utilities are available
202191
assert req.context.get("set_status") is not None
203192
assert req.context.get("set_title") is not None
@@ -208,52 +197,52 @@ def process(self, *, req: BoltRequestType, resp: BoltResponse, next: Callable[[]
208197

209198
@assistant.thread_started(middleware=[TestMiddleware()])
210199
def start_thread():
211-
handler_called["value"] = True
200+
listener_called.set()
212201

213202
@assistant.user_message(middleware=[TestMiddleware()])
214203
def handle_user_message():
215-
handler_called["value"] = True
204+
listener_called.set()
216205

217206
app.assistant(assistant)
218207

219208
request = BoltRequest(body=thread_started_event_body, mode="socket_mode")
220209
response = app.dispatch(request)
221210
assert response.status == 200
222-
assert_target_called(handler_called)
223-
assert_target_called(middleware_called)
211+
assert listener_called.wait(timeout=0.1) is True
212+
assert middleware_called.wait(timeout=0.1) is True
224213

225-
handler_called = {"value": False}
226-
middleware_called = {"value": False}
214+
listener_called.clear()
215+
middleware_called.clear()
227216

228217
request = BoltRequest(body=user_message_event_body, mode="socket_mode")
229218
response = app.dispatch(request)
230219
assert response.status == 200
231-
assert_target_called(handler_called)
232-
assert_target_called(middleware_called)
220+
assert listener_called.wait(timeout=0.1) is True
221+
assert middleware_called.wait(timeout=0.1) is True
233222

234223
def test_assistant_custom_middleware_can_short_circuit(self):
235224
app = App(client=self.web_client)
236225
assistant = Assistant()
237-
handler_called = {"value": False}
238-
middleware_called = {"value": False}
226+
listener_called = Event()
227+
middleware_called = Event()
239228

240229
class BlockingMiddleware(Middleware):
241230
def process(self, *, req: BoltRequestType, resp: BoltResponse, next: Callable[[], BoltResponse]):
242-
middleware_called["value"] = True
231+
middleware_called.set()
243232
# Intentionally not calling next() to short-circuit
244233
return BoltResponse(status=200)
245234

246235
@assistant.thread_started(middleware=[BlockingMiddleware()])
247236
def start_thread(say: Say, context: BoltContext):
248-
handler_called["value"] = True
237+
listener_called.set()
249238

250239
app.assistant(assistant)
251240

252241
request = BoltRequest(body=thread_started_event_body, mode="socket_mode")
253242
response = app.dispatch(request)
254243
assert response.status == 200
255-
assert_target_called(middleware_called)
256-
assert handler_called["value"] is False
244+
assert middleware_called.wait(timeout=0.1) is True
245+
assert listener_called.wait(timeout=0.1) is False
257246

258247

259248
def build_payload(event: dict) -> dict:

0 commit comments

Comments
 (0)