test: 补充render_adapter缩略图单元测试,提升增量覆盖率
CI/CD Pipeline / Unit Tests (pull_request) Failing after 41s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m12s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 1m19s
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Successful in 3m17s
AI Code Review / AI Code Review (pull_request) Successful in 4m41s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1422h59m31s
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Failing after 1422h59m56s
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Failing after 1422h59m57s
CI Build & Deploy Pipeline / Deploy Production (pull_request) Failing after 1422h59m56s
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Failing after 1422h59m57s
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Failing after 1422h59m58s
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1422h59m58s
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Failing after 1423h0m0s
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Failing after 1423h0m0s
CI/CD Pipeline / Check if frontend-only change (pull_request) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Failing after 1423h32m0s
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Failing after 1423h32m2s
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Failing after 1423h32m4s

- test_thumbnail_generated_on_success: 验证渲染成功后thumbnail_url正确返回
- test_thumbnail_failure_does_not_block: 验证缩略图生成失败不阻断主流程
This commit is contained in:
CI Bot
2026-07-19 08:17:23 +08:00
parent c56f94093a
commit 0e277a042c
+88 -2
View File
@@ -308,13 +308,99 @@ class TestRenderPlan:
assert result.width == 1280
assert result.height == 720
assert result.clip_count == 2
# 缩略图URL(即使生成失败也应该是空串,不为None)
assert hasattr(result, "thumbnail_url")
@patch("video_processing.render_adapter.upload_to_oss")
@patch("video_processing.render_adapter.UnifiedRenderService")
@patch("video_processing.render_adapter.download_asset")
def test_thumbnail_generated_on_success(self, mock_download, mock_render_cls, mock_upload, tmp_path):
"""渲染成功后生成缩略图,thumbnail_url 正确返回。"""
def _fake_download(storage_key, local_path):
local_path.parent.mkdir(parents=True, exist_ok=True)
local_path.write_bytes(b"fake video")
return True
mock_download.side_effect = _fake_download
mock_render = MagicMock()
mock_render.render.return_value = MagicMock(
output_path=tmp_path / "out.mp4",
duration=5.0,
file_size=1024,
width=1280,
height=720,
)
mock_render_cls.return_value = mock_render
mock_upload.return_value = "https://oss.example.com/out.mp4"
fake_thumb = "https://oss.example.com/rendered/plan_thumb/thumbnail.jpg"
plan = FakePlan(id="plan_thumb")
clips = [_make_clip("c1", order=0, duration=5.0)]
asset_url_map = {"asset_c1.mp4": "https://test-bucket.oss.com/assets/asset_c1.mp4"}
adapter, _, _ = _make_adapter(plan=plan, clips=clips, asset_url_map=asset_url_map)
with patch(
"video_processing.thumbnail_generator.generate_and_upload_thumbnail",
return_value=fake_thumb,
):
result = adapter.render_plan(
"plan_thumb",
work_dir=tmp_path / "work",
)
assert result.success
assert result.thumbnail_url == fake_thumb
@patch("video_processing.render_adapter.upload_to_oss")
@patch("video_processing.render_adapter.UnifiedRenderService")
@patch("video_processing.render_adapter.download_asset")
def test_thumbnail_failure_does_not_block(self, mock_download, mock_render_cls, mock_upload, tmp_path):
"""缩略图生成失败不影响主流程,thumbnail_url 为空串。"""
def _fake_download(storage_key, local_path):
local_path.parent.mkdir(parents=True, exist_ok=True)
local_path.write_bytes(b"fake video")
return True
mock_download.side_effect = _fake_download
mock_render = MagicMock()
mock_render.render.return_value = MagicMock(
output_path=tmp_path / "out.mp4",
duration=5.0,
file_size=1024,
width=1280,
height=720,
)
mock_render_cls.return_value = mock_render
mock_upload.return_value = "https://oss.example.com/out.mp4"
plan = FakePlan(id="plan_thumb_fail")
clips = [_make_clip("c1", order=0, duration=5.0)]
asset_url_map = {"asset_c1.mp4": "https://test-bucket.oss.com/assets/asset_c1.mp4"}
adapter, _, _ = _make_adapter(plan=plan, clips=clips, asset_url_map=asset_url_map)
with patch(
"video_processing.thumbnail_generator.generate_and_upload_thumbnail",
side_effect=RuntimeError("cv2 not available"),
):
result = adapter.render_plan(
"plan_thumb_fail",
work_dir=tmp_path / "work",
)
assert result.success # 不阻断
assert result.thumbnail_url == ""
# 验证 UnifiedRenderService 被正确调用
mock_render_cls.assert_called_once()
call_kwargs = mock_render_cls.call_args
assert call_kwargs.kwargs["plan"] is plan
assert len(call_kwargs.kwargs["clips"]) == 2
assert len(call_kwargs.kwargs["asset_path_map"]) == 2
assert len(call_kwargs.kwargs["clips"]) == 1
assert len(call_kwargs.kwargs["asset_path_map"]) == 1
@patch("video_processing.render_adapter.upload_to_oss")
@patch("video_processing.render_adapter.UnifiedRenderService")