"""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]