Files
xiaoxia-saas/tests/unit/test_voice_presets.py
T
xiaoxia 42335eff42
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Has been cancelled
CI/CD Pipeline / Validate - Type Check (mypy) (push) Has been cancelled
CI/CD Pipeline / Validate - Migration (alembic) (push) Has been cancelled
CI/CD Pipeline / Unit Tests (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Frontend Lint (push) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (push) Has been cancelled
CI/CD Pipeline / PR Build API Image (push) Has been cancelled
CI/CD Pipeline / PR Build Web Image (push) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (push) Has been cancelled
CI/CD Pipeline / Build Staging API Image (push) Has been cancelled
CI/CD Pipeline / Build Staging Web Image (push) Has been cancelled
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 / Build Production API Image (push) Has been cancelled
CI/CD Pipeline / Build Production Web Image (push) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (push) Has been cancelled
CI/CD Pipeline / Deploy Production (push) Has been cancelled
CI/CD Pipeline / Production Browser E2E (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
test: P3-1 第48波单元测试(tag/verification_code/subtitle/voice_presets,+59) (#836)
2026-07-24 18:58:14 +08:00

138 lines
4.0 KiB
Python
Executable File

"""voice_presets 音色预设单测."""
import pytest
from packages.domain.voice_presets import (
MOCK_VOICES,
VoiceGender,
VoicePreset,
VoiceStyle,
get_default_voice,
get_voice,
list_voices,
)
class TestVoiceGender:
def test_values(self):
assert VoiceGender.MALE.value == "male"
assert VoiceGender.FEMALE.value == "female"
assert VoiceGender.CHILD.value == "child"
def test_is_str(self):
assert isinstance(VoiceGender.FEMALE, str)
class TestVoiceStyle:
def test_values(self):
assert VoiceStyle.STABLE.value == "stable"
assert VoiceStyle.LIVELY.value == "lively"
assert VoiceStyle.NARRATION.value == "narration"
assert VoiceStyle.NEWS.value == "news"
assert VoiceStyle.STORY.value == "story"
class TestVoicePreset:
def test_default_values(self):
v = VoicePreset(voice_id="test", name="测试音色")
assert v.gender == VoiceGender.FEMALE
assert v.style == VoiceStyle.NARRATION
assert v.provider == "mock"
assert v.default_speed == 1.0
assert v.default_pitch == 0.0
assert v.sample_rate == 22050
assert v.language == "zh-CN"
def test_custom_values(self):
v = VoicePreset(
voice_id="male1",
name="男声",
gender=VoiceGender.MALE,
style=VoiceStyle.STABLE,
provider="aliyun",
default_speed=0.9,
)
assert v.gender == VoiceGender.MALE
assert v.style == VoiceStyle.STABLE
assert v.provider == "aliyun"
assert v.default_speed == 0.9
class TestMockVoices:
def test_mock_voices_not_empty(self):
assert len(MOCK_VOICES) > 0
def test_all_mock_voices_have_ids(self):
for v in MOCK_VOICES:
assert v.voice_id
assert v.name
assert v.provider == "mock"
def test_unique_voice_ids(self):
ids = [v.voice_id for v in MOCK_VOICES]
assert len(ids) == len(set(ids))
class TestGetVoice:
def test_get_existing_voice(self):
v = get_voice("female_warm")
assert v is not None
assert v.voice_id == "female_warm"
assert v.name == "温暖女声"
def test_get_nonexistent_voice(self):
v = get_voice("nonexistent")
assert v is None
def test_non_mock_provider_returns_none(self):
v = get_voice("female_warm", provider="aliyun")
assert v is None
class TestListVoices:
def test_list_all(self):
voices = list_voices()
assert len(voices) == len(MOCK_VOICES)
def test_filter_by_gender(self):
female_voices = list_voices(gender="female")
assert len(female_voices) > 0
assert all(v.gender == VoiceGender.FEMALE for v in female_voices)
def test_filter_by_style(self):
story_voices = list_voices(style="story")
assert len(story_voices) > 0
assert all(v.style == VoiceStyle.STORY for v in story_voices)
def test_filter_by_keyword_name(self):
voices = list_voices(keyword="女声")
assert len(voices) > 0
assert all("女声" in v.name for v in voices)
def test_filter_by_keyword_description(self):
voices = list_voices(keyword="商务")
assert len(voices) > 0
assert any("商务" in v.description for v in voices)
def test_filter_by_provider_non_mock(self):
voices = list_voices(provider="aliyun")
assert len(voices) == 0
def test_filter_multiple_conditions(self):
voices = list_voices(gender="female", style="narration")
assert len(voices) > 0
assert all(v.gender == VoiceGender.FEMALE for v in voices)
assert all(v.style == VoiceStyle.NARRATION for v in voices)
def test_keyword_case_insensitive(self):
voices1 = list_voices(keyword="FEMALE")
voices2 = list_voices(keyword="female")
assert len(voices1) == len(voices2)
class TestGetDefaultVoice:
def test_default_voice_exists(self):
v = get_default_voice()
assert v is not None
assert v == MOCK_VOICES[0]