Files
xiaoxia-saas/tests/unit/test_ffmpeg_utils.py
T

80 lines
2.6 KiB
Python
Executable File

"""FFmpeg Utils 单元测试"""
from __future__ import annotations
import subprocess
import pytest
from packages.shared.ffmpeg_utils import (
FFMPEG_BIN,
FFPROBE_BIN,
DEFAULT_FFMPEG_TIMEOUT,
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