birdcage/mcp/tests/test_satellite.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

87 lines
2.5 KiB
Python

"""Tests for satellite tracking tools."""
import pytest
from conftest import parse_result
from fastmcp import Client
@pytest.mark.anyio
async def test_search_satellites(mcp_client: Client):
result = await mcp_client.call_tool(
"search_satellites", {"query": "ISS"}
)
data = parse_result(result)
assert data["count"] >= 1
names = [r["name"] for r in data["results"]]
assert any("ISS" in n for n in names)
@pytest.mark.anyio
async def test_search_no_results(mcp_client: Client):
result = await mcp_client.call_tool(
"search_satellites", {"query": "nonexistent_xyz"}
)
data = parse_result(result)
assert data["count"] == 0
@pytest.mark.anyio
async def test_search_with_limit(mcp_client: Client):
result = await mcp_client.call_tool(
"search_satellites", {"query": "", "limit": 3}
)
data = parse_result(result)
# Empty query won't match any catalog entries
assert data["count"] >= 0
@pytest.mark.anyio
async def test_get_passes(mcp_client: Client):
result = await mcp_client.call_tool(
"get_passes", {"norad_id": 25544}
)
data = parse_result(result)
assert data["count"] > 0
p = data["passes"][0]
assert "aos_time" in p
assert "tca_time" in p
assert "los_time" in p
assert "max_elevation" in p
assert p["norad_id"] == 25544
@pytest.mark.anyio
async def test_get_next_pass(mcp_client: Client):
result = await mcp_client.call_tool(
"get_next_pass", {"norad_id": 25544}
)
data = parse_result(result)
assert data["pass"] is not None
assert data["pass"]["satellite_name"] == "ISS (ZARYA)"
@pytest.mark.anyio
async def test_get_visible_targets(mcp_client: Client):
result = await mcp_client.call_tool(
"get_visible_targets", {}
)
data = parse_result(result)
# Celestial bodies (Moon, Sun, Jupiter) are always visible
assert data["count"] >= 1
names = [t["name"] for t in data["targets"]]
# At least celestial bodies should be present
assert any(
n in names for n in ("Moon", "Sun", "Jupiter")
)
@pytest.mark.anyio
async def test_get_visible_targets_with_min_alt(mcp_client: Client):
result = await mcp_client.call_tool(
"get_visible_targets", {"min_alt": 80.0}
)
data = parse_result(result)
# Very high min_alt should filter out most targets
for t in data["targets"]:
assert t["altitude"] >= 80.0