From bf04db97e8c3719806cd290f13ebe48f98b87817 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 5 Feb 2026 12:36:25 +0000 Subject: [PATCH] Add Gitea Actions workflow and remaining tests --- tests/test_server.py | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 tests/test_server.py diff --git a/tests/test_server.py b/tests/test_server.py new file mode 100644 index 0000000..1b83645 --- /dev/null +++ b/tests/test_server.py @@ -0,0 +1,101 @@ +"""Tests for MCP server.""" + +import pytest +from fastapi.testclient import TestClient + +from mcp_server_cli.server import MCPServer +from mcp_server_cli.config import AppConfig, ServerConfig +from mcp_server_cli.tools import FileTools, GitTools, ShellTools +from mcp_server_cli.models import MCPRequest, MCPMethod + + +@pytest.fixture +def mcp_server(): + """Create an MCP server with registered tools.""" + server = MCPServer() + server.register_tool(FileTools()) + server.register_tool(GitTools()) + server.register_tool(ShellTools()) + return server + + +class TestMCPServer: + """Tests for MCP server class.""" + + def test_server_creation(self): + """Test server creation.""" + server = MCPServer() + assert server.connection_state.value == "disconnected" + assert len(server.tool_registry) == 0 + + def test_register_tool(self, mcp_server): + """Test tool registration.""" + assert "file_tools" in mcp_server.tool_registry + assert len(mcp_server.list_tools()) == 3 + + def test_get_tool(self, mcp_server): + """Test getting a registered tool.""" + retrieved = mcp_server.get_tool("file_tools") + assert retrieved is not None + assert retrieved.name == "file_tools" + + def test_list_tools(self, mcp_server): + """Test listing all tools.""" + tools = mcp_server.list_tools() + assert len(tools) >= 2 + names = [t.name for t in tools] + assert "file_tools" in names + assert "git_tools" in names + + +class TestMCPProtocol: + """Tests for MCP protocol implementation.""" + + def test_mcp_initialize(self, mcp_server): + """Test MCP initialize request.""" + request = MCPRequest( + id=1, + method=MCPMethod.INITIALIZE, + params={"protocol_version": "2024-11-05"}, + ) + import asyncio + response = asyncio.run(mcp_server.handle_request(request)) + assert response.id == 1 + assert response.result is not None + + def test_mcp_tools_list(self, mcp_server): + """Test MCP tools/list request.""" + request = MCPRequest( + id=2, + method=MCPMethod.TOOLS_LIST, + ) + import asyncio + response = asyncio.run(mcp_server.handle_request(request)) + assert response.id == 2 + assert response.result is not None + + def test_mcp_invalid_method(self, mcp_server): + """Test MCP request with invalid tool.""" + request = MCPRequest( + id=3, + method=MCPMethod.TOOLS_CALL, + params={"name": "nonexistent"}, + ) + import asyncio + response = asyncio.run(mcp_server.handle_request(request)) + assert response.error is not None or response.result.get("is_error") is True + + +class TestToolCall: + """Tests for tool calling.""" + + def test_call_read_file_nonexistent(self, mcp_server): + """Test calling read on nonexistent file.""" + from mcp_server_cli.models import ToolCallParams + params = ToolCallParams( + name="read_file", + arguments={"path": "/nonexistent/file.txt"}, + ) + import asyncio + result = asyncio.run(mcp_server._handle_tool_call(params)) + assert result.is_error is True