mcp-browser/tests/test_browser_functionality.py

118 lines
3.8 KiB
Python

#!/usr/bin/env python3
"""
Test MCP Browser core functionality without external servers.
"""
import pytest
import asyncio
import json
import tempfile
from pathlib import Path
from mcp_browser import MCPBrowser
@pytest.mark.asyncio
async def test_browser_without_servers():
"""Test MCP Browser core functionality without external servers."""
print("=== Testing MCP Browser Core Functionality ===\n")
# Create browser without any servers
browser = MCPBrowser(enable_builtin_servers=False)
try:
# Manual initialization without servers
from mcp_browser.config import MCPBrowserConfig
from mcp_browser.registry import ToolRegistry
from mcp_browser.filter import MessageFilter, VirtualToolHandler
browser.config = MCPBrowserConfig(
servers={},
default_server=None,
sparse_mode=True,
debug=False
)
browser.registry = ToolRegistry()
browser.filter = MessageFilter(browser.registry, sparse_mode=True)
browser.virtual_handler = VirtualToolHandler(browser.registry, browser._forward_to_server)
browser._initialized = True
print("✓ Browser initialized without external servers\n")
# Test 1: Test sparse tools directly
print("1. Testing sparse mode tools:")
sparse_tools = browser.registry.get_sparse_tools()
assert len(sparse_tools) == 3 # Sparse mode shows only 3 tools
print(f" ✓ Found {len(sparse_tools)} sparse tools")
for tool in sparse_tools:
print(f" - {tool['name']}")
# Test 2: Add some test tools and use mcp_discover
print("\n2. Testing tool discovery:")
test_tools = [
{"name": "test_tool1", "description": "Test Tool 1"},
{"name": "test_tool2", "description": "Test Tool 2"},
{"name": "test_tool3", "description": "Test Tool 3"}
]
browser.registry.update_tools(test_tools)
# Test virtual tool handler directly
response = await browser.virtual_handler.handle_tool_call({
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "mcp_discover",
"arguments": {"jsonpath": "$.tools[*].name"}
}
})
assert response is not None
assert "result" in response
all_tools = json.loads(response["result"]["content"][0]["text"])
assert len(all_tools) == 3
print(f" ✓ Discovered {len(all_tools)} test tools: {all_tools}")
# Test 3: Test message filtering
print("\n3. Testing message filtering:")
test_message = {
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": test_tools
}
}
filtered = browser.filter.filter_incoming(test_message)
assert filtered is not None
assert len(filtered["result"]["tools"]) == 3 # Sparse tools
assert filtered["result"]["tools"][0]["name"] == "mcp_discover"
print(" ✓ Message filtering works correctly")
# Test 4: Test JSONPath discovery
print("\n4. Testing JSONPath discovery:")
result = browser.registry.discover("$.tools[*].description")
assert result == ["Test Tool 1", "Test Tool 2", "Test Tool 3"]
print(" ✓ JSONPath discovery works correctly")
print("\n✅ All tests passed!")
except Exception as e:
print(f"\n❌ Test failed: {e}")
import traceback
traceback.print_exc()
raise
finally:
# No need to close since we didn't start any servers
pass
def main():
asyncio.run(test_browser_without_servers())
if __name__ == "__main__":
main()