Files
OpenBB/openbb_platform/extensions/mcp_server/tests/test_main.py
Magnus 7b520e5f8a [BugFix] MCP - expose correct header for session id (#7160)
* [BugFix] MCP - expose correct header for session id

* Pin FastMCP to <2.9

The update casued problems with converting tools from OpenAPI specs

* Update default settings

* Add exclusion for all POST requests in route filtering

* fix compress input and output schemas with newer fastmcp versions

* Add unit tests for MCP server, utilities and settings

* add missing init file

* skip tests for python 3.9

* Add setup instructions for VS Code

* update fastmcp version and lock file

---------

Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com>
Co-authored-by: DidierRLopes <didierrlopes@gmail.com>
2025-07-12 22:26:15 +00:00

90 lines
2.7 KiB
Python

"""Unit tests for main module."""
from unittest.mock import ANY, MagicMock, patch
from fastapi import FastAPI
from openbb_mcp_server.main import _extract_brief_description, create_mcp_server, main
from openbb_mcp_server.utils.settings import MCPSettings
def test_extract_brief_description():
full_desc = """Brief description.
**Query Parameters:**
Details..."""
assert _extract_brief_description(full_desc) == "Brief description."
no_desc = ""
assert _extract_brief_description(no_desc) == "No description available"
no_split = "Just brief."
assert _extract_brief_description(no_split) == "Just brief."
responses_split = """Brief.
**Responses:**
Details..."""
assert _extract_brief_description(responses_split) == "Brief."
@patch("openbb_mcp_server.main.FastMCP.from_fastapi")
@patch("openbb_mcp_server.main.ToolRegistry")
def test_create_mcp_server(_mock_registry, mock_from_fastapi):
settings = MCPSettings(enable_tool_discovery=False)
app = FastAPI()
mock_mcp = MagicMock()
mock_from_fastapi.return_value = mock_mcp
mcp = create_mcp_server(settings, app)
assert mcp == mock_mcp
mock_from_fastapi.assert_called_once()
# Test with discovery enabled
settings = MCPSettings(enable_tool_discovery=True)
create_mcp_server(settings, app)
@patch("openbb_mcp_server.main.parse_args")
@patch("openbb_mcp_server.main.load_mcp_settings_with_overrides")
@patch("openbb_mcp_server.main.create_mcp_server")
@patch("openbb_mcp_server.main.SystemService")
@patch("sys.exit")
def test_main(mock_exit, mock_system, mock_create, mock_load, mock_parse):
mock_args = MagicMock()
mock_args.transport = "http"
mock_args.host = "localhost"
mock_args.port = 8000
mock_args.allowed_categories = None
mock_args.default_categories = "all"
mock_args.no_tool_discovery = False
mock_parse.return_value = mock_args
mock_settings = MCPSettings()
mock_load.return_value = mock_settings
mock_mcp = MagicMock()
mock_create.return_value = mock_mcp
mock_system.return_value.system_settings.api_settings.cors.allow_origins = ["*"]
mock_system.return_value.system_settings.api_settings.cors.allow_methods = ["*"]
mock_system.return_value.system_settings.api_settings.cors.allow_headers = ["*"]
main()
mock_mcp.run.assert_called_once_with(
transport="http",
host="localhost",
port=8000,
middleware=ANY,
)
# Test stdio transport
mock_args.transport = "stdio"
main()
mock_mcp.run.assert_called_with(transport="stdio")
# Test exception handling
mock_create.side_effect = Exception("Test error")
main()
mock_exit.assert_called_once_with(1)