diff --git a/tests/components/voice_assistant/snapshots/test_websocket.ambr b/tests/components/voice_assistant/snapshots/test_websocket.ambr index 07934df6c4c693e0b90ab859935b65b23ce52567..c18af44b21cf7513476ec56256e09e4193a237a4 100644 --- a/tests/components/voice_assistant/snapshots/test_websocket.ambr +++ b/tests/components/voice_assistant/snapshots/test_websocket.ambr @@ -66,7 +66,7 @@ dict({ 'tts_output': dict({ 'mime_type': 'audio/mpeg', - 'url': '/api/tts_proxy/dae2cdcb27a1d1c3b07ba2c7db91480f9d4bfd8f_en_-_demo.mp3', + 'url': '/api/tts_proxy/dae2cdcb27a1d1c3b07ba2c7db91480f9d4bfd8f_en_-_test.mp3', }), }) # --- diff --git a/tests/components/voice_assistant/test_websocket.py b/tests/components/voice_assistant/test_websocket.py index f02122a3e7fad1f6a43925a18e6712b45e0b513f..149d896dcf6b8509f1fe9067f41261c254f7d1cb 100644 --- a/tests/components/voice_assistant/test_websocket.py +++ b/tests/components/voice_assistant/test_websocket.py @@ -1,15 +1,18 @@ """Websocket tests for Voice Assistant integration.""" import asyncio from collections.abc import AsyncIterable +from typing import Any from unittest.mock import MagicMock, patch import pytest from syrupy.assertion import SnapshotAssertion -from homeassistant.components import stt +from homeassistant.components import stt, tts from homeassistant.core import HomeAssistant +from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.setup import async_setup_component +from tests.common import MockModule, mock_integration, mock_platform from tests.components.tts.conftest import ( # noqa: F401, pylint: disable=unused-import mock_get_cache_files, mock_init_cache_dir, @@ -64,6 +67,61 @@ class MockSttProvider(stt.Provider): return stt.SpeechResult(self.text, stt.SpeechResultState.SUCCESS) +class MockSTT: + """A mock STT platform.""" + + async def async_get_engine( + self, + hass: HomeAssistant, + config: ConfigType, + discovery_info: DiscoveryInfoType | None = None, + ) -> tts.Provider: + """Set up a mock speech component.""" + return MockSttProvider(hass, _TRANSCRIPT) + + +class MockTTSProvider(tts.Provider): + """Mock TTS provider.""" + + name = "Test" + + @property + def default_language(self) -> str: + """Return the default language.""" + return "en" + + @property + def supported_languages(self) -> list[str]: + """Return list of supported languages.""" + return ["en"] + + @property + def supported_options(self) -> list[str]: + """Return list of supported options like voice, emotions.""" + return ["voice", "age"] + + def get_tts_audio( + self, message: str, language: str, options: dict[str, Any] | None = None + ) -> tts.TtsAudioType: + """Load TTS dat.""" + return ("mp3", b"") + + +class MockTTS: + """A mock TTS platform.""" + + PLATFORM_SCHEMA = tts.PLATFORM_SCHEMA + + async def async_get_engine( + self, + hass: HomeAssistant, + config: ConfigType, + discovery_info: DiscoveryInfoType | None = None, + ) -> tts.Provider: + """Set up a mock speech component.""" + return MockTTSProvider() + + @pytest.fixture(autouse=True) async def init_components( hass: HomeAssistant, @@ -71,29 +129,15 @@ async def init_components( mock_init_cache_dir, # noqa: F811 ): """Initialize relevant components with empty configs.""" - assert await async_setup_component(hass, "media_source", {}) - assert await async_setup_component( - hass, - "tts", - { - "tts": { - "platform": "demo", - } - }, - ) - assert await async_setup_component(hass, "stt", {}) - - # mock_platform fails because it can't import - hass.data[stt.DOMAIN] = {"test": MockSttProvider(hass, _TRANSCRIPT)} + mock_integration(hass, MockModule(domain="test")) + mock_platform(hass, "test.tts", MockTTS()) + mock_platform(hass, "test.stt", MockSTT()) + assert await async_setup_component(hass, tts.DOMAIN, {"tts": {"platform": "test"}}) + assert await async_setup_component(hass, stt.DOMAIN, {"stt": {"platform": "test"}}) + assert await async_setup_component(hass, "media_source", {}) assert await async_setup_component(hass, "voice_assistant", {}) - with patch( - "homeassistant.components.demo.tts.DemoProvider.get_tts_audio", - return_value=("mp3", b""), - ) as mock_get_tts: - yield mock_get_tts - async def test_text_only_pipeline( hass: HomeAssistant,