phase 1
This commit is contained in:
0
tests/detect/__init__.py
Normal file
0
tests/detect/__init__.py
Normal file
114
tests/detect/test_sse_contract.py
Normal file
114
tests/detect/test_sse_contract.py
Normal file
@@ -0,0 +1,114 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user