From 0e277a042cf16c03d7fb74c05f8ccc5119b5e77e Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sun, 19 Jul 2026 08:17:23 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=85render=5Fadapter?= =?UTF-8?q?=E7=BC=A9=E7=95=A5=E5=9B=BE=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E5=A2=9E=E9=87=8F=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - test_thumbnail_generated_on_success: 验证渲染成功后thumbnail_url正确返回 - test_thumbnail_failure_does_not_block: 验证缩略图生成失败不阻断主流程 --- tests/unit/test_render_adapter.py | 90 ++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) mode change 100755 => 100644 tests/unit/test_render_adapter.py diff --git a/tests/unit/test_render_adapter.py b/tests/unit/test_render_adapter.py old mode 100755 new mode 100644 index efb920d79..f4645e851 --- a/tests/unit/test_render_adapter.py +++ b/tests/unit/test_render_adapter.py @@ -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")