Files
core/tests/components/inels/test_switch.py
2025-10-23 16:55:29 +02:00

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