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.
This commit is contained in:
parent
16ca4892b3
commit
8a6b99bd8c
21 changed files with 3233 additions and 0 deletions
100
mcp/tests/test_movement.py
Normal file
100
mcp/tests/test_movement.py
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
"""Tests for movement tools."""
|
||||
|
||||
import pytest
|
||||
from conftest import parse_result
|
||||
from fastmcp import Client
|
||||
from fastmcp.exceptions import ToolError
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_get_position(mcp_client: Client):
|
||||
result = await mcp_client.call_tool("get_position", {})
|
||||
data = parse_result(result)
|
||||
assert "azimuth" in data
|
||||
assert "elevation" in data
|
||||
assert isinstance(data["azimuth"], float)
|
||||
assert isinstance(data["elevation"], float)
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_move_to(mcp_client: Client):
|
||||
result = await mcp_client.call_tool(
|
||||
"move_to", {"azimuth": 200.0, "elevation": 40.0}
|
||||
)
|
||||
data = parse_result(result)
|
||||
assert data["status"] == "moving"
|
||||
assert data["target_azimuth"] == 200.0
|
||||
assert data["target_elevation"] == 40.0
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_move_motor_az(mcp_client: Client):
|
||||
result = await mcp_client.call_tool(
|
||||
"move_motor", {"motor_id": 0, "degrees": 90.0}
|
||||
)
|
||||
data = parse_result(result)
|
||||
assert data["axis"] == "azimuth"
|
||||
assert data["target"] == 90.0
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_move_motor_el(mcp_client: Client):
|
||||
result = await mcp_client.call_tool(
|
||||
"move_motor", {"motor_id": 1, "degrees": 30.0}
|
||||
)
|
||||
data = parse_result(result)
|
||||
assert data["axis"] == "elevation"
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_move_motor_invalid_id(mcp_client: Client):
|
||||
with pytest.raises(ToolError):
|
||||
await mcp_client.call_tool(
|
||||
"move_motor", {"motor_id": 2, "degrees": 10.0}
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_home_motor(mcp_client: Client):
|
||||
result = await mcp_client.call_tool("home_motor", {"motor_id": 1})
|
||||
data = parse_result(result)
|
||||
assert data["status"] == "homing"
|
||||
assert data["axis"] == "elevation"
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_engage_release(mcp_client: Client):
|
||||
result = await mcp_client.call_tool("release_motors", {})
|
||||
data = parse_result(result)
|
||||
assert data["status"] == "released"
|
||||
|
||||
result = await mcp_client.call_tool("engage_motors", {})
|
||||
data = parse_result(result)
|
||||
assert data["status"] == "engaged"
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_stow(mcp_client: Client):
|
||||
result = await mcp_client.call_tool("stow", {})
|
||||
data = parse_result(result)
|
||||
assert data["status"] == "stowing"
|
||||
assert data["target_azimuth"] == 0.0
|
||||
assert data["target_elevation"] == 65.0
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_get_step_positions(mcp_client: Client):
|
||||
result = await mcp_client.call_tool("get_step_positions", {})
|
||||
data = parse_result(result)
|
||||
assert "az_steps" in data
|
||||
assert "el_steps" in data
|
||||
assert isinstance(data["az_steps"], int)
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_get_el_limits(mcp_client: Client):
|
||||
result = await mcp_client.call_tool("get_el_limits", {})
|
||||
data = parse_result(result)
|
||||
assert data["min"] == 18.0
|
||||
assert data["max"] == 65.0
|
||||
assert data["home"] == 65.0
|
||||
Loading…
Add table
Add a link
Reference in a new issue