Initial video AI analysis project
This commit is contained in:
135
tests/test_result_parser.py
Normal file
135
tests/test_result_parser.py
Normal file
@@ -0,0 +1,135 @@
|
||||
import unittest
|
||||
|
||||
from video_ai_analysis_poc.result_parser import build_clip_result, extract_json_payload
|
||||
|
||||
|
||||
class ResultParserTests(unittest.TestCase):
|
||||
def test_extract_json_payload_handles_markdown_and_prose(self):
|
||||
payload = extract_json_payload(
|
||||
"analysis follows\n```json\n{\"screen_time\":\"12:31:20\",\"events\":[]}\n```"
|
||||
)
|
||||
|
||||
self.assertEqual(payload, {"screen_time": "12:31:20", "events": []})
|
||||
|
||||
def test_build_clip_result_preserves_timeline_screen_time_and_events(self):
|
||||
clip_record = {
|
||||
"video_id": "video-abc",
|
||||
"clip_id": "video-abc_c000001",
|
||||
"clip_start_seconds": 120.0,
|
||||
"clip_end_seconds": 130.0,
|
||||
"clip_start_timecode": "00:02:00",
|
||||
"clip_end_timecode": "00:02:10",
|
||||
"clip_start_beijing_time": "2026-06-15 07:02:00",
|
||||
"clip_end_beijing_time": "2026-06-15 07:02:10",
|
||||
"frame_times": [
|
||||
{
|
||||
"frame_path": "frames/video-abc/000120.jpg",
|
||||
"offset_seconds": 120.0,
|
||||
"timecode": "00:02:00",
|
||||
"beijing_time": "2026-06-15 07:02:00",
|
||||
}
|
||||
],
|
||||
}
|
||||
raw_response = (
|
||||
"Here is the result: "
|
||||
"{\"画面时间\":\"2026-06-14 12:31:20\","
|
||||
"\"events\":[{\"event_type\":\"queue_detected\",\"confidence\":0.86}]}"
|
||||
)
|
||||
|
||||
result = build_clip_result(
|
||||
raw_response,
|
||||
clip_record,
|
||||
{"path": "/videos/a.mp4"},
|
||||
{
|
||||
"schema": {"version": "local-batch-v1"},
|
||||
"runtime": {"timezone": "Asia/Shanghai"},
|
||||
},
|
||||
processing={"latency_ms": 1800},
|
||||
)
|
||||
|
||||
self.assertEqual(result["schema_version"], "local-batch-v1")
|
||||
self.assertEqual(result["video_id"], "video-abc")
|
||||
self.assertEqual(result["video_path"], "/videos/a.mp4")
|
||||
self.assertEqual(result["clip_id"], "video-abc_c000001")
|
||||
self.assertEqual(result["status"], "ok")
|
||||
self.assertEqual(result["monitoring_timeline"]["timezone"], "Asia/Shanghai")
|
||||
self.assertIsNone(result["monitoring_timeline"]["video_start_time"])
|
||||
self.assertEqual(
|
||||
result["monitoring_timeline"]["clip_start_beijing_time"],
|
||||
"2026-06-15 07:02:00",
|
||||
)
|
||||
self.assertEqual(
|
||||
result["monitoring_timeline"]["clip_end_beijing_time"],
|
||||
"2026-06-15 07:02:10",
|
||||
)
|
||||
self.assertEqual(result["monitoring_timeline"]["frame_times"], clip_record["frame_times"])
|
||||
self.assertEqual(
|
||||
result["monitoring_timeline"]["screen_time"],
|
||||
"2026-06-14 12:31:20",
|
||||
)
|
||||
self.assertEqual(result["events"][0]["event_type"], "queue_detected")
|
||||
self.assertEqual(result["events"][0]["start_offset_seconds"], 120.0)
|
||||
self.assertEqual(result["events"][0]["end_offset_seconds"], 130.0)
|
||||
self.assertEqual(result["raw_response"], raw_response)
|
||||
self.assertEqual(result["processing"]["latency_ms"], 1800)
|
||||
self.assertIsNone(result["error"])
|
||||
|
||||
def test_build_clip_result_reads_zhengxin_time_key(self):
|
||||
result = build_clip_result(
|
||||
(
|
||||
'{"Action":"Action_Idle","quality_status":"qualified",'
|
||||
'"error_type":"","安全隐患":"","人物位置":"","总结":"无",'
|
||||
'"时间":"2026-06-14 12:31:20","employees":[],"guests":[]}'
|
||||
),
|
||||
{
|
||||
"video_id": "video-abc",
|
||||
"clip_id": "video-abc_c000001",
|
||||
"clip_start_seconds": 0.0,
|
||||
"clip_end_seconds": 10.0,
|
||||
"clip_start_timecode": "00:00:00",
|
||||
"clip_end_timecode": "00:00:10",
|
||||
"frame_times": [],
|
||||
},
|
||||
{"path": "/videos/a.mp4"},
|
||||
{
|
||||
"schema": {"version": "local-batch-v1"},
|
||||
"runtime": {"timezone": "Asia/Shanghai"},
|
||||
},
|
||||
processing={},
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "ok")
|
||||
self.assertEqual(
|
||||
result["monitoring_timeline"]["screen_time"],
|
||||
"2026-06-14 12:31:20",
|
||||
)
|
||||
|
||||
def test_build_clip_result_records_parse_failure_without_crashing(self):
|
||||
result = build_clip_result(
|
||||
"not json",
|
||||
{
|
||||
"video_id": "video-abc",
|
||||
"clip_id": "video-abc_c000001",
|
||||
"clip_start_seconds": 0.0,
|
||||
"clip_end_seconds": 10.0,
|
||||
"clip_start_timecode": "00:00:00",
|
||||
"clip_end_timecode": "00:00:10",
|
||||
"frame_times": [],
|
||||
},
|
||||
{"path": "/videos/a.mp4"},
|
||||
{
|
||||
"schema": {"version": "local-batch-v1"},
|
||||
"runtime": {"timezone": "Asia/Shanghai"},
|
||||
},
|
||||
processing={},
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "parse_failed")
|
||||
self.assertEqual(result["events"], [])
|
||||
self.assertEqual(result["monitoring_timeline"]["screen_time"], "")
|
||||
self.assertEqual(result["raw_response"], "not json")
|
||||
self.assertIn("JSON", result["error"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user