"""Tests for the SigID Wiki lookup API endpoint.""" from unittest.mock import patch import pytest import routes.signalid as signalid_module @pytest.fixture def auth_client(client): """Client with logged-in session.""" with client.session_transaction() as sess: sess["logged_in"] = True return client def test_sigidwiki_lookup_missing_frequency(auth_client): """frequency_mhz is required.""" resp = auth_client.post("/signalid/sigidwiki", json={}) assert resp.status_code == 400 data = resp.get_json() assert data["status"] == "error" def test_sigidwiki_lookup_invalid_frequency(auth_client): """frequency_mhz must be numeric and positive.""" resp = auth_client.post("/signalid/sigidwiki", json={"frequency_mhz": "abc"}) assert resp.status_code == 400 resp = auth_client.post("/signalid/sigidwiki", json={"frequency_mhz": -1}) assert resp.status_code == 400 def test_sigidwiki_lookup_success(auth_client): """Endpoint returns normalized SigID lookup structure.""" signalid_module._cache.clear() fake_lookup = { "matches": [ { "title": "POCSAG", "url": "https://www.sigidwiki.com/wiki/POCSAG", "frequencies_mhz": [929.6625], "modes": ["NFM"], "modulations": ["FSK"], "distance_hz": 0, "source": "SigID Wiki", } ], "search_used": False, "exact_queries": ["[[Category:Signal]][[Frequencies::929.6625 MHz]]|?Frequencies|?Mode|?Modulation|limit=10"], } with patch("routes.signalid._lookup_sigidwiki_matches", return_value=fake_lookup) as lookup_mock: resp = auth_client.post( "/signalid/sigidwiki", json={ "frequency_mhz": 929.6625, "modulation": "fm", "limit": 5, }, ) assert lookup_mock.call_count == 1 assert resp.status_code == 200 data = resp.get_json() assert data["status"] == "ok" assert data["source"] == "sigidwiki" assert data["cached"] is False assert data["match_count"] == 1 assert data["matches"][0]["title"] == "POCSAG" def test_sigidwiki_lookup_cached_response(auth_client): """Second identical lookup should be served from cache.""" signalid_module._cache.clear() fake_lookup = { "matches": [{"title": "Test Signal", "url": "https://www.sigidwiki.com/wiki/Test_Signal"}], "search_used": True, "exact_queries": [], } payload = {"frequency_mhz": 433.92, "modulation": "nfm", "limit": 5} with patch("routes.signalid._lookup_sigidwiki_matches", return_value=fake_lookup) as lookup_mock: first = auth_client.post("/signalid/sigidwiki", json=payload) second = auth_client.post("/signalid/sigidwiki", json=payload) assert lookup_mock.call_count == 1 assert first.status_code == 200 assert second.status_code == 200 assert first.get_json()["cached"] is False assert second.get_json()["cached"] is True def test_sigidwiki_lookup_backend_failure(auth_client): """Unexpected lookup failures should return 502.""" signalid_module._cache.clear() with patch("routes.signalid._lookup_sigidwiki_matches", side_effect=RuntimeError("boom")): resp = auth_client.post("/signalid/sigidwiki", json={"frequency_mhz": 433.92}) assert resp.status_code == 502 data = resp.get_json() assert data["status"] == "error"