202 lines
6.4 KiB
Python
202 lines
6.4 KiB
Python
"""Test cases for the switcher_kis component."""
|
|
from datetime import timedelta
|
|
from typing import Any, Generator
|
|
from unittest.mock import patch
|
|
|
|
from aioswitcher.consts import COMMAND_ON
|
|
from aioswitcher.devices import SwitcherV2Device
|
|
from pytest import raises
|
|
|
|
from homeassistant.components.switcher_kis import (
|
|
DATA_DEVICE,
|
|
DOMAIN,
|
|
SIGNAL_SWITCHER_DEVICE_UPDATE,
|
|
)
|
|
from homeassistant.components.switcher_kis.switch import (
|
|
CONF_AUTO_OFF,
|
|
CONF_TIMER_MINUTES,
|
|
SERVICE_SET_AUTO_OFF_NAME,
|
|
SERVICE_TURN_ON_WITH_TIMER_NAME,
|
|
)
|
|
from homeassistant.const import CONF_ENTITY_ID
|
|
from homeassistant.core import Context, callback
|
|
from homeassistant.exceptions import UnknownUser
|
|
from homeassistant.helpers.config_validation import time_period_str
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
|
from homeassistant.helpers.typing import HomeAssistantType
|
|
from homeassistant.setup import async_setup_component
|
|
from homeassistant.util import dt
|
|
|
|
from .consts import (
|
|
DUMMY_AUTO_OFF_SET,
|
|
DUMMY_DEVICE_ID,
|
|
DUMMY_DEVICE_NAME,
|
|
DUMMY_DEVICE_STATE,
|
|
DUMMY_ELECTRIC_CURRENT,
|
|
DUMMY_IP_ADDRESS,
|
|
DUMMY_MAC_ADDRESS,
|
|
DUMMY_PHONE_ID,
|
|
DUMMY_POWER_CONSUMPTION,
|
|
DUMMY_REMAINING_TIME,
|
|
DUMMY_TIMER_MINUTES_SET,
|
|
MANDATORY_CONFIGURATION,
|
|
SWITCH_ENTITY_ID,
|
|
)
|
|
|
|
from tests.common import MockUser, async_fire_time_changed
|
|
|
|
|
|
async def test_failed_config(
|
|
hass: HomeAssistantType, mock_failed_bridge: Generator[None, Any, None]
|
|
) -> None:
|
|
"""Test failed configuration."""
|
|
assert await async_setup_component(hass, DOMAIN, MANDATORY_CONFIGURATION) is False
|
|
|
|
|
|
async def test_minimal_config(
|
|
hass: HomeAssistantType, mock_bridge: Generator[None, Any, None]
|
|
) -> None:
|
|
"""Test setup with configuration minimal entries."""
|
|
assert await async_setup_component(hass, DOMAIN, MANDATORY_CONFIGURATION)
|
|
|
|
|
|
async def test_discovery_data_bucket(
|
|
hass: HomeAssistantType, mock_bridge: Generator[None, Any, None]
|
|
) -> None:
|
|
"""Test the event send with the updated device."""
|
|
assert await async_setup_component(hass, DOMAIN, MANDATORY_CONFIGURATION)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
device = hass.data[DOMAIN].get(DATA_DEVICE)
|
|
assert device.device_id == DUMMY_DEVICE_ID
|
|
assert device.ip_addr == DUMMY_IP_ADDRESS
|
|
assert device.mac_addr == DUMMY_MAC_ADDRESS
|
|
assert device.name == DUMMY_DEVICE_NAME
|
|
assert device.state == DUMMY_DEVICE_STATE
|
|
assert device.remaining_time == DUMMY_REMAINING_TIME
|
|
assert device.auto_off_set == DUMMY_AUTO_OFF_SET
|
|
assert device.power_consumption == DUMMY_POWER_CONSUMPTION
|
|
assert device.electric_current == DUMMY_ELECTRIC_CURRENT
|
|
assert device.phone_id == DUMMY_PHONE_ID
|
|
|
|
|
|
async def test_set_auto_off_service(
|
|
hass: HomeAssistantType,
|
|
mock_bridge: Generator[None, Any, None],
|
|
mock_api: Generator[None, Any, None],
|
|
hass_owner_user: MockUser,
|
|
) -> None:
|
|
"""Test the set_auto_off service."""
|
|
assert await async_setup_component(hass, DOMAIN, MANDATORY_CONFIGURATION)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
assert hass.services.has_service(DOMAIN, SERVICE_SET_AUTO_OFF_NAME)
|
|
|
|
await hass.services.async_call(
|
|
DOMAIN,
|
|
SERVICE_SET_AUTO_OFF_NAME,
|
|
{CONF_ENTITY_ID: SWITCH_ENTITY_ID, CONF_AUTO_OFF: DUMMY_AUTO_OFF_SET},
|
|
blocking=True,
|
|
context=Context(user_id=hass_owner_user.id),
|
|
)
|
|
|
|
with raises(UnknownUser) as unknown_user_exc:
|
|
await hass.services.async_call(
|
|
DOMAIN,
|
|
SERVICE_SET_AUTO_OFF_NAME,
|
|
{CONF_ENTITY_ID: SWITCH_ENTITY_ID, CONF_AUTO_OFF: DUMMY_AUTO_OFF_SET},
|
|
blocking=True,
|
|
context=Context(user_id="not_real_user"),
|
|
)
|
|
|
|
assert unknown_user_exc.type is UnknownUser
|
|
|
|
with patch(
|
|
"homeassistant.components.switcher_kis.switch.SwitcherV2Api.set_auto_shutdown"
|
|
) as mock_set_auto_shutdown:
|
|
await hass.services.async_call(
|
|
DOMAIN,
|
|
SERVICE_SET_AUTO_OFF_NAME,
|
|
{CONF_ENTITY_ID: SWITCH_ENTITY_ID, CONF_AUTO_OFF: DUMMY_AUTO_OFF_SET},
|
|
)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
mock_set_auto_shutdown.assert_called_once_with(
|
|
time_period_str(DUMMY_AUTO_OFF_SET)
|
|
)
|
|
|
|
|
|
async def test_turn_on_with_timer_service(
|
|
hass: HomeAssistantType,
|
|
mock_bridge: Generator[None, Any, None],
|
|
mock_api: Generator[None, Any, None],
|
|
hass_owner_user: MockUser,
|
|
) -> None:
|
|
"""Test the set_auto_off service."""
|
|
assert await async_setup_component(hass, DOMAIN, MANDATORY_CONFIGURATION)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
assert hass.services.has_service(DOMAIN, SERVICE_TURN_ON_WITH_TIMER_NAME)
|
|
|
|
await hass.services.async_call(
|
|
DOMAIN,
|
|
SERVICE_TURN_ON_WITH_TIMER_NAME,
|
|
{CONF_ENTITY_ID: SWITCH_ENTITY_ID, CONF_TIMER_MINUTES: DUMMY_TIMER_MINUTES_SET},
|
|
blocking=True,
|
|
context=Context(user_id=hass_owner_user.id),
|
|
)
|
|
|
|
with raises(UnknownUser) as unknown_user_exc:
|
|
await hass.services.async_call(
|
|
DOMAIN,
|
|
SERVICE_TURN_ON_WITH_TIMER_NAME,
|
|
{
|
|
CONF_ENTITY_ID: SWITCH_ENTITY_ID,
|
|
CONF_TIMER_MINUTES: DUMMY_TIMER_MINUTES_SET,
|
|
},
|
|
blocking=True,
|
|
context=Context(user_id="not_real_user"),
|
|
)
|
|
|
|
assert unknown_user_exc.type is UnknownUser
|
|
|
|
with patch(
|
|
"homeassistant.components.switcher_kis.switch.SwitcherV2Api.control_device"
|
|
) as mock_control_device:
|
|
await hass.services.async_call(
|
|
DOMAIN,
|
|
SERVICE_TURN_ON_WITH_TIMER_NAME,
|
|
{
|
|
CONF_ENTITY_ID: SWITCH_ENTITY_ID,
|
|
CONF_TIMER_MINUTES: DUMMY_TIMER_MINUTES_SET,
|
|
},
|
|
)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
mock_control_device.assert_called_once_with(
|
|
COMMAND_ON, int(DUMMY_TIMER_MINUTES_SET)
|
|
)
|
|
|
|
|
|
async def test_signal_dispatcher(
|
|
hass: HomeAssistantType, mock_bridge: Generator[None, Any, None]
|
|
) -> None:
|
|
"""Test signal dispatcher dispatching device updates every 4 seconds."""
|
|
assert await async_setup_component(hass, DOMAIN, MANDATORY_CONFIGURATION)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
@callback
|
|
def verify_update_data(device: SwitcherV2Device) -> None:
|
|
"""Use as callback for signal dispatcher."""
|
|
pass
|
|
|
|
async_dispatcher_connect(hass, SIGNAL_SWITCHER_DEVICE_UPDATE, verify_update_data)
|
|
|
|
async_fire_time_changed(hass, dt.utcnow() + timedelta(seconds=5))
|