Files
video-ai-analysis/tests/test_probe.py
2026-06-17 11:33:54 +08:00

52 lines
1.8 KiB
Python

import subprocess
import unittest
from pathlib import Path
from unittest.mock import patch
from video_ai_analysis_poc.probe import probe_video
class ProbeTests(unittest.TestCase):
def test_probe_video_returns_structured_metadata(self):
payload = (
'{"streams":[{"codec_type":"video","codec_name":"h264",'
'"width":1920,"height":1080,"avg_frame_rate":"30000/1001"}],'
'"format":{"duration":"12.5","format_name":"mov,mp4,m4a,3gp,3g2,mj2",'
'"start_time":"0.000000"}}'
)
completed = subprocess.CompletedProcess(
args=["ffprobe"],
returncode=0,
stdout=payload,
stderr="",
)
with patch("subprocess.run", return_value=completed):
result = probe_video(Path("/tmp/video.mp4"), timeout_seconds=3)
self.assertEqual(result["status"], "probed")
self.assertEqual(result["codec_name"], "h264")
self.assertEqual(result["width"], 1920)
self.assertEqual(result["height"], 1080)
self.assertAlmostEqual(result["fps"], 29.97002997)
self.assertEqual(result["duration_seconds"], 12.5)
self.assertIsNone(result["last_error"])
def test_probe_video_returns_structured_failure(self):
failure = subprocess.CalledProcessError(
returncode=1,
cmd=["ffprobe"],
stderr="Invalid data found when processing input",
)
with patch("subprocess.run", side_effect=failure):
result = probe_video(Path("/tmp/bad.mp4"), timeout_seconds=3)
self.assertEqual(result["status"], "probe_failed")
self.assertEqual(result["retry_count"], 0)
self.assertIn("Invalid data", result["last_error"])
if __name__ == "__main__":
unittest.main()