Spaces:
Running
Running
| from __future__ import annotations | |
| from fastapi.testclient import TestClient | |
| from app.container import build_container | |
| from app.mcp.registry import ( | |
| AUDIO_TOOLS, | |
| IMAGE_TOOLS, | |
| PROBE_TOOLS, | |
| SYSTEM_TOOLS, | |
| TEMPLATE_TOOLS, | |
| VIDEO_TOOLS, | |
| WHISPER_TOOLS, | |
| YTDLP_TOOLS, | |
| MCPRegistry, | |
| MediaInput, | |
| ) | |
| from app.mcp.server import create_mcp_server | |
| from main import create_app | |
| async def test_mcp_registers_all_tools_resources_and_prompts(settings) -> None: | |
| server = create_mcp_server(build_container(settings)) | |
| tools = {tool.name for tool in await server.list_tools()} | |
| expected_tools = set( | |
| VIDEO_TOOLS | |
| + AUDIO_TOOLS | |
| + IMAGE_TOOLS | |
| + WHISPER_TOOLS | |
| + YTDLP_TOOLS | |
| + PROBE_TOOLS | |
| + SYSTEM_TOOLS | |
| + TEMPLATE_TOOLS | |
| ) | |
| expected_tools.update( | |
| { | |
| "social.list_providers", | |
| "social.get_capabilities", | |
| "social.list_media_assets", | |
| "social.register_media_asset", | |
| "social.list_accounts", | |
| "social.get_account", | |
| "social.create_post", | |
| "social.publish_post", | |
| "social.schedule_post", | |
| "social.cancel_post", | |
| "social.get_post", | |
| "social.get_job", | |
| "social.get_analytics", | |
| "ai.capabilities", | |
| "ai.generate", | |
| "ai.list_jobs", | |
| "ai.get_job", | |
| "ai.cancel_job", | |
| } | |
| ) | |
| assert tools == expected_tools | |
| resources = {str(resource.uri) for resource in await server.list_resources()} | |
| assert resources == { | |
| "media://operations", | |
| "media://formats", | |
| "media://codecs", | |
| "media://health", | |
| "media://configuration", | |
| "media://version", | |
| } | |
| prompts = {prompt.name for prompt in await server.list_prompts()} | |
| assert prompts == { | |
| "compress_for_social_media", | |
| "youtube_to_mp3", | |
| "download_and_transcribe", | |
| "generate_subtitles", | |
| "extract_audio", | |
| "make_thumbnail", | |
| "probe_media", | |
| "instagram_reel", | |
| "tiktok_video", | |
| "podcast_audio", | |
| } | |
| async def test_mcp_errors_use_safe_structured_envelope(settings) -> None: | |
| registry = MCPRegistry(build_container(settings)) | |
| response = await registry.run_probe( | |
| "probe_media", | |
| MediaInput(temp_path=str(settings.temp_dir / "missing.mp4")), | |
| ) | |
| assert response["success"] is False | |
| assert response["request_id"] | |
| assert response["processing_time"] >= 0 | |
| assert response["error"]["code"] == "INVALID_INPUT" | |
| assert "traceback" not in str(response).lower() | |
| def test_rest_and_mcp_coexist_in_one_application(settings) -> None: | |
| application = create_app(settings) | |
| mounts = {getattr(route, "path", None) for route in application.routes} | |
| assert "/mcp" in mounts | |
| with TestClient(application) as client: | |
| response = client.get("/health") | |
| assert response.status_code == 200 | |
| assert response.json()["success"] is True | |
| assert application.state.mcp_server is not None | |