Files
Shadowbroker/backend/tests/test_cctv_pipeline.py
T

80 lines
2.2 KiB
Python

"""Regression tests for CCTV ingestion and persistence."""
import threading
from services import cctv_pipeline
class DummyIngestor(cctv_pipeline.BaseCCTVIngestor):
def __init__(self, cameras):
self._cameras = cameras
def fetch_data(self):
return self._cameras
def test_ingestor_can_run_from_another_thread(tmp_path, monkeypatch):
db_path = tmp_path / "data" / "cctv.db"
monkeypatch.setattr(cctv_pipeline, "DB_PATH", db_path)
ingestor = DummyIngestor(
[
{
"id": "cam-1",
"source_agency": "Test",
"lat": 51.5,
"lon": -0.12,
"direction_facing": "North",
"media_url": "https://example.com/camera.jpg",
"refresh_rate_seconds": 30,
}
]
)
thread = threading.Thread(target=ingestor.ingest)
thread.start()
thread.join()
cameras = cctv_pipeline.get_all_cameras()
assert len(cameras) == 1
assert cameras[0]["id"] == "cam-1"
assert cameras[0]["media_type"] == "image"
def test_ingest_updates_existing_rows_in_persistent_data_dir(tmp_path, monkeypatch):
db_path = tmp_path / "persistent" / "cctv.db"
monkeypatch.setattr(cctv_pipeline, "DB_PATH", db_path)
DummyIngestor(
[
{
"id": "cam-2",
"source_agency": "Test",
"lat": 40.71,
"lon": -74.0,
"direction_facing": "East",
"media_url": "https://example.com/old.jpg",
"refresh_rate_seconds": 60,
}
]
).ingest()
DummyIngestor(
[
{
"id": "cam-2",
"source_agency": "Test",
"lat": 40.71,
"lon": -74.0,
"direction_facing": "East",
"media_url": "https://example.com/live.m3u8",
"refresh_rate_seconds": 60,
}
]
).ingest()
cameras = cctv_pipeline.get_all_cameras()
assert db_path.exists()
assert len(cameras) == 1
assert cameras[0]["media_url"] == "https://example.com/live.m3u8"
assert cameras[0]["media_type"] == "hls"