Add test cases for Tradfri switch platform (#64156)

* Add tests for the switch platform

* Fix typo

* Typos
pull/64165/head
Patrik Lindgren 2022-01-15 12:27:42 +01:00 committed by GitHub
parent 66f1ac025d
commit c2181aa5fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 161 additions and 0 deletions

View File

@ -43,6 +43,7 @@ class TradfriSwitch(TradfriBaseDevice, SwitchEntity):
"""Initialize a switch."""
super().__init__(device, api, gateway_id)
self._attr_unique_id = f"{gateway_id}-{device.id}"
self._refresh(device, write_ha=False)
def _refresh(self, device: Command, write_ha: bool = True) -> None:
"""Refresh the switch data."""

View File

@ -0,0 +1,160 @@
"""Tradfri switch (recognised as sockets in the IKEA ecosystem) platform tests."""
from unittest.mock import MagicMock, Mock, PropertyMock, patch
import pytest
from pytradfri.device import Device
from pytradfri.device.socket import Socket
from pytradfri.device.socket_control import SocketControl
from .common import setup_integration
@pytest.fixture(autouse=True, scope="module")
def setup(request):
"""Set up patches for pytradfri methods."""
with patch(
"pytradfri.device.SocketControl.raw",
new_callable=PropertyMock,
return_value=[{"mock": "mock"}],
), patch(
"pytradfri.device.SocketControl.sockets",
):
yield
def mock_switch(test_features=None, test_state=None, device_number=0):
"""Mock a tradfri switch/socket."""
if test_features is None:
test_features = {}
if test_state is None:
test_state = {}
mock_switch_data = Mock(**test_state)
dev_info_mock = MagicMock()
dev_info_mock.manufacturer = "manufacturer"
dev_info_mock.model_number = "model"
dev_info_mock.firmware_version = "1.2.3"
_mock_switch = Mock(
id=f"mock-switch-id-{device_number}",
reachable=True,
observe=Mock(),
device_info=dev_info_mock,
has_light_control=False,
has_socket_control=True,
has_blind_control=False,
has_signal_repeater_control=False,
has_air_purifier_control=False,
)
_mock_switch.name = f"tradfri_switch_{device_number}"
socket_control = SocketControl(_mock_switch)
# Store the initial state.
setattr(socket_control, "sockets", [mock_switch_data])
_mock_switch.socket_control = socket_control
return _mock_switch
async def test_switch(hass, mock_gateway, mock_api_factory):
"""Test that switches are correctly added."""
state = {
"state": True,
}
mock_gateway.mock_devices.append(mock_switch(test_state=state))
await setup_integration(hass)
switch_1 = hass.states.get("switch.tradfri_switch_0")
assert switch_1 is not None
assert switch_1.state == "on"
async def test_switch_observed(hass, mock_gateway, mock_api_factory):
"""Test that switches are correctly observed."""
state = {
"state": True,
}
switch = mock_switch(test_state=state)
mock_gateway.mock_devices.append(switch)
await setup_integration(hass)
assert len(switch.observe.mock_calls) > 0
async def test_switch_available(hass, mock_gateway, mock_api_factory):
"""Test switch available property."""
switch = mock_switch(test_state={"state": True}, device_number=1)
switch.reachable = True
switch2 = mock_switch(test_state={"state": True}, device_number=2)
switch2.reachable = False
mock_gateway.mock_devices.append(switch)
mock_gateway.mock_devices.append(switch2)
await setup_integration(hass)
assert hass.states.get("switch.tradfri_switch_1").state == "on"
assert hass.states.get("switch.tradfri_switch_2").state == "unavailable"
@pytest.mark.parametrize(
"test_data, expected_result",
[
(
"turn_on",
"on",
),
("turn_off", "off"),
],
)
async def test_turn_on_off(
hass,
mock_gateway,
mock_api_factory,
test_data,
expected_result,
):
"""Test turning switch on/off."""
# Note pytradfri style, not hass. Values not really important.
initial_state = {
"state": True,
}
# Setup the gateway with a mock switch.
switch = mock_switch(test_state=initial_state, device_number=0)
mock_gateway.mock_devices.append(switch)
await setup_integration(hass)
# Use the turn_on/turn_off service call to change the switch state.
await hass.services.async_call(
"switch",
test_data,
{
"entity_id": "switch.tradfri_switch_0",
},
blocking=True,
)
await hass.async_block_till_done()
# Check that the switch is observed.
mock_func = switch.observe
assert len(mock_func.mock_calls) > 0
_, callkwargs = mock_func.call_args
assert "callback" in callkwargs
# Callback function to refresh switch state.
callback = callkwargs["callback"]
responses = mock_gateway.mock_responses
mock_gateway_response = responses[0]
# Use the callback function to update the switch state.
dev = Device(mock_gateway_response)
switch_data = Socket(dev, 0)
switch.socket_control.sockets[0] = switch_data
callback(switch)
await hass.async_block_till_done()
# Check that the state is correct.
state = hass.states.get("switch.tradfri_switch_0")
assert state.state == expected_result