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
138 lines
4.0 KiB
Python
Executable File
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]
|