diff --git a/tests/unit/test_cover_url_finalize.py b/tests/unit/test_cover_url_finalize.py index 5bc28d13b..079554e36 100644 --- a/tests/unit/test_cover_url_finalize.py +++ b/tests/unit/test_cover_url_finalize.py @@ -6,9 +6,32 @@ from cover_candidates to gen_task.cover_url. from __future__ import annotations +import sys from pathlib import Path from unittest.mock import MagicMock, patch +import pytest + +# Add worker app to sys.path +_WORKER_ROOT = Path(__file__).resolve().parents[2] / "apps" / "worker" +if str(_WORKER_ROOT) not in sys.path: + sys.path.insert(0, str(_WORKER_ROOT)) + + +class FakeGenTask: + """Simple stand-in for GenerationTask that tracks attribute assignment.""" + + def __init__(self): + self.id = "task-1" + self.status = MagicMock() + self.status.value = "running" + self._assigned = {} + + def __setattr__(self, name, value): + if not name.startswith("_"): + self._assigned[name] = value + super().__setattr__(name, value) + def _make_plan(): plan = MagicMock() @@ -19,19 +42,11 @@ def _make_plan(): return plan -def _make_gen_task(): - gen_task = MagicMock() - gen_task.id = "task-1" - gen_task.status = MagicMock() - gen_task.status.value = "running" - return gen_task - - def _call_finalize(cover_candidates=None, gen_task=None, plan=None): from worker_app.tasks.edit_plan_generation import _finalize_render_success plan = plan or _make_plan() - gen_task = gen_task or _make_gen_task() + gen_task = gen_task or FakeGenTask() plan_repo = MagicMock() clip_repo = MagicMock() @@ -86,25 +101,26 @@ class TestFinalizeCoverUrl: def test_cover_url_not_set_when_empty_list(self): """Empty cover_candidates should not set cover_url""" _, gen_task, _ = _call_finalize(cover_candidates=[]) - assert not getattr(gen_task, "cover_url", None) + assert "cover_url" not in gen_task._assigned def test_cover_url_not_set_when_none(self): """None cover_candidates should not set cover_url""" _, gen_task, _ = _call_finalize(cover_candidates=None) - assert not getattr(gen_task, "cover_url", None) + assert "cover_url" not in gen_task._assigned def test_cover_url_not_set_when_url_empty(self): """Empty URL strings in candidates should not set cover_url""" candidates = [{"image_url": "", "url": ""}] _, gen_task, _ = _call_finalize(cover_candidates=candidates) - assert not getattr(gen_task, "cover_url", None) + assert "cover_url" not in gen_task._assigned def test_no_generation_task_no_crash(self): """Should not crash when gen_task is None""" candidates = [{"image_url": "https://oss.example.com/cover.jpg"}] gen_task_repo = MagicMock() gen_task_repo.get.return_value = None - _, _, _ = _call_finalize(cover_candidates=candidates) + result, _, _ = _call_finalize(cover_candidates=candidates) + assert result["status"] == "completed" def test_image_url_priority_over_url(self): """image_url should take priority over url key"""