core/tests/components/homekit_controller/test_button.py

124 lines
3.5 KiB
Python

"""Basic checks for HomeKit button."""
from collections.abc import Callable
from aiohomekit.model import Accessory
from aiohomekit.model.characteristics import CharacteristicsTypes
from aiohomekit.model.services import Service, ServicesTypes
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from .common import Helper, setup_test_component
def create_switch_with_setup_button(accessory: Accessory) -> Service:
"""Define setup button characteristics."""
service = accessory.add_service(ServicesTypes.OUTLET)
setup = service.add_char(CharacteristicsTypes.VENDOR_HAA_SETUP)
setup.value = ""
setup.format = "string"
cur_state = service.add_char(CharacteristicsTypes.ON)
cur_state.value = True
return service
def create_switch_with_ecobee_clear_hold_button(accessory: Accessory) -> Service:
"""Define setup button characteristics."""
service = accessory.add_service(ServicesTypes.OUTLET)
setup = service.add_char(CharacteristicsTypes.VENDOR_ECOBEE_CLEAR_HOLD)
setup.value = ""
setup.format = "string"
cur_state = service.add_char(CharacteristicsTypes.ON)
cur_state.value = True
return service
async def test_press_button(
hass: HomeAssistant, get_next_aid: Callable[[], int]
) -> None:
"""Test a switch service that has a button characteristic is correctly handled."""
helper = await setup_test_component(
hass, get_next_aid(), create_switch_with_setup_button
)
# Helper will be for the primary entity, which is the outlet. Make a helper for the button.
button = Helper(
hass,
"button.testdevice_setup",
helper.pairing,
helper.accessory,
helper.config_entry,
)
await hass.services.async_call(
"button",
"press",
{"entity_id": "button.testdevice_setup"},
blocking=True,
)
button.async_assert_service_values(
ServicesTypes.OUTLET,
{
CharacteristicsTypes.VENDOR_HAA_SETUP: "#HAA@trcmd", # codespell:ignore haa
},
)
async def test_ecobee_clear_hold_press_button(
hass: HomeAssistant, get_next_aid: Callable[[], int]
) -> None:
"""Test ecobee clear hold button characteristic is correctly handled."""
helper = await setup_test_component(
hass, get_next_aid(), create_switch_with_ecobee_clear_hold_button
)
# Helper will be for the primary entity, which is the outlet. Make a helper for the button.
clear_hold = Helper(
hass,
"button.testdevice_clear_hold",
helper.pairing,
helper.accessory,
helper.config_entry,
)
await hass.services.async_call(
"button",
"press",
{"entity_id": "button.testdevice_clear_hold"},
blocking=True,
)
clear_hold.async_assert_service_values(
ServicesTypes.OUTLET,
{
CharacteristicsTypes.VENDOR_ECOBEE_CLEAR_HOLD: True,
},
)
async def test_migrate_unique_id(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
get_next_aid: Callable[[], int],
) -> None:
"""Test a we can migrate a button unique id."""
aid = get_next_aid()
button_entry = entity_registry.async_get_or_create(
"button",
"homekit_controller",
f"homekit-0001-aid:{aid}-sid:1-cid:2",
)
await setup_test_component(hass, aid, create_switch_with_ecobee_clear_hold_button)
assert (
entity_registry.async_get(button_entry.entity_id).unique_id
== f"00:00:00:00:00:00_{aid}_1_2"
)