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