"""FFmpeg Utils 单元测试""" from __future__ import annotations import subprocess import pytest from packages.shared.ffmpeg_utils import ( DEFAULT_FFMPEG_TIMEOUT, FFMPEG_BIN, FFPROBE_BIN, run_ffmpeg, ) class TestFFmpegConstants: """常量测试""" def test_ffmpeg_bin_is_string(self): """FFMPEG_BIN 是字符串""" assert isinstance(FFMPEG_BIN, str) assert len(FFMPEG_BIN) > 0 def test_ffprobe_bin_is_string(self): """FFPROBE_BIN 是字符串""" assert isinstance(FFPROBE_BIN, str) assert len(FFPROBE_BIN) > 0 def test_default_timeout_value(self): """默认超时 30 分钟""" assert DEFAULT_FFMPEG_TIMEOUT == 1800 class TestRunFFmpeg: """run_ffmpeg 函数测试""" def test_run_ffmpeg_version(self): """执行 ffmpeg -version 成功""" stdout, stderr = run_ffmpeg([FFMPEG_BIN, "-version"]) # ffmpeg version 信息通常在 stdout 或 stderr 中 output = stdout + stderr assert "ffmpeg" in output.lower() or "version" in output.lower() def test_run_ffmpeg_capture_output_true(self): """capture_output=True 时返回字符串""" stdout, stderr = run_ffmpeg([FFMPEG_BIN, "-version"]) assert isinstance(stdout, str) assert isinstance(stderr, str) def test_run_ffmpeg_invalid_command_raises(self): """无效命令抛出 CalledProcessError""" with pytest.raises(subprocess.CalledProcessError): run_ffmpeg([FFMPEG_BIN, "-invalid_flag_xyz"]) def test_run_ffmpeg_empty_command(self): """空命令列表抛出异常""" with pytest.raises((FileNotFoundError, subprocess.CalledProcessError, IndexError)): run_ffmpeg([]) def test_run_ffmpeg_custom_timeout(self): """自定义超时参数""" # 用一个肯定不会超时的快速命令验证 timeout 参数能传入 stdout, stderr = run_ffmpeg([FFMPEG_BIN, "-version"], timeout=30) assert isinstance(stdout, str) def test_run_ffmpeg_timeout_expired(self): """超时触发 TimeoutExpired""" # 用 sleep 模拟超时,但 ffmpeg 没有 sleep 功能 # 用一个会 hang 的命令(指定读取不存在的流) # 实际上不好模拟,跳过具体超时测试,只验证类型 import subprocess as sp assert hasattr(sp, "TimeoutExpired") def test_run_ffmpeg_returns_tuple(self): """返回值是二元组""" result = run_ffmpeg([FFMPEG_BIN, "-version"]) assert isinstance(result, tuple) assert len(result) == 2