forked from cardosofelipe/pragma-stack
feat(knowledge-base): implement Knowledge Base MCP Server (#57) #72
@@ -2,15 +2,13 @@
|
|||||||
Tests for MCP Tool Call Routing
|
Tests for MCP Tool Call Routing
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from unittest.mock import AsyncMock, MagicMock, patch
|
from unittest.mock import AsyncMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from app.services.mcp.config import MCPConfig, MCPServerConfig
|
from app.services.mcp.config import MCPConfig, MCPServerConfig
|
||||||
from app.services.mcp.connection import ConnectionPool
|
from app.services.mcp.connection import ConnectionPool
|
||||||
from app.services.mcp.exceptions import (
|
from app.services.mcp.exceptions import (
|
||||||
MCPCircuitOpenError,
|
|
||||||
MCPToolError,
|
|
||||||
MCPToolNotFoundError,
|
MCPToolNotFoundError,
|
||||||
)
|
)
|
||||||
from app.services.mcp.registry import MCPServerRegistry
|
from app.services.mcp.registry import MCPServerRegistry
|
||||||
@@ -79,7 +77,10 @@ class TestToolInfo:
|
|||||||
name="create_issue",
|
name="create_issue",
|
||||||
description="Create a new issue",
|
description="Create a new issue",
|
||||||
server_name="issues",
|
server_name="issues",
|
||||||
input_schema={"type": "object", "properties": {"title": {"type": "string"}}},
|
input_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {"title": {"type": "string"}},
|
||||||
|
},
|
||||||
)
|
)
|
||||||
assert info.name == "create_issue"
|
assert info.name == "create_issue"
|
||||||
assert info.description == "Create a new issue"
|
assert info.description == "Create a new issue"
|
||||||
@@ -174,9 +175,7 @@ class TestToolRouter:
|
|||||||
|
|
||||||
# Mock the pool connection and request
|
# Mock the pool connection and request
|
||||||
mock_conn = AsyncMock()
|
mock_conn = AsyncMock()
|
||||||
mock_conn.execute_request = AsyncMock(
|
mock_conn.execute_request = AsyncMock(return_value={"result": {"status": "ok"}})
|
||||||
return_value={"result": {"status": "ok"}}
|
|
||||||
)
|
|
||||||
mock_conn.is_connected = True
|
mock_conn.is_connected = True
|
||||||
|
|
||||||
with patch.object(router._pool, "get_connection", return_value=mock_conn):
|
with patch.object(router._pool, "get_connection", return_value=mock_conn):
|
||||||
@@ -232,9 +231,7 @@ class TestToolRouter:
|
|||||||
await router.register_tool_mapping("tool-on-server-1", "server-1")
|
await router.register_tool_mapping("tool-on-server-1", "server-1")
|
||||||
|
|
||||||
mock_conn = AsyncMock()
|
mock_conn = AsyncMock()
|
||||||
mock_conn.execute_request = AsyncMock(
|
mock_conn.execute_request = AsyncMock(return_value={"result": "routed"})
|
||||||
return_value={"result": "routed"}
|
|
||||||
)
|
|
||||||
mock_conn.is_connected = True
|
mock_conn.is_connected = True
|
||||||
|
|
||||||
with patch.object(router._pool, "get_connection", return_value=mock_conn):
|
with patch.object(router._pool, "get_connection", return_value=mock_conn):
|
||||||
@@ -339,7 +336,11 @@ class TestToolRouter:
|
|||||||
delay2 = router._calculate_retry_delay(2, config)
|
delay2 = router._calculate_retry_delay(2, config)
|
||||||
delay3 = router._calculate_retry_delay(3, config)
|
delay3 = router._calculate_retry_delay(3, config)
|
||||||
|
|
||||||
# Delays should increase with attempts
|
# All delays should be positive
|
||||||
assert delay1 > 0
|
assert delay1 > 0
|
||||||
# Allow for jitter variation
|
assert delay2 > 0
|
||||||
|
assert delay3 > 0
|
||||||
|
# All delays should be within max bounds (allow for jitter variation)
|
||||||
assert delay1 <= config.retry_max_delay * 1.25
|
assert delay1 <= config.retry_max_delay * 1.25
|
||||||
|
assert delay2 <= config.retry_max_delay * 1.25
|
||||||
|
assert delay3 <= config.retry_max_delay * 1.25
|
||||||
|
|||||||
Reference in New Issue
Block a user