256 lines
8.9 KiB
Python
256 lines
8.9 KiB
Python
"""
|
||
测试转码路由
|
||
"""
|
||
import pytest
|
||
from pathlib import Path
|
||
import tempfile
|
||
import os
|
||
import sys
|
||
|
||
project_root = Path(__file__).parent.parent.absolute()
|
||
sys.path.insert(0, str(project_root))
|
||
os.chdir(project_root)
|
||
|
||
from main import create_app
|
||
|
||
|
||
class TestConvertRoute:
|
||
"""测试视频转码路由"""
|
||
|
||
def test_convert_missing_path_parameter(self):
|
||
"""测试缺少 path 参数时返回错误"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert')
|
||
assert response.status_code == 400
|
||
data = response.get_json()
|
||
assert data['status'] == 'error'
|
||
assert 'path' in data['message']
|
||
|
||
def test_convert_with_empty_path(self):
|
||
"""测试 path 为空时返回错误"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=')
|
||
assert response.status_code == 400
|
||
data = response.get_json()
|
||
assert data['status'] == 'error'
|
||
|
||
def test_convert_file_not_found(self, temp_dirs):
|
||
"""测试文件不存在时返回 404"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
app.config['INPUT_DIR'] = str(temp_dirs['input'])
|
||
app.config['OUTPUT_DIR'] = str(temp_dirs['output'])
|
||
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=nonexistent.mp4')
|
||
assert response.status_code == 404
|
||
data = response.get_json()
|
||
assert data['status'] == 'error'
|
||
assert '不存在' in data['message']
|
||
|
||
def test_convert_response_format(self, temp_dirs):
|
||
"""测试转码响应格式"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
app.config['INPUT_DIR'] = str(temp_dirs['input'])
|
||
app.config['OUTPUT_DIR'] = str(temp_dirs['output'])
|
||
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=test.mp4')
|
||
# 文件不存在时返回 404
|
||
assert response.status_code in [200, 404, 500]
|
||
data = response.get_json()
|
||
assert 'status' in data
|
||
assert 'message' in data
|
||
|
||
|
||
class TestGetVidUrlRoute:
|
||
"""测试获取视频 URL 路由"""
|
||
|
||
def test_getvidurl_missing_path_parameter(self):
|
||
"""测试缺少 path 参数时返回错误"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/getVidUrl')
|
||
assert response.status_code == 404
|
||
data = response.get_json()
|
||
assert data['status'] == 'error'
|
||
|
||
def test_getvidurl_with_empty_path(self):
|
||
"""测试 path 为空时返回错误"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/getVidUrl?path=')
|
||
# Path('') 在布尔检查中为 True,但后续检查会返回 404
|
||
assert response.status_code == 404
|
||
data = response.get_json()
|
||
assert data['status'] == 'error'
|
||
|
||
def test_getvidurl_video_not_found(self, temp_dirs):
|
||
"""测试视频不存在时返回 404"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
app.config['OUTPUT_DIR'] = str(temp_dirs['output'])
|
||
|
||
# 创建转码输出目录
|
||
transcode_dir = Path(temp_dirs['output']) / 'vid_h264'
|
||
transcode_dir.mkdir(parents=True, exist_ok=True)
|
||
|
||
with app.test_client() as client:
|
||
response = client.get('/api/getVidUrl?path=nonexistent.mp4')
|
||
assert response.status_code == 404
|
||
data = response.get_json()
|
||
assert data['status'] == 'error'
|
||
|
||
def test_getvidurl_with_valid_video(self, temp_dirs):
|
||
"""测试获取存在的视频 URL"""
|
||
# 使用 conftest 的 app fixture
|
||
from flask import Flask
|
||
import tempfile
|
||
|
||
# 创建临时输出目录
|
||
temp_output = tempfile.mkdtemp()
|
||
app = Flask(__name__)
|
||
app.config['TESTING'] = True
|
||
app.config['OUTPUT_DIR'] = temp_output
|
||
|
||
# 注册转码路由
|
||
from app.transcode.routes import register_transcode_routes
|
||
register_transcode_routes(app)
|
||
|
||
# 创建模拟转码视频文件
|
||
transcode_dir = Path(temp_output) / 'vid_h264'
|
||
transcode_dir.mkdir(parents=True, exist_ok=True)
|
||
video_file = transcode_dir / 'test_h264.mp4'
|
||
video_file.touch()
|
||
|
||
with app.test_client() as client:
|
||
response = client.get('/api/getVidUrl?path=test.mp4')
|
||
assert response.status_code == 200
|
||
data = response.get_json()
|
||
assert data['status'] == 'success'
|
||
assert 'data' in data
|
||
assert 'url' in data['data']
|
||
assert 'test_h264.mp4' in data['data']['url']
|
||
assert 'localhost:8086' in data['data']['url']
|
||
|
||
|
||
class TestTranscodeCore:
|
||
"""测试转码核心功能"""
|
||
|
||
def test_transcode_core_import(self):
|
||
"""测试转码核心模块可以导入"""
|
||
from app.transcode.core import convert_to_h264
|
||
assert convert_to_h264 is not None
|
||
|
||
def test_convert_to_h264_file_not_found(self, temp_dirs):
|
||
"""测试文件不存在时抛出异常"""
|
||
from app.transcode.core import convert_to_h264
|
||
|
||
with pytest.raises(FileNotFoundError):
|
||
convert_to_h264(
|
||
input_root=temp_dirs['input'],
|
||
vid_full_name='nonexistent.mp4',
|
||
output_root=temp_dirs['output']
|
||
)
|
||
|
||
def test_convert_to_h264_output_path_format(self, temp_dirs):
|
||
"""测试输出路径格式"""
|
||
from app.transcode.core import convert_to_h264
|
||
|
||
# 创建一个假的输入文件
|
||
input_file = temp_dirs['input'] / 'test.mp4'
|
||
input_file.touch()
|
||
|
||
# 由于需要 ffmpeg,这里只测试路径处理逻辑
|
||
# 实际转码会失败,但可以验证路径处理
|
||
try:
|
||
output_path = convert_to_h264(
|
||
input_root=temp_dirs['input'],
|
||
vid_full_name='test.mp4',
|
||
output_root=temp_dirs['output']
|
||
)
|
||
# 如果成功,验证输出路径格式
|
||
assert 'test_h264.mp4' in output_path
|
||
except Exception as e:
|
||
# 预期可能因为 ffmpeg 问题失败
|
||
assert 'ffmpeg' in str(e).lower() or 'returncode' in str(e).lower()
|
||
|
||
|
||
class TestTranscodeOutputDirectory:
|
||
"""测试转码输出目录"""
|
||
|
||
def test_transcode_output_dir_created(self, temp_dirs):
|
||
"""测试转码输出目录自动创建"""
|
||
from flask import Flask
|
||
|
||
# 创建新 app 并配置 OUTPUT_DIR
|
||
app = Flask(__name__)
|
||
app.config['TESTING'] = True
|
||
app.config['OUTPUT_DIR'] = str(temp_dirs['output'])
|
||
|
||
# 触发路由注册以创建输出目录
|
||
from app.transcode.routes import register_transcode_routes
|
||
register_transcode_routes(app)
|
||
|
||
transcode_dir = Path(temp_dirs['output']) / 'vid_h264'
|
||
assert transcode_dir.exists()
|
||
assert transcode_dir.is_dir()
|
||
|
||
def test_transcode_output_dir_with_main_app(self):
|
||
"""测试主应用创建时输出目录也会创建"""
|
||
# 使用 create_app 会自动注册路由并创建输出目录
|
||
app = create_app()
|
||
|
||
# 验证路由已注册
|
||
rules = [rule.rule for rule in app.url_map.iter_rules()]
|
||
assert '/api/convert' in rules
|
||
assert '/api/getVidUrl' in rules
|
||
|
||
|
||
class TestVideoFormats:
|
||
"""测试支持的视频格式"""
|
||
|
||
def test_mp4_format(self):
|
||
"""测试 MP4 格式支持"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=test.mp4')
|
||
# 文件不存在,但路由应该能处理
|
||
assert response.status_code in [404, 500]
|
||
|
||
def test_avi_format(self):
|
||
"""测试 AVI 格式支持"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=test.avi')
|
||
assert response.status_code in [404, 500]
|
||
|
||
def test_mkv_format(self):
|
||
"""测试 MKV 格式支持"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=test.mkv')
|
||
assert response.status_code in [404, 500]
|
||
|
||
def test_mov_format(self):
|
||
"""测试 MOV 格式支持"""
|
||
app = create_app()
|
||
app.config['TESTING'] = True
|
||
with app.test_client() as client:
|
||
response = client.get('/api/convert?path=test.mov')
|
||
assert response.status_code in [404, 500]
|
||
|
||
|
||
if __name__ == '__main__':
|
||
pytest.main([__file__, '-v'])
|