fix: 给StubGenerationTaskRepository补list_by_user_filtered和count_by_user_filtered方法

修复integration test失败:AttributeError: 'StubGenerationTaskRepository' object has no attribute 'list_by_user_filtered'

task_center.py新增了按状态筛选的列表接口,调用了repository的list_by_user_filtered和count_by_user_filtered方法,
但测试中的StubGenerationTaskRepository没有实现这两个方法。
This commit is contained in:
CI Bot
2026-07-14 10:12:29 +08:00
parent 241760ef39
commit 9968e9c33a
5 changed files with 145 additions and 0 deletions
+32
View File
@@ -139,6 +139,38 @@ class StubGenerationTaskRepository:
return [t for t in self._tasks.values() if getattr(t, "source_edit_plan_id", "") == plan_id]
def list_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
limit: int | None = None,
offset: int = 0,
) -> list:
"""按用户+状态筛选任务列表(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
# 按创建时间倒序
items.sort(key=lambda t: t.created_at or "", reverse=True)
if offset:
items = items[offset:]
if limit is not None:
items = items[:limit]
return items
def count_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
) -> int:
"""按用户+状态筛选计数(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
return len(items)
class StubGeneratedVideoRepository:
def __init__(self, videos: dict[str, GeneratedVideo] | None = None):
self._videos = videos or {}
+32
View File
@@ -104,6 +104,38 @@ class StubGenerationTaskRepository:
return [t for t in self._tasks.values() if getattr(t, "source_edit_plan_id", "") == plan_id]
def list_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
limit: int | None = None,
offset: int = 0,
) -> list:
"""按用户+状态筛选任务列表(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
# 按创建时间倒序
items.sort(key=lambda t: t.created_at or "", reverse=True)
if offset:
items = items[offset:]
if limit is not None:
items = items[:limit]
return items
def count_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
) -> int:
"""按用户+状态筛选计数(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
return len(items)
class StubIngestJobRepository:
def __init__(self, jobs: dict[str, IngestJob] | None = None):
self._jobs = jobs or {}
@@ -198,6 +198,39 @@ class StubGenerationTaskRepository:
@dataclass
def list_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
limit: int | None = None,
offset: int = 0,
) -> list:
"""按用户+状态筛选任务列表(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
# 按创建时间倒序
items.sort(key=lambda t: t.created_at or "", reverse=True)
if offset:
items = items[offset:]
if limit is not None:
items = items[:limit]
return items
def count_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
) -> int:
"""按用户+状态筛选计数(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
return len(items)
class FakeUser:
id: str = "user-001"
email: str = "test@example.com"
+32
View File
@@ -223,6 +223,38 @@ def _make_service():
# ===========================================================================
def list_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
limit: int | None = None,
offset: int = 0,
) -> list:
"""按用户+状态筛选任务列表(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
# 按创建时间倒序
items.sort(key=lambda t: t.created_at or "", reverse=True)
if offset:
items = items[offset:]
if limit is not None:
items = items[:limit]
return items
def count_by_user_filtered(
self,
user_id: str,
*,
status: str | None = None,
) -> int:
"""按用户+状态筛选计数(stub实现)。"""
items = [t for t in self._tasks.values() if t.created_by_user_id == user_id]
if status:
items = [t for t in items if str(t.status) == status]
return len(items)
class TestEditPlanServiceCRUD:
"""计划 CRUD 测试"""
@@ -65,6 +65,22 @@ class StubGenerationTaskRepository:
return 0
def list_by_user_filtered(self, user_id, *, status=None, limit=None, offset=0):
items = [t for t in self._tasks.values() if getattr(t, 'created_by_user_id', None) == user_id]
if status:
items = [t for t in items if getattr(t, 'status', None) == status]
if offset:
items = items[offset:]
if limit is not None:
items = items[:limit]
return items
def count_by_user_filtered(self, user_id, *, status=None):
items = [t for t in self._tasks.values() if getattr(t, 'created_by_user_id', None) == user_id]
if status:
items = [t for t in items if getattr(t, 'status', None) == status]
return len(items)
class StubGeneratedVideoRepository:
def __init__(self, videos=None):
self._videos = videos or {}