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:
@@ -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 {}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
Reference in New Issue
Block a user