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
173 lines
6.5 KiB
Python
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
|