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