Files
xiaoxia-saas/tests/unit/test_preset_voices_domain.py
xiaoxia abc3fbea1b
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Build Staging Web Image (push) Successful in 34s
CI/CD Pipeline / Frontend Lint (push) Successful in 1m35s
CI/CD Pipeline / Build Staging API Image (push) Successful in 2m14s
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 2m23s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 2m25s
CI/CD Pipeline / Unit Tests (push) Successful in 2m42s
CI/CD Pipeline / Integration Tests (push) Successful in 1m4s
CI/CD Pipeline / Build Staging Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
test(unit): P3-1 第五波 新增3个领域模块单元测试(54个用例) (#683)
Co-authored-by: CI Bot <dev@xiaoxiajianji.com>
Co-committed-by: CI Bot <dev@xiaoxiajianji.com>
2026-07-21 19:47:24 +08:00

167 lines
4.9 KiB
Python

"""
PresetVoice 预置音色领域模型单元测试
"""
import pytest
from domain.preset_voices import (
PRESET_VOICES,
PresetVoice,
get_preset_voice_by_id,
get_preset_voices,
is_preset_voice,
)
class TestPresetVoice:
"""PresetVoice 数据类测试"""
def test_create_required_fields(self):
v = PresetVoice(
voice_id="test_v1",
name="测试音色",
description="测试描述",
gender="female",
)
assert v.voice_id == "test_v1"
assert v.name == "测试音色"
assert v.description == "测试描述"
assert v.gender == "female"
def test_default_language(self):
v = PresetVoice(voice_id="v1", name="n", description="d", gender="female")
assert v.language == "zh-CN"
def test_default_preview_url(self):
v = PresetVoice(voice_id="v1", name="n", description="d", gender="female")
assert v.preview_url == ""
def test_default_tags_none(self):
v = PresetVoice(voice_id="v1", name="n", description="d", gender="female")
assert v.tags is None
def test_custom_tags(self):
v = PresetVoice(
voice_id="v1",
name="n",
description="d",
gender="female",
tags=["温柔", "女声"],
)
assert v.tags == ["温柔", "女声"]
def test_is_frozen(self):
v = PresetVoice(voice_id="v1", name="n", description="d", gender="female")
with pytest.raises(AttributeError):
v.name = "改了"
class TestPresetVoiceToDict:
"""to_dict 序列化测试"""
def test_to_dict_basic(self):
v = PresetVoice(
voice_id="longxiaochun_v3",
name="龙小淳",
description="温柔女声",
gender="female",
language="zh-CN",
preview_url="https://example.com/audio.mp3",
tags=["温柔", "女声"],
)
d = v.to_dict()
assert d["voice_id"] == "longxiaochun_v3"
assert d["name"] == "龙小淳"
assert d["description"] == "温柔女声"
assert d["gender"] == "female"
assert d["language"] == "zh-CN"
assert d["preview_url"] == "https://example.com/audio.mp3"
assert d["tags"] == ["温柔", "女声"]
def test_to_dict_tags_none_becomes_empty_list(self):
v = PresetVoice(voice_id="v1", name="n", description="d", gender="female")
d = v.to_dict()
assert d["tags"] == []
class TestPresetVoiceList:
"""预置音色列表测试"""
def test_list_not_empty(self):
voices = get_preset_voices()
assert len(voices) > 0
def test_all_are_preset_voice_instances(self):
for v in PRESET_VOICES:
assert isinstance(v, PresetVoice)
def test_voice_ids_unique(self):
ids = [v.voice_id for v in PRESET_VOICES]
assert len(ids) == len(set(ids))
def test_all_have_required_fields(self):
for v in PRESET_VOICES:
assert v.voice_id
assert v.name
assert v.description
assert v.gender in ("male", "female")
assert v.language
def test_total_count(self):
assert len(PRESET_VOICES) == 8
class TestGetPresetVoiceById:
"""按 ID 查询预置音色测试"""
def test_existing_voice(self):
v = get_preset_voice_by_id("longxiaochun_v3")
assert v is not None
assert v.name == "龙小淳"
assert v.gender == "female"
def test_nonexistent_voice(self):
v = get_preset_voice_by_id("nonexistent_voice")
assert v is None
def test_empty_string(self):
v = get_preset_voice_by_id("")
assert v is None
class TestIsPresetVoice:
"""判断是否预置音色测试"""
def test_existing_is_preset(self):
assert is_preset_voice("longxiaochen_v3") is True
def test_nonexistent_not_preset(self):
assert is_preset_voice("custom_voice_123") is False
def test_empty_not_preset(self):
assert is_preset_voice("") is False
class TestPresetVoiceSamples:
"""预置音色样本验证"""
@pytest.mark.parametrize(
"voice_id,expected_name,gender",
[
("longxiaochun_v3", "龙小淳", "female"),
("longxiaoxia_v3", "龙小夏", "female"),
("longxiaochen_v3", "龙小晨", "male"),
("longyue_v3", "龙悦", "female"),
("longshu_v3", "龙书", "male"),
("longjing_v3", "龙静", "female"),
("longbo_v3", "龙博", "male"),
("longtian_v3", "龙甜", "female"),
],
)
def test_all_preset_voices_sample(self, voice_id, expected_name, gender):
v = get_preset_voice_by_id(voice_id)
assert v is not None
assert v.name == expected_name
assert v.gender == gender
assert v.language == "zh-CN"
assert len(v.tags or []) >= 2