Files
2026-07-13 12:49:17 +08:00

77 lines
2.9 KiB
Python

import unittest
from unittest.mock import AsyncMock, MagicMock
from trae_agent.tools.base import ToolCallArguments, ToolExecResult
from trae_agent.tools.mcp_tool import MCPTool
class TestMCPTool(unittest.IsolatedAsyncioTestCase):
def setUp(self):
# simulate a tool schema
self.mock_tool = MagicMock()
self.mock_tool.name = "test_tool"
self.mock_tool.description = "A test tool"
self.mock_tool.inputSchema = {
"required": ["param1"],
"properties": {
"param1": {"type": "string", "description": "First parameter"},
"param2": {"type": "integer", "description": "Second parameter"},
},
}
# simulate client side
self.mock_client = MagicMock()
self.tool = MCPTool(self.mock_client, self.mock_tool, model_provider="test_provider")
def test_get_name(self):
self.assertEqual(self.tool.get_name(), "test_tool")
def test_get_description(self):
self.assertEqual(self.tool.get_description(), "A test tool")
def test_get_model_provider(self):
self.assertEqual(self.tool.get_model_provider(), "test_provider")
def test_get_parameters(self):
params = self.tool.get_parameters()
self.assertEqual(len(params), 2)
self.assertTrue(any(p.name == "param1" and p.required for p in params))
self.assertTrue(any(p.name == "param2" and not p.required for p in params))
async def test_execute_success(self):
mock_response = MagicMock()
mock_response.isError = False
mock_response.content = [MagicMock(text="Execution successful")]
self.mock_client.call_tool = AsyncMock(return_value=mock_response)
arguments = ToolCallArguments(arguments={"param1": "value", "param2": 123})
result: ToolExecResult = await self.tool.execute(arguments)
self.assertIsNone(result.error)
self.assertEqual(result.output, "Execution successful")
async def test_execute_failure(self):
mock_response = MagicMock()
mock_response.isError = True
mock_response.content = [MagicMock(text="Something went wrong")]
self.mock_client.call_tool = AsyncMock(return_value=mock_response)
arguments = ToolCallArguments(arguments={"param1": "value"})
result: ToolExecResult = await self.tool.execute(arguments)
self.assertIsNone(result.output)
self.assertEqual(result.error, "Something went wrong")
async def test_execute_exception(self):
self.mock_client.call_tool = AsyncMock(side_effect=RuntimeError("Tool crashed"))
arguments = ToolCallArguments(arguments={"param1": "value"})
result: ToolExecResult = await self.tool.execute(arguments)
self.assertIn("Error running mcp tool", result.error)
self.assertEqual(result.error_code, -1)
if __name__ == "__main__":
unittest.main()