Files
mediaproc/tests/detect/test_sse_contract.py
2026-03-30 07:22:14 -03:00

115 lines
3.2 KiB
Python

"""Round-trip serialization tests for SSE contract models."""
from core.detect.sse import (
BoundingBoxEvent,
BrandSummary,
Detection,
DetectionReportSummary,
FrameUpdate,
GraphEdge,
GraphNode,
GraphUpdate,
JobComplete,
LogEvent,
StatsUpdate,
)
def test_graph_update_roundtrip():
obj = GraphUpdate(
nodes=[
GraphNode(id="extract_frames", status="completed", items_in=100, items_out=100),
GraphNode(id="filter_scenes", status="processing", items_in=100, items_out=0),
],
edges=[GraphEdge(source="extract_frames", target="filter_scenes", throughput=50)],
active_path=["filter_scenes"],
)
data = obj.model_dump(mode="json")
restored = GraphUpdate.model_validate(data)
assert restored == obj
def test_stats_update_defaults():
obj = StatsUpdate()
data = obj.model_dump(mode="json")
assert data["frames_extracted"] == 0
assert data["estimated_cloud_cost_usd"] == 0.0
restored = StatsUpdate.model_validate(data)
assert restored == obj
def test_frame_update_with_boxes():
obj = FrameUpdate(
frame_ref=42,
timestamp=71.5,
jpeg_b64="abc123==",
boxes=[
BoundingBoxEvent(x=10, y=20, w=100, h=50, confidence=0.91, label="text_region",
resolved_brand="Adidas", source="ocr"),
],
)
data = obj.model_dump(mode="json")
restored = FrameUpdate.model_validate(data)
assert restored.boxes[0].resolved_brand == "Adidas"
def test_detection():
obj = Detection(
brand="Emirates",
timestamp=68.5,
duration=3.0,
confidence=0.93,
source="ocr",
content_type="soccer_broadcast",
)
data = obj.model_dump(mode="json")
assert data["source"] == "ocr"
assert data["bbox"] is None
restored = Detection.model_validate(data)
assert restored == obj
def test_log_event():
obj = LogEvent(
level="INFO",
stage="BrandResolver",
msg="Exact match: Emirates",
trace_id="lf-abc123",
ts="2024-03-01T12:00:01Z",
)
data = obj.model_dump(mode="json")
restored = LogEvent.model_validate(data)
assert restored.trace_id == "lf-abc123"
def test_job_complete():
obj = JobComplete(
job_id="test-123",
report=DetectionReportSummary(
video_source="match.mp4",
content_type="soccer_broadcast",
duration_seconds=5400.0,
total_detections=142,
brands=[
BrandSummary(
brand="Adidas",
total_appearances=45,
total_screen_time=120.5,
avg_confidence=0.89,
first_seen=12.0,
last_seen=5380.0,
),
],
stats=StatsUpdate(
frames_extracted=10800,
frames_after_scene_filter=3200,
regions_detected=1500,
regions_resolved_by_ocr=1200,
),
),
)
data = obj.model_dump(mode="json")
restored = JobComplete.model_validate(data)
assert restored.report.brands[0].brand == "Adidas"
assert restored.report.stats.frames_extracted == 10800