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
Co-authored-by: CI Bot <dev@xiaoxiajianji.com> Co-committed-by: CI Bot <dev@xiaoxiajianji.com>
167 lines
4.9 KiB
Python
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
|