115 lines
3.2 KiB
Python
115 lines
3.2 KiB
Python
"""Round-trip serialization tests for SSE contract models."""
|
|
|
|
from detect.sse_contract 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
|