Skip to main content
Glama

FastAPI OpenAPI MCP Server

by jason-chang
test_plain.py7.56 kB
""" PlainTextFormatter 测试 """ from typing import Any import pytest from openapi_mcp.formatters.plain import PlainTextFormatter @pytest.fixture def formatter() -> PlainTextFormatter: """创建 PlainTextFormatter 实例""" return PlainTextFormatter() @pytest.fixture def formatter_with_limit() -> PlainTextFormatter: """创建有长度限制的 PlainTextFormatter 实例""" return PlainTextFormatter(max_length=500) @pytest.fixture def sample_endpoints() -> dict[str, list[dict[str, str]]]: """示例接口列表""" return { 'Users': [ {'method': 'GET', 'path': '/users', 'summary': 'List all users'}, {'method': 'POST', 'path': '/users', 'summary': 'Create a new user'}, ], 'Items': [ {'method': 'GET', 'path': '/items', 'summary': 'List all items'}, ], } @pytest.fixture def sample_endpoint_details() -> dict[str, Any]: """示例接口详情""" return { 'method': 'POST', 'path': '/users', 'summary': 'Create a new user', 'description': 'Creates a new user with the provided information.', 'parameters': [ { 'name': 'api_key', 'in': 'header', 'required': True, 'type': 'string', 'description': 'API authentication key', } ], 'requestBody': { 'required': True, 'content': { 'application/json': { 'schema': {'$ref': '#/components/schemas/UserCreate'} } }, }, 'responses': { '201': { 'description': 'User created successfully', 'content': { 'application/json': { 'schema': {'$ref': '#/components/schemas/User'} } }, }, '400': {'description': 'Invalid request'}, }, 'security': [{'BearerAuth': ['write:users']}], } @pytest.fixture def sample_models() -> list[dict[str, str]]: """示例模型列表""" return [ {'name': 'User', 'description': 'User data model'}, {'name': 'Item', 'description': 'Item data model'}, ] @pytest.fixture def sample_model_details() -> dict[str, Any]: """示例模型详情""" return { 'name': 'User', 'description': 'User data model', 'fields': [ { 'name': 'id', 'type': 'integer', 'required': True, 'description': 'User ID', }, { 'name': 'email', 'type': 'string', 'required': True, 'description': 'User email', 'format': 'email', 'maxLength': 100, }, { 'name': 'name', 'type': 'string', 'required': False, 'description': 'User name', 'minLength': 1, 'maxLength': 50, }, ], 'required': ['id', 'email'], } @pytest.fixture def sample_search_results() -> list[dict[str, str]]: """示例搜索结果""" return [ {'method': 'GET', 'path': '/users', 'summary': 'List all users'}, {'method': 'GET', 'path': '/users/{id}', 'summary': 'Get user by ID'}, ] class TestPlainTextFormatter: """PlainTextFormatter 测试""" def test_format_endpoints( self, formatter: PlainTextFormatter, sample_endpoints: dict[str, list[dict[str, str]]], ) -> None: """测试格式化接口列表""" result = formatter.format_endpoints(sample_endpoints) assert 'Available API Endpoints:' in result assert '[Users]' in result assert '[Items]' in result assert 'GET /users - List all users' in result assert 'POST /users - Create a new user' in result assert 'GET /items - List all items' in result assert 'Total endpoints: 3' in result def test_format_endpoints_empty(self, formatter: PlainTextFormatter) -> None: """测试格式化空接口列表""" result = formatter.format_endpoints({}) assert 'No endpoints found.' in result def test_format_endpoints_untagged(self, formatter: PlainTextFormatter) -> None: """测试格式化无标签接口""" endpoints = { 'Untagged': [ {'method': 'GET', 'path': '/health', 'summary': 'Health check'} ] } result = formatter.format_endpoints(endpoints) assert '[Untagged]' in result assert 'GET /health - Health check' in result def test_format_endpoint_details( self, formatter: PlainTextFormatter, sample_endpoint_details: dict[str, Any] ) -> None: """测试格式化接口详情""" result = formatter.format_endpoint_details(sample_endpoint_details) assert 'POST /users' in result assert 'Create a new user' in result assert 'Creates a new user with the provided information.' in result assert 'Parameters:' in result assert 'api_key (header) [Required]: string' in result assert 'Request Body:' in result assert 'Content-Type: application/json' in result assert 'Schema: UserCreate' in result assert 'Responses:' in result assert '201 - User created successfully' in result assert '400 - Invalid request' in result assert 'Security:' in result assert '- BearerAuth' in result assert 'write:users' in result def test_format_endpoint_details_deprecated( self, formatter: PlainTextFormatter ) -> None: """测试格式化废弃的接口""" endpoint_info = { 'method': 'GET', 'path': '/old-endpoint', 'summary': 'Old endpoint', 'deprecated': True, } result = formatter.format_endpoint_details(endpoint_info) assert 'WARNING: This endpoint is deprecated.' in result def test_format_models( self, formatter: PlainTextFormatter, sample_models: list[dict[str, str]] ) -> None: """测试格式化模型列表""" result = formatter.format_models(sample_models) assert 'API Data Models (2 models):' in result assert '- User: User data model' in result assert '- Item: Item data model' in result assert 'Use get_model_details to view full schema.' in result def test_format_models_empty(self, formatter: PlainTextFormatter) -> None: """测试格式化空模型列表""" result = formatter.format_models([]) assert 'No models found.' in result def test_format_model_details( self, formatter: PlainTextFormatter, sample_model_details: dict[str, Any] ) -> None: """测试格式化模型详情""" result = formatter.format_model_details(sample_model_details) assert 'Model: User' in result assert 'Description: User data model' in result assert 'Fields:' in result assert '- id [Required]: integer' in result assert '- email [Required]: string' in result assert 'format: email' in result assert 'maxLength: 100' in result assert '- name: string' in result assert 'minLength: 1' in result assert 'maxLength: 50' in result assert 'Required fields: id, email' in result def test_format_search_results( self, formatter: PlainTextFormatter, sample_search_results: list[dict[str, str]] ) -> None: """测试格式化搜索结果""" result = formatter.format_search_results(sample_search_results) assert 'Search Results (2 endpoints):' in result assert 'GET /users - List all users' in result assert 'GET /users/{id} - Get user by ID' in result def test_format_search_results_empty(self, formatter: PlainTextFormatter) -> None: """测试格式化空搜索结果""" result = formatter.format_search_results([]) assert 'No results found.' in result def test_truncate_no_limit(self, formatter: PlainTextFormatter) -> None: """测试无长度限制时不截断""" long_text = 'A' * 10000 result = formatter.truncate(long_text) assert len(result) == 10000 assert result == long_text def test_truncate_with_limit( self, formatter_with_limit: PlainTextFormatter ) -> None: """测试有长度限制时截断""" long_text = 'A' * 1000 result = formatter_with_limit.truncate(long_text) assert len(result) < len(long_text) assert '⚠️ 输出已截断' in result assert '总长度: 1000 字符' in result assert '限制: 500 字符' in result

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jason-chang/fastapi-openapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server