From e2276458ed2b904db9c6666bc05ba088ecadee9d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 17 Jul 2024 19:10:02 -0500 Subject: [PATCH] Fix homekit_controller tests to avoid global aid generation (#119852) --- .../homekit_controller/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/homekit_controller/common.py | 16 +- .../components/homekit_controller/conftest.py | 15 +- .../test_alarm_control_panel.py | 26 ++- .../homekit_controller/test_binary_sensor.py | 58 ++++-- .../homekit_controller/test_button.py | 24 ++- .../homekit_controller/test_camera.py | 17 +- .../homekit_controller/test_climate.py | 192 +++++++++++++----- .../homekit_controller/test_config_flow.py | 2 +- .../homekit_controller/test_cover.py | 102 +++++++--- .../homekit_controller/test_device_trigger.py | 17 +- .../homekit_controller/test_event.py | 24 ++- .../components/homekit_controller/test_fan.py | 128 ++++++++---- .../homekit_controller/test_humidifier.py | 94 ++++++--- .../homekit_controller/test_init.py | 32 ++- .../homekit_controller/test_light.py | 92 ++++++--- .../homekit_controller/test_lock.py | 22 +- .../homekit_controller/test_media_player.py | 64 ++++-- .../homekit_controller/test_number.py | 26 ++- .../homekit_controller/test_select.py | 42 +++- .../homekit_controller/test_sensor.py | 84 +++++--- .../homekit_controller/test_storage.py | 5 +- .../homekit_controller/test_switch.py | 48 +++-- 25 files changed, 792 insertions(+), 344 deletions(-) diff --git a/homeassistant/components/homekit_controller/manifest.json b/homeassistant/components/homekit_controller/manifest.json index 72c1a0478a3..6b30439aa77 100644 --- a/homeassistant/components/homekit_controller/manifest.json +++ b/homeassistant/components/homekit_controller/manifest.json @@ -14,6 +14,6 @@ "documentation": "https://www.home-assistant.io/integrations/homekit_controller", "iot_class": "local_push", "loggers": ["aiohomekit", "commentjson"], - "requirements": ["aiohomekit==3.1.5"], + "requirements": ["aiohomekit==3.2.0"], "zeroconf": ["_hap._tcp.local.", "_hap._udp.local."] } diff --git a/requirements_all.txt b/requirements_all.txt index 32a604b0ca1..00b421526c0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -255,7 +255,7 @@ aioguardian==2022.07.0 aioharmony==0.2.10 # homeassistant.components.homekit_controller -aiohomekit==3.1.5 +aiohomekit==3.2.0 # homeassistant.components.hue aiohue==4.7.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index ed95670a77d..9595d2c0c08 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -237,7 +237,7 @@ aioguardian==2022.07.0 aioharmony==0.2.10 # homeassistant.components.homekit_controller -aiohomekit==3.1.5 +aiohomekit==3.2.0 # homeassistant.components.hue aiohue==4.7.1 diff --git a/tests/components/homekit_controller/common.py b/tests/components/homekit_controller/common.py index 1360b463e4a..9aba3ef3225 100644 --- a/tests/components/homekit_controller/common.py +++ b/tests/components/homekit_controller/common.py @@ -11,12 +11,7 @@ from unittest import mock from aiohomekit.controller.abstract import AbstractDescription, AbstractPairing from aiohomekit.hkjson import loads as hkloads -from aiohomekit.model import ( - Accessories, - AccessoriesState, - Accessory, - mixin as model_mixin, -) +from aiohomekit.model import Accessories, AccessoriesState, Accessory from aiohomekit.testing import FakeController, FakePairing from homeassistant.components.device_automation import DeviceAutomationType @@ -282,7 +277,7 @@ async def device_config_changed(hass: HomeAssistant, accessories: Accessories): async def setup_test_component( - hass, setup_accessory, capitalize=False, suffix=None, connection=None + hass, aid, setup_accessory, capitalize=False, suffix=None, connection=None ): """Load a fake homekit accessory based on a homekit accessory model. @@ -291,7 +286,7 @@ async def setup_test_component( If suffix is set, entityId will include the suffix """ accessory = Accessory.create_with_info( - "TestDevice", "example.com", "Test", "0001", "0.1" + aid, "TestDevice", "example.com", "Test", "0001", "0.1" ) setup_accessory(accessory) @@ -397,8 +392,3 @@ async def assert_devices_and_entities_created( # Root device must not have a via, otherwise its not the device assert root_device.via_device_id is None - - -def get_next_aid(): - """Get next aid.""" - return model_mixin.id_counter + 1 diff --git a/tests/components/homekit_controller/conftest.py b/tests/components/homekit_controller/conftest.py index 0c25e68f732..eea3f4b67f2 100644 --- a/tests/components/homekit_controller/conftest.py +++ b/tests/components/homekit_controller/conftest.py @@ -1,6 +1,6 @@ """HomeKit controller session fixtures.""" -from collections.abc import Generator +from collections.abc import Callable, Generator import datetime from unittest.mock import MagicMock, patch @@ -44,3 +44,16 @@ def hk_mock_async_zeroconf(mock_async_zeroconf: MagicMock) -> None: @pytest.fixture(autouse=True) def auto_mock_bluetooth(mock_bluetooth: None) -> None: """Auto mock bluetooth.""" + + +@pytest.fixture +def get_next_aid() -> Generator[Callable[[], int]]: + """Generate a function that returns increasing accessory ids.""" + id_counter = 0 + + def _get_id(): + nonlocal id_counter + id_counter += 1 + return id_counter + + return _get_id diff --git a/tests/components/homekit_controller/test_alarm_control_panel.py b/tests/components/homekit_controller/test_alarm_control_panel.py index a8852aac4f7..d08478641b3 100644 --- a/tests/components/homekit_controller/test_alarm_control_panel.py +++ b/tests/components/homekit_controller/test_alarm_control_panel.py @@ -1,12 +1,14 @@ """Basic checks for HomeKitalarm_control_panel.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_security_system_service(accessory): @@ -27,9 +29,13 @@ def create_security_system_service(accessory): targ_state.value = 50 -async def test_switch_change_alarm_state(hass: HomeAssistant) -> None: +async def test_switch_change_alarm_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit alarm on and off again.""" - helper = await setup_test_component(hass, create_security_system_service) + helper = await setup_test_component( + hass, get_next_aid(), create_security_system_service + ) await hass.services.async_call( "alarm_control_panel", @@ -84,9 +90,13 @@ async def test_switch_change_alarm_state(hass: HomeAssistant) -> None: ) -async def test_switch_read_alarm_state(hass: HomeAssistant) -> None: +async def test_switch_read_alarm_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit alarm accessory.""" - helper = await setup_test_component(hass, create_security_system_service) + helper = await setup_test_component( + hass, get_next_aid(), create_security_system_service + ) await helper.async_update( ServicesTypes.SECURITY_SYSTEM, @@ -126,7 +136,9 @@ async def test_switch_read_alarm_state(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a alarm_control_panel unique id.""" aid = get_next_aid() @@ -135,7 +147,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_security_system_service) + await setup_test_component(hass, aid, create_security_system_service) assert ( entity_registry.async_get(alarm_control_panel_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_binary_sensor.py b/tests/components/homekit_controller/test_binary_sensor.py index 3d4486bb38d..63b35fbe1b8 100644 --- a/tests/components/homekit_controller/test_binary_sensor.py +++ b/tests/components/homekit_controller/test_binary_sensor.py @@ -1,5 +1,7 @@ """Basic checks for HomeKit motion sensors and contact sensors.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes @@ -7,7 +9,7 @@ from homeassistant.components.binary_sensor import BinarySensorDeviceClass from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_motion_sensor_service(accessory): @@ -18,9 +20,13 @@ def create_motion_sensor_service(accessory): cur_state.value = 0 -async def test_motion_sensor_read_state(hass: HomeAssistant) -> None: +async def test_motion_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit motion sensor accessory.""" - helper = await setup_test_component(hass, create_motion_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_motion_sensor_service + ) await helper.async_update( ServicesTypes.MOTION_SENSOR, {CharacteristicsTypes.MOTION_DETECTED: False} @@ -45,9 +51,13 @@ def create_contact_sensor_service(accessory): cur_state.value = 0 -async def test_contact_sensor_read_state(hass: HomeAssistant) -> None: +async def test_contact_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit contact accessory.""" - helper = await setup_test_component(hass, create_contact_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_contact_sensor_service + ) await helper.async_update( ServicesTypes.CONTACT_SENSOR, {CharacteristicsTypes.CONTACT_STATE: 0} @@ -72,9 +82,13 @@ def create_smoke_sensor_service(accessory): cur_state.value = 0 -async def test_smoke_sensor_read_state(hass: HomeAssistant) -> None: +async def test_smoke_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit contact accessory.""" - helper = await setup_test_component(hass, create_smoke_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_smoke_sensor_service + ) await helper.async_update( ServicesTypes.SMOKE_SENSOR, {CharacteristicsTypes.SMOKE_DETECTED: 0} @@ -99,9 +113,13 @@ def create_carbon_monoxide_sensor_service(accessory): cur_state.value = 0 -async def test_carbon_monoxide_sensor_read_state(hass: HomeAssistant) -> None: +async def test_carbon_monoxide_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit contact accessory.""" - helper = await setup_test_component(hass, create_carbon_monoxide_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_carbon_monoxide_sensor_service + ) await helper.async_update( ServicesTypes.CARBON_MONOXIDE_SENSOR, @@ -128,9 +146,13 @@ def create_occupancy_sensor_service(accessory): cur_state.value = 0 -async def test_occupancy_sensor_read_state(hass: HomeAssistant) -> None: +async def test_occupancy_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit occupancy sensor accessory.""" - helper = await setup_test_component(hass, create_occupancy_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_occupancy_sensor_service + ) await helper.async_update( ServicesTypes.OCCUPANCY_SENSOR, {CharacteristicsTypes.OCCUPANCY_DETECTED: False} @@ -155,9 +177,13 @@ def create_leak_sensor_service(accessory): cur_state.value = 0 -async def test_leak_sensor_read_state(hass: HomeAssistant) -> None: +async def test_leak_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit leak sensor accessory.""" - helper = await setup_test_component(hass, create_leak_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_leak_sensor_service + ) await helper.async_update( ServicesTypes.LEAK_SENSOR, {CharacteristicsTypes.LEAK_DETECTED: 0} @@ -175,7 +201,9 @@ async def test_leak_sensor_read_state(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a binary_sensor unique id.""" aid = get_next_aid() @@ -184,7 +212,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_leak_sensor_service) + await setup_test_component(hass, aid, create_leak_sensor_service) assert ( entity_registry.async_get(binary_sensor_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_button.py b/tests/components/homekit_controller/test_button.py index 9f935569333..058194a7ebd 100644 --- a/tests/components/homekit_controller/test_button.py +++ b/tests/components/homekit_controller/test_button.py @@ -1,12 +1,14 @@ """Basic checks for HomeKit button.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import Helper, get_next_aid, setup_test_component +from .common import Helper, setup_test_component def create_switch_with_setup_button(accessory): @@ -39,9 +41,13 @@ def create_switch_with_ecobee_clear_hold_button(accessory): return service -async def test_press_button(hass: HomeAssistant) -> None: +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, create_switch_with_setup_button) + 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( @@ -66,10 +72,12 @@ async def test_press_button(hass: HomeAssistant) -> None: ) -async def test_ecobee_clear_hold_press_button(hass: HomeAssistant) -> None: +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, create_switch_with_ecobee_clear_hold_button + 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. @@ -96,7 +104,9 @@ async def test_ecobee_clear_hold_press_button(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + 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() @@ -105,7 +115,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-0001-aid:{aid}-sid:1-cid:2", ) - await setup_test_component(hass, create_switch_with_ecobee_clear_hold_button) + 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" diff --git a/tests/components/homekit_controller/test_camera.py b/tests/components/homekit_controller/test_camera.py index de64ee95d74..6e20c1feb3c 100644 --- a/tests/components/homekit_controller/test_camera.py +++ b/tests/components/homekit_controller/test_camera.py @@ -1,6 +1,7 @@ """Basic checks for HomeKit cameras.""" import base64 +from collections.abc import Callable from aiohomekit.model.services import ServicesTypes from aiohomekit.testing import FAKE_CAMERA_IMAGE @@ -9,7 +10,7 @@ from homeassistant.components import camera from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_camera(accessory): @@ -18,7 +19,9 @@ def create_camera(accessory): async def test_migrate_unique_ids( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test migrating entity unique ids.""" aid = get_next_aid() @@ -27,23 +30,23 @@ async def test_migrate_unique_ids( "homekit_controller", f"homekit-0001-aid:{aid}", ) - await setup_test_component(hass, create_camera) + await setup_test_component(hass, aid, create_camera) assert ( entity_registry.async_get(camera.entity_id).unique_id == f"00:00:00:00:00:00_{aid}" ) -async def test_read_state(hass: HomeAssistant) -> None: +async def test_read_state(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test reading the state of a HomeKit camera.""" - helper = await setup_test_component(hass, create_camera) + helper = await setup_test_component(hass, get_next_aid(), create_camera) state = await helper.poll_and_get_state() assert state.state == "idle" -async def test_get_image(hass: HomeAssistant) -> None: +async def test_get_image(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test getting a JPEG from a camera.""" - helper = await setup_test_component(hass, create_camera) + helper = await setup_test_component(hass, get_next_aid(), create_camera) image = await camera.async_get_image(hass, helper.entity_id) assert image.content == base64.b64decode(FAKE_CAMERA_IMAGE) diff --git a/tests/components/homekit_controller/test_climate.py b/tests/components/homekit_controller/test_climate.py index 5470c669700..183e020eb25 100644 --- a/tests/components/homekit_controller/test_climate.py +++ b/tests/components/homekit_controller/test_climate.py @@ -1,5 +1,7 @@ """Basic checks for HomeKitclimate.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import ( ActivationStateValues, CharacteristicsTypes, @@ -21,7 +23,7 @@ from homeassistant.components.climate import ( from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component # Test thermostat devices @@ -73,9 +75,13 @@ def create_thermostat_service_min_max(accessory): char.maxValue = 1 -async def test_climate_respect_supported_op_modes_1(hass: HomeAssistant) -> None: +async def test_climate_respect_supported_op_modes_1( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that climate respects minValue/maxValue hints.""" - helper = await setup_test_component(hass, create_thermostat_service_min_max) + helper = await setup_test_component( + hass, get_next_aid(), create_thermostat_service_min_max + ) state = await helper.poll_and_get_state() assert state.attributes["hvac_modes"] == ["off", "heat"] @@ -88,16 +94,22 @@ def create_thermostat_service_valid_vals(accessory): char.valid_values = [0, 1, 2] -async def test_climate_respect_supported_op_modes_2(hass: HomeAssistant) -> None: +async def test_climate_respect_supported_op_modes_2( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that climate respects validValue hints.""" - helper = await setup_test_component(hass, create_thermostat_service_valid_vals) + helper = await setup_test_component( + hass, get_next_aid(), create_thermostat_service_valid_vals + ) state = await helper.poll_and_get_state() assert state.attributes["hvac_modes"] == ["off", "heat", "cool"] -async def test_climate_change_thermostat_state(hass: HomeAssistant) -> None: +async def test_climate_change_thermostat_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit thermostat on and off again.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -178,9 +190,11 @@ async def test_climate_change_thermostat_state(hass: HomeAssistant) -> None: ) -async def test_climate_check_min_max_values_per_mode(hass: HomeAssistant) -> None: +async def test_climate_check_min_max_values_per_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we we get the appropriate min/max values for each mode.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -213,9 +227,11 @@ async def test_climate_check_min_max_values_per_mode(hass: HomeAssistant) -> Non assert climate_state.attributes["max_temp"] == 40 -async def test_climate_change_thermostat_temperature(hass: HomeAssistant) -> None: +async def test_climate_change_thermostat_temperature( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit thermostat on and off again.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -244,9 +260,11 @@ async def test_climate_change_thermostat_temperature(hass: HomeAssistant) -> Non ) -async def test_climate_change_thermostat_temperature_range(hass: HomeAssistant) -> None: +async def test_climate_change_thermostat_temperature_range( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set separate heat and cool setpoints in heat_cool mode.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -278,10 +296,10 @@ async def test_climate_change_thermostat_temperature_range(hass: HomeAssistant) async def test_climate_change_thermostat_temperature_range_iphone( - hass: HomeAssistant, + hass: HomeAssistant, get_next_aid: Callable[[], int] ) -> None: """Test that we can set all three set points at once (iPhone heat_cool mode support).""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -313,10 +331,10 @@ async def test_climate_change_thermostat_temperature_range_iphone( async def test_climate_cannot_set_thermostat_temp_range_in_wrong_mode( - hass: HomeAssistant, + hass: HomeAssistant, get_next_aid: Callable[[], int] ) -> None: """Test that we cannot set range values when not in heat_cool mode.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -372,10 +390,12 @@ def create_thermostat_single_set_point_auto(accessory): async def test_climate_check_min_max_values_per_mode_sspa_device( - hass: HomeAssistant, + hass: HomeAssistant, get_next_aid: Callable[[], int] ) -> None: """Test appropriate min/max values for each mode on sspa devices.""" - helper = await setup_test_component(hass, create_thermostat_single_set_point_auto) + helper = await setup_test_component( + hass, get_next_aid(), create_thermostat_single_set_point_auto + ) await hass.services.async_call( DOMAIN, @@ -408,9 +428,13 @@ async def test_climate_check_min_max_values_per_mode_sspa_device( assert climate_state.attributes["max_temp"] == 35 -async def test_climate_set_thermostat_temp_on_sspa_device(hass: HomeAssistant) -> None: +async def test_climate_set_thermostat_temp_on_sspa_device( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test setting temperature in different modes on device with single set point in auto.""" - helper = await setup_test_component(hass, create_thermostat_single_set_point_auto) + helper = await setup_test_component( + hass, get_next_aid(), create_thermostat_single_set_point_auto + ) await hass.services.async_call( DOMAIN, @@ -462,9 +486,13 @@ async def test_climate_set_thermostat_temp_on_sspa_device(hass: HomeAssistant) - ) -async def test_climate_set_mode_via_temp(hass: HomeAssistant) -> None: +async def test_climate_set_mode_via_temp( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test setting temperature and mode at same tims.""" - helper = await setup_test_component(hass, create_thermostat_single_set_point_auto) + helper = await setup_test_component( + hass, get_next_aid(), create_thermostat_single_set_point_auto + ) await hass.services.async_call( DOMAIN, @@ -503,9 +531,11 @@ async def test_climate_set_mode_via_temp(hass: HomeAssistant) -> None: ) -async def test_climate_change_thermostat_humidity(hass: HomeAssistant) -> None: +async def test_climate_change_thermostat_humidity( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit thermostat on and off again.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await hass.services.async_call( DOMAIN, @@ -534,9 +564,11 @@ async def test_climate_change_thermostat_humidity(hass: HomeAssistant) -> None: ) -async def test_climate_read_thermostat_state(hass: HomeAssistant) -> None: +async def test_climate_read_thermostat_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit thermostat accessory.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) # Simulate that heating is on await helper.async_update( @@ -591,9 +623,11 @@ async def test_climate_read_thermostat_state(hass: HomeAssistant) -> None: assert state.state == HVACMode.HEAT_COOL -async def test_hvac_mode_vs_hvac_action(hass: HomeAssistant) -> None: +async def test_hvac_mode_vs_hvac_action( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Check that we haven't conflated hvac_mode and hvac_action.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) # Simulate that current temperature is above target temp # Heating might be on, but hvac_action currently 'off' @@ -628,9 +662,11 @@ async def test_hvac_mode_vs_hvac_action(hass: HomeAssistant) -> None: assert state.attributes["hvac_action"] == "heating" -async def test_hvac_mode_vs_hvac_action_current_mode_wrong(hass: HomeAssistant) -> None: +async def test_hvac_mode_vs_hvac_action_current_mode_wrong( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Check that we cope with buggy HEATING_COOLING_CURRENT.""" - helper = await setup_test_component(hass, create_thermostat_service) + helper = await setup_test_component(hass, get_next_aid(), create_thermostat_service) await helper.async_update( ServicesTypes.THERMOSTAT, @@ -692,9 +728,13 @@ def create_heater_cooler_service_min_max(accessory): char.maxValue = 2 -async def test_heater_cooler_respect_supported_op_modes_1(hass: HomeAssistant) -> None: +async def test_heater_cooler_respect_supported_op_modes_1( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that climate respects minValue/maxValue hints.""" - helper = await setup_test_component(hass, create_heater_cooler_service_min_max) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service_min_max + ) state = await helper.poll_and_get_state() assert state.attributes["hvac_modes"] == ["heat", "cool", "off"] @@ -707,16 +747,24 @@ def create_theater_cooler_service_valid_vals(accessory): char.valid_values = [1, 2] -async def test_heater_cooler_respect_supported_op_modes_2(hass: HomeAssistant) -> None: +async def test_heater_cooler_respect_supported_op_modes_2( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that climate respects validValue hints.""" - helper = await setup_test_component(hass, create_theater_cooler_service_valid_vals) + helper = await setup_test_component( + hass, get_next_aid(), create_theater_cooler_service_valid_vals + ) state = await helper.poll_and_get_state() assert state.attributes["hvac_modes"] == ["heat", "cool", "off"] -async def test_heater_cooler_change_thermostat_state(hass: HomeAssistant) -> None: +async def test_heater_cooler_change_thermostat_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can change the operational mode.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) await hass.services.async_call( DOMAIN, @@ -771,12 +819,16 @@ async def test_heater_cooler_change_thermostat_state(hass: HomeAssistant) -> Non ) -async def test_can_turn_on_after_off(hass: HomeAssistant) -> None: +async def test_can_turn_on_after_off( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we always force device from inactive to active when setting mode. This is a regression test for #81863. """ - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) await hass.services.async_call( DOMAIN, @@ -806,9 +858,13 @@ async def test_can_turn_on_after_off(hass: HomeAssistant) -> None: ) -async def test_heater_cooler_change_thermostat_temperature(hass: HomeAssistant) -> None: +async def test_heater_cooler_change_thermostat_temperature( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can change the target temperature.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) await hass.services.async_call( DOMAIN, @@ -849,9 +905,13 @@ async def test_heater_cooler_change_thermostat_temperature(hass: HomeAssistant) ) -async def test_heater_cooler_change_fan_speed(hass: HomeAssistant) -> None: +async def test_heater_cooler_change_fan_speed( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can change the target fan speed.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) await hass.services.async_call( DOMAIN, @@ -897,9 +957,13 @@ async def test_heater_cooler_change_fan_speed(hass: HomeAssistant) -> None: ) -async def test_heater_cooler_read_fan_speed(hass: HomeAssistant) -> None: +async def test_heater_cooler_read_fan_speed( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit thermostat accessory.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) # Simulate that fan speed is off await helper.async_update( @@ -946,9 +1010,13 @@ async def test_heater_cooler_read_fan_speed(hass: HomeAssistant) -> None: assert state.attributes["fan_mode"] == "high" -async def test_heater_cooler_read_thermostat_state(hass: HomeAssistant) -> None: +async def test_heater_cooler_read_thermostat_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit thermostat accessory.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) # Simulate that heating is on await helper.async_update( @@ -1000,9 +1068,13 @@ async def test_heater_cooler_read_thermostat_state(hass: HomeAssistant) -> None: assert state.state == HVACMode.HEAT_COOL -async def test_heater_cooler_hvac_mode_vs_hvac_action(hass: HomeAssistant) -> None: +async def test_heater_cooler_hvac_mode_vs_hvac_action( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Check that we haven't conflated hvac_mode and hvac_action.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) # Simulate that current temperature is above target temp # Heating might be on, but hvac_action currently 'off' @@ -1039,9 +1111,13 @@ async def test_heater_cooler_hvac_mode_vs_hvac_action(hass: HomeAssistant) -> No assert state.attributes["hvac_action"] == "heating" -async def test_heater_cooler_change_swing_mode(hass: HomeAssistant) -> None: +async def test_heater_cooler_change_swing_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can change the swing mode.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) await hass.services.async_call( DOMAIN, @@ -1070,9 +1146,13 @@ async def test_heater_cooler_change_swing_mode(hass: HomeAssistant) -> None: ) -async def test_heater_cooler_turn_off(hass: HomeAssistant) -> None: +async def test_heater_cooler_turn_off( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that both hvac_action and hvac_mode return "off" when turned off.""" - helper = await setup_test_component(hass, create_heater_cooler_service) + helper = await setup_test_component( + hass, get_next_aid(), create_heater_cooler_service + ) # Simulate that the device is turned off but CURRENT_HEATER_COOLER_STATE still returns HEATING/COOLING await helper.async_update( @@ -1090,7 +1170,9 @@ async def test_heater_cooler_turn_off(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a switch unique id.""" aid = get_next_aid() @@ -1099,7 +1181,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_heater_cooler_service) + await setup_test_component(hass, aid, create_heater_cooler_service) assert ( entity_registry.async_get(climate_entry.entity_id).unique_id == f"00:00:00:00:00:00_{aid}_8" diff --git a/tests/components/homekit_controller/test_config_flow.py b/tests/components/homekit_controller/test_config_flow.py index a336758f4ac..420c9d45803 100644 --- a/tests/components/homekit_controller/test_config_flow.py +++ b/tests/components/homekit_controller/test_config_flow.py @@ -211,13 +211,13 @@ def setup_mock_accessory(controller): bridge = Accessories() accessory = Accessory.create_with_info( + 1, name="Koogeek-LS1-20833F", manufacturer="Koogeek", model="LS1", serial_number="12345", firmware_revision="1.1", ) - accessory.aid = 1 service = accessory.add_service(ServicesTypes.LIGHTBULB) on_char = service.add_char(CharacteristicsTypes.ON) diff --git a/tests/components/homekit_controller/test_cover.py b/tests/components/homekit_controller/test_cover.py index 2157eb51212..c819eac1f5a 100644 --- a/tests/components/homekit_controller/test_cover.py +++ b/tests/components/homekit_controller/test_cover.py @@ -1,5 +1,7 @@ """Basic checks for HomeKitalarm_control_panel.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes @@ -7,7 +9,7 @@ from homeassistant.const import STATE_UNAVAILABLE from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_window_covering_service(accessory): @@ -113,9 +115,13 @@ def create_window_covering_service_with_none_tilt(accessory): tilt_target.maxValue = 0 -async def test_change_window_cover_state(hass: HomeAssistant) -> None: +async def test_change_window_cover_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit alarm on and off again.""" - helper = await setup_test_component(hass, create_window_covering_service) + helper = await setup_test_component( + hass, get_next_aid(), create_window_covering_service + ) await hass.services.async_call( "cover", "open_cover", {"entity_id": helper.entity_id}, blocking=True @@ -138,9 +144,13 @@ async def test_change_window_cover_state(hass: HomeAssistant) -> None: ) -async def test_read_window_cover_state(hass: HomeAssistant) -> None: +async def test_read_window_cover_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit alarm accessory.""" - helper = await setup_test_component(hass, create_window_covering_service) + helper = await setup_test_component( + hass, get_next_aid(), create_window_covering_service + ) await helper.async_update( ServicesTypes.WINDOW_COVERING, @@ -171,10 +181,12 @@ async def test_read_window_cover_state(hass: HomeAssistant) -> None: assert state.attributes["obstruction-detected"] is True -async def test_read_window_cover_tilt_horizontal(hass: HomeAssistant) -> None: +async def test_read_window_cover_tilt_horizontal( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that horizontal tilt is handled correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_h_tilt + hass, get_next_aid(), create_window_covering_service_with_h_tilt ) await helper.async_update( @@ -186,10 +198,12 @@ async def test_read_window_cover_tilt_horizontal(hass: HomeAssistant) -> None: assert state.attributes["current_tilt_position"] == 83 -async def test_read_window_cover_tilt_horizontal_2(hass: HomeAssistant) -> None: +async def test_read_window_cover_tilt_horizontal_2( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that horizontal tilt is handled correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_h_tilt_2 + hass, get_next_aid(), create_window_covering_service_with_h_tilt_2 ) await helper.async_update( @@ -201,10 +215,12 @@ async def test_read_window_cover_tilt_horizontal_2(hass: HomeAssistant) -> None: assert state.attributes["current_tilt_position"] == 83 -async def test_read_window_cover_tilt_vertical(hass: HomeAssistant) -> None: +async def test_read_window_cover_tilt_vertical( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that vertical tilt is handled correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_v_tilt + hass, get_next_aid(), create_window_covering_service_with_v_tilt ) await helper.async_update( @@ -216,10 +232,12 @@ async def test_read_window_cover_tilt_vertical(hass: HomeAssistant) -> None: assert state.attributes["current_tilt_position"] == 83 -async def test_read_window_cover_tilt_vertical_2(hass: HomeAssistant) -> None: +async def test_read_window_cover_tilt_vertical_2( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that vertical tilt is handled correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_v_tilt_2 + hass, get_next_aid(), create_window_covering_service_with_v_tilt_2 ) await helper.async_update( @@ -231,10 +249,12 @@ async def test_read_window_cover_tilt_vertical_2(hass: HomeAssistant) -> None: assert state.attributes["current_tilt_position"] == 83 -async def test_read_window_cover_tilt_missing_tilt(hass: HomeAssistant) -> None: +async def test_read_window_cover_tilt_missing_tilt( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that missing tilt is handled.""" helper = await setup_test_component( - hass, create_window_covering_service_with_none_tilt + hass, get_next_aid(), create_window_covering_service_with_none_tilt ) await helper.async_update( @@ -246,10 +266,12 @@ async def test_read_window_cover_tilt_missing_tilt(hass: HomeAssistant) -> None: assert state.state != STATE_UNAVAILABLE -async def test_write_window_cover_tilt_horizontal(hass: HomeAssistant) -> None: +async def test_write_window_cover_tilt_horizontal( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that horizontal tilt is written correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_h_tilt + hass, get_next_aid(), create_window_covering_service_with_h_tilt ) await hass.services.async_call( @@ -267,10 +289,12 @@ async def test_write_window_cover_tilt_horizontal(hass: HomeAssistant) -> None: ) -async def test_write_window_cover_tilt_horizontal_2(hass: HomeAssistant) -> None: +async def test_write_window_cover_tilt_horizontal_2( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that horizontal tilt is written correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_h_tilt_2 + hass, get_next_aid(), create_window_covering_service_with_h_tilt_2 ) await hass.services.async_call( @@ -288,10 +312,12 @@ async def test_write_window_cover_tilt_horizontal_2(hass: HomeAssistant) -> None ) -async def test_write_window_cover_tilt_vertical(hass: HomeAssistant) -> None: +async def test_write_window_cover_tilt_vertical( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that vertical tilt is written correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_v_tilt + hass, get_next_aid(), create_window_covering_service_with_v_tilt ) await hass.services.async_call( @@ -309,10 +335,12 @@ async def test_write_window_cover_tilt_vertical(hass: HomeAssistant) -> None: ) -async def test_write_window_cover_tilt_vertical_2(hass: HomeAssistant) -> None: +async def test_write_window_cover_tilt_vertical_2( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that vertical tilt is written correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_v_tilt_2 + hass, get_next_aid(), create_window_covering_service_with_v_tilt_2 ) await hass.services.async_call( @@ -330,10 +358,12 @@ async def test_write_window_cover_tilt_vertical_2(hass: HomeAssistant) -> None: ) -async def test_window_cover_stop(hass: HomeAssistant) -> None: +async def test_window_cover_stop( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that vertical tilt is written correctly.""" helper = await setup_test_component( - hass, create_window_covering_service_with_v_tilt + hass, get_next_aid(), create_window_covering_service_with_v_tilt ) await hass.services.async_call( @@ -366,9 +396,13 @@ def create_garage_door_opener_service(accessory): return service -async def test_change_door_state(hass: HomeAssistant) -> None: +async def test_change_door_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn open and close a HomeKit garage door.""" - helper = await setup_test_component(hass, create_garage_door_opener_service) + helper = await setup_test_component( + hass, get_next_aid(), create_garage_door_opener_service + ) await hass.services.async_call( "cover", "open_cover", {"entity_id": helper.entity_id}, blocking=True @@ -391,9 +425,13 @@ async def test_change_door_state(hass: HomeAssistant) -> None: ) -async def test_read_door_state(hass: HomeAssistant) -> None: +async def test_read_door_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit garage door.""" - helper = await setup_test_component(hass, create_garage_door_opener_service) + helper = await setup_test_component( + hass, get_next_aid(), create_garage_door_opener_service + ) await helper.async_update( ServicesTypes.GARAGE_DOOR_OPENER, @@ -432,7 +470,9 @@ async def test_read_door_state(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a cover unique id.""" aid = get_next_aid() @@ -441,7 +481,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_garage_door_opener_service) + await setup_test_component(hass, aid, create_garage_door_opener_service) assert ( entity_registry.async_get(cover_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_device_trigger.py b/tests/components/homekit_controller/test_device_trigger.py index 6c4c2ce8191..ecf34868b6c 100644 --- a/tests/components/homekit_controller/test_device_trigger.py +++ b/tests/components/homekit_controller/test_device_trigger.py @@ -1,5 +1,7 @@ """Test homekit_controller stateless triggers.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes import pytest @@ -82,9 +84,10 @@ async def test_enumerate_remote( hass: HomeAssistant, device_registry: dr.DeviceRegistry, entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test that remote is correctly enumerated.""" - await setup_test_component(hass, create_remote) + await setup_test_component(hass, get_next_aid(), create_remote) bat_sensor = entity_registry.async_get("sensor.testdevice_battery") identify_button = entity_registry.async_get("button.testdevice_identify") @@ -133,9 +136,10 @@ async def test_enumerate_button( hass: HomeAssistant, device_registry: dr.DeviceRegistry, entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test that a button is correctly enumerated.""" - await setup_test_component(hass, create_button) + await setup_test_component(hass, get_next_aid(), create_button) bat_sensor = entity_registry.async_get("sensor.testdevice_battery") identify_button = entity_registry.async_get("button.testdevice_identify") @@ -183,9 +187,10 @@ async def test_enumerate_doorbell( hass: HomeAssistant, device_registry: dr.DeviceRegistry, entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test that a button is correctly enumerated.""" - await setup_test_component(hass, create_doorbell) + await setup_test_component(hass, get_next_aid(), create_doorbell) bat_sensor = entity_registry.async_get("sensor.testdevice_battery") identify_button = entity_registry.async_get("button.testdevice_identify") @@ -233,10 +238,11 @@ async def test_handle_events( hass: HomeAssistant, device_registry: dr.DeviceRegistry, entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], service_calls: list[ServiceCall], ) -> None: """Test that events are handled.""" - helper = await setup_test_component(hass, create_remote) + helper = await setup_test_component(hass, get_next_aid(), create_remote) entry = entity_registry.async_get("sensor.testdevice_battery") @@ -355,10 +361,11 @@ async def test_handle_events_late_setup( hass: HomeAssistant, device_registry: dr.DeviceRegistry, entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], service_calls: list[ServiceCall], ) -> None: """Test that events are handled when setup happens after startup.""" - helper = await setup_test_component(hass, create_remote) + helper = await setup_test_component(hass, get_next_aid(), create_remote) entry = entity_registry.async_get("sensor.testdevice_battery") diff --git a/tests/components/homekit_controller/test_event.py b/tests/components/homekit_controller/test_event.py index e139b49982a..99dcf38fafc 100644 --- a/tests/components/homekit_controller/test_event.py +++ b/tests/components/homekit_controller/test_event.py @@ -1,5 +1,7 @@ """Test homekit_controller stateless triggers.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes @@ -65,9 +67,13 @@ def create_doorbell(accessory): battery.add_char(CharacteristicsTypes.BATTERY_LEVEL) -async def test_remote(hass: HomeAssistant, entity_registry: er.EntityRegistry) -> None: +async def test_remote( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], +) -> None: """Test that remote is supported.""" - helper = await setup_test_component(hass, create_remote) + helper = await setup_test_component(hass, get_next_aid(), create_remote) entities = [ ("event.testdevice_button_1", "Button 1"), @@ -108,9 +114,13 @@ async def test_remote(hass: HomeAssistant, entity_registry: er.EntityRegistry) - assert state.attributes["event_type"] == "long_press" -async def test_button(hass: HomeAssistant, entity_registry: er.EntityRegistry) -> None: +async def test_button( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], +) -> None: """Test that a button is correctly enumerated.""" - helper = await setup_test_component(hass, create_button) + helper = await setup_test_component(hass, get_next_aid(), create_button) entity_id = "event.testdevice_button_1" button = entity_registry.async_get(entity_id) @@ -145,10 +155,12 @@ async def test_button(hass: HomeAssistant, entity_registry: er.EntityRegistry) - async def test_doorbell( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test that doorbell service is handled.""" - helper = await setup_test_component(hass, create_doorbell) + helper = await setup_test_component(hass, get_next_aid(), create_doorbell) entity_id = "event.testdevice_doorbell" doorbell = entity_registry.async_get(entity_id) diff --git a/tests/components/homekit_controller/test_fan.py b/tests/components/homekit_controller/test_fan.py index 428d3ab7d50..8de447144af 100644 --- a/tests/components/homekit_controller/test_fan.py +++ b/tests/components/homekit_controller/test_fan.py @@ -1,12 +1,14 @@ """Basic checks for HomeKit fans.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_fan_service(accessory): @@ -90,9 +92,11 @@ def create_fanv2_service_without_rotation_speed(accessory): swing_mode.value = 0 -async def test_fan_read_state(hass: HomeAssistant) -> None: +async def test_fan_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit fan accessory.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) state = await helper.async_update( ServicesTypes.FAN, {CharacteristicsTypes.ON: False} @@ -105,9 +109,9 @@ async def test_fan_read_state(hass: HomeAssistant) -> None: assert state.state == "on" -async def test_turn_on(hass: HomeAssistant) -> None: +async def test_turn_on(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can turn a fan on.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) await hass.services.async_call( "fan", @@ -152,10 +156,12 @@ async def test_turn_on(hass: HomeAssistant) -> None: ) -async def test_turn_on_off_without_rotation_speed(hass: HomeAssistant) -> None: +async def test_turn_on_off_without_rotation_speed( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a fan on.""" helper = await setup_test_component( - hass, create_fanv2_service_without_rotation_speed + hass, get_next_aid(), create_fanv2_service_without_rotation_speed ) await hass.services.async_call( @@ -185,9 +191,9 @@ async def test_turn_on_off_without_rotation_speed(hass: HomeAssistant) -> None: ) -async def test_turn_off(hass: HomeAssistant) -> None: +async def test_turn_off(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can turn a fan off.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) await helper.async_update(ServicesTypes.FAN, {CharacteristicsTypes.ON: 1}) @@ -205,9 +211,9 @@ async def test_turn_off(hass: HomeAssistant) -> None: ) -async def test_set_speed(hass: HomeAssistant) -> None: +async def test_set_speed(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we set fan speed.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) await helper.async_update(ServicesTypes.FAN, {CharacteristicsTypes.ON: 1}) @@ -264,9 +270,11 @@ async def test_set_speed(hass: HomeAssistant) -> None: ) -async def test_set_percentage(hass: HomeAssistant) -> None: +async def test_set_percentage( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we set fan speed by percentage.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) await helper.async_update(ServicesTypes.FAN, {CharacteristicsTypes.ON: 1}) @@ -297,9 +305,9 @@ async def test_set_percentage(hass: HomeAssistant) -> None: ) -async def test_speed_read(hass: HomeAssistant) -> None: +async def test_speed_read(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can read a fans oscillation.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) state = await helper.async_update( ServicesTypes.FAN, @@ -337,9 +345,11 @@ async def test_speed_read(hass: HomeAssistant) -> None: assert state.attributes["percentage"] == 0 -async def test_set_direction(hass: HomeAssistant) -> None: +async def test_set_direction( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set fan spin direction.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) await hass.services.async_call( "fan", @@ -368,9 +378,11 @@ async def test_set_direction(hass: HomeAssistant) -> None: ) -async def test_direction_read(hass: HomeAssistant) -> None: +async def test_direction_read( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read a fans oscillation.""" - helper = await setup_test_component(hass, create_fan_service) + helper = await setup_test_component(hass, get_next_aid(), create_fan_service) state = await helper.async_update( ServicesTypes.FAN, {CharacteristicsTypes.ROTATION_DIRECTION: 0} @@ -383,9 +395,11 @@ async def test_direction_read(hass: HomeAssistant) -> None: assert state.attributes["direction"] == "reverse" -async def test_fanv2_read_state(hass: HomeAssistant) -> None: +async def test_fanv2_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit fan accessory.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) state = await helper.async_update( ServicesTypes.FAN_V2, {CharacteristicsTypes.ACTIVE: False} @@ -398,9 +412,9 @@ async def test_fanv2_read_state(hass: HomeAssistant) -> None: assert state.state == "on" -async def test_v2_turn_on(hass: HomeAssistant) -> None: +async def test_v2_turn_on(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can turn a fan on.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) await hass.services.async_call( "fan", @@ -473,9 +487,11 @@ async def test_v2_turn_on(hass: HomeAssistant) -> None: ) -async def test_v2_turn_off(hass: HomeAssistant) -> None: +async def test_v2_turn_off( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a fan off.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) await helper.async_update(ServicesTypes.FAN_V2, {CharacteristicsTypes.ACTIVE: 1}) @@ -493,9 +509,11 @@ async def test_v2_turn_off(hass: HomeAssistant) -> None: ) -async def test_v2_set_speed(hass: HomeAssistant) -> None: +async def test_v2_set_speed( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we set fan speed.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) await helper.async_update(ServicesTypes.FAN_V2, {CharacteristicsTypes.ACTIVE: 1}) @@ -552,9 +570,11 @@ async def test_v2_set_speed(hass: HomeAssistant) -> None: ) -async def test_v2_set_percentage(hass: HomeAssistant) -> None: +async def test_v2_set_percentage( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we set fan speed by percentage.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) await helper.async_update(ServicesTypes.FAN_V2, {CharacteristicsTypes.ACTIVE: 1}) @@ -585,9 +605,13 @@ async def test_v2_set_percentage(hass: HomeAssistant) -> None: ) -async def test_v2_set_percentage_with_min_step(hass: HomeAssistant) -> None: +async def test_v2_set_percentage_with_min_step( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we set fan speed by percentage.""" - helper = await setup_test_component(hass, create_fanv2_service_with_min_step) + helper = await setup_test_component( + hass, get_next_aid(), create_fanv2_service_with_min_step + ) await helper.async_update(ServicesTypes.FAN_V2, {CharacteristicsTypes.ACTIVE: 1}) @@ -618,9 +642,11 @@ async def test_v2_set_percentage_with_min_step(hass: HomeAssistant) -> None: ) -async def test_v2_speed_read(hass: HomeAssistant) -> None: +async def test_v2_speed_read( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read a fans oscillation.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) state = await helper.async_update( ServicesTypes.FAN_V2, @@ -657,9 +683,11 @@ async def test_v2_speed_read(hass: HomeAssistant) -> None: assert state.attributes["percentage"] == 0 -async def test_v2_set_direction(hass: HomeAssistant) -> None: +async def test_v2_set_direction( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set fan spin direction.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) await hass.services.async_call( "fan", @@ -688,9 +716,11 @@ async def test_v2_set_direction(hass: HomeAssistant) -> None: ) -async def test_v2_direction_read(hass: HomeAssistant) -> None: +async def test_v2_direction_read( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read a fans oscillation.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) state = await helper.async_update( ServicesTypes.FAN_V2, {CharacteristicsTypes.ROTATION_DIRECTION: 0} @@ -703,9 +733,11 @@ async def test_v2_direction_read(hass: HomeAssistant) -> None: assert state.attributes["direction"] == "reverse" -async def test_v2_oscillate(hass: HomeAssistant) -> None: +async def test_v2_oscillate( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can control a fans oscillation.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) await hass.services.async_call( "fan", @@ -734,9 +766,11 @@ async def test_v2_oscillate(hass: HomeAssistant) -> None: ) -async def test_v2_oscillate_read(hass: HomeAssistant) -> None: +async def test_v2_oscillate_read( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read a fans oscillation.""" - helper = await setup_test_component(hass, create_fanv2_service) + helper = await setup_test_component(hass, get_next_aid(), create_fanv2_service) state = await helper.async_update( ServicesTypes.FAN_V2, {CharacteristicsTypes.SWING_MODE: 0} @@ -750,11 +784,11 @@ async def test_v2_oscillate_read(hass: HomeAssistant) -> None: async def test_v2_set_percentage_non_standard_rotation_range( - hass: HomeAssistant, + hass: HomeAssistant, get_next_aid: Callable[[], int] ) -> None: """Test that we set fan speed with a non-standard rotation range.""" helper = await setup_test_component( - hass, create_fanv2_service_non_standard_rotation_range + hass, get_next_aid(), create_fanv2_service_non_standard_rotation_range ) await helper.async_update(ServicesTypes.FAN_V2, {CharacteristicsTypes.ACTIVE: 1}) @@ -813,7 +847,9 @@ async def test_v2_set_percentage_non_standard_rotation_range( async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a fan unique id.""" aid = get_next_aid() @@ -822,7 +858,9 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_fanv2_service_non_standard_rotation_range) + await setup_test_component( + hass, aid, create_fanv2_service_non_standard_rotation_range + ) assert ( entity_registry.async_get(fan_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_humidifier.py b/tests/components/homekit_controller/test_humidifier.py index 60c74be3949..a031086e93d 100644 --- a/tests/components/homekit_controller/test_humidifier.py +++ b/tests/components/homekit_controller/test_humidifier.py @@ -1,5 +1,7 @@ """Basic checks for HomeKit Humidifier/Dehumidifier.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes @@ -7,7 +9,7 @@ from homeassistant.components.humidifier import DOMAIN, MODE_AUTO, MODE_NORMAL from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_humidifier_service(accessory): @@ -64,9 +66,11 @@ def create_dehumidifier_service(accessory): return service -async def test_humidifier_active_state(hass: HomeAssistant) -> None: +async def test_humidifier_active_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit humidifier on and off again.""" - helper = await setup_test_component(hass, create_humidifier_service) + helper = await setup_test_component(hass, get_next_aid(), create_humidifier_service) await hass.services.async_call( DOMAIN, "turn_on", {"entity_id": helper.entity_id}, blocking=True @@ -87,9 +91,13 @@ async def test_humidifier_active_state(hass: HomeAssistant) -> None: ) -async def test_dehumidifier_active_state(hass: HomeAssistant) -> None: +async def test_dehumidifier_active_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit dehumidifier on and off again.""" - helper = await setup_test_component(hass, create_dehumidifier_service) + helper = await setup_test_component( + hass, get_next_aid(), create_dehumidifier_service + ) await hass.services.async_call( DOMAIN, "turn_on", {"entity_id": helper.entity_id}, blocking=True @@ -110,9 +118,11 @@ async def test_dehumidifier_active_state(hass: HomeAssistant) -> None: ) -async def test_humidifier_read_humidity(hass: HomeAssistant) -> None: +async def test_humidifier_read_humidity( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit humidifier accessory.""" - helper = await setup_test_component(hass, create_humidifier_service) + helper = await setup_test_component(hass, get_next_aid(), create_humidifier_service) state = await helper.async_update( ServicesTypes.HUMIDIFIER_DEHUMIDIFIER, @@ -149,9 +159,13 @@ async def test_humidifier_read_humidity(hass: HomeAssistant) -> None: assert state.state == "off" -async def test_dehumidifier_read_humidity(hass: HomeAssistant) -> None: +async def test_dehumidifier_read_humidity( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit dehumidifier accessory.""" - helper = await setup_test_component(hass, create_dehumidifier_service) + helper = await setup_test_component( + hass, get_next_aid(), create_dehumidifier_service + ) state = await helper.async_update( ServicesTypes.HUMIDIFIER_DEHUMIDIFIER, @@ -186,9 +200,11 @@ async def test_dehumidifier_read_humidity(hass: HomeAssistant) -> None: assert state.attributes["humidity"] == 40 -async def test_humidifier_set_humidity(hass: HomeAssistant) -> None: +async def test_humidifier_set_humidity( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set the state of a HomeKit humidifier accessory.""" - helper = await setup_test_component(hass, create_humidifier_service) + helper = await setup_test_component(hass, get_next_aid(), create_humidifier_service) await hass.services.async_call( DOMAIN, @@ -202,9 +218,13 @@ async def test_humidifier_set_humidity(hass: HomeAssistant) -> None: ) -async def test_dehumidifier_set_humidity(hass: HomeAssistant) -> None: +async def test_dehumidifier_set_humidity( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set the state of a HomeKit dehumidifier accessory.""" - helper = await setup_test_component(hass, create_dehumidifier_service) + helper = await setup_test_component( + hass, get_next_aid(), create_dehumidifier_service + ) await hass.services.async_call( DOMAIN, @@ -218,9 +238,11 @@ async def test_dehumidifier_set_humidity(hass: HomeAssistant) -> None: ) -async def test_humidifier_set_mode(hass: HomeAssistant) -> None: +async def test_humidifier_set_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set the mode of a HomeKit humidifier accessory.""" - helper = await setup_test_component(hass, create_humidifier_service) + helper = await setup_test_component(hass, get_next_aid(), create_humidifier_service) await hass.services.async_call( DOMAIN, @@ -251,9 +273,13 @@ async def test_humidifier_set_mode(hass: HomeAssistant) -> None: ) -async def test_dehumidifier_set_mode(hass: HomeAssistant) -> None: +async def test_dehumidifier_set_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set the mode of a HomeKit dehumidifier accessory.""" - helper = await setup_test_component(hass, create_dehumidifier_service) + helper = await setup_test_component( + hass, get_next_aid(), create_dehumidifier_service + ) await hass.services.async_call( DOMAIN, @@ -284,9 +310,11 @@ async def test_dehumidifier_set_mode(hass: HomeAssistant) -> None: ) -async def test_humidifier_read_only_mode(hass: HomeAssistant) -> None: +async def test_humidifier_read_only_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit humidifier accessory.""" - helper = await setup_test_component(hass, create_humidifier_service) + helper = await setup_test_component(hass, get_next_aid(), create_humidifier_service) state = await helper.poll_and_get_state() assert state.attributes["mode"] == "normal" @@ -324,9 +352,13 @@ async def test_humidifier_read_only_mode(hass: HomeAssistant) -> None: assert state.attributes["mode"] == "normal" -async def test_dehumidifier_read_only_mode(hass: HomeAssistant) -> None: +async def test_dehumidifier_read_only_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit dehumidifier accessory.""" - helper = await setup_test_component(hass, create_dehumidifier_service) + helper = await setup_test_component( + hass, get_next_aid(), create_dehumidifier_service + ) state = await helper.poll_and_get_state() assert state.attributes["mode"] == "normal" @@ -364,9 +396,11 @@ async def test_dehumidifier_read_only_mode(hass: HomeAssistant) -> None: assert state.attributes["mode"] == "normal" -async def test_humidifier_target_humidity_modes(hass: HomeAssistant) -> None: +async def test_humidifier_target_humidity_modes( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit humidifier accessory.""" - helper = await setup_test_component(hass, create_humidifier_service) + helper = await setup_test_component(hass, get_next_aid(), create_humidifier_service) state = await helper.async_update( ServicesTypes.HUMIDIFIER_DEHUMIDIFIER, @@ -409,9 +443,13 @@ async def test_humidifier_target_humidity_modes(hass: HomeAssistant) -> None: assert state.attributes["humidity"] == 37 -async def test_dehumidifier_target_humidity_modes(hass: HomeAssistant) -> None: +async def test_dehumidifier_target_humidity_modes( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit dehumidifier accessory.""" - helper = await setup_test_component(hass, create_dehumidifier_service) + helper = await setup_test_component( + hass, get_next_aid(), create_dehumidifier_service + ) state = await helper.async_update( ServicesTypes.HUMIDIFIER_DEHUMIDIFIER, @@ -457,7 +495,9 @@ async def test_dehumidifier_target_humidity_modes(hass: HomeAssistant) -> None: async def test_migrate_entity_ids( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test that we can migrate humidifier entity ids.""" aid = get_next_aid() @@ -467,7 +507,7 @@ async def test_migrate_entity_ids( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_humidifier_service) + await setup_test_component(hass, aid, create_humidifier_service) assert ( entity_registry.async_get(humidifier_entry.entity_id).unique_id == f"00:00:00:00:00:00_{aid}_8" diff --git a/tests/components/homekit_controller/test_init.py b/tests/components/homekit_controller/test_init.py index 542d87d0b0e..f3952298326 100644 --- a/tests/components/homekit_controller/test_init.py +++ b/tests/components/homekit_controller/test_init.py @@ -1,5 +1,6 @@ """Tests for homekit_controller init.""" +from collections.abc import Callable from datetime import timedelta import pathlib from unittest.mock import patch @@ -46,9 +47,11 @@ def create_motion_sensor_service(accessory): cur_state.value = 0 -async def test_unload_on_stop(hass: HomeAssistant) -> None: +async def test_unload_on_stop( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test async_unload is called on stop.""" - await setup_test_component(hass, create_motion_sensor_service) + await setup_test_component(hass, get_next_aid(), create_motion_sensor_service) with patch( "homeassistant.components.homekit_controller.HKDevice.async_unload" ) as async_unlock_mock: @@ -58,9 +61,13 @@ async def test_unload_on_stop(hass: HomeAssistant) -> None: assert async_unlock_mock.called -async def test_async_remove_entry(hass: HomeAssistant) -> None: +async def test_async_remove_entry( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test unpairing a component.""" - helper = await setup_test_component(hass, create_motion_sensor_service) + helper = await setup_test_component( + hass, get_next_aid(), create_motion_sensor_service + ) controller = helper.pairing.controller hkid = "00:00:00:00:00:00" @@ -88,10 +95,13 @@ async def test_device_remove_devices( device_registry: dr.DeviceRegistry, entity_registry: er.EntityRegistry, hass_ws_client: WebSocketGenerator, + get_next_aid: Callable[[], int], ) -> None: """Test we can only remove a device that no longer exists.""" assert await async_setup_component(hass, "config", {}) - helper: Helper = await setup_test_component(hass, create_alive_service) + helper: Helper = await setup_test_component( + hass, get_next_aid(), create_alive_service + ) config_entry = helper.config_entry entry_id = config_entry.entry_id @@ -110,10 +120,13 @@ async def test_device_remove_devices( assert response["success"] -async def test_offline_device_raises(hass: HomeAssistant, controller) -> None: +async def test_offline_device_raises( + hass: HomeAssistant, get_next_aid: Callable[[], int], controller +) -> None: """Test an offline device raises ConfigEntryNotReady.""" is_connected = False + aid = get_next_aid() class OfflineFakePairing(FakePairing): """Fake pairing that can flip is_connected.""" @@ -140,7 +153,7 @@ async def test_offline_device_raises(hass: HomeAssistant, controller) -> None: return {} accessory = Accessory.create_with_info( - "TestDevice", "example.com", "Test", "0001", "0.1" + aid, "TestDevice", "example.com", "Test", "0001", "0.1" ) create_alive_service(accessory) @@ -162,11 +175,12 @@ async def test_offline_device_raises(hass: HomeAssistant, controller) -> None: async def test_ble_device_only_checks_is_available( - hass: HomeAssistant, controller + hass: HomeAssistant, get_next_aid: Callable[[], int], controller ) -> None: """Test a BLE device only checks is_available.""" is_available = False + aid = get_next_aid() class FakeBLEPairing(FakePairing): """Fake BLE pairing that can flip is_available.""" @@ -197,7 +211,7 @@ async def test_ble_device_only_checks_is_available( return {} accessory = Accessory.create_with_info( - "TestDevice", "example.com", "Test", "0001", "0.1" + aid, "TestDevice", "example.com", "Test", "0001", "0.1" ) create_alive_service(accessory) diff --git a/tests/components/homekit_controller/test_light.py b/tests/components/homekit_controller/test_light.py index c2644735ecb..d0180837c11 100644 --- a/tests/components/homekit_controller/test_light.py +++ b/tests/components/homekit_controller/test_light.py @@ -1,5 +1,7 @@ """Basic checks for HomeKitSwitch.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes @@ -13,7 +15,7 @@ from homeassistant.const import ATTR_SUPPORTED_FEATURES, STATE_UNAVAILABLE from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component LIGHT_BULB_NAME = "TestDevice" LIGHT_BULB_ENTITY_ID = "light.testdevice" @@ -55,9 +57,13 @@ def create_lightbulb_service_with_color_temp(accessory): return service -async def test_switch_change_light_state(hass: HomeAssistant) -> None: +async def test_switch_change_light_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit light on and off again.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_hs) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_hs + ) await hass.services.async_call( "light", @@ -102,9 +108,13 @@ async def test_switch_change_light_state(hass: HomeAssistant) -> None: ) -async def test_switch_change_light_state_color_temp(hass: HomeAssistant) -> None: +async def test_switch_change_light_state_color_temp( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn change color_temp.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_color_temp) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_color_temp + ) await hass.services.async_call( "light", @@ -122,9 +132,11 @@ async def test_switch_change_light_state_color_temp(hass: HomeAssistant) -> None ) -async def test_switch_read_light_state_dimmer(hass: HomeAssistant) -> None: +async def test_switch_read_light_state_dimmer( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit light accessory.""" - helper = await setup_test_component(hass, create_lightbulb_service) + helper = await setup_test_component(hass, get_next_aid(), create_lightbulb_service) # Initial state is that the light is off state = await helper.poll_and_get_state() @@ -157,9 +169,11 @@ async def test_switch_read_light_state_dimmer(hass: HomeAssistant) -> None: assert state.state == "off" -async def test_switch_push_light_state_dimmer(hass: HomeAssistant) -> None: +async def test_switch_push_light_state_dimmer( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit light accessory.""" - helper = await setup_test_component(hass, create_lightbulb_service) + helper = await setup_test_component(hass, get_next_aid(), create_lightbulb_service) # Initial state is that the light is off state = hass.states.get(LIGHT_BULB_ENTITY_ID) @@ -185,9 +199,13 @@ async def test_switch_push_light_state_dimmer(hass: HomeAssistant) -> None: assert state.state == "off" -async def test_switch_read_light_state_hs(hass: HomeAssistant) -> None: +async def test_switch_read_light_state_hs( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit light accessory.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_hs) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_hs + ) # Initial state is that the light is off state = await helper.poll_and_get_state() @@ -248,9 +266,13 @@ async def test_switch_read_light_state_hs(hass: HomeAssistant) -> None: assert state.attributes[ATTR_SUPPORTED_FEATURES] == 0 -async def test_switch_push_light_state_hs(hass: HomeAssistant) -> None: +async def test_switch_push_light_state_hs( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit light accessory.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_hs) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_hs + ) # Initial state is that the light is off state = hass.states.get(LIGHT_BULB_ENTITY_ID) @@ -279,9 +301,13 @@ async def test_switch_push_light_state_hs(hass: HomeAssistant) -> None: assert state.state == "off" -async def test_switch_read_light_state_color_temp(hass: HomeAssistant) -> None: +async def test_switch_read_light_state_color_temp( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the color_temp of a light accessory.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_color_temp) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_color_temp + ) # Initial state is that the light is off state = await helper.poll_and_get_state() @@ -307,9 +333,13 @@ async def test_switch_read_light_state_color_temp(hass: HomeAssistant) -> None: assert state.attributes[ATTR_SUPPORTED_FEATURES] == 0 -async def test_switch_push_light_state_color_temp(hass: HomeAssistant) -> None: +async def test_switch_push_light_state_color_temp( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit light accessory.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_color_temp) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_color_temp + ) # Initial state is that the light is off state = hass.states.get(LIGHT_BULB_ENTITY_ID) @@ -328,9 +358,13 @@ async def test_switch_push_light_state_color_temp(hass: HomeAssistant) -> None: assert state.attributes["color_temp"] == 400 -async def test_light_becomes_unavailable_but_recovers(hass: HomeAssistant) -> None: +async def test_light_becomes_unavailable_but_recovers( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test transition to and from unavailable state.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_color_temp) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_color_temp + ) # Initial state is that the light is off state = await helper.poll_and_get_state() @@ -356,9 +390,13 @@ async def test_light_becomes_unavailable_but_recovers(hass: HomeAssistant) -> No assert state.attributes["color_temp"] == 400 -async def test_light_unloaded_removed(hass: HomeAssistant) -> None: +async def test_light_unloaded_removed( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test entity and HKDevice are correctly unloaded and removed.""" - helper = await setup_test_component(hass, create_lightbulb_service_with_color_temp) + helper = await setup_test_component( + hass, get_next_aid(), create_lightbulb_service_with_color_temp + ) # Initial state is that the light is off state = await helper.poll_and_get_state() @@ -382,7 +420,9 @@ async def test_light_unloaded_removed(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a light unique id.""" aid = get_next_aid() @@ -391,7 +431,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_lightbulb_service_with_color_temp) + await setup_test_component(hass, aid, create_lightbulb_service_with_color_temp) assert ( entity_registry.async_get(light_entry.entity_id).unique_id @@ -400,7 +440,9 @@ async def test_migrate_unique_id( async def test_only_migrate_once( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we handle migration happening after an upgrade and than a downgrade and then an upgrade.""" aid = get_next_aid() @@ -414,7 +456,7 @@ async def test_only_migrate_once( "homekit_controller", f"00:00:00:00:00:00_{aid}_8", ) - await setup_test_component(hass, create_lightbulb_service_with_color_temp) + await setup_test_component(hass, aid, create_lightbulb_service_with_color_temp) assert ( entity_registry.async_get(old_light_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_lock.py b/tests/components/homekit_controller/test_lock.py index db248b82b1a..e56ca5fcffe 100644 --- a/tests/components/homekit_controller/test_lock.py +++ b/tests/components/homekit_controller/test_lock.py @@ -1,12 +1,14 @@ """Basic checks for HomeKitLock.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_lock_service(accessory): @@ -29,9 +31,11 @@ def create_lock_service(accessory): return service -async def test_switch_change_lock_state(hass: HomeAssistant) -> None: +async def test_switch_change_lock_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit lock on and off again.""" - helper = await setup_test_component(hass, create_lock_service) + helper = await setup_test_component(hass, get_next_aid(), create_lock_service) await hass.services.async_call( "lock", "lock", {"entity_id": "lock.testdevice"}, blocking=True @@ -54,9 +58,11 @@ async def test_switch_change_lock_state(hass: HomeAssistant) -> None: ) -async def test_switch_read_lock_state(hass: HomeAssistant) -> None: +async def test_switch_read_lock_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit lock accessory.""" - helper = await setup_test_component(hass, create_lock_service) + helper = await setup_test_component(hass, get_next_aid(), create_lock_service) state = await helper.async_update( ServicesTypes.LOCK_MECHANISM, @@ -119,7 +125,9 @@ async def test_switch_read_lock_state(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a lock unique id.""" aid = get_next_aid() @@ -128,7 +136,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_lock_service) + await setup_test_component(hass, aid, create_lock_service) assert ( entity_registry.async_get(lock_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_media_player.py b/tests/components/homekit_controller/test_media_player.py index 62a042ff7b9..a7f900217d7 100644 --- a/tests/components/homekit_controller/test_media_player.py +++ b/tests/components/homekit_controller/test_media_player.py @@ -1,5 +1,7 @@ """Basic checks for HomeKit motion sensors and contact sensors.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import ( CharacteristicPermissions, CharacteristicsTypes, @@ -10,7 +12,7 @@ import pytest from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_tv_service(accessory): @@ -62,9 +64,11 @@ def create_tv_service_with_target_media_state(accessory): return service -async def test_tv_read_state(hass: HomeAssistant) -> None: +async def test_tv_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit fan accessory.""" - helper = await setup_test_component(hass, create_tv_service) + helper = await setup_test_component(hass, get_next_aid(), create_tv_service) state = await helper.async_update( ServicesTypes.TELEVISION, @@ -91,18 +95,22 @@ async def test_tv_read_state(hass: HomeAssistant) -> None: assert state.state == "idle" -async def test_tv_read_sources(hass: HomeAssistant) -> None: +async def test_tv_read_sources( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the input source of a HomeKit TV.""" - helper = await setup_test_component(hass, create_tv_service) + helper = await setup_test_component(hass, get_next_aid(), create_tv_service) state = await helper.poll_and_get_state() assert state.attributes["source"] == "HDMI 1" assert state.attributes["source_list"] == ["HDMI 1", "HDMI 2"] -async def test_play_remote_key(hass: HomeAssistant) -> None: +async def test_play_remote_key( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can play media on a media player.""" - helper = await setup_test_component(hass, create_tv_service) + helper = await setup_test_component(hass, get_next_aid(), create_tv_service) await helper.async_update( ServicesTypes.TELEVISION, @@ -147,9 +155,11 @@ async def test_play_remote_key(hass: HomeAssistant) -> None: ) -async def test_pause_remote_key(hass: HomeAssistant) -> None: +async def test_pause_remote_key( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can pause a media player.""" - helper = await setup_test_component(hass, create_tv_service) + helper = await setup_test_component(hass, get_next_aid(), create_tv_service) await helper.async_update( ServicesTypes.TELEVISION, @@ -194,9 +204,11 @@ async def test_pause_remote_key(hass: HomeAssistant) -> None: ) -async def test_play(hass: HomeAssistant) -> None: +async def test_play(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can play media on a media player.""" - helper = await setup_test_component(hass, create_tv_service_with_target_media_state) + helper = await setup_test_component( + hass, get_next_aid(), create_tv_service_with_target_media_state + ) await helper.async_update( ServicesTypes.TELEVISION, @@ -243,9 +255,11 @@ async def test_play(hass: HomeAssistant) -> None: ) -async def test_pause(hass: HomeAssistant) -> None: +async def test_pause(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can turn pause a media player.""" - helper = await setup_test_component(hass, create_tv_service_with_target_media_state) + helper = await setup_test_component( + hass, get_next_aid(), create_tv_service_with_target_media_state + ) await helper.async_update( ServicesTypes.TELEVISION, @@ -291,9 +305,11 @@ async def test_pause(hass: HomeAssistant) -> None: ) -async def test_stop(hass: HomeAssistant) -> None: +async def test_stop(hass: HomeAssistant, get_next_aid: Callable[[], int]) -> None: """Test that we can stop a media player.""" - helper = await setup_test_component(hass, create_tv_service_with_target_media_state) + helper = await setup_test_component( + hass, get_next_aid(), create_tv_service_with_target_media_state + ) await hass.services.async_call( "media_player", @@ -332,9 +348,11 @@ async def test_stop(hass: HomeAssistant) -> None: ) -async def test_tv_set_source(hass: HomeAssistant) -> None: +async def test_tv_set_source( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set the input source of a HomeKit TV.""" - helper = await setup_test_component(hass, create_tv_service) + helper = await setup_test_component(hass, get_next_aid(), create_tv_service) await hass.services.async_call( "media_player", @@ -353,9 +371,11 @@ async def test_tv_set_source(hass: HomeAssistant) -> None: assert state.attributes["source"] == "HDMI 2" -async def test_tv_set_source_fail(hass: HomeAssistant) -> None: +async def test_tv_set_source_fail( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can set the input source of a HomeKit TV.""" - helper = await setup_test_component(hass, create_tv_service) + helper = await setup_test_component(hass, get_next_aid(), create_tv_service) with pytest.raises(ValueError): await hass.services.async_call( @@ -370,7 +390,9 @@ async def test_tv_set_source_fail(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a media_player unique id.""" aid = get_next_aid() @@ -379,7 +401,7 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-00:00:00:00:00:00-{aid}-8", ) - await setup_test_component(hass, create_tv_service_with_target_media_state) + await setup_test_component(hass, aid, create_tv_service_with_target_media_state) assert ( entity_registry.async_get(media_player_entry.entity_id).unique_id diff --git a/tests/components/homekit_controller/test_number.py b/tests/components/homekit_controller/test_number.py index 96e2cbe8d4d..fcbcc3ca7a8 100644 --- a/tests/components/homekit_controller/test_number.py +++ b/tests/components/homekit_controller/test_number.py @@ -1,12 +1,14 @@ """Basic checks for HomeKit sensor.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import Helper, get_next_aid, setup_test_component +from .common import Helper, setup_test_component def create_switch_with_spray_level(accessory): @@ -31,7 +33,9 @@ def create_switch_with_spray_level(accessory): async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a number unique id.""" aid = get_next_aid() @@ -41,7 +45,7 @@ async def test_migrate_unique_id( f"homekit-0001-aid:{aid}-sid:8-cid:9", suggested_object_id="testdevice_spray_quantity", ) - await setup_test_component(hass, create_switch_with_spray_level) + await setup_test_component(hass, aid, create_switch_with_spray_level) assert ( entity_registry.async_get(number.entity_id).unique_id @@ -49,9 +53,13 @@ async def test_migrate_unique_id( ) -async def test_read_number(hass: HomeAssistant) -> None: +async def test_read_number( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test a switch service that has a sensor characteristic is correctly handled.""" - helper = await setup_test_component(hass, create_switch_with_spray_level) + helper = await setup_test_component( + hass, get_next_aid(), create_switch_with_spray_level + ) # Helper will be for the primary entity, which is the outlet. Make a helper for the sensor. spray_level = Helper( @@ -75,9 +83,13 @@ async def test_read_number(hass: HomeAssistant) -> None: assert state.state == "5" -async def test_write_number(hass: HomeAssistant) -> None: +async def test_write_number( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test a switch service that has a sensor characteristic is correctly handled.""" - helper = await setup_test_component(hass, create_switch_with_spray_level) + helper = await setup_test_component( + hass, get_next_aid(), create_switch_with_spray_level + ) # Helper will be for the primary entity, which is the outlet. Make a helper for the sensor. spray_level = Helper( diff --git a/tests/components/homekit_controller/test_select.py b/tests/components/homekit_controller/test_select.py index b00206e1b0d..cd9357b78d9 100644 --- a/tests/components/homekit_controller/test_select.py +++ b/tests/components/homekit_controller/test_select.py @@ -1,5 +1,7 @@ """Basic checks for HomeKit select entities.""" +from collections.abc import Callable + from aiohomekit.model import Accessory from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.characteristics.const import TemperatureDisplayUnits @@ -8,7 +10,7 @@ from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import Helper, get_next_aid, setup_test_component +from .common import Helper, setup_test_component def create_service_with_ecobee_mode(accessory: Accessory): @@ -35,7 +37,9 @@ def create_service_with_temperature_units(accessory: Accessory): async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test we can migrate a select unique id.""" aid = get_next_aid() @@ -46,7 +50,7 @@ async def test_migrate_unique_id( suggested_object_id="testdevice_current_mode", ) - await setup_test_component(hass, create_service_with_ecobee_mode) + await setup_test_component(hass, aid, create_service_with_ecobee_mode) assert ( entity_registry.async_get(select.entity_id).unique_id @@ -54,9 +58,13 @@ async def test_migrate_unique_id( ) -async def test_read_current_mode(hass: HomeAssistant) -> None: +async def test_read_current_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that Ecobee mode can be correctly read and show as human readable text.""" - helper = await setup_test_component(hass, create_service_with_ecobee_mode) + helper = await setup_test_component( + hass, get_next_aid(), create_service_with_ecobee_mode + ) # Helper will be for the primary entity, which is the service. Make a helper for the sensor. ecobee_mode = Helper( @@ -92,9 +100,13 @@ async def test_read_current_mode(hass: HomeAssistant) -> None: assert state.state == "away" -async def test_write_current_mode(hass: HomeAssistant) -> None: +async def test_write_current_mode( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test can set a specific mode.""" - helper = await setup_test_component(hass, create_service_with_ecobee_mode) + helper = await setup_test_component( + hass, get_next_aid(), create_service_with_ecobee_mode + ) helper.accessory.services.first(service_type=ServicesTypes.THERMOSTAT) # Helper will be for the primary entity, which is the service. Make a helper for the sensor. @@ -140,9 +152,13 @@ async def test_write_current_mode(hass: HomeAssistant) -> None: ) -async def test_read_select(hass: HomeAssistant) -> None: +async def test_read_select( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test the generic select can read the current value.""" - helper = await setup_test_component(hass, create_service_with_temperature_units) + helper = await setup_test_component( + hass, get_next_aid(), create_service_with_temperature_units + ) # Helper will be for the primary entity, which is the service. Make a helper for the sensor. select_entity = Helper( @@ -170,9 +186,13 @@ async def test_read_select(hass: HomeAssistant) -> None: assert state.state == "fahrenheit" -async def test_write_select(hass: HomeAssistant) -> None: +async def test_write_select( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test can set a value.""" - helper = await setup_test_component(hass, create_service_with_temperature_units) + helper = await setup_test_component( + hass, get_next_aid(), create_service_with_temperature_units + ) helper.accessory.services.first(service_type=ServicesTypes.THERMOSTAT) # Helper will be for the primary entity, which is the service. Make a helper for the sensor. diff --git a/tests/components/homekit_controller/test_sensor.py b/tests/components/homekit_controller/test_sensor.py index 461d62742a5..ad896395e75 100644 --- a/tests/components/homekit_controller/test_sensor.py +++ b/tests/components/homekit_controller/test_sensor.py @@ -1,5 +1,6 @@ """Basic checks for HomeKit sensor.""" +from collections.abc import Callable from unittest.mock import patch from aiohomekit.model import Transport @@ -71,10 +72,12 @@ def create_battery_level_sensor(accessory): return service -async def test_temperature_sensor_read_state(hass: HomeAssistant) -> None: +async def test_temperature_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit temperature sensor accessory.""" helper = await setup_test_component( - hass, create_temperature_sensor_service, suffix="temperature" + hass, get_next_aid(), create_temperature_sensor_service, suffix="temperature" ) state = await helper.async_update( @@ -97,10 +100,12 @@ async def test_temperature_sensor_read_state(hass: HomeAssistant) -> None: assert state.attributes["state_class"] == SensorStateClass.MEASUREMENT -async def test_temperature_sensor_not_added_twice(hass: HomeAssistant) -> None: +async def test_temperature_sensor_not_added_twice( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """A standalone temperature sensor should not get a characteristic AND a service entity.""" helper = await setup_test_component( - hass, create_temperature_sensor_service, suffix="temperature" + hass, get_next_aid(), create_temperature_sensor_service, suffix="temperature" ) created_sensors = set() @@ -111,10 +116,12 @@ async def test_temperature_sensor_not_added_twice(hass: HomeAssistant) -> None: assert created_sensors == {helper.entity_id} -async def test_humidity_sensor_read_state(hass: HomeAssistant) -> None: +async def test_humidity_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit humidity sensor accessory.""" helper = await setup_test_component( - hass, create_humidity_sensor_service, suffix="humidity" + hass, get_next_aid(), create_humidity_sensor_service, suffix="humidity" ) state = await helper.async_update( @@ -136,10 +143,12 @@ async def test_humidity_sensor_read_state(hass: HomeAssistant) -> None: assert state.attributes["device_class"] == SensorDeviceClass.HUMIDITY -async def test_light_level_sensor_read_state(hass: HomeAssistant) -> None: +async def test_light_level_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit temperature sensor accessory.""" helper = await setup_test_component( - hass, create_light_level_sensor_service, suffix="light_level" + hass, get_next_aid(), create_light_level_sensor_service, suffix="light_level" ) state = await helper.async_update( @@ -161,10 +170,15 @@ async def test_light_level_sensor_read_state(hass: HomeAssistant) -> None: assert state.attributes["device_class"] == SensorDeviceClass.ILLUMINANCE -async def test_carbon_dioxide_level_sensor_read_state(hass: HomeAssistant) -> None: +async def test_carbon_dioxide_level_sensor_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit carbon dioxide sensor accessory.""" helper = await setup_test_component( - hass, create_carbon_dioxide_level_sensor_service, suffix="carbon_dioxide" + hass, + get_next_aid(), + create_carbon_dioxide_level_sensor_service, + suffix="carbon_dioxide", ) state = await helper.async_update( @@ -184,10 +198,12 @@ async def test_carbon_dioxide_level_sensor_read_state(hass: HomeAssistant) -> No assert state.state == "20" -async def test_battery_level_sensor(hass: HomeAssistant) -> None: +async def test_battery_level_sensor( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit battery level sensor.""" helper = await setup_test_component( - hass, create_battery_level_sensor, suffix="battery" + hass, get_next_aid(), create_battery_level_sensor, suffix="battery" ) state = await helper.async_update( @@ -211,10 +227,12 @@ async def test_battery_level_sensor(hass: HomeAssistant) -> None: assert state.attributes["device_class"] == SensorDeviceClass.BATTERY -async def test_battery_charging(hass: HomeAssistant) -> None: +async def test_battery_charging( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit battery's charging state.""" helper = await setup_test_component( - hass, create_battery_level_sensor, suffix="battery" + hass, get_next_aid(), create_battery_level_sensor, suffix="battery" ) state = await helper.async_update( @@ -235,10 +253,12 @@ async def test_battery_charging(hass: HomeAssistant) -> None: assert state.attributes["icon"] == "mdi:battery-charging-20" -async def test_battery_low(hass: HomeAssistant) -> None: +async def test_battery_low( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test reading the state of a HomeKit battery's low state.""" helper = await setup_test_component( - hass, create_battery_level_sensor, suffix="battery" + hass, get_next_aid(), create_battery_level_sensor, suffix="battery" ) state = await helper.async_update( @@ -277,9 +297,11 @@ def create_switch_with_sensor(accessory): return service -async def test_switch_with_sensor(hass: HomeAssistant) -> None: +async def test_switch_with_sensor( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test a switch service that has a sensor characteristic is correctly handled.""" - helper = await setup_test_component(hass, create_switch_with_sensor) + helper = await setup_test_component(hass, get_next_aid(), create_switch_with_sensor) # Helper will be for the primary entity, which is the outlet. Make a helper for the sensor. energy_helper = Helper( @@ -307,9 +329,11 @@ async def test_switch_with_sensor(hass: HomeAssistant) -> None: assert state.state == "50" -async def test_sensor_unavailable(hass: HomeAssistant) -> None: +async def test_sensor_unavailable( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test a sensor becoming unavailable.""" - helper = await setup_test_component(hass, create_switch_with_sensor) + helper = await setup_test_component(hass, get_next_aid(), create_switch_with_sensor) outlet = helper.accessory.services.first(service_type=ServicesTypes.OUTLET) on_char = outlet[CharacteristicsTypes.ON] @@ -383,7 +407,9 @@ def test_thread_status_to_str() -> None: @pytest.mark.usefixtures("enable_bluetooth", "entity_registry_enabled_by_default") -async def test_rssi_sensor(hass: HomeAssistant) -> None: +async def test_rssi_sensor( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test an rssi sensor.""" inject_bluetooth_service_info(hass, TEST_DEVICE_SERVICE_INFO) @@ -398,14 +424,20 @@ async def test_rssi_sensor(hass: HomeAssistant) -> None: # Any accessory will do for this test, but we need at least # one or the rssi sensor will not be created await setup_test_component( - hass, create_battery_level_sensor, suffix="battery", connection="BLE" + hass, + get_next_aid(), + create_battery_level_sensor, + suffix="battery", + connection="BLE", ) assert hass.states.get("sensor.testdevice_signal_strength").state == "-56" @pytest.mark.usefixtures("enable_bluetooth", "entity_registry_enabled_by_default") async def test_migrate_rssi_sensor_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test an rssi sensor unique id migration.""" rssi_sensor = entity_registry.async_get_or_create( @@ -428,7 +460,11 @@ async def test_migrate_rssi_sensor_unique_id( # Any accessory will do for this test, but we need at least # one or the rssi sensor will not be created await setup_test_component( - hass, create_battery_level_sensor, suffix="battery", connection="BLE" + hass, + get_next_aid(), + create_battery_level_sensor, + suffix="battery", + connection="BLE", ) assert hass.states.get("sensor.renamed_rssi").state == "-56" diff --git a/tests/components/homekit_controller/test_storage.py b/tests/components/homekit_controller/test_storage.py index 9523dc9abb7..ab7d7afd6fe 100644 --- a/tests/components/homekit_controller/test_storage.py +++ b/tests/components/homekit_controller/test_storage.py @@ -1,5 +1,6 @@ """Basic checks for entity map storage.""" +from collections.abc import Callable from typing import Any from aiohomekit.model.characteristics import CharacteristicsTypes @@ -72,10 +73,10 @@ def create_lightbulb_service(accessory): async def test_storage_is_updated_on_add( - hass: HomeAssistant, hass_storage: dict[str, Any] + hass: HomeAssistant, hass_storage: dict[str, Any], get_next_aid: Callable[[], int] ) -> None: """Test entity map storage is cleaned up on adding an accessory.""" - await setup_test_component(hass, create_lightbulb_service) + await setup_test_component(hass, get_next_aid(), create_lightbulb_service) entity_map: EntityMapStorage = hass.data[ENTITY_MAP] hkid = "00:00:00:00:00:00" diff --git a/tests/components/homekit_controller/test_switch.py b/tests/components/homekit_controller/test_switch.py index 8a6b2a65e88..1fc49c5c636 100644 --- a/tests/components/homekit_controller/test_switch.py +++ b/tests/components/homekit_controller/test_switch.py @@ -1,5 +1,7 @@ """Basic checks for HomeKitSwitch.""" +from collections.abc import Callable + from aiohomekit.model.characteristics import ( CharacteristicsTypes, InUseValues, @@ -10,7 +12,7 @@ from aiohomekit.model.services import ServicesTypes from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from .common import get_next_aid, setup_test_component +from .common import setup_test_component def create_switch_service(accessory): @@ -50,9 +52,11 @@ def create_char_switch_service(accessory): on_char.value = False -async def test_switch_change_outlet_state(hass: HomeAssistant) -> None: +async def test_switch_change_outlet_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a HomeKit outlet on and off again.""" - helper = await setup_test_component(hass, create_switch_service) + helper = await setup_test_component(hass, get_next_aid(), create_switch_service) await hass.services.async_call( "switch", "turn_on", {"entity_id": "switch.testdevice"}, blocking=True @@ -75,9 +79,11 @@ async def test_switch_change_outlet_state(hass: HomeAssistant) -> None: ) -async def test_switch_read_outlet_state(hass: HomeAssistant) -> None: +async def test_switch_read_outlet_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit outlet accessory.""" - helper = await setup_test_component(hass, create_switch_service) + helper = await setup_test_component(hass, get_next_aid(), create_switch_service) # Initial state is that the switch is off and the outlet isn't in use switch_1 = await helper.poll_and_get_state() @@ -108,9 +114,11 @@ async def test_switch_read_outlet_state(hass: HomeAssistant) -> None: assert switch_1.attributes["outlet_in_use"] is True -async def test_valve_change_active_state(hass: HomeAssistant) -> None: +async def test_valve_change_active_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a valve on and off again.""" - helper = await setup_test_component(hass, create_valve_service) + helper = await setup_test_component(hass, get_next_aid(), create_valve_service) await hass.services.async_call( "switch", "turn_on", {"entity_id": "switch.testdevice"}, blocking=True @@ -133,9 +141,11 @@ async def test_valve_change_active_state(hass: HomeAssistant) -> None: ) -async def test_valve_read_state(hass: HomeAssistant) -> None: +async def test_valve_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a valve accessory.""" - helper = await setup_test_component(hass, create_valve_service) + helper = await setup_test_component(hass, get_next_aid(), create_valve_service) # Initial state is that the switch is off and the outlet isn't in use switch_1 = await helper.poll_and_get_state() @@ -166,10 +176,12 @@ async def test_valve_read_state(hass: HomeAssistant) -> None: assert switch_1.attributes["in_use"] is False -async def test_char_switch_change_state(hass: HomeAssistant) -> None: +async def test_char_switch_change_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can turn a characteristic on and off again.""" helper = await setup_test_component( - hass, create_char_switch_service, suffix="pairing_mode" + hass, get_next_aid(), create_char_switch_service, suffix="pairing_mode" ) await hass.services.async_call( @@ -199,10 +211,12 @@ async def test_char_switch_change_state(hass: HomeAssistant) -> None: ) -async def test_char_switch_read_state(hass: HomeAssistant) -> None: +async def test_char_switch_read_state( + hass: HomeAssistant, get_next_aid: Callable[[], int] +) -> None: """Test that we can read the state of a HomeKit characteristic switch.""" helper = await setup_test_component( - hass, create_char_switch_service, suffix="pairing_mode" + hass, get_next_aid(), create_char_switch_service, suffix="pairing_mode" ) # Simulate that someone switched on the device in the real world not via HA @@ -221,7 +235,9 @@ async def test_char_switch_read_state(hass: HomeAssistant) -> None: async def test_migrate_unique_id( - hass: HomeAssistant, entity_registry: er.EntityRegistry + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + get_next_aid: Callable[[], int], ) -> None: """Test a we can migrate a switch unique id.""" aid = get_next_aid() @@ -235,7 +251,9 @@ async def test_migrate_unique_id( "homekit_controller", f"homekit-0001-aid:{aid}-sid:8-cid:9", ) - await setup_test_component(hass, create_char_switch_service, suffix="pairing_mode") + await setup_test_component( + hass, aid, create_char_switch_service, suffix="pairing_mode" + ) assert ( entity_registry.async_get(switch_entry.entity_id).unique_id