Skip to content

Commit 93a7f4a

Browse files
author
Fede Kamelhar
committed
Increasing Coverage Message Processor
1 parent a331e63 commit 93a7f4a

File tree

1 file changed

+130
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)