mirror of
https://github.com/elisspace/core.git
synced 2026-09-28 05:19:54 +00:00
As shown in #64868, a number of newer models don't come wiht a macAddr attributes, so for those fall back to the wireless address. This could be hidden by the python-songpal library but for now this will make it possible to have multiple modern songpal devices on the same network.
113 lines
3.1 KiB
Python
113 lines
3.1 KiB
Python
"""Test the songpal integration."""
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
|
from songpal import SongpalException
|
|
from songpal.containers import Sysinfo
|
|
|
|
from homeassistant.components.songpal.const import CONF_ENDPOINT
|
|
from homeassistant.const import CONF_NAME
|
|
|
|
FRIENDLY_NAME = "name"
|
|
ENTITY_ID = f"media_player.{FRIENDLY_NAME}"
|
|
HOST = "0.0.0.0"
|
|
ENDPOINT = f"http://{HOST}:10000/sony"
|
|
MODEL = "model"
|
|
MAC = "mac"
|
|
WIRELESS_MAC = "wmac"
|
|
SW_VERSION = "sw_ver"
|
|
|
|
CONF_DATA = {
|
|
CONF_NAME: FRIENDLY_NAME,
|
|
CONF_ENDPOINT: ENDPOINT,
|
|
}
|
|
|
|
|
|
def _create_mocked_device(throw_exception=False, wired_mac=MAC, wireless_mac=None):
|
|
mocked_device = MagicMock()
|
|
|
|
type(mocked_device).get_supported_methods = AsyncMock(
|
|
side_effect=SongpalException("Unable to do POST request: ")
|
|
if throw_exception
|
|
else None
|
|
)
|
|
|
|
interface_info = MagicMock()
|
|
interface_info.modelName = MODEL
|
|
type(mocked_device).get_interface_information = AsyncMock(
|
|
return_value=interface_info
|
|
)
|
|
|
|
sys_info = Sysinfo(
|
|
bdAddr=None,
|
|
macAddr=wired_mac,
|
|
wirelessMacAddr=wireless_mac,
|
|
bssid=None,
|
|
ssid=None,
|
|
bleID=None,
|
|
version=SW_VERSION,
|
|
)
|
|
type(mocked_device).get_system_info = AsyncMock(return_value=sys_info)
|
|
|
|
volume1 = MagicMock()
|
|
volume1.maxVolume = 100
|
|
volume1.minVolume = 0
|
|
volume1.volume = 50
|
|
volume1.is_muted = False
|
|
volume1.set_volume = AsyncMock()
|
|
volume1.set_mute = AsyncMock()
|
|
volume2 = MagicMock()
|
|
volume2.maxVolume = 100
|
|
volume2.minVolume = 0
|
|
volume2.volume = 20
|
|
volume2.is_muted = True
|
|
mocked_device.volume1 = volume1
|
|
type(mocked_device).get_volume_information = AsyncMock(
|
|
return_value=[volume1, volume2]
|
|
)
|
|
|
|
power = MagicMock()
|
|
power.status = True
|
|
type(mocked_device).get_power = AsyncMock(return_value=power)
|
|
|
|
input1 = MagicMock()
|
|
input1.title = "title1"
|
|
input1.uri = "uri1"
|
|
input1.active = False
|
|
input1.activate = AsyncMock()
|
|
mocked_device.input1 = input1
|
|
input2 = MagicMock()
|
|
input2.title = "title2"
|
|
input2.uri = "uri2"
|
|
input2.active = True
|
|
type(mocked_device).get_inputs = AsyncMock(return_value=[input1, input2])
|
|
|
|
type(mocked_device).set_power = AsyncMock()
|
|
type(mocked_device).set_sound_settings = AsyncMock()
|
|
type(mocked_device).listen_notifications = AsyncMock()
|
|
type(mocked_device).stop_listen_notifications = AsyncMock()
|
|
|
|
notification_callbacks = {}
|
|
mocked_device.notification_callbacks = notification_callbacks
|
|
|
|
def _on_notification(name, callback):
|
|
notification_callbacks[name] = callback
|
|
|
|
type(mocked_device).on_notification = MagicMock(side_effect=_on_notification)
|
|
type(mocked_device).clear_notification_callbacks = MagicMock()
|
|
|
|
return mocked_device
|
|
|
|
|
|
def _patch_config_flow_device(mocked_device):
|
|
return patch(
|
|
"homeassistant.components.songpal.config_flow.Device",
|
|
return_value=mocked_device,
|
|
)
|
|
|
|
|
|
def _patch_media_player_device(mocked_device):
|
|
return patch(
|
|
"homeassistant.components.songpal.media_player.Device",
|
|
return_value=mocked_device,
|
|
)
|