from __future__ import annotations import argparse import json from typing import Any import pytest import pyro_mcp.cli as cli def test_cli_run_prints_json( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], ) -> None: class StubPyro: def run_in_vm(self, **kwargs: Any) -> dict[str, Any]: assert kwargs["network"] is True assert kwargs["command"] == "echo hi" return {"exit_code": 0, "stdout": "hi\n"} class StubParser: def parse_args(self) -> argparse.Namespace: return argparse.Namespace( command="run", environment="debian:12", vcpu_count=1, mem_mib=512, timeout_seconds=30, ttl_seconds=600, network=True, command_args=["--", "echo", "hi"], ) monkeypatch.setattr(cli, "_build_parser", lambda: StubParser()) monkeypatch.setattr(cli, "Pyro", StubPyro) cli.main() output = json.loads(capsys.readouterr().out) assert output["exit_code"] == 0 def test_cli_doctor_prints_json( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: class StubParser: def parse_args(self) -> argparse.Namespace: return argparse.Namespace(command="doctor", platform="linux-x86_64") monkeypatch.setattr(cli, "_build_parser", lambda: StubParser()) monkeypatch.setattr( cli, "doctor_report", lambda platform: {"platform": platform, "runtime_ok": True}, ) cli.main() output = json.loads(capsys.readouterr().out) assert output["runtime_ok"] is True def test_cli_demo_ollama_prints_summary( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: class StubParser: def parse_args(self) -> argparse.Namespace: return argparse.Namespace( command="demo", demo_command="ollama", base_url="http://localhost:11434/v1", model="llama3.2:3b", verbose=False, ) monkeypatch.setattr(cli, "_build_parser", lambda: StubParser()) monkeypatch.setattr( cli, "run_ollama_tool_demo", lambda **kwargs: { "exec_result": {"exit_code": 0, "execution_mode": "guest_vsock", "stdout": "true\n"}, "fallback_used": False, }, ) cli.main() output = capsys.readouterr().out assert "[summary] exit_code=0 fallback_used=False execution_mode=guest_vsock" in output def test_cli_env_list_prints_json( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: class StubPyro: def list_environments(self) -> list[dict[str, object]]: return [{"name": "debian:12", "installed": False}] class StubParser: def parse_args(self) -> argparse.Namespace: return argparse.Namespace(command="env", env_command="list") monkeypatch.setattr(cli, "_build_parser", lambda: StubParser()) monkeypatch.setattr(cli, "Pyro", StubPyro) cli.main() output = json.loads(capsys.readouterr().out) assert output["environments"][0]["name"] == "debian:12" def test_cli_requires_run_command() -> None: with pytest.raises(ValueError, match="command is required"): cli._require_command([])