1+ # tests/mcp/test_register_mcp_tools.py
2+ import pytest
3+ from unittest .mock import Mock , patch
4+
5+ from chuk_tool_processor .mcp .register_mcp_tools import register_mcp_tools
6+ from chuk_tool_processor .mcp .stream_manager import StreamManager
7+ from chuk_tool_processor .registry .interface import ToolRegistryInterface
8+
9+
10+ class TestRegisterMCPTools :
11+ """Test MCP tools registration."""
12+
13+ @pytest .fixture
14+ def mock_registry (self ):
15+ """Mock tool registry."""
16+ mock = Mock (spec = ToolRegistryInterface )
17+ mock .register_tool = Mock ()
18+ return mock
19+
20+ @pytest .fixture
21+ def mock_stream_manager (self ):
22+ """Mock stream manager."""
23+ mock = Mock (spec = StreamManager )
24+ tools = [
25+ {"name" : "echo" , "description" : "Echo tool" , "inputSchema" : {}},
26+ {"name" : "calc" , "description" : "Calculator" , "inputSchema" : {}}
27+ ]
28+ mock .get_all_tools = Mock (return_value = tools )
29+ return mock
30+
31+ def test_register_tools (self , mock_registry , mock_stream_manager ):
32+ """Test registering MCP tools."""
33+ # Mock the registry provider
34+ with patch ('chuk_tool_processor.mcp.register_mcp_tools.ToolRegistryProvider.get_registry' , return_value = mock_registry ):
35+ registered = register_mcp_tools (mock_stream_manager , namespace = "mcp" )
36+
37+ # Check registration calls
38+ assert len (registered ) == 2
39+ assert "echo" in registered
40+ assert "calc" in registered
41+
42+ # Verify register_tool was called with correct args
43+ assert mock_registry .register_tool .call_count == 4 # 2 tools x 2 registrations each
44+
45+ # Check that tools were registered in both namespaces
46+ call_args = mock_registry .register_tool .call_args_list
47+
48+ # Check tools are registered as both "tool" and "namespace.tool"
49+ tool_names = []
50+ for call in call_args :
51+ # Extract name parameter from the call
52+ args , kwargs = call
53+ # The name is the second positional argument
54+ # or in kwargs with key 'name'
55+ if 'name' in kwargs :
56+ tool_names .append (kwargs ['name' ])
57+ elif len (args ) > 1 :
58+ tool_names .append (args [1 ])
59+
60+ assert "echo" in tool_names
61+ assert "mcp.echo" in tool_names
62+ assert "calc" in tool_names
63+ assert "mcp.calc" in tool_names
64+
65+ def test_register_with_invalid_tool (self , mock_registry , mock_stream_manager ):
66+ """Test handling invalid tool definitions."""
67+ tools = [
68+ {"description" : "No name" }, # Missing name
69+ {"name" : "" , "description" : "Empty name" } # Empty name
70+ ]
71+ mock_stream_manager .get_all_tools = Mock (return_value = tools )
72+
73+ with patch ('chuk_tool_processor.mcp.register_mcp_tools.ToolRegistryProvider.get_registry' , return_value = mock_registry ):
74+ registered = register_mcp_tools (mock_stream_manager )
75+
76+ assert len (registered ) == 0
77+ assert mock_registry .register_tool .call_count == 0
78+
79+ def test_empty_tools_registration (self , mock_registry ):
80+ """Test registering with no tools."""
81+ mock_stream_manager = Mock (spec = StreamManager )
82+ mock_stream_manager .get_all_tools = Mock (return_value = [])
83+
84+ with patch ('chuk_tool_processor.mcp.register_mcp_tools.ToolRegistryProvider.get_registry' , return_value = mock_registry ):
85+ registered = register_mcp_tools (mock_stream_manager )
86+
87+ assert len (registered ) == 0
88+ assert mock_registry .register_tool .call_count == 0
89+
90+ def test_duplicate_tool_names (self , mock_registry ):
91+ """Test registering tools with duplicate names."""
92+ mock_stream_manager = Mock (spec = StreamManager )
93+ tools = [
94+ {"name" : "echo" , "description" : "First echo" },
95+ {"name" : "echo" , "description" : "Second echo" } # Duplicate
96+ ]
97+ mock_stream_manager .get_all_tools = Mock (return_value = tools )
98+
99+ with patch ('chuk_tool_processor.mcp.register_mcp_tools.ToolRegistryProvider.get_registry' , return_value = mock_registry ):
100+ registered = register_mcp_tools (mock_stream_manager )
101+
102+ # Should register both (last one overwrites)
103+ assert len (registered ) == 2 # Count includes duplicates
104+ # Each tool is registered twice (once in mcp namespace, once in default namespace)
105+ # But due to duplicates, we expect 4 calls total (2 tools x 2 namespaces)
106+ assert mock_registry .register_tool .call_count == 4 # 2 tools x 2 namespaces
0 commit comments