Skip to content

test_base_mcp

ipw.tests.agents.mcp.test_base_mcp

Tests for agents/mcp/base.py — MCPToolResult and BaseMCPServer.

TestMCPToolResult

Test MCPToolResult dataclass fields.

Source code in intelligence-per-watt/src/ipw/tests/agents/mcp/test_base_mcp.py
class TestMCPToolResult:
    """Test MCPToolResult dataclass fields."""

    def test_default_values(self) -> None:
        result = MCPToolResult(content="hello")
        assert result.content == "hello"
        assert result.usage == {}
        assert result.cost_usd is None
        assert result.telemetry_samples == []
        assert result.latency_seconds == 0.0
        assert result.ttft_seconds is None
        assert result.metadata == {}

    def test_all_fields(self) -> None:
        result = MCPToolResult(
            content="answer",
            usage={"prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15},
            cost_usd=0.001,
            telemetry_samples=[{"power": 100}],
            latency_seconds=0.5,
            ttft_seconds=0.1,
            metadata={"model": "test"},
        )
        assert result.cost_usd == 0.001
        assert result.latency_seconds == 0.5
        assert result.ttft_seconds == 0.1
        assert result.usage["total_tokens"] == 15

    def test_usage_dict_is_independent(self) -> None:
        r1 = MCPToolResult(content="a")
        r2 = MCPToolResult(content="b")
        r1.usage["key"] = 1
        assert "key" not in r2.usage

TestBaseMCPServer

Test BaseMCPServer contract.

Source code in intelligence-per-watt/src/ipw/tests/agents/mcp/test_base_mcp.py
class TestBaseMCPServer:
    """Test BaseMCPServer contract."""

    def test_cannot_instantiate_directly(self) -> None:
        with pytest.raises(TypeError):
            BaseMCPServer(name="test")

    def test_concrete_subclass(self) -> None:
        class DummyServer(BaseMCPServer):
            def _execute_impl(self, prompt: str, **params) -> MCPToolResult:
                return MCPToolResult(content=f"echo: {prompt}")

        server = DummyServer(name="dummy")
        assert server.name == "dummy"
        assert repr(server) == "DummyServer(name='dummy')"

    def test_execute_wraps_impl(self) -> None:
        class DummyServer(BaseMCPServer):
            def _execute_impl(self, prompt: str, **params) -> MCPToolResult:
                return MCPToolResult(content=f"echo: {prompt}")

        server = DummyServer(name="dummy")
        result = server.execute("hello")
        assert result.content == "echo: hello"
        assert result.latency_seconds > 0

    def test_execute_records_events(self) -> None:
        recorder = EventRecorder()

        class DummyServer(BaseMCPServer):
            def _execute_impl(self, prompt: str, **params) -> MCPToolResult:
                return MCPToolResult(
                    content="ok",
                    usage={"prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15},
                    cost_usd=0.001,
                )

        server = DummyServer(name="dummy", event_recorder=recorder)
        server.execute("test")

        events = recorder.get_events()
        assert len(events) == 2
        assert events[0].event_type == "submodel_call_start"
        assert events[1].event_type == "submodel_call_end"
        assert events[1].metadata["total_tokens"] == 15
        assert events[1].metadata["cost_usd"] == 0.001

    def test_get_backend_from_name(self) -> None:
        class DummyServer(BaseMCPServer):
            def _execute_impl(self, prompt: str, **params) -> MCPToolResult:
                return MCPToolResult(content="ok")

        server = DummyServer(name="vllm:model")
        assert server._get_backend() == "vllm"

    def test_get_backend_unknown(self) -> None:
        class DummyServer(BaseMCPServer):
            def _execute_impl(self, prompt: str, **params) -> MCPToolResult:
                return MCPToolResult(content="ok")

        server = DummyServer(name="calculator")
        assert server._get_backend() == "unknown"