Skip to content

Commit 5af2a54

Browse files
committed
some more tests
1 parent 0d0468d commit 5af2a54

File tree

2 files changed

+188
-43
lines changed

2 files changed

+188
-43
lines changed

packages/slackBotFunction/app/slack/slack_events.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,9 @@ def process_async_slack_action(body: Dict[str, Any], client: WebClient) -> None:
244244
client=client,
245245
)
246246
# Only post message if storage succeeded
247-
post_params = {"channel": feedback_data["ch"], "text": response_message}
248-
if feedback_data.get("tt"): # Only add thread_ts if it exists (not for DMs)
249-
post_params["thread_ts"] = feedback_data["tt"]
250-
client.chat_postMessage(**post_params)
247+
client.chat_postMessage(
248+
channel=feedback_data["ch"], text=response_message, thread_ts=feedback_data.get("tt")
249+
)
251250
except ClientError as e:
252251
if e.response.get("Error", {}).get("Code") == "ConditionalCheckFailedException":
253252
# Silently ignore duplicate votes - user already voted on this message

packages/slackBotFunction/tests/test_async_processing.py renamed to packages/slackBotFunction/tests/test_slack_events.py

Lines changed: 185 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,15 @@
22
from 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

Comments
 (0)