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()