mirror of
https://github.com/smittix/intercept.git
synced 2026-06-19 02:49:45 -07:00
30450295b5
Auth fixture, /listening->/receiver waterfall rename, numeric validator returns, and float timestamp — all matching current code behaviour. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
99 lines
3.1 KiB
Python
99 lines
3.1 KiB
Python
"""Tests for the Waterfall / Spectrogram endpoints."""
|
|
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
|
|
@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_waterfall_start_no_rtl_power(auth_client):
|
|
"""Start should fail gracefully when rtl_power is not available."""
|
|
with patch("routes.listening_post.waterfall.find_rtl_power", return_value=None):
|
|
resp = auth_client.post(
|
|
"/receiver/waterfall/start",
|
|
json={
|
|
"start_freq": 88.0,
|
|
"end_freq": 108.0,
|
|
},
|
|
)
|
|
assert resp.status_code == 503
|
|
data = resp.get_json()
|
|
assert "rtl_power" in data["message"]
|
|
|
|
|
|
def test_waterfall_start_invalid_range(auth_client):
|
|
"""Start should reject end <= start."""
|
|
with patch("routes.listening_post.waterfall.find_rtl_power", return_value="/usr/bin/rtl_power"):
|
|
resp = auth_client.post(
|
|
"/receiver/waterfall/start",
|
|
json={
|
|
"start_freq": 108.0,
|
|
"end_freq": 88.0,
|
|
},
|
|
)
|
|
assert resp.status_code == 400
|
|
|
|
|
|
def test_waterfall_start_success(auth_client):
|
|
"""Start should succeed with mocked rtl_power and device."""
|
|
with (
|
|
patch("routes.listening_post.waterfall.find_rtl_power", return_value="/usr/bin/rtl_power"),
|
|
patch("routes.listening_post.waterfall.app_module") as mock_app,
|
|
):
|
|
mock_app.claim_sdr_device.return_value = None # No error, claim succeeds
|
|
resp = auth_client.post(
|
|
"/receiver/waterfall/start",
|
|
json={
|
|
"start_freq": 88.0,
|
|
"end_freq": 108.0,
|
|
"gain": 40,
|
|
"device": 0,
|
|
},
|
|
)
|
|
assert resp.status_code == 200
|
|
data = resp.get_json()
|
|
assert data["status"] == "started"
|
|
|
|
# Clean up: stop waterfall
|
|
import routes.listening_post as lp
|
|
|
|
lp.waterfall_running = False
|
|
|
|
|
|
def test_waterfall_stop(auth_client):
|
|
"""Stop should succeed."""
|
|
resp = auth_client.post("/receiver/waterfall/stop")
|
|
assert resp.status_code == 200
|
|
data = resp.get_json()
|
|
assert data["status"] == "stopped"
|
|
|
|
|
|
def test_waterfall_stream_mimetype(auth_client):
|
|
"""Stream should return event-stream content type."""
|
|
resp = auth_client.get("/receiver/waterfall/stream")
|
|
assert resp.content_type.startswith("text/event-stream")
|
|
|
|
|
|
def test_waterfall_start_device_busy(auth_client):
|
|
"""Start should fail when device is in use."""
|
|
with (
|
|
patch("routes.listening_post.waterfall.find_rtl_power", return_value="/usr/bin/rtl_power"),
|
|
patch("routes.listening_post.waterfall.app_module") as mock_app,
|
|
):
|
|
mock_app.claim_sdr_device.return_value = "SDR device 0 is in use by scanner"
|
|
resp = auth_client.post(
|
|
"/receiver/waterfall/start",
|
|
json={
|
|
"start_freq": 88.0,
|
|
"end_freq": 108.0,
|
|
},
|
|
)
|
|
assert resp.status_code == 409
|