22from unittest .mock import Mock , patch
33
44
5- @patch ("app.services.dynamo.get_state_information" )
6- @patch ("app.services.bedrock.query_bedrock" )
7- @patch ("app.services.query_reformulator.reformulate_query" )
8- @patch ("app.slack.slack_events.get_conversation_session" )
9- def test_process_async_slack_event_success (
10- mock_get_session : Mock ,
11- mock_reformulate_query : Mock ,
12- mock_query_bedrock : Mock ,
13- mock_get_state_information : Mock ,
5+ @patch ("app.utils.handler_utils.forward_event_to_pull_request_lambda" )
6+ def test_process_async_slack_event_normal_message (
7+ mock_forward_event_to_pull_request_lambda : Mock ,
148 mock_get_parameter : Mock ,
159 mock_env : Mock ,
1610):
1711 """Test successful async event processing"""
1812 # set up mocks
1913 mock_client = Mock ()
20- mock_client .chat_postMessage .return_value = {"ts" : "1234567890.124" }
21- mock_client .chat_update .return_value = {"ok" : True }
22- mock_query_bedrock .return_value = {"output" : {"text" : "AI response" }}
23- mock_reformulate_query .return_value = "test question"
24- mock_get_session .return_value = None # No existing session
2514
2615 # delete and import module to test
2716 if "app.slack.slack_events" in sys .modules :
@@ -30,18 +19,96 @@ def test_process_async_slack_event_success(
3019
3120 # perform operation
3221 slack_event_data = {"text" : "<@U123> test question" , "user" : "U456" , "channel" : "C789" , "ts" : "1234567890.123" }
33- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
22+ with patch ("app.slack.slack_events.process_feedback_event" ) as mock_process_feedback_event , patch (
23+ "app.slack.slack_events.process_slack_message"
24+ ) as mock_process_slack_message :
25+ process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
26+ mock_forward_event_to_pull_request_lambda .assert_not_called ()
27+ mock_process_feedback_event .assert_not_called ()
28+ mock_process_slack_message .assert_called_once_with (
29+ event = slack_event_data , event_id = "evt123" , client = mock_client
30+ )
31+
32+
33+ @patch ("app.utils.handler_utils.forward_event_to_pull_request_lambda" )
34+ def test_process_async_slack_event_pull_request_with_mention (
35+ mock_forward_event_to_pull_request_lambda : Mock ,
36+ mock_get_parameter : Mock ,
37+ mock_env : Mock ,
38+ ):
39+ """Test successful async event processing"""
40+ # set up mocks
41+ mock_client = Mock ()
3442
35- # assertions
36- # Should be called at least once - first for AI response
37- assert mock_client .chat_postMessage .call_count >= 1
38- first_call = mock_client .chat_postMessage .call_args_list [0 ]
39- assert first_call [1 ]["text" ] == "AI response"
40- assert first_call [1 ]["channel" ] == "C789"
43+ # delete and import module to test
44+ if "app.slack.slack_events" in sys .modules :
45+ del sys .modules ["app.slack.slack_events" ]
46+ from app .slack .slack_events import process_async_slack_event
47+
48+ # perform operation
49+ slack_event_data = {
50+ "text" : "<@U123> pr: 123 test question" ,
51+ "user" : "U456" ,
52+ "channel" : "C789" ,
53+ "ts" : "1234567890.123" ,
54+ }
55+ with patch ("app.slack.slack_events.process_feedback_event" ) as mock_process_feedback_event , patch (
56+ "app.slack.slack_events.process_slack_message"
57+ ) as mock_process_slack_message :
58+ process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
59+ mock_forward_event_to_pull_request_lambda .assert_called_once_with (
60+ pull_request_id = 123 ,
61+ event = slack_event_data ,
62+ event_id = "evt123" ,
63+ store_pull_request_id = True ,
64+ )
65+ mock_process_feedback_event .assert_not_called ()
66+ mock_process_slack_message .assert_not_called ()
67+
68+
69+ @patch ("app.utils.handler_utils.forward_event_to_pull_request_lambda" )
70+ def test_process_async_slack_event_pull_request_with_no_mention (
71+ mock_forward_event_to_pull_request_lambda : Mock ,
72+ mock_get_parameter : Mock ,
73+ mock_env : Mock ,
74+ ):
75+ """Test successful async event processing"""
76+ # set up mocks
77+ mock_client = Mock ()
4178
79+ # delete and import module to test
80+ if "app.slack.slack_events" in sys .modules :
81+ del sys .modules ["app.slack.slack_events" ]
82+ from app .slack .slack_events import process_async_slack_event
4283
43- def test_process_async_slack_event_empty_query (mock_get_parameter : Mock , mock_env : Mock ):
44- """Test async event processing with empty query"""
84+ # perform operation
85+ slack_event_data = {
86+ "text" : "pr: 123 test question" ,
87+ "user" : "U456" ,
88+ "channel" : "C789" ,
89+ "ts" : "1234567890.123" ,
90+ }
91+ with patch ("app.slack.slack_events.process_feedback_event" ) as mock_process_feedback_event , patch (
92+ "app.slack.slack_events.process_slack_message"
93+ ) as mock_process_slack_message :
94+ process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
95+ mock_forward_event_to_pull_request_lambda .assert_called_once_with (
96+ pull_request_id = 123 ,
97+ event = slack_event_data ,
98+ event_id = "evt123" ,
99+ store_pull_request_id = True ,
100+ )
101+ mock_process_feedback_event .assert_not_called ()
102+ mock_process_slack_message .assert_not_called ()
103+
104+
105+ @patch ("app.utils.handler_utils.forward_event_to_pull_request_lambda" )
106+ def test_process_async_slack_event_feedback (
107+ mock_forward_event_to_pull_request_lambda : Mock ,
108+ mock_get_parameter : Mock ,
109+ mock_env : Mock ,
110+ ):
111+ """Test successful async event processing"""
45112 # set up mocks
46113 mock_client = Mock ()
47114
@@ -50,14 +117,48 @@ def test_process_async_slack_event_empty_query(mock_get_parameter: Mock, mock_en
50117 del sys .modules ["app.slack.slack_events" ]
51118 from app .slack .slack_events import process_async_slack_event
52119
120+ # perform operation
121+ slack_event_data = {
122+ "text" : "feedback: this is some feedback" ,
123+ "user" : "U456" ,
124+ "channel" : "C789" ,
125+ "ts" : "1234567890.123" ,
126+ }
127+ with patch ("app.slack.slack_events.process_feedback_event" ) as mock_process_feedback_event , patch (
128+ "app.slack.slack_events.process_slack_message"
129+ ) as mock_process_slack_message :
130+ process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
131+ mock_forward_event_to_pull_request_lambda .assert_not_called ()
132+ mock_process_feedback_event .assert_called_once_with (
133+ message_text = "feedback: this is some feedback" ,
134+ conversation_key = "thread#C789#1234567890.123" ,
135+ user_id = "U456" ,
136+ channel_id = "C789" ,
137+ thread_root = "1234567890.123" ,
138+ client = mock_client ,
139+ event = slack_event_data ,
140+ )
141+ mock_process_slack_message .assert_not_called ()
142+
143+
144+ def test_process_slack_message_empty_query (mock_get_parameter : Mock , mock_env : Mock ):
145+ """Test async event processing with empty query"""
146+ # set up mocks
147+ mock_client = Mock ()
148+
149+ # delete and import module to test
150+ if "app.slack.slack_events" in sys .modules :
151+ del sys .modules ["app.slack.slack_events" ]
152+ from app .slack .slack_events import process_slack_message
153+
53154 # perform operation
54155 slack_event_data = {
55156 "text" : "<@U123>" , # Only mention, no actual query
56157 "user" : "U456" ,
57158 "channel" : "C789" ,
58159 "ts" : "1234567890.123" ,
59160 }
60- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
161+ process_slack_message (event = slack_event_data , event_id = "evt123" , client = mock_client )
61162
62163 # assertions
63164 mock_client .chat_postMessage .assert_called_once_with (
@@ -72,7 +173,7 @@ def test_process_async_slack_event_empty_query(mock_get_parameter: Mock, mock_en
72173@patch ("app.services.query_reformulator.reformulate_query" )
73174@patch ("app.slack.slack_events.get_conversation_session" )
74175@patch ("app.services.slack.post_error_message" )
75- def test_process_async_slack_event_error (
176+ def test_process_slack_message_event_error (
76177 mock_post_error_message : Mock ,
77178 mock_get_session : Mock ,
78179 mock_reformulate_query : Mock ,
@@ -91,11 +192,11 @@ def test_process_async_slack_event_error(
91192 # delete and import module to test
92193 if "app.slack.slack_events" in sys .modules :
93194 del sys .modules ["app.slack.slack_events" ]
94- from app .slack .slack_events import process_async_slack_event
195+ from app .slack .slack_events import process_slack_message
95196
96197 # perform operation
97198 slack_event_data = {"text" : "test question" , "user" : "U456" , "channel" : "C789" , "ts" : "1234567890.123" }
98- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
199+ process_slack_message (event = slack_event_data , event_id = "evt123" , client = mock_client )
99200
100201 # assertions
101202 mock_post_error_message .assert_called_once_with (channel = "C789" , thread_ts = "1234567890.123" , client = mock_client )
@@ -105,7 +206,7 @@ def test_process_async_slack_event_error(
105206@patch ("app.services.bedrock.query_bedrock" )
106207@patch ("app.services.query_reformulator.reformulate_query" )
107208@patch ("app.slack.slack_events.get_conversation_session" )
108- def test_process_async_slack_event_with_thread_ts (
209+ def test_process_slack_message_with_thread_ts (
109210 mock_get_session : Mock ,
110211 mock_reformulate_query : Mock ,
111212 mock_query_bedrock : Mock ,
@@ -125,7 +226,7 @@ def test_process_async_slack_event_with_thread_ts(
125226 # delete and import module to test
126227 if "app.slack.slack_events" in sys .modules :
127228 del sys .modules ["app.slack.slack_events" ]
128- from app .slack .slack_events import process_async_slack_event
229+ from app .slack .slack_events import process_slack_message
129230
130231 # perform operation
131232 slack_event_data = {
@@ -135,7 +236,7 @@ def test_process_async_slack_event_with_thread_ts(
135236 "ts" : "1234567890.123" ,
136237 "thread_ts" : "1234567888.111" , # Existing thread
137238 }
138- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
239+ process_slack_message (event = slack_event_data , event_id = "evt123" , client = mock_client )
139240
140241 # assertions
141242 # Should be called at least once with the correct thread_ts
@@ -167,12 +268,12 @@ def test_regex_text_processing(
167268 # delete and import module to test
168269 if "app.slack.slack_events" in sys .modules :
169270 del sys .modules ["app.slack.slack_events" ]
170- from app .slack .slack_events import process_async_slack_event
271+ from app .slack .slack_events import process_slack_message
171272
172273 # perform operation
173274 slack_event_data = {"text" : "<@U123456> test question" , "user" : "U456" , "channel" : "C789" , "ts" : "1234567890.123" }
174275
175- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
276+ process_slack_message (event = slack_event_data , event_id = "evt123" , client = mock_client )
176277
177278 # assertions
178279 # Verify that the message was processed (query_bedrock was called)
@@ -185,7 +286,7 @@ def test_regex_text_processing(
185286@patch ("app.services.dynamo.store_state_information" )
186287@patch ("app.services.bedrock.query_bedrock" )
187288@patch ("app.services.query_reformulator.reformulate_query" )
188- def test_process_async_slack_event_with_session_storage (
289+ def test_process_slack_message_with_session_storage (
189290 mock_reformulate_query : Mock ,
190291 mock_query_bedrock : Mock ,
191292 mock_store_state_information : Mock ,
@@ -207,12 +308,12 @@ def test_process_async_slack_event_with_session_storage(
207308 # delete and import module to test
208309 if "app.slack.slack_events" in sys .modules :
209310 del sys .modules ["app.slack.slack_events" ]
210- from app .slack .slack_events import process_async_slack_event
311+ from app .slack .slack_events import process_slack_message
211312
212313 # perform operation
213314 slack_event_data = {"text" : "test question" , "user" : "U456" , "channel" : "C789" , "ts" : "1234567890.123" }
214315
215- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
316+ process_slack_message (event = slack_event_data , event_id = "evt123" , client = mock_client )
216317
217318 # assertions
218319 # Verify session was stored - should be called twice (Q&A pair + session)
@@ -223,7 +324,7 @@ def test_process_async_slack_event_with_session_storage(
223324@patch ("app.services.bedrock.query_bedrock" )
224325@patch ("app.services.query_reformulator.reformulate_query" )
225326@patch ("app.slack.slack_events.get_conversation_session" )
226- def test_process_async_slack_event_chat_update_error (
327+ def test_process_slack_message_chat_update_error (
227328 mock_get_session : Mock ,
228329 mock_reformulate_query : Mock ,
229330 mock_query_bedrock : Mock ,
@@ -243,11 +344,11 @@ def test_process_async_slack_event_chat_update_error(
243344 # delete and import module to test
244345 if "app.slack.slack_events" in sys .modules :
245346 del sys .modules ["app.slack.slack_events" ]
246- from app .slack .slack_events import process_async_slack_event
347+ from app .slack .slack_events import process_slack_message
247348
248349 # perform operation
249350 slack_event_data = {"text" : "<@U123> test question" , "user" : "U456" , "channel" : "C789" , "ts" : "1234567890.123" }
250- process_async_slack_event (event = slack_event_data , event_id = "evt123" , client = mock_client )
351+ process_slack_message (event = slack_event_data , event_id = "evt123" , client = mock_client )
251352
252353 # assertions
253354 # no assertions as we are just checking it does not throw an error
@@ -257,7 +358,7 @@ def test_process_async_slack_event_chat_update_error(
257358@patch ("app.services.bedrock.query_bedrock" )
258359@patch ("app.services.query_reformulator.reformulate_query" )
259360@patch ("app.slack.slack_events.get_conversation_session" )
260- def test_process_async_slack_event_dm_context (
361+ def test_process_slack_message_dm_context (
261362 mock_get_session : Mock ,
262363 mock_reformulate_query : Mock ,
263364 mock_query_bedrock : Mock ,
@@ -289,3 +390,48 @@ def test_process_async_slack_event_dm_context(
289390
290391 # assertions
291392 # no assertions as we are just checking it does not throw an error
393+
394+
395+ @patch ("app.utils.handler_utils.is_latest_message" )
396+ def test_process_async_slack_action (
397+ mock_is_latest_message : Mock ,
398+ mock_get_parameter : Mock ,
399+ mock_env : Mock ,
400+ ):
401+ """Test successful async action processing"""
402+ # set up mocks
403+ mock_client = Mock ()
404+ mock_is_latest_message .return_value = True
405+
406+ # delete and import module to test
407+ if "app.slack.slack_events" in sys .modules :
408+ del sys .modules ["app.slack.slack_events" ]
409+ from app .slack .slack_events import process_async_slack_action
410+
411+ feedback_value = '{"ck":"thread#C123#123","ch":"C123","mt":"1759845126.972219","tt":"1759845114.407989"}'
412+
413+ # perform operation
414+ slack_action_data = {
415+ "type" : "block_actions" ,
416+ "user" : {"id" : "U123" },
417+ "channel" : {"id" : "C123" },
418+ "actions" : [{"action_id" : "feedback_yes" , "value" : feedback_value }],
419+ }
420+ with patch ("app.slack.slack_events.store_feedback" ) as mock_store_feedback :
421+ process_async_slack_action (body = slack_action_data , client = mock_client )
422+
423+ # assertions
424+ mock_store_feedback .assert_called_once_with (
425+ conversation_key = "thread#C123#123" ,
426+ feedback_type = "positive" ,
427+ user_id = "U123" ,
428+ channel_id = "C123" ,
429+ thread_ts = "1759845114.407989" ,
430+ message_ts = "1759845126.972219" ,
431+ client = mock_client ,
432+ )
433+ mock_client .chat_postMessage .assert_called_once_with (
434+ channel = "C123" ,
435+ text = "Thank you for your feedback." ,
436+ thread_ts = "1759845114.407989" ,
437+ )
0 commit comments