Files
prefecthq--fastmcp/tests/cli/test_mcp_server_config_schema.py
wehub-resource-sync 60e0ffc959
Upgrade checks / Notify on failure (push) Has been cancelled
Upgrade checks / Close issue on success (push) Has been cancelled
Schema Crash Test / Real-world schema crash test (232K schemas) (push) Has been cancelled
Run static analysis / static_analysis (push) Has been cancelled
Tests / Tests: Python 3.10 on ubuntu-latest (push) Has been cancelled
Tests / Tests: Python 3.13 on ubuntu-latest (push) Has been cancelled
Tests / Tests: Python 3.10 on windows-latest (push) Has been cancelled
Tests / Tests with lowest-direct dependencies (push) Has been cancelled
Tests / MCP conformance tests (push) Has been cancelled
Tests / Integration tests (push) Has been cancelled
Tests / Package install smoke (push) Has been cancelled
Upgrade checks / Static analysis (push) Has been cancelled
Upgrade checks / Tests: Python 3.10 on ubuntu-latest (push) Has been cancelled
Upgrade checks / Tests: Python 3.13 on ubuntu-latest (push) Has been cancelled
Upgrade checks / Tests: Python 3.10 on windows-latest (push) Has been cancelled
Upgrade checks / Integration tests (push) Has been cancelled
Update MCPServerConfig Schema / update-config-schema (push) Has been cancelled
Update SDK Documentation / update-sdk-docs (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:39:59 +08:00

173 lines
6.5 KiB
Python

"""Test that the generated JSON schema has the correct structure."""
import pytest
from fastmcp.utilities.mcp_server_config.v1.mcp_server_config import (
Deployment,
generate_schema,
)
def test_schema_has_correct_id():
"""Test that the schema has the correct $id field."""
generated_schema = generate_schema()
assert generated_schema is not None
assert "$id" in generated_schema
assert (
generated_schema["$id"]
== "https://gofastmcp.com/public/schemas/fastmcp.json/v1.json"
)
def test_schema_has_required_fields():
"""Test that the schema specifies the required fields correctly."""
generated_schema = generate_schema()
assert generated_schema is not None
# Check that source is required
assert "required" in generated_schema
assert "source" in generated_schema["required"]
# Check that source is in properties
assert "properties" in generated_schema
assert "source" in generated_schema["properties"]
def test_schema_nested_structure():
"""Test that the schema has the correct nested structure."""
generated_schema = generate_schema()
assert generated_schema is not None
properties = generated_schema["properties"]
# Check environment section
assert "environment" in properties
env_schema = properties["environment"]
# Environment can be in anyOf or direct properties
if "anyOf" in env_schema:
# Find the UVEnvironment in anyOf
for option in env_schema["anyOf"]:
if option.get("type") == "object" and "properties" in option:
env_props = option["properties"]
assert "type" in env_props # New type field
assert "python" in env_props
assert "dependencies" in env_props
assert "requirements" in env_props
assert "project" in env_props
assert "editable" in env_props
break
elif "properties" in env_schema:
env_props = env_schema["properties"]
assert "type" in env_props # New type field
assert "python" in env_props
assert "dependencies" in env_props
assert "requirements" in env_props
assert "project" in env_props
assert "editable" in env_props
# Check deployment section
assert "deployment" in properties
deploy_schema = properties["deployment"]
if "properties" in deploy_schema:
deploy_props = deploy_schema["properties"]
assert "transport" in deploy_props
assert "host" in deploy_props
assert "port" in deploy_props
assert "log_level" in deploy_props
assert "env" in deploy_props
assert "cwd" in deploy_props
assert "args" in deploy_props
def test_schema_transport_enum():
"""Test that transport field has correct enum values."""
generated_schema = generate_schema()
assert generated_schema is not None
# Navigate to transport field
deploy_schema = generated_schema["properties"]["deployment"]
# Handle both direct properties and anyOf cases
if "anyOf" in deploy_schema:
# Find the object type in anyOf
for option in deploy_schema["anyOf"]:
if option.get("type") == "object" and "properties" in option:
transport_schema = option["properties"].get("transport", {})
if "anyOf" in transport_schema:
# Look for enum in anyOf options
for trans_option in transport_schema["anyOf"]:
if "enum" in trans_option:
valid_transports = trans_option["enum"]
assert "stdio" in valid_transports
assert "http" in valid_transports
assert "sse" in valid_transports
assert "streamable-http" in valid_transports
break
elif "properties" in deploy_schema:
transport_schema = deploy_schema["properties"].get("transport", {})
if "anyOf" in transport_schema:
for option in transport_schema["anyOf"]:
if "enum" in option:
valid_transports = option["enum"]
assert "stdio" in valid_transports
assert "http" in valid_transports
assert "sse" in valid_transports
assert "streamable-http" in valid_transports
break
def test_schema_log_level_enum():
"""Test that log_level field has correct enum values."""
generated_schema = generate_schema()
assert generated_schema is not None
# Navigate to log_level field
deploy_schema = generated_schema["properties"]["deployment"]
# Handle both direct properties and anyOf cases
if "anyOf" in deploy_schema:
# Find the object type in anyOf
for option in deploy_schema["anyOf"]:
if option.get("type") == "object" and "properties" in option:
log_level_schema = option["properties"].get("log_level", {})
if "anyOf" in log_level_schema:
# Look for enum in anyOf options
for level_option in log_level_schema["anyOf"]:
if "enum" in level_option:
valid_levels = level_option["enum"]
assert "DEBUG" in valid_levels
assert "INFO" in valid_levels
assert "WARNING" in valid_levels
assert "ERROR" in valid_levels
assert "CRITICAL" in valid_levels
break
elif "properties" in deploy_schema:
log_level_schema = deploy_schema["properties"].get("log_level", {})
if "anyOf" in log_level_schema:
for option in log_level_schema["anyOf"]:
if "enum" in option:
valid_levels = option["enum"]
assert "DEBUG" in valid_levels
assert "INFO" in valid_levels
assert "WARNING" in valid_levels
assert "ERROR" in valid_levels
assert "CRITICAL" in valid_levels
break
@pytest.mark.parametrize(
"transport",
[
"streamable-http",
"http",
"stdio",
"sse",
None,
],
)
def test_transport_values_accepted(transport):
"""Test that all valid transport values are accepted."""
deployment = Deployment(transport=transport)
assert deployment.transport == transport