release: bump version to 0.66.1
This commit is contained in:
@@ -7,6 +7,7 @@ from unittest.mock import AsyncMock, patch
|
||||
|
||||
from app.core.datasource_defaults import DEFAULT_DATASOURCES
|
||||
from app.services.collectors.celestrak import CelesTrakTLECollector
|
||||
from app.services.collectors.downloads import DownloadHTTPStatusError, ResumableFileDownloader
|
||||
from app.services.credential_guides import DEFAULT_CREDENTIAL_GUIDES
|
||||
from app.services.collectors.top500 import TOP500Collector
|
||||
from app.services.collectors.registry import collector_registry
|
||||
@@ -222,6 +223,101 @@ class TestCelesTrakTLECollector:
|
||||
|
||||
assert attempts == 3
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_fetch_uses_cache_when_celestrak_reports_not_updated(self, monkeypatch, tmp_path):
|
||||
collector = CelesTrakTLECollector()
|
||||
collector._resolved_url = "https://celestrak.example/NORAD/elements/gp.php"
|
||||
collector._downloader = ResumableFileDownloader(cache_namespace="celestrak-test", cache_root=tmp_path)
|
||||
url = collector._active_url()
|
||||
cached_path = collector._downloader.cached_file_path(url, ".json")
|
||||
cached_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
cached_path.write_text(
|
||||
json.dumps([{"NORAD_CAT_ID": 25544, "OBJECT_NAME": "ISS (ZARYA)"}]),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
async def fake_download_file(*args, **kwargs):
|
||||
raise DownloadHTTPStatusError(
|
||||
url=url,
|
||||
status_code=403,
|
||||
body="GP data has not updated since your last successful download of GROUP=active.",
|
||||
)
|
||||
|
||||
async def fake_emit_business_log(*args, **kwargs):
|
||||
return None
|
||||
|
||||
monkeypatch.setattr(collector._downloader, "download_file", fake_download_file)
|
||||
monkeypatch.setattr("app.services.collectors.celestrak.emit_business_log", fake_emit_business_log)
|
||||
|
||||
records = await collector.fetch()
|
||||
|
||||
assert records[0]["NORAD_CAT_ID"] == 25544
|
||||
assert records[0]["_celestrak_query_group"] == "active"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_fetch_not_updated_without_cache_does_not_retry(self, monkeypatch, tmp_path):
|
||||
collector = CelesTrakTLECollector()
|
||||
collector._resolved_url = "https://celestrak.example/NORAD/elements/gp.php"
|
||||
collector._downloader = ResumableFileDownloader(cache_namespace="celestrak-test", cache_root=tmp_path)
|
||||
attempts = 0
|
||||
|
||||
async def fake_download_file(*args, **kwargs):
|
||||
nonlocal attempts
|
||||
attempts += 1
|
||||
raise DownloadHTTPStatusError(
|
||||
url=collector._active_url(),
|
||||
status_code=403,
|
||||
body="GP data has not updated since your last successful download of GROUP=active.",
|
||||
)
|
||||
|
||||
async def fake_emit_business_log(*args, **kwargs):
|
||||
return None
|
||||
|
||||
monkeypatch.setattr(collector._downloader, "download_file", fake_download_file)
|
||||
monkeypatch.setattr("app.services.collectors.celestrak.FALLBACK_GROUPS", ("starlink",))
|
||||
monkeypatch.setattr("app.services.collectors.celestrak.emit_business_log", fake_emit_business_log)
|
||||
monkeypatch.setattr("app.services.collectors.celestrak.asyncio.sleep", AsyncMock())
|
||||
|
||||
with pytest.raises(RuntimeError, match="fallback group mode failed"):
|
||||
await collector.fetch()
|
||||
|
||||
assert attempts == 2
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_fetch_falls_back_to_all_groups_when_active_not_updated_without_cache(self, monkeypatch, tmp_path):
|
||||
collector = CelesTrakTLECollector()
|
||||
collector._resolved_url = "https://celestrak.example/NORAD/elements/gp.php"
|
||||
collector._downloader = ResumableFileDownloader(cache_namespace="celestrak-test", cache_root=tmp_path)
|
||||
payload_by_group = {
|
||||
"starlink": [{"NORAD_CAT_ID": 100, "OBJECT_NAME": "STARLINK-100"}],
|
||||
"gps-ops": [{"NORAD_CAT_ID": 200, "OBJECT_NAME": "GPS BIIR-2"}],
|
||||
}
|
||||
|
||||
async def fake_download_file(_client, url, **_kwargs):
|
||||
if "GROUP=active" in url:
|
||||
raise DownloadHTTPStatusError(
|
||||
url=url,
|
||||
status_code=403,
|
||||
body="GP data has not updated since your last successful download of GROUP=active.",
|
||||
)
|
||||
group = "starlink" if "GROUP=starlink" in url else "gps-ops"
|
||||
path = tmp_path / f"{group}.json"
|
||||
path.write_text(json.dumps(payload_by_group[group]), encoding="utf-8")
|
||||
return path
|
||||
|
||||
async def fake_emit_business_log(*args, **kwargs):
|
||||
return None
|
||||
|
||||
monkeypatch.setattr(collector._downloader, "download_file", fake_download_file)
|
||||
monkeypatch.setattr("app.services.collectors.celestrak.FALLBACK_GROUPS", tuple(payload_by_group))
|
||||
monkeypatch.setattr("app.services.collectors.celestrak.emit_business_log", fake_emit_business_log)
|
||||
|
||||
records = await collector.fetch()
|
||||
|
||||
assert [item["NORAD_CAT_ID"] for item in records] == [100, 200]
|
||||
assert records[0]["_celestrak_query_group"] == "starlink"
|
||||
assert records[1]["_celestrak_group"] == "gps-ops"
|
||||
|
||||
|
||||
def test_aisstream_collector_is_registered():
|
||||
collector = collector_registry.get("aisstream_vessels")
|
||||
|
||||
Reference in New Issue
Block a user