1- import time
2- from time import sleep
1+ from threading import Event
32from typing import Callable
43
54from 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
87from slack_bolt .middleware import Middleware
98from slack_bolt .request import BoltRequest as BoltRequestType
109from 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
1511from 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-
2514class 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
259248def build_payload (event : dict ) -> dict :
0 commit comments