1
0
mirror of https://github.com/home-assistant/core.git synced 2026-04-02 16:36:08 +01:00
Files
core/tests/components/wiim/conftest.py
Linkplay2020 fa57f72f37 Add WiiM media player integration (#148948)
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>
2026-03-19 18:33:53 +01:00

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