mirror of
https://github.com/home-assistant/core.git
synced 2026-04-02 16:36:08 +01:00
Co-authored-by: Tao Jiang <tao.jiang@linkplay.com> Co-authored-by: Erik Montnemery <erik@montnemery.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Paulus Schoutsen <balloob@gmail.com> Co-authored-by: Joostlek <joostlek@outlook.com>
172 lines
5.9 KiB
Python
172 lines
5.9 KiB
Python
"""Pytest fixtures and shared setup for the WiiM integration tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Generator
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
|
import pytest
|
|
from wiim.consts import AudioOutputHwMode, InputMode, LoopMode, PlayingStatus
|
|
from wiim.controller import WiimController
|
|
from wiim.models import (
|
|
WiimGroupRole,
|
|
WiimGroupSnapshot,
|
|
WiimLoopState,
|
|
WiimProbeResult,
|
|
WiimQueueSnapshot,
|
|
WiimRepeatMode,
|
|
WiimTransportCapabilities,
|
|
)
|
|
|
|
from homeassistant.components.wiim import DOMAIN
|
|
from homeassistant.const import CONF_HOST
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_setup_entry() -> Generator[AsyncMock]:
|
|
"""Mock setting up a config entry."""
|
|
with patch(
|
|
"homeassistant.components.wiim.async_setup_entry", return_value=True
|
|
) as mock_setup:
|
|
yield mock_setup
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_config_entry() -> MockConfigEntry:
|
|
"""Mock Home Assistant ConfigEntry."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
data={CONF_HOST: "192.168.1.100"},
|
|
title="Test WiiM Device",
|
|
unique_id="uuid:test-udn-1234",
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_wiim_device() -> Generator[AsyncMock]:
|
|
"""Patch async_create_wiim_device and return the mocked WiimDevice instance."""
|
|
with patch(
|
|
"homeassistant.components.wiim.async_create_wiim_device",
|
|
autospec=True,
|
|
) as mock_create:
|
|
mock = mock_create.return_value
|
|
mock.udn = "uuid:test-udn-1234"
|
|
mock.name = "Test WiiM Device"
|
|
mock.model_name = "WiiM Pro"
|
|
mock.manufacturer = "Linkplay Tech"
|
|
mock.firmware_version = "4.8.523456"
|
|
mock.ip_address = "192.168.1.100"
|
|
mock.http_api_url = "http://192.168.1.100:8080"
|
|
mock.presentation_url = "http://192.168.1.100:8080/web_interface"
|
|
mock.available = True
|
|
mock.model = "WiiM Pro"
|
|
mock.volume = 50
|
|
mock.is_muted = False
|
|
mock.supports_http_api = False
|
|
mock.playing_status = PlayingStatus.STOPPED
|
|
mock.loop_mode = LoopMode.SHUFFLE_DISABLE_REPEAT_NONE
|
|
mock.loop_state = WiimLoopState(
|
|
repeat=WiimRepeatMode.OFF,
|
|
shuffle=False,
|
|
)
|
|
mock.input_mode = InputMode.LINE_IN
|
|
mock.audio_output_hw_mode = AudioOutputHwMode.SPEAKER_OUT.display_name # type: ignore[attr-defined]
|
|
mock.mac_address = "AA:BB:CC:DD:EE:FF"
|
|
mock.current_track_info = {}
|
|
mock.current_media = None
|
|
mock.current_track_duration = 0
|
|
mock.play_mode = "Network"
|
|
mock.equalizer_mode = ""
|
|
mock.current_position = 0
|
|
mock.next_track_uri = ""
|
|
mock.event_data = {}
|
|
mock.general_event_callback = None
|
|
mock.av_transport_event_callback = None
|
|
mock.rendering_control_event_callback = None
|
|
mock.play_queue_event_callback = None
|
|
mock.output_mode = "speaker"
|
|
mock.supported_input_modes = (InputMode.LINE_IN.display_name,) # type: ignore[attr-defined]
|
|
mock.supported_output_modes = (
|
|
AudioOutputHwMode.SPEAKER_OUT.display_name, # type: ignore[attr-defined]
|
|
)
|
|
|
|
upnp_device = MagicMock()
|
|
upnp_device.udn = mock.udn
|
|
upnp_device.friendly_name = mock.name
|
|
upnp_device.model_name = mock.model_name
|
|
upnp_device.manufacturer = mock.manufacturer
|
|
upnp_device.serial_number = "TESTSERIAL123"
|
|
upnp_device.presentation_url = mock.presentation_url
|
|
upnp_device.get_device_info = MagicMock(
|
|
return_value={
|
|
"udn": mock.udn,
|
|
"friendly_name": mock.name,
|
|
"model_name": mock.model_name,
|
|
"manufacturer": mock.manufacturer,
|
|
"serial_number": upnp_device.serial_number,
|
|
}
|
|
)
|
|
mock.upnp_device = upnp_device
|
|
|
|
mock.get_audio_output_hw_mode = AsyncMock(return_value="speaker")
|
|
mock.async_get_play_queue = AsyncMock(return_value=[])
|
|
mock.async_get_audio_output_modes = AsyncMock(return_value=[])
|
|
mock.async_get_input_modes = AsyncMock(return_value=[])
|
|
mock.async_get_play_mediums = AsyncMock(return_value=[])
|
|
mock.async_get_transport_capabilities = AsyncMock(
|
|
return_value=WiimTransportCapabilities(
|
|
can_next=False,
|
|
can_previous=False,
|
|
can_repeat=False,
|
|
can_shuffle=False,
|
|
)
|
|
)
|
|
mock.async_get_presets = AsyncMock(return_value=())
|
|
mock.async_get_queue_snapshot = AsyncMock(
|
|
return_value=WiimQueueSnapshot(items=())
|
|
)
|
|
mock.build_loop_mode = MagicMock(
|
|
return_value=LoopMode.SHUFFLE_DISABLE_REPEAT_NONE
|
|
)
|
|
|
|
yield mock
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_wiim_controller(mock_wiim_device: AsyncMock) -> Generator[MagicMock]:
|
|
"""Mock a WiimController instance."""
|
|
mock = MagicMock(spec=WiimController)
|
|
mock.add_device = AsyncMock()
|
|
mock.disconnect = AsyncMock()
|
|
mock.remove_device = AsyncMock()
|
|
mock.async_update_all_multiroom_status = AsyncMock()
|
|
mock.get_group_snapshot.return_value = WiimGroupSnapshot(
|
|
role=WiimGroupRole.STANDALONE,
|
|
leader_udn=mock_wiim_device.udn,
|
|
member_udns=(mock_wiim_device.udn,),
|
|
)
|
|
mock.get_device.side_effect = lambda _udn: mock_wiim_device
|
|
with patch(
|
|
"homeassistant.components.wiim.WiimController",
|
|
return_value=mock,
|
|
):
|
|
yield mock
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_probe_player() -> Generator[AsyncMock]:
|
|
"""Mock a WiimProbePlayer instance."""
|
|
with patch(
|
|
"homeassistant.components.wiim.config_flow.async_probe_wiim_device"
|
|
) as mock_probe:
|
|
mock_probe.return_value = WiimProbeResult(
|
|
host="192.168.1.100",
|
|
udn="uuid:test-udn-1234",
|
|
name="WiiM Pro",
|
|
location="http://192.168.1.100:49152/description.xml",
|
|
model="WiiM Pro",
|
|
)
|
|
yield mock_probe
|