Files
xiaoxia-saas/tests/unit/domain/test_generation_task.py
T
CI Bot 05d75db0cf
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3m5s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m13s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m20s
AI Code Review / AI Code Review (pull_request) Successful in 3m54s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m57s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m10s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m14s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m11s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 6m1s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
chore: 删除素材选取 random 模式
- generation_tasks.py: 删除 import random、if mode==random 分支、docstring 中 random 描述
- generation_task.py schema: description 移除 random=随机选取,count 描述仅保留 smart
- 选取入口条件 in ("random","smart") 改为 in ("smart",)
- test_asset_select_mode.py: 删除 TestSelectAssetsRandomMode 类(3个用例)
- domain/test_generation_task.py + test_wave77_generation_task.py: random→smart

不改:_calc_random_start_time(片段级随机)、smart_match.py、前端
2026-08-29 17:54:15 +08:00

209 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""generation_task 单测.
domain 层生成任务实体纯逻辑模块,0 外部依赖。
覆盖:枚举、create工厂/校验、列表拷贝。
"""
from __future__ import annotations
from packages.domain.generation_task import GenerationTask, GenerationTaskStatus
class TestGenerationTaskStatus:
"""GenerationTaskStatus 枚举测试."""
def test_five_statuses(self):
"""五种状态."""
assert len(GenerationTaskStatus) == 5
def test_pending(self):
assert GenerationTaskStatus.PENDING == "pending"
def test_running(self):
assert GenerationTaskStatus.RUNNING == "running"
def test_completed(self):
assert GenerationTaskStatus.COMPLETED == "completed"
def test_failed(self):
assert GenerationTaskStatus.FAILED == "failed"
def test_cancelled(self):
assert GenerationTaskStatus.CANCELLED == "cancelled"
class TestGenerationTaskCreate:
"""GenerationTask.create 工厂测试."""
def test_create_minimal(self):
"""最简创建(project_id + asset_library_id."""
task = GenerationTask.create(project_id="proj1", asset_library_id="lib1")
assert task.project_id == "proj1"
assert task.asset_library_id == "lib1"
assert task.status == GenerationTaskStatus.PENDING
assert task.progress == 0.0
assert task.result_count == 0
assert task.error_message == ""
assert task.asset_ids == []
assert task.title_ids == []
assert task.voice_ids == []
assert isinstance(task.id, str)
assert len(task.id) > 0
def test_create_with_all_fields(self):
"""带全部字段创建."""
task = GenerationTask.create(
project_id=" proj1 ",
asset_library_id=" lib1 ",
strategy_id=" strat1 ",
voice_library_id=" vlib1 ",
template_id=" tpl1 ",
asset_ids=["a1", "a2", "a3"],
title_ids=["t1", "t2"],
voice_ids=["v1"],
created_by_user_id=" user1 ",
source_edit_plan_id=" plan1 ",
asset_select_mode="smart",
batch_id="batch1",
)
assert task.project_id == "proj1"
assert task.asset_library_id == "lib1"
assert task.strategy_id == "strat1"
assert task.voice_library_id == "vlib1"
assert task.template_id == "tpl1"
assert task.asset_ids == ["a1", "a2", "a3"]
assert task.title_ids == ["t1", "t2"]
assert task.voice_ids == ["v1"]
assert task.created_by_user_id == "user1"
assert task.source_edit_plan_id == "plan1"
assert task.asset_select_mode == "smart"
assert task.batch_id == "batch1"
def test_create_with_template_instead_of_project(self):
"""有 template_id 但 project_id 为空也可以."""
task = GenerationTask.create(
project_id="",
asset_library_id="lib1",
template_id="tpl1",
)
assert task.template_id == "tpl1"
assert task.project_id == ""
def test_create_neither_project_nor_template(self):
"""project_id 和 template_id 都为空,抛错."""
try:
GenerationTask.create(project_id="", asset_library_id="lib1")
assert False
except ValueError as e:
assert "project_id" in str(e) and "template_id" in str(e)
def test_create_whitespace_project_and_template(self):
"""都是空白也抛错."""
try:
GenerationTask.create(project_id=" ", asset_library_id="lib1", template_id=" ")
assert False
except ValueError as e:
assert "project_id" in str(e) and "template_id" in str(e)
def test_create_no_asset_library_and_no_ids(self):
"""asset_library_id 为空且没有素材列表,抛错."""
try:
GenerationTask.create(project_id="p1", asset_library_id="")
assert False
except ValueError as e:
assert "asset_library_id" in str(e)
def test_create_whitespace_asset_library_and_no_ids(self):
"""空白 asset_library 且无素材列表,抛错."""
try:
GenerationTask.create(project_id="p1", asset_library_id=" ")
assert False
except ValueError as e:
assert "asset_library_id" in str(e)
def test_create_with_asset_ids_instead_of_library(self):
"""用 asset_ids 替代 asset_library_id."""
task = GenerationTask.create(
project_id="p1",
asset_library_id="",
asset_ids=["a1", "a2"],
)
assert task.asset_library_id == ""
assert task.asset_ids == ["a1", "a2"]
def test_create_with_title_ids_instead_of_library(self):
"""用 title_ids 替代 asset_library_id."""
task = GenerationTask.create(
project_id="p1",
asset_library_id="",
title_ids=["t1"],
)
assert task.title_ids == ["t1"]
def test_create_with_voice_ids_instead_of_library(self):
"""用 voice_ids 替代 asset_library_id."""
task = GenerationTask.create(
project_id="p1",
asset_library_id="",
voice_ids=["v1"],
)
assert task.voice_ids == ["v1"]
def test_create_asset_ids_copied(self):
"""asset_ids 是拷贝不是引用."""
original = ["a1", "a2"]
task = GenerationTask.create(project_id="p1", asset_library_id="lib1", asset_ids=original)
original.append("a3")
assert task.asset_ids == ["a1", "a2"]
def test_create_title_ids_copied(self):
"""title_ids 是拷贝不是引用."""
original = ["t1"]
task = GenerationTask.create(project_id="p1", asset_library_id="lib1", title_ids=original)
original.append("t2")
assert task.title_ids == ["t1"]
def test_create_voice_ids_copied(self):
"""voice_ids 是拷贝不是引用."""
original = ["v1"]
task = GenerationTask.create(project_id="p1", asset_library_id="lib1", voice_ids=original)
original.append("v2")
assert task.voice_ids == ["v1"]
def test_create_none_lists_default_empty(self):
"""None 列表默认为空."""
task = GenerationTask.create(
project_id="p1",
asset_library_id="lib1",
asset_ids=None,
title_ids=None,
voice_ids=None,
)
assert task.asset_ids == []
assert task.title_ids == []
assert task.voice_ids == []
def test_create_unique_id(self):
"""不同任务 id 不同."""
t1 = GenerationTask.create("p", "l")
t2 = GenerationTask.create("p", "l")
assert t1.id != t2.id
def test_create_has_created_at(self):
"""有创建时间."""
task = GenerationTask.create("p", "l")
assert task.created_at is not None
def test_create_defaults_started_completed_none(self):
"""started_at 和 completed_at 默认 None."""
task = GenerationTask.create("p", "l")
assert task.started_at is None
assert task.completed_at is None
def test_empty_lists_independent(self):
"""不同任务的空列表互不影响."""
t1 = GenerationTask.create("p", "l")
t2 = GenerationTask.create("p", "l")
t1.asset_ids.append("x")
assert t2.asset_ids == []