from __future__ import annotations import asyncio from collections.abc import Sequence from typing import Any import pytest from mcp.types import TextContent import pyro_mcp.demo as demo_module from pyro_mcp.demo import run_demo from pyro_mcp.server import HELLO_STATIC_PAYLOAD def test_run_demo_returns_static_payload() -> None: payload = asyncio.run(run_demo()) assert payload == HELLO_STATIC_PAYLOAD def test_run_demo_raises_for_non_text_blocks(monkeypatch: pytest.MonkeyPatch) -> None: class StubServer: async def call_tool( self, name: str, arguments: dict[str, Any], ) -> tuple[Sequence[int], dict[str, str]]: assert name == "hello_static" assert arguments == {} return [123], HELLO_STATIC_PAYLOAD monkeypatch.setattr(demo_module, "create_server", lambda: StubServer()) with pytest.raises(TypeError, match="unexpected MCP content block output"): asyncio.run(demo_module.run_demo()) def test_run_demo_raises_for_non_dict_payload(monkeypatch: pytest.MonkeyPatch) -> None: class StubServer: async def call_tool( self, name: str, arguments: dict[str, Any], ) -> tuple[list[TextContent], str]: assert name == "hello_static" assert arguments == {} return [TextContent(type="text", text="x")], "bad" monkeypatch.setattr(demo_module, "create_server", lambda: StubServer()) with pytest.raises(TypeError, match="expected a structured dictionary payload"): asyncio.run(demo_module.run_demo()) def test_run_demo_raises_for_unexpected_payload(monkeypatch: pytest.MonkeyPatch) -> None: class StubServer: async def call_tool( self, name: str, arguments: dict[str, Any], ) -> tuple[list[TextContent], dict[str, str]]: assert name == "hello_static" assert arguments == {} return [TextContent(type="text", text="x")], { "message": "different", "status": "ok", "version": "0.0.1", } monkeypatch.setattr(demo_module, "create_server", lambda: StubServer()) with pytest.raises(ValueError, match="static payload did not match expected value"): asyncio.run(demo_module.run_demo()) def test_demo_main_prints_json( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], ) -> None: async def fake_run_demo() -> dict[str, str]: return HELLO_STATIC_PAYLOAD monkeypatch.setattr(demo_module, "run_demo", fake_run_demo) demo_module.main() output = capsys.readouterr().out assert '"message": "hello from pyro_mcp"' in output