birdcage/mcp/tests/test_system.py
Ryan Malloy 8a6b99bd8c Add birdcage-mcp FastMCP server for satellite dish control
34 tools (connection, movement, signal, system, satellite, console),
5 resources, 3 prompts. Backed by DemoDevice for offline testing.
46 tests passing against the demo backend via run_server_async.
2026-02-17 16:01:51 -07:00

122 lines
3.6 KiB
Python

"""Tests for system and firmware tools."""
import pytest
from conftest import parse_result
from fastmcp import Client
from fastmcp.exceptions import ToolError
@pytest.mark.anyio
async def test_get_firmware_id(mcp_client: Client):
result = await mcp_client.call_tool("get_firmware_id", {})
data = parse_result(result)
assert "02.02.48" in data["raw"]
assert "TWELINCH" in data["raw"]
@pytest.mark.anyio
async def test_get_motor_dynamics(mcp_client: Client):
result = await mcp_client.call_tool("get_motor_dynamics", {})
data = parse_result(result)
assert data["az_max_vel"] == 65.0
assert data["el_max_vel"] == 45.0
assert data["az_accel"] == 400.0
assert data["el_accel"] == 400.0
@pytest.mark.anyio
async def test_set_max_velocity(mcp_client: Client):
result = await mcp_client.call_tool(
"set_max_velocity", {"motor_id": 0, "deg_per_sec": 30.0}
)
data = parse_result(result)
assert data["axis"] == "azimuth"
assert data["max_velocity"] == 30.0
# Verify it stuck
result = await mcp_client.call_tool("get_motor_dynamics", {})
data = parse_result(result)
assert data["az_max_vel"] == 30.0
@pytest.mark.anyio
async def test_set_max_velocity_invalid_motor(mcp_client: Client):
with pytest.raises(ToolError):
await mcp_client.call_tool(
"set_max_velocity", {"motor_id": 3, "deg_per_sec": 10.0}
)
@pytest.mark.anyio
async def test_set_max_acceleration(mcp_client: Client):
result = await mcp_client.call_tool(
"set_max_acceleration", {"motor_id": 1, "accel": 200.0}
)
data = parse_result(result)
assert data["axis"] == "elevation"
assert data["max_acceleration"] == 200.0
@pytest.mark.anyio
async def test_get_motor_life(mcp_client: Client):
result = await mcp_client.call_tool("get_motor_life", {})
data = parse_result(result)
assert "AZ total moves" in data["raw"]
@pytest.mark.anyio
async def test_get_pid_gains(mcp_client: Client):
result = await mcp_client.call_tool("get_pid_gains", {})
data = parse_result(result)
assert data["az"]["kp"] == 600.0
assert data["az"]["kv"] == 60.0
assert data["el"]["kp"] == 250.0
@pytest.mark.anyio
async def test_set_pid_gains(mcp_client: Client):
result = await mcp_client.call_tool(
"set_pid_gains",
{"motor_id": 0, "kp": 500.0, "kv": 55.0, "ki": 2.0},
)
data = parse_result(result)
assert data["status"] == "set"
assert data["kp"] == 500.0
@pytest.mark.anyio
async def test_get_a3981_diag(mcp_client: Client):
result = await mcp_client.call_tool("get_a3981_diag", {})
data = parse_result(result)
assert "OK" in data["raw"]
@pytest.mark.anyio
async def test_get_a3981_modes(mcp_client: Client):
result = await mcp_client.call_tool("get_a3981_modes", {})
data = parse_result(result)
assert "AUTO" in data["step_mode"]
@pytest.mark.anyio
async def test_nvs_dump(mcp_client: Client):
result = await mcp_client.call_tool("nvs_dump", {})
data = parse_result(result)
assert "Disable Tracker" in data["raw"]
assert "AZ Max Vel" in data["raw"]
@pytest.mark.anyio
async def test_nvs_read(mcp_client: Client):
result = await mcp_client.call_tool("nvs_read", {"index": 20})
data = parse_result(result)
assert data["index"] == 20
assert "Disable Tracker" in data["raw"]
@pytest.mark.anyio
async def test_nvs_read_missing_index(mcp_client: Client):
result = await mcp_client.call_tool("nvs_read", {"index": 999})
data = parse_result(result)
assert "not found" in data["raw"]