mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-15 13:51:19 +00:00
* [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>
90 lines
2.7 KiB
Python
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)
|