mirror of https://github.com/home-assistant/core
224 lines
5.3 KiB
Python
224 lines
5.3 KiB
Python
"""Tests for the Broadlink integration."""
|
|
|
|
from dataclasses import dataclass
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from homeassistant.components.broadlink.const import DOMAIN
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
# Do not edit/remove. Adding is ok.
|
|
BROADLINK_DEVICES = {
|
|
"Entrance": (
|
|
"192.168.0.11",
|
|
"34ea34befc25",
|
|
"RM mini 3",
|
|
"Broadlink",
|
|
"RMMINI",
|
|
0x2737,
|
|
57,
|
|
8,
|
|
),
|
|
"Living Room": (
|
|
"192.168.0.12",
|
|
"34ea34b43b5a",
|
|
"RM mini 3",
|
|
"Broadlink",
|
|
"RMMINIB",
|
|
0x5F36,
|
|
44017,
|
|
10,
|
|
),
|
|
"Office": (
|
|
"192.168.0.13",
|
|
"34ea34b43d22",
|
|
"RM pro",
|
|
"Broadlink",
|
|
"RMPRO",
|
|
0x2787,
|
|
20025,
|
|
7,
|
|
),
|
|
"Garage": (
|
|
"192.168.0.14",
|
|
"34ea34c43f31",
|
|
"RM4 pro",
|
|
"Broadlink",
|
|
"RM4PRO",
|
|
0x6026,
|
|
52,
|
|
4,
|
|
),
|
|
"Bedroom": (
|
|
"192.168.0.15",
|
|
"34ea34b45d2c",
|
|
"e-Sensor",
|
|
"Broadlink",
|
|
"A1",
|
|
0x2714,
|
|
20025,
|
|
5,
|
|
),
|
|
"Dining room": (
|
|
"192.168.0.16",
|
|
"34ea34b4fd1c",
|
|
"SCB1E",
|
|
"Broadlink",
|
|
"SP4B",
|
|
0x5115,
|
|
57,
|
|
5,
|
|
),
|
|
"Kitchen": ( # Not supported.
|
|
"192.168.0.64",
|
|
"34ea34b61d2c",
|
|
"SB800TD",
|
|
"Broadlink",
|
|
"SB800TD",
|
|
0x504E,
|
|
57,
|
|
5,
|
|
),
|
|
"Gaming room": (
|
|
"192.168.0.65",
|
|
"34ea34b61d2d",
|
|
"MP1-1K4S",
|
|
"Broadlink",
|
|
"MP1",
|
|
0x4EB5,
|
|
57,
|
|
5,
|
|
),
|
|
"Guest room": (
|
|
"192.168.0.66",
|
|
"34ea34b61d2e",
|
|
"HY02/HY03",
|
|
"Hysen",
|
|
"HYS",
|
|
0x4EAD,
|
|
10024,
|
|
5,
|
|
),
|
|
}
|
|
|
|
|
|
@dataclass
|
|
class MockSetup:
|
|
"""Representation of a mock setup."""
|
|
|
|
api: MagicMock
|
|
entry: MockConfigEntry
|
|
factory: MagicMock
|
|
|
|
|
|
class BroadlinkDevice:
|
|
"""Representation of a Broadlink device."""
|
|
|
|
def __init__(
|
|
self,
|
|
name: str,
|
|
host: str,
|
|
mac: str,
|
|
model: str,
|
|
manufacturer: str,
|
|
type_: str,
|
|
devtype: int,
|
|
fwversion: int,
|
|
timeout: int,
|
|
) -> None:
|
|
"""Initialize the device."""
|
|
self.name = name
|
|
self.host = host
|
|
self.mac = mac
|
|
self.model = model
|
|
self.manufacturer = manufacturer
|
|
self.type = type_
|
|
self.devtype = devtype
|
|
self.timeout = timeout
|
|
self.fwversion = fwversion
|
|
|
|
async def setup_entry(
|
|
self,
|
|
hass: HomeAssistant,
|
|
mock_api: MagicMock | None = None,
|
|
mock_entry: MockConfigEntry | None = None,
|
|
) -> MockSetup:
|
|
"""Set up the device."""
|
|
mock_api = mock_api or self.get_mock_api()
|
|
mock_entry = mock_entry or self.get_mock_entry()
|
|
mock_entry.add_to_hass(hass)
|
|
|
|
with patch(
|
|
"homeassistant.components.broadlink.device.blk.gendevice",
|
|
return_value=mock_api,
|
|
) as mock_factory:
|
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
return MockSetup(mock_api, mock_entry, mock_factory)
|
|
|
|
def get_mock_api(self):
|
|
"""Return a mock device (API)."""
|
|
mock_api = MagicMock()
|
|
mock_api.name = self.name
|
|
mock_api.host = (self.host, 80)
|
|
mock_api.mac = bytes.fromhex(self.mac)
|
|
mock_api.model = self.model
|
|
mock_api.manufacturer = self.manufacturer
|
|
mock_api.type = self.type
|
|
mock_api.devtype = self.devtype
|
|
mock_api.timeout = self.timeout
|
|
mock_api.is_locked = False
|
|
mock_api.auth.return_value = True
|
|
mock_api.get_fwversion.return_value = self.fwversion
|
|
return mock_api
|
|
|
|
def get_mock_entry(self):
|
|
"""Return a mock config entry."""
|
|
return MockConfigEntry(
|
|
domain=DOMAIN,
|
|
unique_id=self.mac,
|
|
title=self.name,
|
|
data=self.get_entry_data(),
|
|
)
|
|
|
|
def get_entry_data(self):
|
|
"""Return entry data."""
|
|
return {
|
|
"host": self.host,
|
|
"mac": self.mac,
|
|
"type": self.devtype,
|
|
"timeout": self.timeout,
|
|
}
|
|
|
|
|
|
class BroadlinkMP1BG1Device(BroadlinkDevice):
|
|
"""Mock device for MP1 and BG1 with special mocking of api return values."""
|
|
|
|
def get_mock_api(self):
|
|
"""Return a mock device (API) with support for check_power calls."""
|
|
mock_api = super().get_mock_api()
|
|
mock_api.check_power.return_value = {"s1": 0, "s2": 0, "s3": 0, "s4": 0}
|
|
return mock_api
|
|
|
|
|
|
class BroadlinkSP4BDevice(BroadlinkDevice):
|
|
"""Mock device for SP4b with special mocking of api return values."""
|
|
|
|
def get_mock_api(self):
|
|
"""Return a mock device (API) with support for get_state calls."""
|
|
mock_api = super().get_mock_api()
|
|
mock_api.get_state.return_value = {"pwr": 0}
|
|
return mock_api
|
|
|
|
|
|
def get_device(name):
|
|
"""Get a device by name."""
|
|
dev_type = BROADLINK_DEVICES[name][5]
|
|
if dev_type in {0x4EB5}:
|
|
return BroadlinkMP1BG1Device(name, *BROADLINK_DEVICES[name])
|
|
if dev_type in {0x5115}:
|
|
return BroadlinkSP4BDevice(name, *BROADLINK_DEVICES[name])
|
|
return BroadlinkDevice(name, *BROADLINK_DEVICES[name])
|