mirror of
https://github.com/home-assistant/core.git
synced 2025-11-09 19:09:32 +00:00
168 lines
5.4 KiB
Python
168 lines
5.4 KiB
Python
"""iNELS switch platform testing."""
|
|
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from homeassistant.components.switch import (
|
|
DOMAIN as SWITCH_DOMAIN,
|
|
SERVICE_TURN_OFF,
|
|
SERVICE_TURN_ON,
|
|
)
|
|
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, STATE_UNAVAILABLE
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from .common import MAC_ADDRESS, UNIQUE_ID, get_entity_id
|
|
|
|
DT_07 = "07"
|
|
DT_100 = "100"
|
|
DT_BITS = "bits"
|
|
|
|
|
|
@pytest.fixture(params=["simple_relay", "relay", "bit"])
|
|
def entity_config(request: pytest.FixtureRequest):
|
|
"""Fixture to provide parameterized entity configuration for switch tests."""
|
|
configs = {
|
|
"simple_relay": {
|
|
"entity_type": "switch",
|
|
"device_type": "simple_relay",
|
|
"dev_type": DT_07,
|
|
"unique_id": UNIQUE_ID,
|
|
"gw_connected_topic": f"inels/connected/{MAC_ADDRESS}/gw",
|
|
"connected_topic": f"inels/connected/{MAC_ADDRESS}/{DT_07}/{UNIQUE_ID}",
|
|
"status_topic": f"inels/status/{MAC_ADDRESS}/{DT_07}/{UNIQUE_ID}",
|
|
"base_topic": f"{MAC_ADDRESS}/{DT_07}/{UNIQUE_ID}",
|
|
"switch_on_value": "07\n01\n92\n09\n",
|
|
"switch_off_value": "07\n00\n92\n09\n",
|
|
},
|
|
"relay": {
|
|
"entity_type": "switch",
|
|
"device_type": "relay",
|
|
"dev_type": DT_100,
|
|
"unique_id": UNIQUE_ID,
|
|
"gw_connected_topic": f"inels/connected/{MAC_ADDRESS}/gw",
|
|
"connected_topic": f"inels/connected/{MAC_ADDRESS}/{DT_100}/{UNIQUE_ID}",
|
|
"status_topic": f"inels/status/{MAC_ADDRESS}/{DT_100}/{UNIQUE_ID}",
|
|
"base_topic": f"{MAC_ADDRESS}/{DT_100}/{UNIQUE_ID}",
|
|
"switch_on_value": "07\n00\n0A\n28\n00\n",
|
|
"switch_off_value": "06\n00\n0A\n28\n00\n",
|
|
"alerts": {
|
|
"overflow": "06\n00\n0A\n28\n01\n",
|
|
},
|
|
},
|
|
"bit": {
|
|
"entity_type": "switch",
|
|
"device_type": "bit",
|
|
"dev_type": DT_BITS,
|
|
"unique_id": UNIQUE_ID,
|
|
"gw_connected_topic": f"inels/connected/{MAC_ADDRESS}/gw",
|
|
"connected_topic": f"inels/connected/{MAC_ADDRESS}/{DT_BITS}/{UNIQUE_ID}",
|
|
"status_topic": f"inels/status/{MAC_ADDRESS}/{DT_BITS}/{UNIQUE_ID}",
|
|
"base_topic": f"{MAC_ADDRESS}/{DT_BITS}/{UNIQUE_ID}",
|
|
"switch_on_value": b'{"state":{"000":1,"001":1}}',
|
|
"switch_off_value": b'{"state":{"000":0,"001":0}}',
|
|
},
|
|
}
|
|
return configs[request.param]
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"entity_config", ["simple_relay", "relay", "bit"], indirect=True
|
|
)
|
|
@pytest.mark.parametrize(
|
|
("gw_available", "device_available", "expected_state"),
|
|
[
|
|
(True, False, STATE_UNAVAILABLE),
|
|
(False, True, STATE_UNAVAILABLE),
|
|
(True, True, STATE_ON),
|
|
],
|
|
)
|
|
async def test_switch_availability(
|
|
hass: HomeAssistant,
|
|
setup_entity,
|
|
entity_config,
|
|
gw_available,
|
|
device_available,
|
|
expected_state,
|
|
) -> None:
|
|
"""Test switch availability and state under different gateway and device availability conditions."""
|
|
|
|
switch_state = await setup_entity(
|
|
entity_config,
|
|
status_value=entity_config["switch_on_value"],
|
|
gw_available=gw_available,
|
|
device_available=device_available,
|
|
index=0 if entity_config["device_type"] == "bit" else None,
|
|
)
|
|
|
|
assert switch_state is not None
|
|
assert switch_state.state == expected_state
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("entity_config", "index"),
|
|
[
|
|
("simple_relay", None),
|
|
("relay", None),
|
|
("bit", 0),
|
|
],
|
|
indirect=["entity_config"],
|
|
)
|
|
async def test_switch_turn_on(
|
|
hass: HomeAssistant, setup_entity, entity_config, index
|
|
) -> None:
|
|
"""Test turning on a switch."""
|
|
switch_state = await setup_entity(
|
|
entity_config, status_value=entity_config["switch_off_value"], index=index
|
|
)
|
|
|
|
assert switch_state is not None
|
|
assert switch_state.state == STATE_OFF
|
|
|
|
with patch("inelsmqtt.devices.Device.set_ha_value") as mock_set_state:
|
|
await hass.services.async_call(
|
|
SWITCH_DOMAIN,
|
|
SERVICE_TURN_ON,
|
|
{ATTR_ENTITY_ID: get_entity_id(entity_config, index)},
|
|
blocking=True,
|
|
)
|
|
await hass.async_block_till_done()
|
|
mock_set_state.assert_called_once()
|
|
|
|
ha_value = mock_set_state.call_args.args[0]
|
|
assert getattr(ha_value, entity_config["device_type"])[0].is_on is True
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("entity_config", "index"),
|
|
[
|
|
("simple_relay", None),
|
|
("relay", None),
|
|
("bit", 0),
|
|
],
|
|
indirect=["entity_config"],
|
|
)
|
|
async def test_switch_turn_off(
|
|
hass: HomeAssistant, setup_entity, entity_config, index
|
|
) -> None:
|
|
"""Test turning off a switch."""
|
|
switch_state = await setup_entity(
|
|
entity_config, status_value=entity_config["switch_on_value"], index=index
|
|
)
|
|
|
|
assert switch_state is not None
|
|
assert switch_state.state == STATE_ON
|
|
|
|
with patch("inelsmqtt.devices.Device.set_ha_value") as mock_set_state:
|
|
await hass.services.async_call(
|
|
SWITCH_DOMAIN,
|
|
SERVICE_TURN_OFF,
|
|
{ATTR_ENTITY_ID: get_entity_id(entity_config, index)},
|
|
blocking=True,
|
|
)
|
|
await hass.async_block_till_done()
|
|
mock_set_state.assert_called_once()
|
|
|
|
ha_value = mock_set_state.call_args.args[0]
|
|
assert getattr(ha_value, entity_config["device_type"])[0].is_on is False
|