88def mock_agent ():
99 """Fixture to create a mock agent with tools."""
1010 agent = MagicMock ()
11- agent .tool .http_request = MagicMock (return_value = {"status" : "success" , "result" : {"ip" : "127.0.0.1" }})
12- agent .tool .use_aws = MagicMock (return_value = {"status" : "success" , "result" : {"buckets" : ["bucket1" , "bucket2" ]}})
13- agent .tool .error_tool = MagicMock (side_effect = Exception ("Tool execution failed" ))
11+
12+ # Create a mock tool registry that mimics the real agent's tool access pattern
13+ mock_tool_registry = MagicMock ()
14+ mock_tool_registry .registry = {
15+ "http_request" : MagicMock (return_value = {"status" : "success" , "result" : {"ip" : "127.0.0.1" }}),
16+ "use_aws" : MagicMock (return_value = {"status" : "success" , "result" : {"buckets" : ["bucket1" , "bucket2" ]}}),
17+ "error_tool" : MagicMock (side_effect = Exception ("Tool execution failed" ))
18+ }
19+ agent .tool_registry = mock_tool_registry
20+
21+ # Create a custom mock tool object that properly handles getattr
22+ class MockTool :
23+ def __init__ (self ):
24+ self .http_request = mock_tool_registry .registry ["http_request" ]
25+ self .use_aws = mock_tool_registry .registry ["use_aws" ]
26+ self .error_tool = mock_tool_registry .registry ["error_tool" ]
27+
28+ def __getattr__ (self , name ):
29+ # Return None for non-existent tools (this will make callable() return False)
30+ return None
31+
32+ agent .tool = MockTool ()
33+
1434 return agent
1535
1636
@@ -27,12 +47,26 @@ def test_batch_success(mock_agent):
2747 assert result ["toolUseId" ] == "mock_tool_id"
2848 assert result ["status" ] == "success"
2949 assert len (result ["content" ]) == 2
30- assert result ["content" ][0 ]["json" ]["name" ] == "http_request"
31- assert result ["content" ][0 ]["json" ]["status" ] == "success"
32- assert result ["content" ][0 ]["json" ]["result" ]["result" ]["ip" ] == "127.0.0.1"
33- assert result ["content" ][1 ]["json" ]["name" ] == "use_aws"
34- assert result ["content" ][1 ]["json" ]["status" ] == "success"
35- assert result ["content" ][1 ]["json" ]["result" ]["result" ]["buckets" ] == ["bucket1" , "bucket2" ]
50+
51+ # Check the summary text
52+ assert "Batch execution completed with 2 tool(s):" in result ["content" ][0 ]["text" ]
53+ assert "✓ http_request: Success" in result ["content" ][0 ]["text" ]
54+ assert "✓ use_aws: Success" in result ["content" ][0 ]["text" ]
55+
56+ # Check the JSON results
57+ json_content = result ["content" ][1 ]["json" ]
58+ assert json_content ["batch_summary" ]["total_tools" ] == 2
59+ assert json_content ["batch_summary" ]["successful" ] == 2
60+ assert json_content ["batch_summary" ]["failed" ] == 0
61+
62+ results = json_content ["results" ]
63+ assert len (results ) == 2
64+ assert results [0 ]["name" ] == "http_request"
65+ assert results [0 ]["status" ] == "success"
66+ assert results [0 ]["result" ]["result" ]["ip" ] == "127.0.0.1"
67+ assert results [1 ]["name" ] == "use_aws"
68+ assert results [1 ]["status" ] == "success"
69+ assert results [1 ]["result" ]["result" ]["buckets" ] == ["bucket1" , "bucket2" ]
3670
3771
3872def test_batch_missing_tool (mock_agent ):
@@ -46,10 +80,23 @@ def test_batch_missing_tool(mock_agent):
4680
4781 assert result ["toolUseId" ] == "mock_tool_id"
4882 assert result ["status" ] == "success"
49- assert len (result ["content" ]) == 1
50- assert result ["content" ][0 ]["toolUseId" ] == "mock_tool_id"
51- assert result ["content" ][0 ]["status" ] == "error"
52- assert "Tool missing" in result ["content" ][0 ]["content" ][0 ]["text" ]
83+ assert len (result ["content" ]) == 2
84+
85+ # Check the summary text
86+ assert "Batch execution completed with 1 tool(s):" in result ["content" ][0 ]["text" ]
87+ assert "✗ non_existent_tool: Error" in result ["content" ][0 ]["text" ]
88+
89+ # Check the JSON results
90+ json_content = result ["content" ][1 ]["json" ]
91+ assert json_content ["batch_summary" ]["total_tools" ] == 1
92+ assert json_content ["batch_summary" ]["successful" ] == 0
93+ assert json_content ["batch_summary" ]["failed" ] == 1
94+
95+ results = json_content ["results" ]
96+ assert len (results ) == 1
97+ assert results [0 ]["name" ] == "non_existent_tool"
98+ assert results [0 ]["status" ] == "error"
99+ assert "not found in agent" in results [0 ]["error" ]
53100
54101
55102def test_batch_tool_error (mock_agent ):
@@ -63,10 +110,24 @@ def test_batch_tool_error(mock_agent):
63110
64111 assert result ["toolUseId" ] == "mock_tool_id"
65112 assert result ["status" ] == "success"
66- assert len (result ["content" ]) == 1
67- assert result ["content" ][0 ]["toolUseId" ] == "mock_tool_id"
68- assert result ["content" ][0 ]["status" ] == "error"
69- assert "Error in batch tool" in result ["content" ][0 ]["content" ][0 ]["text" ]
113+ assert len (result ["content" ]) == 2
114+
115+ # Check the summary text
116+ assert "Batch execution completed with 1 tool(s):" in result ["content" ][0 ]["text" ]
117+ assert "✗ error_tool: Error" in result ["content" ][0 ]["text" ]
118+
119+ # Check the JSON results
120+ json_content = result ["content" ][1 ]["json" ]
121+ assert json_content ["batch_summary" ]["total_tools" ] == 1
122+ assert json_content ["batch_summary" ]["successful" ] == 0
123+ assert json_content ["batch_summary" ]["failed" ] == 1
124+
125+ results = json_content ["results" ]
126+ assert len (results ) == 1
127+ assert results [0 ]["name" ] == "error_tool"
128+ assert results [0 ]["status" ] == "error"
129+ assert "Tool execution failed" in results [0 ]["error" ]
130+ assert "traceback" in results [0 ]
70131
71132
72133def test_batch_no_invocations (mock_agent ):
@@ -78,7 +139,17 @@ def test_batch_no_invocations(mock_agent):
78139
79140 assert result ["toolUseId" ] == "mock_tool_id"
80141 assert result ["status" ] == "success"
81- assert len (result ["content" ]) == 0
142+ assert len (result ["content" ]) == 2
143+
144+ # Check the summary text
145+ assert "Batch execution completed with 0 tool(s):" in result ["content" ][0 ]["text" ]
146+
147+ # Check the JSON results
148+ json_content = result ["content" ][1 ]["json" ]
149+ assert json_content ["batch_summary" ]["total_tools" ] == 0
150+ assert json_content ["batch_summary" ]["successful" ] == 0
151+ assert json_content ["batch_summary" ]["failed" ] == 0
152+ assert len (json_content ["results" ]) == 0
82153
83154
84155def test_batch_top_level_error (mock_agent ):
0 commit comments