# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for McpToolset.""" import sys from unittest.mock import AsyncMock from unittest.mock import MagicMock import pytest # Skip all tests in this module if Python version is less than 3.10 pytestmark = pytest.mark.skipif( sys.version_info < (3, 10), reason="MCP tool requires Python 3.10+" ) # Import dependencies with version checking try: from google.adk.tools.mcp_tool.mcp_toolset import McpToolset except ImportError as e: if sys.version_info < (3, 10): # Create dummy classes to prevent NameError during test collection # Tests will be skipped anyway due to pytestmark class DummyClass: pass McpToolset = DummyClass else: raise e @pytest.mark.asyncio async def test_mcp_toolset_with_prefix(): """Test that McpToolset correctly applies the tool_name_prefix.""" # Mock the connection parameters mock_connection_params = MagicMock() # Mock the MCPSessionManager and its create_session method mock_session_manager = MagicMock() mock_session = MagicMock() # Mock the list_tools response from the MCP server mock_tool1 = MagicMock() mock_tool1.name = "tool1" mock_tool1.description = "tool 1 desc" mock_tool2 = MagicMock() mock_tool2.name = "tool2" mock_tool2.description = "tool 2 desc" list_tools_result = MagicMock() list_tools_result.tools = [mock_tool1, mock_tool2] mock_session.list_tools = AsyncMock(return_value=list_tools_result) mock_session_manager.create_session = AsyncMock(return_value=mock_session) # Create an instance of McpToolset with a prefix toolset = McpToolset( connection_params=mock_connection_params, tool_name_prefix="my_prefix", ) # Replace the internal session manager with our mock toolset._mcp_session_manager = mock_session_manager # Get the tools from the toolset tools = await toolset.get_tools() # The get_tools method in McpToolset returns MCPTool objects, which are # instances of BaseTool. The prefixing is handled by the BaseToolset, # so we need to call get_tools_with_prefix to get the prefixed tools. prefixed_tools = await toolset.get_tools_with_prefix() # Assert that the tools are prefixed correctly assert len(prefixed_tools) == 2 assert prefixed_tools[0].name == "my_prefix_tool1" assert prefixed_tools[1].name == "my_prefix_tool2" # Assert that the original tools are not modified assert tools[0].name == "tool1" assert tools[1].name == "tool2"