86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
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
|