Add Gitea Actions workflow and remaining tests
Some checks failed
CI / test (push) Has been cancelled
Some checks failed
CI / test (push) Has been cancelled
This commit is contained in:
101
tests/test_server.py
Normal file
101
tests/test_server.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user