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.
87 lines
2.5 KiB
Python
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
|