core/tests/components/switcher_kis/test_init.py

137 lines
4.7 KiB
Python

"""Test cases for the switcher_kis component."""
from datetime import timedelta
import pytest
from homeassistant.components.switcher_kis.const import DOMAIN, MAX_UPDATE_INTERVAL_SEC
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import STATE_UNAVAILABLE
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util, slugify
from . import init_integration
from .consts import DUMMY_DEVICE_ID1, DUMMY_DEVICE_ID4, DUMMY_SWITCHER_DEVICES
from tests.common import async_fire_time_changed
from tests.typing import WebSocketGenerator
async def test_update_fail(
hass: HomeAssistant, mock_bridge, caplog: pytest.LogCaptureFixture
) -> None:
"""Test entities state unavailable when updates fail.."""
entry = await init_integration(hass)
assert mock_bridge
mock_bridge.mock_callbacks(DUMMY_SWITCHER_DEVICES)
await hass.async_block_till_done()
assert mock_bridge.is_running is True
assert len(entry.runtime_data) == 2
async_fire_time_changed(
hass, dt_util.utcnow() + timedelta(seconds=MAX_UPDATE_INTERVAL_SEC + 1)
)
await hass.async_block_till_done()
for device in DUMMY_SWITCHER_DEVICES:
assert (
f"Device {device.name} did not send update for {MAX_UPDATE_INTERVAL_SEC} seconds"
in caplog.text
)
entity_id = f"switch.{slugify(device.name)}"
state = hass.states.get(entity_id)
assert state.state == STATE_UNAVAILABLE
entity_id = f"sensor.{slugify(device.name)}_power"
state = hass.states.get(entity_id)
assert state.state == STATE_UNAVAILABLE
mock_bridge.mock_callbacks(DUMMY_SWITCHER_DEVICES)
await hass.async_block_till_done()
async_fire_time_changed(
hass, dt_util.utcnow() + timedelta(seconds=MAX_UPDATE_INTERVAL_SEC - 2)
)
await hass.async_block_till_done()
for device in DUMMY_SWITCHER_DEVICES:
entity_id = f"switch.{slugify(device.name)}"
state = hass.states.get(entity_id)
assert state.state != STATE_UNAVAILABLE
entity_id = f"sensor.{slugify(device.name)}_power"
state = hass.states.get(entity_id)
assert state.state != STATE_UNAVAILABLE
async def test_entry_unload(hass: HomeAssistant, mock_bridge) -> None:
"""Test entry unload."""
entry = await init_integration(hass)
assert mock_bridge
assert entry.state is ConfigEntryState.LOADED
assert mock_bridge.is_running is True
await hass.config_entries.async_unload(entry.entry_id)
await hass.async_block_till_done()
assert entry.state is ConfigEntryState.NOT_LOADED
assert mock_bridge.is_running is False
async def test_remove_device(
hass: HomeAssistant, mock_bridge, hass_ws_client: WebSocketGenerator
) -> None:
"""Test being able to remove a disconnected device."""
assert await async_setup_component(hass, "config", {})
entry = await init_integration(hass)
entry_id = entry.entry_id
assert mock_bridge
mock_bridge.mock_callbacks(DUMMY_SWITCHER_DEVICES)
await hass.async_block_till_done()
assert mock_bridge.is_running is True
assert len(entry.runtime_data) == 2
device_registry = dr.async_get(hass)
live_device_id = DUMMY_DEVICE_ID1
dead_device_id = DUMMY_DEVICE_ID4
assert len(dr.async_entries_for_config_entry(device_registry, entry_id)) == 2
# Create a dead device
device_registry.async_get_or_create(
config_entry_id=entry.entry_id,
identifiers={(DOMAIN, dead_device_id)},
manufacturer="Switcher",
model="Switcher Model",
name="Switcher Device",
)
await hass.async_block_till_done()
assert len(dr.async_entries_for_config_entry(device_registry, entry_id)) == 3
# Try to remove a live device - fails
device = device_registry.async_get_device(identifiers={(DOMAIN, live_device_id)})
client = await hass_ws_client(hass)
response = await client.remove_device(device.id, entry_id)
assert not response["success"]
assert len(dr.async_entries_for_config_entry(device_registry, entry_id)) == 3
assert (
device_registry.async_get_device(identifiers={(DOMAIN, live_device_id)})
is not None
)
# Try to remove a dead device - succeeds
device = device_registry.async_get_device(identifiers={(DOMAIN, dead_device_id)})
response = await client.remove_device(device.id, entry_id)
assert response["success"]
assert len(dr.async_entries_for_config_entry(device_registry, entry_id)) == 2
assert (
device_registry.async_get_device(identifiers={(DOMAIN, dead_device_id)}) is None
)