86 lines
3.7 KiB
Python
86 lines
3.7 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
from types import SimpleNamespace
|
|
|
|
from biliup_next.core.models import Task, TaskStep, utc_now_iso
|
|
from biliup_next.modules.collection.service import CollectionService
|
|
|
|
|
|
class _FakeRegistry:
|
|
def __init__(self, provider) -> None: # type: ignore[no-untyped-def]
|
|
self.provider = provider
|
|
|
|
def get(self, provider_type: str, provider_id: str): # type: ignore[no-untyped-def]
|
|
return self.provider
|
|
|
|
|
|
class _FakeProvider:
|
|
def sync(self, task, target: str, settings: dict[str, object]) -> dict[str, object]: # type: ignore[no-untyped-def]
|
|
return {"status": "skipped", "target": target}
|
|
|
|
|
|
class _FakeRepo:
|
|
def __init__(self) -> None:
|
|
now = utc_now_iso()
|
|
self.task = Task("task-1", "local_file", "/tmp/source.mp4", "task-1", "running", now, now)
|
|
self.steps = {
|
|
"collection_a": TaskStep(None, "task-1", "collection_a", "pending", None, None, 0, None, None),
|
|
"collection_b": TaskStep(None, "task-1", "collection_b", "pending", None, None, 0, None, None),
|
|
}
|
|
self.task_status_updates: list[tuple[str, str]] = []
|
|
|
|
def get_task(self, task_id: str): # type: ignore[no-untyped-def]
|
|
return self.task if task_id == self.task.id else None
|
|
|
|
def update_step_status(self, task_id: str, step_name: str, status: str, **kwargs) -> None: # type: ignore[no-untyped-def]
|
|
step = self.steps[step_name]
|
|
self.steps[step_name] = TaskStep(
|
|
step.id,
|
|
step.task_id,
|
|
step.step_name,
|
|
status,
|
|
kwargs.get("error_code", step.error_code),
|
|
kwargs.get("error_message", step.error_message),
|
|
kwargs.get("retry_count", step.retry_count),
|
|
kwargs.get("started_at", step.started_at),
|
|
kwargs.get("finished_at", step.finished_at),
|
|
)
|
|
|
|
def list_steps(self, task_id: str) -> list[TaskStep]:
|
|
return list(self.steps.values())
|
|
|
|
def update_task_status(self, task_id: str, status: str, updated_at: str) -> None:
|
|
self.task_status_updates.append((task_id, status))
|
|
|
|
|
|
class CollectionServiceTests(unittest.TestCase):
|
|
def test_collection_a_restores_commented_status_so_collection_b_can_run(self) -> None:
|
|
repo = _FakeRepo()
|
|
service = CollectionService(_FakeRegistry(_FakeProvider()), repo) # type: ignore[arg-type]
|
|
service.cleanup = SimpleNamespace(cleanup_task_outputs=lambda task_id, settings: {}) # type: ignore[assignment]
|
|
|
|
result = service.run("task-1", "a", {"provider": "fake"})
|
|
|
|
self.assertEqual(result["status"], "skipped")
|
|
self.assertEqual(repo.steps["collection_a"].status, "succeeded")
|
|
self.assertEqual(repo.steps["collection_b"].status, "pending")
|
|
self.assertEqual(repo.task_status_updates[-1], ("task-1", "commented"))
|
|
|
|
def test_collection_b_marks_collection_synced_when_both_steps_succeeded(self) -> None:
|
|
repo = _FakeRepo()
|
|
repo.steps["collection_a"] = TaskStep(None, "task-1", "collection_a", "succeeded", None, None, 0, None, utc_now_iso())
|
|
service = CollectionService(_FakeRegistry(_FakeProvider()), repo) # type: ignore[arg-type]
|
|
service.cleanup = SimpleNamespace(cleanup_task_outputs=lambda task_id, settings: {"deleted": []}) # type: ignore[assignment]
|
|
|
|
result = service.run("task-1", "b", {"provider": "fake"})
|
|
|
|
self.assertEqual(result["status"], "skipped")
|
|
self.assertEqual(repo.steps["collection_b"].status, "succeeded")
|
|
self.assertEqual(repo.task_status_updates[-1], ("task-1", "collection_synced"))
|
|
self.assertEqual(result["cleanup"], {"deleted": []})
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|