96c8a90098
AI Code Review / AI Code Review (pull_request) Failing after 0s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 16s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 50s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 29s
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 / Validate - Migration (alembic) (pull_request) Successful in 48s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 29s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 32s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 30s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m5s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m33s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m11s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m11s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m53s
CI/CD Pipeline / Deploy Production (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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 48m10s
新增73个测试,5个小领域模块深度覆盖: - title_library_domain +15(tags/metadata独立性、零值大值、长文本、unicode、特殊字符等) - recipe_domain +22(RecipeItem边界、items顺序/数量、生成参数独立性、长名称等) - editing_mode_domain +8(from string、字符串拼接、dict key、枚举值校验等) - tag_domain +9(id唯一性/hex、slots、长名称、unicode、相等性等) - voice_library_domain +19(零值/大值/负值、tags/metadata独立性、project_id边界等)
95 lines
2.9 KiB
Python
Executable File
95 lines
2.9 KiB
Python
Executable File
"""
|
|
EditingMode 剪辑模式枚举单元测试
|
|
"""
|
|
|
|
from packages.domain.editing_mode import EditingMode
|
|
|
|
|
|
class TestEditingMode:
|
|
"""EditingMode 枚举测试"""
|
|
|
|
def test_all_modes_exist(self):
|
|
assert EditingMode.ONE_TAKE == "one_take"
|
|
assert EditingMode.PIP == "pip"
|
|
assert EditingMode.VOICE_OVER == "voice_over"
|
|
assert EditingMode.VOICE_PIP == "voice_pip"
|
|
|
|
def test_total_count(self):
|
|
assert len(EditingMode) == 4
|
|
|
|
def test_is_string_type(self):
|
|
for mode in EditingMode:
|
|
assert isinstance(mode.value, str)
|
|
assert isinstance(mode, str)
|
|
|
|
def test_mode_descriptions(self):
|
|
"""验证模式值有意义"""
|
|
assert "one" in EditingMode.ONE_TAKE
|
|
assert "pip" in EditingMode.PIP
|
|
assert "voice" in EditingMode.VOICE_OVER
|
|
assert "voice" in EditingMode.VOICE_PIP
|
|
|
|
def test_usage_in_comparison(self):
|
|
mode = EditingMode.ONE_TAKE
|
|
assert mode == "one_take"
|
|
assert mode != "pip"
|
|
|
|
def test_iterable(self):
|
|
modes = list(EditingMode)
|
|
assert len(modes) == 4
|
|
assert EditingMode.ONE_TAKE in modes
|
|
|
|
|
|
class TestEditingModeExtended:
|
|
"""EditingMode 深度补充测试"""
|
|
|
|
def test_from_string_value(self):
|
|
"""可以从字符串值构造枚举"""
|
|
assert EditingMode("one_take") == EditingMode.ONE_TAKE
|
|
assert EditingMode("pip") == EditingMode.PIP
|
|
assert EditingMode("voice_over") == EditingMode.VOICE_OVER
|
|
assert EditingMode("voice_pip") == EditingMode.VOICE_PIP
|
|
|
|
def test_invalid_string_raises(self):
|
|
import pytest
|
|
|
|
with pytest.raises(ValueError):
|
|
EditingMode("invalid_mode")
|
|
|
|
def test_string_concatenation(self):
|
|
"""StrEnum 支持字符串拼接"""
|
|
result = "mode_" + EditingMode.ONE_TAKE
|
|
assert result == "mode_one_take"
|
|
|
|
def test_dict_key_usage(self):
|
|
"""可以作为字典 key 使用"""
|
|
mapping = {
|
|
EditingMode.ONE_TAKE: "顺序拼接",
|
|
EditingMode.PIP: "画中画",
|
|
}
|
|
assert mapping[EditingMode.ONE_TAKE] == "顺序拼接"
|
|
assert mapping[EditingMode.PIP] == "画中画"
|
|
assert len(mapping) == 2
|
|
|
|
def test_value_lowercase(self):
|
|
"""所有枚举值都是小写字母+下划线"""
|
|
for mode in EditingMode:
|
|
assert mode.value == mode.value.lower()
|
|
assert " " not in mode.value
|
|
|
|
def test_unique_values(self):
|
|
"""所有枚举值唯一"""
|
|
values = [m.value for m in EditingMode]
|
|
assert len(values) == len(set(values))
|
|
|
|
def test_membership_test(self):
|
|
assert EditingMode.ONE_TAKE in EditingMode
|
|
assert "one_take" in [m.value for m in EditingMode]
|
|
|
|
def test_comparison_with_string(self):
|
|
"""和字符串直接比较"""
|
|
mode = EditingMode.VOICE_OVER
|
|
assert mode == "voice_over"
|
|
assert mode != "pip"
|
|
assert "voice_over" == mode
|