mirror of
https://github.com/home-assistant/core.git
synced 2026-04-02 08:26:41 +01:00
147 lines
4.2 KiB
Python
147 lines
4.2 KiB
Python
"""Tests for the MyNeomitis select component."""
|
|
|
|
from unittest.mock import AsyncMock
|
|
|
|
from syrupy.assertion import SnapshotAssertion
|
|
|
|
from homeassistant.const import ATTR_ENTITY_ID
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from tests.common import MockConfigEntry, snapshot_platform
|
|
|
|
RELAIS_DEVICE = {
|
|
"_id": "relais1",
|
|
"name": "Relais Device",
|
|
"model": "EWS",
|
|
"state": {"relayMode": 1, "targetMode": 2},
|
|
"connected": True,
|
|
"program": {"data": {}},
|
|
}
|
|
|
|
PILOTE_DEVICE = {
|
|
"_id": "pilote1",
|
|
"name": "Pilote Device",
|
|
"model": "EWS",
|
|
"state": {"targetMode": 1},
|
|
"connected": True,
|
|
"program": {"data": {}},
|
|
}
|
|
|
|
UFH_DEVICE = {
|
|
"_id": "ufh1",
|
|
"name": "UFH Device",
|
|
"model": "UFH",
|
|
"state": {"changeOverUser": 0},
|
|
"connected": True,
|
|
"program": {"data": {}},
|
|
}
|
|
|
|
|
|
async def test_entities(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_pyaxenco_client: AsyncMock,
|
|
snapshot: SnapshotAssertion,
|
|
entity_registry: er.EntityRegistry,
|
|
) -> None:
|
|
"""Test all select entities are created for supported devices."""
|
|
mock_pyaxenco_client.get_devices.return_value = [
|
|
RELAIS_DEVICE,
|
|
PILOTE_DEVICE,
|
|
UFH_DEVICE,
|
|
{
|
|
"_id": "unsupported",
|
|
"name": "Unsupported Device",
|
|
"model": "UNKNOWN",
|
|
"state": {},
|
|
"connected": True,
|
|
"program": {"data": {}},
|
|
},
|
|
]
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
|
|
|
|
|
|
async def test_select_option(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_pyaxenco_client: AsyncMock,
|
|
) -> None:
|
|
"""Test that selecting an option propagates to the library correctly."""
|
|
mock_pyaxenco_client.get_devices.return_value = [RELAIS_DEVICE]
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
await hass.services.async_call(
|
|
"select",
|
|
"select_option",
|
|
{ATTR_ENTITY_ID: "select.relais_device", "option": "on"},
|
|
blocking=True,
|
|
)
|
|
|
|
mock_pyaxenco_client.set_device_mode.assert_awaited_once_with("relais1", 1)
|
|
|
|
state = hass.states.get("select.relais_device")
|
|
assert state is not None
|
|
assert state.state == "on"
|
|
|
|
|
|
async def test_websocket_state_update(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_pyaxenco_client: AsyncMock,
|
|
) -> None:
|
|
"""Test that entity updates when source data changes via WebSocket."""
|
|
mock_pyaxenco_client.get_devices.return_value = [RELAIS_DEVICE]
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get("select.relais_device")
|
|
assert state is not None
|
|
assert state.state == "off"
|
|
|
|
mock_pyaxenco_client.register_listener.assert_called_once()
|
|
callback = mock_pyaxenco_client.register_listener.call_args[0][1]
|
|
|
|
callback({"targetMode": 1})
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get("select.relais_device")
|
|
assert state is not None
|
|
assert state.state == "on"
|
|
|
|
|
|
async def test_device_becomes_unavailable(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_pyaxenco_client: AsyncMock,
|
|
) -> None:
|
|
"""Test that entity becomes unavailable when device connection is lost."""
|
|
mock_pyaxenco_client.get_devices.return_value = [RELAIS_DEVICE]
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get("select.relais_device")
|
|
assert state is not None
|
|
assert state.state == "off"
|
|
|
|
callback = mock_pyaxenco_client.register_listener.call_args[0][1]
|
|
|
|
callback({"connected": False})
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get("select.relais_device")
|
|
assert state is not None
|
|
assert state.state == "unavailable"
|