"""list_vms / vm_info status reporting.""" from fastmcp import Client from conftest import FakeQMPClient, result_data, write_registry from mcqemu.server import mcp from test_lifecycle import seeded_record async def test_list_vms_stopped(dirs, all_pids_dead): write_registry(dirs, seeded_record(dirs, "vm1")) async with Client(mcp) as client: result = result_data(await client.call_tool("list_vms", {})) assert result["vms"][0]["status"] == "stopped" assert result["registry_warnings"] == [] async def test_list_vms_running(dirs, fake_qmp, all_pids_alive): FakeQMPClient.responses["query-status"] = {"status": "running"} write_registry(dirs, seeded_record(dirs, "vm1")) async with Client(mcp) as client: result = result_data(await client.call_tool("list_vms", {})) assert result["vms"][0]["status"] == "running" async def test_list_vms_unreachable_when_qmp_fails(dirs, fake_qmp, all_pids_alive): FakeQMPClient.connect_error = OSError("connection refused") write_registry(dirs, seeded_record(dirs, "vm1")) async with Client(mcp) as client: result = result_data(await client.call_tool("list_vms", {})) assert result["vms"][0]["status"] == "unreachable" async def test_vm_info_running_includes_block_devices(dirs, fake_qmp, all_pids_alive): FakeQMPClient.responses["query-status"] = {"status": "running"} FakeQMPClient.responses["query-cpus-fast"] = [{"cpu-index": 0}, {"cpu-index": 1}] FakeQMPClient.responses["query-block"] = [ { "device": "virtio0", "inserted": {"file": "/vms/a.qcow2", "drv": "qcow2", "ro": False}, }, {"device": "empty-cd"}, ] write_registry(dirs, seeded_record(dirs, "vm1")) async with Client(mcp) as client: info = result_data(await client.call_tool("vm_info", {"name": "vm1"})) assert info["status"] == "running" assert info["vcpus"] == 2 assert info["block_devices"] == [ {"device": "virtio0", "file": "/vms/a.qcow2", "format": "qcow2", "read_only": False} ] async def test_vm_info_stopped_skips_qmp(dirs, all_pids_dead): write_registry(dirs, seeded_record(dirs, "vm1")) async with Client(mcp) as client: info = result_data(await client.call_tool("vm_info", {"name": "vm1"})) assert info["status"] == "stopped" assert "vcpus" not in info