Skip to content

Commit 4c2bed5

Browse files
committed
added tests
1 parent c70564e commit 4c2bed5

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

src/asktheapi_team_builder/services/mcp_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from asktheapi_team_builder.core.tool_builder import build_tool_function
66

77
class MCPConfig(BaseModel):
8-
transport: "sse" | "stdio" = "sse"
8+
transport: str = "sse"
99
port: int = 8000
1010
name: str = "asktheapi_mcp"
1111

@@ -32,5 +32,5 @@ async def _run_mcp(self):
3232
self.mcp.run(self.mcp_config.transport)
3333

3434
async def start_from_spec(self, url_spec: str, headers: dict = {}):
35-
self._create_from_spec(url_spec, headers)
36-
self._run_mcp()
35+
await self._create_from_spec(url_spec, headers)
36+
await self._run_mcp()

tests/services/test_mcp_service.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import pytest
2+
from unittest.mock import AsyncMock, MagicMock, patch
3+
from asktheapi_team_builder.services.mcp_service import MCPService, MCPConfig
4+
from asktheapi_team_builder.core.api_spec_handler import APISpecHandler
5+
6+
@pytest.fixture
7+
def mock_api_spec_handler():
8+
handler = AsyncMock(spec=APISpecHandler)
9+
handler.download_url_spec.return_value = "mock_spec_content"
10+
handler.classify_spec.return_value = MagicMock(
11+
specs=[
12+
MagicMock(
13+
group_name="test_group",
14+
endpoints=["/test"]
15+
)
16+
]
17+
)
18+
handler.generate_agent_for_group.return_value = MagicMock(
19+
tools=[
20+
MagicMock(
21+
name="test_tool",
22+
description="A test tool",
23+
method="GET",
24+
path="/test",
25+
jsonschema={}
26+
)
27+
]
28+
)
29+
return handler
30+
31+
@pytest.fixture
32+
def mock_fast_mcp():
33+
with patch("asktheapi_team_builder.services.mcp_service.FastMCP") as mock:
34+
instance = MagicMock()
35+
mock.return_value = instance
36+
yield instance
37+
38+
@pytest.fixture
39+
def mcp_service(mock_fast_mcp, mock_api_spec_handler):
40+
with patch("asktheapi_team_builder.services.mcp_service.APISpecHandler", return_value=mock_api_spec_handler):
41+
config = MCPConfig(transport="sse", port=8000, name="test_mcp")
42+
service = MCPService(config)
43+
return service
44+
45+
@pytest.mark.asyncio
46+
async def test_mcp_service_initialization(mcp_service, mock_fast_mcp):
47+
# Assert
48+
assert mcp_service.mcp_config.name == "test_mcp"
49+
assert mcp_service.mcp_config.port == 8000
50+
assert mcp_service.mcp_config.transport == "sse"
51+
52+
@pytest.mark.asyncio
53+
async def test_create_from_spec(mcp_service, mock_api_spec_handler, mock_fast_mcp):
54+
# Arrange
55+
url_spec = "http://example.com/spec"
56+
headers = {"Authorization": "Bearer token"}
57+
58+
# Act
59+
result = await mcp_service._create_from_spec(url_spec, headers)
60+
61+
# Assert
62+
mock_api_spec_handler.download_url_spec.assert_called_once_with(url_spec)
63+
mock_api_spec_handler.classify_spec.assert_called_once_with("mock_spec_content")
64+
mock_api_spec_handler.generate_agent_for_group.assert_called_once()
65+
assert result == mock_fast_mcp
66+
# Verify that add_tool was called
67+
assert mock_fast_mcp.add_tool.called
68+
69+
@pytest.mark.asyncio
70+
async def test_run_mcp(mcp_service, mock_fast_mcp):
71+
# Act
72+
await mcp_service._run_mcp()
73+
74+
# Assert
75+
mock_fast_mcp.run.assert_called_once_with("sse")
76+
77+
@pytest.mark.asyncio
78+
async def test_start_from_spec(mcp_service, mock_api_spec_handler):
79+
# Arrange
80+
url_spec = "http://example.com/spec"
81+
headers = {"Authorization": "Bearer token"}
82+
83+
# Act
84+
await mcp_service.start_from_spec(url_spec, headers)
85+
86+
# Assert
87+
mock_api_spec_handler.download_url_spec.assert_called_once_with(url_spec)
88+
mcp_service.mcp.run.assert_called_once_with("sse")
89+
90+
@pytest.mark.asyncio
91+
async def test_mcp_config_defaults():
92+
# Act
93+
config = MCPConfig()
94+
95+
# Assert
96+
assert config.transport == "sse"
97+
assert config.port == 8000
98+
assert config.name == "asktheapi_mcp"

0 commit comments

Comments
 (0)