Files
xiaoxia-saas/tests/unit/domain/test_template_version.py
xiaoxia 53fb25efcf
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 2s
CI/CD Pipeline / Check push changed paths (push) Successful in 19s
CI/CD Pipeline / Build Staging API Image (push) Successful in 41s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 48s
CI/CD Pipeline / Integration Tests (push) Successful in 3m10s
CI/CD Pipeline / Validate - Python (mypy + alembic) (push) Successful in 3m17s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 3m30s
CI/CD Pipeline / Validate - Style (push) Successful in 4m17s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 59s
CI/CD Pipeline / Frontend Unit Tests (push) Failing after 5m33s
CI/CD Pipeline / Validate - Security (push) Successful in 7m12s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 2m38s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m13s
CI/CD Pipeline / Unit Tests (push) Successful in 10m11s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (push) Failing after 26h14m3s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 26h24m21s
CI/CD Pipeline / Retag skipped Staging API Image (push) Failing after 26h19m47s
CI/CD Pipeline / PR Build Web Image (push) Failing after 26h23m44s
CI/CD Pipeline / PR Build API Image (push) Failing after 26h23m44s
CI/CD Pipeline / Deploy Production (push) Failing after 26h13m23s
CI/CD Pipeline / Build Production Web Image (push) Failing after 26h13m26s
CI/CD Pipeline / CI Gate (push) Failing after 26h13m25s
CI/CD Pipeline / Build Production API Image (push) Failing after 26h13m26s
CI/CD Pipeline / Canary Release to Production (push) Failing after 26h13m23s
CI/CD Pipeline / Retag skipped Staging Web Image (push) Failing after 26h19m46s
CI/CD Pipeline / Frontend Lint (push) Failing after 26h23m37s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 26h23m45s
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Failing after 26h19m46s
fix(#1834): 批量修复 UP 系列静态分析警告(UP007/UP006/UP017/UP035) (#1928)
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
2026-09-15 12:59:17 +08:00

135 lines
4.5 KiB
Python
Executable File

"""EditTemplateVersion 单元测试."""
from __future__ import annotations
from datetime import UTC, datetime, timezone
import pytest
from domain.template_version import EditTemplateVersion
class TestEditTemplateVersionCreate:
"""create() 工厂方法测试."""
def test_create_basic(self):
v = EditTemplateVersion.create("tmpl_001", 1)
assert v.id is not None
assert len(v.id) == 32
assert v.template_id == "tmpl_001"
assert v.version == 1
assert v.name == ""
assert v.editing_mode == "one_take"
assert v.config == {}
assert v.clip_configs == []
assert v.change_note == ""
assert v.published_by == ""
assert v.created_at is not None
def test_create_with_all_fields(self):
v = EditTemplateVersion.create(
"tmpl_001",
3,
name="第三版",
editing_mode="pip",
config={"bgm": True},
clip_configs=[{"id": "c1", "type": "video"}],
change_note="优化剪辑逻辑",
published_by="user_123",
)
assert v.template_id == "tmpl_001"
assert v.version == 3
assert v.name == "第三版"
assert v.editing_mode == "pip"
assert v.config == {"bgm": True}
assert v.clip_configs == [{"id": "c1", "type": "video"}]
assert v.change_note == "优化剪辑逻辑"
assert v.published_by == "user_123"
def test_create_config_none_defaults_to_empty(self):
v = EditTemplateVersion.create("t1", 1, config=None)
assert v.config == {}
def test_create_clip_configs_none_defaults_to_empty(self):
v = EditTemplateVersion.create("t1", 1, clip_configs=None)
assert v.clip_configs == []
def test_create_unique_ids(self):
v1 = EditTemplateVersion.create("t1", 1)
v2 = EditTemplateVersion.create("t1", 1)
assert v1.id != v2.id
def test_create_sets_created_at(self):
before = datetime.now(UTC)
v = EditTemplateVersion.create("t1", 1)
after = datetime.now(UTC)
assert before <= v.created_at <= after
class TestEditTemplateVersionConstruction:
"""直接构造测试."""
def test_direct_construction(self):
now = datetime(2026, 1, 1, tzinfo=UTC)
v = EditTemplateVersion(
id="v1",
template_id="t1",
version=5,
name="v5",
editing_mode="voice_over",
config={"key": "value"},
clip_configs=[{"a": 1}, {"b": 2}],
change_note="test",
published_by="admin",
created_at=now,
)
assert v.id == "v1"
assert v.template_id == "t1"
assert v.version == 5
assert v.name == "v5"
assert v.editing_mode == "voice_over"
assert v.config == {"key": "value"}
assert v.clip_configs == [{"a": 1}, {"b": 2}]
assert v.change_note == "test"
assert v.published_by == "admin"
assert v.created_at == now
def test_default_values(self):
v = EditTemplateVersion(id="v1", template_id="t1", version=1)
assert v.name == ""
assert v.editing_mode == "one_take"
assert v.config == {}
assert v.clip_configs == []
assert v.change_note == ""
assert v.published_by == ""
class TestEditTemplateVersionSlots:
"""slots 测试."""
def test_slots_no_extra_attrs(self):
v = EditTemplateVersion.create("t1", 1)
with pytest.raises((AttributeError, TypeError)):
v.new_field = "value" # type: ignore[attr-defined]
class TestEditTemplateVersionEquality:
"""相等性测试."""
def test_equal_same_id_and_version(self):
now = datetime(2026, 1, 1, tzinfo=UTC)
v1 = EditTemplateVersion(id="same", template_id="t1", version=1, created_at=now)
v2 = EditTemplateVersion(id="same", template_id="t1", version=1, created_at=now)
assert v1 == v2
def test_not_equal_different_id(self):
now = datetime(2026, 1, 1, tzinfo=UTC)
v1 = EditTemplateVersion(id="v1", template_id="t1", version=1, created_at=now)
v2 = EditTemplateVersion(id="v2", template_id="t1", version=1, created_at=now)
assert v1 != v2
def test_not_equal_different_version(self):
now = datetime(2026, 1, 1, tzinfo=UTC)
v1 = EditTemplateVersion(id="same", template_id="t1", version=1, created_at=now)
v2 = EditTemplateVersion(id="same", template_id="t1", version=2, created_at=now)
assert v1 != v2