13a1070fbc
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 14s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m23s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m33s
AI Code Review / AI Code Review (pull_request) Successful in 1m24s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m25s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m40s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m29s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m23s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m19s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m17s
CI/CD Pipeline / CI Gate (pull_request) Successful in 23s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m0s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1169h8m37s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 1169h8m38s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1169h8m38s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1169h8m40s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1169h8m42s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1169h9m27s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1169h9m29s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1169h12m33s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 1169h12m59s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 1169h13m13s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1169h19m49s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1169h19m51s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1169h19m53s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1169h41m42s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1169h42m29s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1169h46m12s
135 lines
4.5 KiB
Python
Executable File
135 lines
4.5 KiB
Python
Executable File
"""EditTemplateVersion 单元测试."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import 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(timezone.utc)
|
|
v = EditTemplateVersion.create("t1", 1)
|
|
after = datetime.now(timezone.utc)
|
|
assert before <= v.created_at <= after
|
|
|
|
|
|
class TestEditTemplateVersionConstruction:
|
|
"""直接构造测试."""
|
|
|
|
def test_direct_construction(self):
|
|
now = datetime(2026, 1, 1, tzinfo=timezone.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=timezone.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=timezone.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=timezone.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
|