Files
intercept/tests/test_signalid_sigidwiki_api.py

100 lines
3.4 KiB
Python

"""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'