Skip to content

Commit 15a8529

Browse files
author
Fede Kamelhar
committed
Increasing Coverage Message Processor
1 parent 48181e7 commit 15a8529

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import pytest
2+
3+
import strands.event_loop.message_processor
4+
from strands.event_loop import message_processor
5+
6+
print(strands.event_loop.message_processor.__file__)
7+
8+
9+
@pytest.mark.parametrize(
10+
"messages,expected,expected_messages",
11+
[
12+
# Orphaned toolUse with empty input, no toolResult
13+
(
14+
[
15+
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "1", "input": {}, "name": "foo"}}]},
16+
{"role": "user", "content": [{"toolResult": {"toolUseId": "2"}}]},
17+
],
18+
True,
19+
[
20+
{"role": "assistant", "content": [{"text": "[Attempted to use foo, but operation was canceled]"}]},
21+
{"role": "user", "content": [{"toolResult": {"toolUseId": "2"}}]},
22+
],
23+
),
24+
# toolUse with input, has matching toolResult
25+
(
26+
[
27+
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "1", "input": {"a": 1}, "name": "foo"}}]},
28+
{"role": "user", "content": [{"toolResult": {"toolUseId": "1"}}]},
29+
],
30+
False,
31+
[
32+
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "1", "input": {"a": 1}, "name": "foo"}}]},
33+
{"role": "user", "content": [{"toolResult": {"toolUseId": "1"}}]},
34+
],
35+
),
36+
# No messages
37+
(
38+
[],
39+
False,
40+
[],
41+
),
42+
],
43+
)
44+
def test_clean_orphaned_empty_tool_uses(messages, expected, expected_messages):
45+
import copy
46+
47+
test_messages = copy.deepcopy(messages)
48+
result = message_processor.clean_orphaned_empty_tool_uses(test_messages)
49+
assert result == expected
50+
assert test_messages == expected_messages
51+
52+
53+
@pytest.mark.parametrize(
54+
"messages,expected_idx",
55+
[
56+
(
57+
[
58+
{"role": "user", "content": [{"text": "hi"}]},
59+
{"role": "user", "content": [{"toolResult": {"toolUseId": "1"}}]},
60+
{"role": "assistant", "content": [{"text": "ok"}]},
61+
],
62+
1,
63+
),
64+
(
65+
[
66+
{"role": "user", "content": [{"text": "hi"}]},
67+
{"role": "assistant", "content": [{"text": "ok"}]},
68+
],
69+
None,
70+
),
71+
(
72+
[],
73+
None,
74+
),
75+
],
76+
)
77+
def test_find_last_message_with_tool_results(messages, expected_idx):
78+
idx = message_processor.find_last_message_with_tool_results(messages)
79+
assert idx == expected_idx
80+
81+
82+
@pytest.mark.parametrize(
83+
"messages,msg_idx,expected_changed,expected_content",
84+
[
85+
(
86+
[
87+
{
88+
"role": "user",
89+
"content": [{"toolResult": {"toolUseId": "1", "status": "ok", "content": [{"text": "big"}]}}],
90+
}
91+
],
92+
0,
93+
True,
94+
[
95+
{
96+
"toolResult": {
97+
"toolUseId": "1",
98+
"status": "error",
99+
"content": [{"text": "The tool result was too large!"}],
100+
}
101+
}
102+
],
103+
),
104+
(
105+
[{"role": "user", "content": [{"text": "no tool result"}]}],
106+
0,
107+
False,
108+
[{"text": "no tool result"}],
109+
),
110+
(
111+
[],
112+
0,
113+
False,
114+
[],
115+
),
116+
(
117+
[{"role": "user", "content": [{"toolResult": {"toolUseId": "1"}}]}],
118+
2,
119+
False,
120+
[{"toolResult": {"toolUseId": "1"}}],
121+
),
122+
],
123+
)
124+
def test_truncate_tool_results(messages, msg_idx, expected_changed, expected_content):
125+
import copy
126+
127+
test_messages = copy.deepcopy(messages)
128+
changed = message_processor.truncate_tool_results(test_messages, msg_idx)
129+
assert changed == expected_changed
130+
if 0 <= msg_idx < len(test_messages):
131+
assert test_messages[msg_idx]["content"] == expected_content
132+
else:
133+
assert test_messages == messages

0 commit comments

Comments
 (0)