mirror of
https://github.com/home-assistant/core.git
synced 2025-04-23 16:57:53 +00:00
Home Connect test improvements (#141135)
* Home Connect test improvements * Remove `appliance_ha_id` fixture in favour of `appliance` fixture
This commit is contained in:
parent
883ce6842d
commit
d8a5881eaa
@ -473,20 +473,6 @@ def mock_client_with_exception(
|
||||
return mock
|
||||
|
||||
|
||||
@pytest.fixture(name="appliance_ha_id")
|
||||
def mock_appliance_ha_id(
|
||||
appliances: list[HomeAppliance], request: pytest.FixtureRequest
|
||||
) -> str:
|
||||
"""Fixture to get the ha_id of an appliance."""
|
||||
appliance_type = "Washer"
|
||||
if hasattr(request, "param") and request.param:
|
||||
appliance_type = request.param
|
||||
for appliance in appliances:
|
||||
if appliance.type == appliance_type:
|
||||
return appliance.ha_id
|
||||
raise ValueError(f"Appliance {appliance_type} not found")
|
||||
|
||||
|
||||
@pytest.fixture(name="appliances")
|
||||
def mock_appliances(
|
||||
appliances_data: str, request: pytest.FixtureRequest
|
||||
|
@ -1,5 +1,5 @@
|
||||
# serializer version: 1
|
||||
# name: test_set_program_and_options[service_call0-set_selected_program]
|
||||
# name: test_set_program_and_options[service_call0-set_selected_program-Washer]
|
||||
_Call(
|
||||
tuple(
|
||||
'SIEMENS-HCS03WCH1-7BC6383CF794',
|
||||
@ -18,7 +18,7 @@
|
||||
}),
|
||||
)
|
||||
# ---
|
||||
# name: test_set_program_and_options[service_call1-start_program]
|
||||
# name: test_set_program_and_options[service_call1-start_program-Washer]
|
||||
_Call(
|
||||
tuple(
|
||||
'SIEMENS-HCS03WCH1-7BC6383CF794',
|
||||
@ -37,7 +37,7 @@
|
||||
}),
|
||||
)
|
||||
# ---
|
||||
# name: test_set_program_and_options[service_call2-set_active_program_options]
|
||||
# name: test_set_program_and_options[service_call2-set_active_program_options-Washer]
|
||||
_Call(
|
||||
tuple(
|
||||
'SIEMENS-HCS03WCH1-7BC6383CF794',
|
||||
@ -57,7 +57,7 @@
|
||||
}),
|
||||
)
|
||||
# ---
|
||||
# name: test_set_program_and_options[service_call3-set_selected_program_options]
|
||||
# name: test_set_program_and_options[service_call3-set_selected_program_options-Washer]
|
||||
_Call(
|
||||
tuple(
|
||||
'SIEMENS-HCS03WCH1-7BC6383CF794',
|
||||
|
@ -3,7 +3,14 @@
|
||||
from collections.abc import Awaitable, Callable
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
|
||||
from aiohomeconnect.model import ArrayOfEvents, Event, EventKey, EventMessage, EventType
|
||||
from aiohomeconnect.model import (
|
||||
ArrayOfEvents,
|
||||
Event,
|
||||
EventKey,
|
||||
EventMessage,
|
||||
EventType,
|
||||
HomeAppliance,
|
||||
)
|
||||
from aiohomeconnect.model.error import HomeConnectApiError
|
||||
import pytest
|
||||
|
||||
@ -52,8 +59,9 @@ async def test_binary_sensors(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -67,7 +75,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -75,7 +83,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -83,7 +91,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -92,7 +100,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -100,13 +108,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -123,7 +132,7 @@ async def test_connected_devices(
|
||||
get_status_original_mock = client.get_status
|
||||
|
||||
def get_status_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -135,14 +144,14 @@ async def test_connected_devices(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
client.get_status = get_status_original_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -150,19 +159,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
async def test_binary_sensors_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_binary_sensors_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if binary sensor entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -181,7 +191,7 @@ async def test_binary_sensors_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -195,7 +205,7 @@ async def test_binary_sensors_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -209,6 +219,7 @@ async def test_binary_sensors_entity_availabilty(
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("value", "expected"),
|
||||
[
|
||||
@ -219,7 +230,7 @@ async def test_binary_sensors_entity_availabilty(
|
||||
],
|
||||
)
|
||||
async def test_binary_sensors_door_states(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
expected: str,
|
||||
value: str,
|
||||
hass: HomeAssistant,
|
||||
@ -237,7 +248,7 @@ async def test_binary_sensors_door_states(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.STATUS,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -259,7 +270,7 @@ async def test_binary_sensors_door_states(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "event_key", "event_value_update", "expected", "appliance_ha_id"),
|
||||
("entity_id", "event_key", "event_value_update", "expected", "appliance"),
|
||||
[
|
||||
(
|
||||
"binary_sensor.washer_remote_control",
|
||||
@ -304,13 +315,13 @@ async def test_binary_sensors_door_states(
|
||||
"FridgeFreezer",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_binary_sensors_functionality(
|
||||
entity_id: str,
|
||||
event_key: EventKey,
|
||||
event_value_update: str,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
expected: str,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
@ -325,7 +336,7 @@ async def test_binary_sensors_functionality(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.STATUS,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -346,13 +357,14 @@ async def test_binary_sensors_functionality(
|
||||
assert hass.states.is_state(entity_id, expected)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_connected_sensor_functionality(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if the connected binary sensor reports the right values."""
|
||||
entity_id = "binary_sensor.washer_connectivity"
|
||||
@ -365,7 +377,7 @@ async def test_connected_sensor_functionality(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -378,7 +390,7 @@ async def test_connected_sensor_functionality(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
|
@ -4,7 +4,12 @@ from collections.abc import Awaitable, Callable
|
||||
from typing import Any
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
|
||||
from aiohomeconnect.model import ArrayOfCommands, CommandKey, EventMessage
|
||||
from aiohomeconnect.model import (
|
||||
ArrayOfCommands,
|
||||
CommandKey,
|
||||
EventMessage,
|
||||
HomeAppliance,
|
||||
)
|
||||
from aiohomeconnect.model.command import Command
|
||||
from aiohomeconnect.model.error import HomeConnectApiError
|
||||
from aiohomeconnect.model.event import ArrayOfEvents, EventType
|
||||
@ -40,8 +45,9 @@ async def test_buttons(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -55,7 +61,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -63,7 +69,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -71,7 +77,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -80,7 +86,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -88,13 +94,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -112,14 +119,14 @@ async def test_connected_devices(
|
||||
get_available_programs_mock = client.get_available_programs
|
||||
|
||||
async def get_available_commands_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
return await get_available_commands_original_mock.side_effect(ha_id)
|
||||
|
||||
async def get_available_programs_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -137,14 +144,14 @@ async def test_connected_devices(
|
||||
client.get_available_commands = get_available_commands_original_mock
|
||||
client.get_available_programs = get_available_programs_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -152,19 +159,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
async def test_button_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_button_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if button entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -183,7 +191,7 @@ async def test_button_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -197,7 +205,7 @@ async def test_button_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -211,6 +219,7 @@ async def test_button_entity_availabilty(
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "method_call", "expected_kwargs"),
|
||||
[
|
||||
@ -231,7 +240,7 @@ async def test_button_functionality(
|
||||
entity_id: str,
|
||||
method_call: str,
|
||||
expected_kwargs: dict[str, Any],
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if button entities availability are based on the appliance connection state."""
|
||||
assert config_entry.state == ConfigEntryState.NOT_LOADED
|
||||
@ -248,7 +257,7 @@ async def test_button_functionality(
|
||||
{ATTR_ENTITY_ID: entity_id},
|
||||
blocking=True,
|
||||
)
|
||||
getattr(client, method_call).assert_called_with(appliance_ha_id, **expected_kwargs)
|
||||
getattr(client, method_call).assert_called_with(appliance.ha_id, **expected_kwargs)
|
||||
|
||||
|
||||
async def test_command_button_exception(
|
||||
|
@ -31,8 +31,17 @@ from homeassistant.components.home_connect.const import (
|
||||
BSH_POWER_OFF,
|
||||
DOMAIN,
|
||||
)
|
||||
from homeassistant.components.homeassistant import (
|
||||
DOMAIN as HA_DOMAIN,
|
||||
SERVICE_UPDATE_ENTITY,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntries, ConfigEntryState
|
||||
from homeassistant.const import EVENT_STATE_REPORTED, Platform
|
||||
from homeassistant.const import (
|
||||
ATTR_ENTITY_ID,
|
||||
EVENT_STATE_REPORTED,
|
||||
STATE_UNAVAILABLE,
|
||||
Platform,
|
||||
)
|
||||
from homeassistant.core import (
|
||||
Event as HassEvent,
|
||||
EventStateReportedData,
|
||||
@ -98,30 +107,30 @@ async def test_coordinator_failure_refresh_and_stream(
|
||||
)
|
||||
entity_id_1 = "binary_sensor.washer_remote_control"
|
||||
entity_id_2 = "binary_sensor.washer_remote_start"
|
||||
await async_setup_component(hass, "homeassistant", {})
|
||||
await async_setup_component(hass, HA_DOMAIN, {})
|
||||
await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
state = hass.states.get(entity_id_1)
|
||||
assert state
|
||||
assert state.state != "unavailable"
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
state = hass.states.get(entity_id_2)
|
||||
assert state
|
||||
assert state.state != "unavailable"
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
client.get_home_appliances.side_effect = HomeConnectError()
|
||||
|
||||
# Force a coordinator refresh.
|
||||
await hass.services.async_call(
|
||||
"homeassistant", "update_entity", {"entity_id": entity_id_1}, blocking=True
|
||||
HA_DOMAIN, SERVICE_UPDATE_ENTITY, {ATTR_ENTITY_ID: entity_id_1}, blocking=True
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get(entity_id_1)
|
||||
assert state
|
||||
assert state.state == "unavailable"
|
||||
assert state.state == STATE_UNAVAILABLE
|
||||
state = hass.states.get(entity_id_2)
|
||||
assert state
|
||||
assert state.state == "unavailable"
|
||||
assert state.state == STATE_UNAVAILABLE
|
||||
|
||||
# Test that the entity becomes available again after a successful update.
|
||||
|
||||
@ -137,16 +146,16 @@ async def test_coordinator_failure_refresh_and_stream(
|
||||
|
||||
# Force a coordinator refresh.
|
||||
await hass.services.async_call(
|
||||
"homeassistant", "update_entity", {"entity_id": entity_id_1}, blocking=True
|
||||
HA_DOMAIN, SERVICE_UPDATE_ENTITY, {ATTR_ENTITY_ID: entity_id_1}, blocking=True
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get(entity_id_1)
|
||||
assert state
|
||||
assert state.state != "unavailable"
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
state = hass.states.get(entity_id_2)
|
||||
assert state
|
||||
assert state.state != "unavailable"
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
# Test that the event stream makes the entity go available too.
|
||||
|
||||
@ -160,16 +169,16 @@ async def test_coordinator_failure_refresh_and_stream(
|
||||
|
||||
# Force a coordinator refresh
|
||||
await hass.services.async_call(
|
||||
"homeassistant", "update_entity", {"entity_id": entity_id_1}, blocking=True
|
||||
HA_DOMAIN, SERVICE_UPDATE_ENTITY, {ATTR_ENTITY_ID: entity_id_1}, blocking=True
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get(entity_id_1)
|
||||
assert state
|
||||
assert state.state == "unavailable"
|
||||
assert state.state == STATE_UNAVAILABLE
|
||||
state = hass.states.get(entity_id_2)
|
||||
assert state
|
||||
assert state.state == "unavailable"
|
||||
assert state.state == STATE_UNAVAILABLE
|
||||
|
||||
# Now make the entity available again.
|
||||
client.get_home_appliances.side_effect = None
|
||||
@ -199,10 +208,10 @@ async def test_coordinator_failure_refresh_and_stream(
|
||||
|
||||
state = hass.states.get(entity_id_1)
|
||||
assert state
|
||||
assert state.state != "unavailable"
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
state = hass.states.get(entity_id_2)
|
||||
assert state
|
||||
assert state.state != "unavailable"
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@ -235,9 +244,9 @@ async def test_coordinator_update_failing(
|
||||
getattr(client, mock_method).assert_called()
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Dishwasher"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Dishwasher"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("event_type", "event_key", "event_value", "entity_id"),
|
||||
("event_type", "event_key", "event_value", ATTR_ENTITY_ID),
|
||||
[
|
||||
(
|
||||
EventType.STATUS,
|
||||
@ -269,7 +278,7 @@ async def test_event_listener(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_registry: er.EntityRegistry,
|
||||
) -> None:
|
||||
"""Test that the event listener works."""
|
||||
@ -280,7 +289,7 @@ async def test_event_listener(
|
||||
state = hass.states.get(entity_id)
|
||||
assert state
|
||||
event_message = EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
event_type,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -327,13 +336,14 @@ async def test_event_listener(
|
||||
listener.assert_called_once_with(new_entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def tests_receive_setting_and_status_for_first_time_at_events(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test that the event listener is capable of receiving settings and status for the first time."""
|
||||
client.get_setting = AsyncMock(return_value=ArrayOfSettings([]))
|
||||
@ -346,7 +356,7 @@ async def tests_receive_setting_and_status_for_first_time_at_events(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.NOTIFY,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -362,7 +372,7 @@ async def tests_receive_setting_and_status_for_first_time_at_events(
|
||||
),
|
||||
),
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.STATUS,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -519,7 +529,7 @@ async def test_devices_updated_on_refresh(
|
||||
return_value=ArrayOfHomeAppliances(appliances[:2]),
|
||||
)
|
||||
|
||||
await async_setup_component(hass, "homeassistant", {})
|
||||
await async_setup_component(hass, HA_DOMAIN, {})
|
||||
assert config_entry.state == ConfigEntryState.NOT_LOADED
|
||||
await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
@ -532,9 +542,9 @@ async def test_devices_updated_on_refresh(
|
||||
return_value=ArrayOfHomeAppliances(appliances[1:3]),
|
||||
)
|
||||
await hass.services.async_call(
|
||||
"homeassistant",
|
||||
"update_entity",
|
||||
{"entity_id": "switch.dishwasher_power"},
|
||||
HA_DOMAIN,
|
||||
SERVICE_UPDATE_ENTITY,
|
||||
{ATTR_ENTITY_ID: "switch.dishwasher_power"},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
|
@ -11,6 +11,7 @@ from aiohomeconnect.model import (
|
||||
EventKey,
|
||||
EventMessage,
|
||||
EventType,
|
||||
HomeAppliance,
|
||||
Option,
|
||||
OptionKey,
|
||||
Program,
|
||||
@ -67,7 +68,7 @@ def platforms() -> list[str]:
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
"option_entity_id",
|
||||
"options_state_stage_1",
|
||||
"options_availability_stage_2",
|
||||
@ -91,12 +92,12 @@ def platforms() -> list[str]:
|
||||
(OptionKey.DISHCARE_DISHWASHER_EXTRA_DRY, "switch.dishwasher_extra_dry"),
|
||||
)
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_program_options_retrieval(
|
||||
array_of_programs_program_arg: str,
|
||||
event_key: EventKey,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
option_entity_id: dict[OptionKey, str],
|
||||
options_state_stage_1: list[tuple[str, bool | None]],
|
||||
options_availability_stage_2: list[bool],
|
||||
@ -122,7 +123,7 @@ async def test_program_options_retrieval(
|
||||
]
|
||||
|
||||
async def get_all_programs_with_options_mock(ha_id: str) -> ArrayOfPrograms:
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return await original_get_all_programs_mock(ha_id)
|
||||
|
||||
array_of_programs: ArrayOfPrograms = await original_get_all_programs_mock(ha_id)
|
||||
@ -204,7 +205,7 @@ async def test_program_options_retrieval(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.NOTIFY,
|
||||
data=ArrayOfEvents(
|
||||
[
|
||||
@ -235,6 +236,7 @@ async def test_program_options_retrieval(
|
||||
assert hass.states.is_state(entity_id, STATE_UNKNOWN)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("array_of_programs_program_arg", "event_key"),
|
||||
[
|
||||
@ -251,7 +253,7 @@ async def test_program_options_retrieval(
|
||||
async def test_no_options_retrieval_on_unknown_program(
|
||||
array_of_programs_program_arg: str,
|
||||
event_key: EventKey,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -285,7 +287,7 @@ async def test_no_options_retrieval_on_unknown_program(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.NOTIFY,
|
||||
data=ArrayOfEvents(
|
||||
[
|
||||
@ -315,7 +317,7 @@ async def test_no_options_retrieval_on_unknown_program(
|
||||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
("appliance_ha_id", "option_key", "option_entity_id"),
|
||||
("appliance", "option_key", "option_entity_id"),
|
||||
[
|
||||
(
|
||||
"Dishwasher",
|
||||
@ -323,11 +325,11 @@ async def test_no_options_retrieval_on_unknown_program(
|
||||
"switch.dishwasher_half_load",
|
||||
)
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_program_options_retrieval_after_appliance_connection(
|
||||
event_key: EventKey,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
option_key: OptionKey,
|
||||
option_entity_id: str,
|
||||
hass: HomeAssistant,
|
||||
@ -344,7 +346,7 @@ async def test_program_options_retrieval_after_appliance_connection(
|
||||
[
|
||||
appliance
|
||||
for appliance in array_of_home_appliances.homeappliances
|
||||
if appliance.ha_id != appliance_ha_id
|
||||
if appliance.ha_id != appliance.ha_id
|
||||
]
|
||||
)
|
||||
|
||||
@ -367,7 +369,7 @@ async def test_program_options_retrieval_after_appliance_connection(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents(
|
||||
[
|
||||
@ -405,7 +407,7 @@ async def test_program_options_retrieval_after_appliance_connection(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.NOTIFY,
|
||||
data=ArrayOfEvents(
|
||||
[
|
||||
@ -450,7 +452,6 @@ async def test_program_options_retrieval_after_appliance_connection(
|
||||
async def test_option_entity_functionality_exception(
|
||||
set_active_program_option_side_effect: HomeConnectError | None,
|
||||
set_selected_program_option_side_effect: HomeConnectError | None,
|
||||
appliance_ha_id: str,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
|
@ -5,7 +5,7 @@ from typing import Any
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
from aiohomeconnect.const import OAUTH2_TOKEN
|
||||
from aiohomeconnect.model import SettingKey, StatusKey
|
||||
from aiohomeconnect.model import HomeAppliance, SettingKey, StatusKey
|
||||
from aiohomeconnect.model.error import (
|
||||
HomeConnectError,
|
||||
TooManyRequestsError,
|
||||
@ -247,6 +247,7 @@ async def test_client_rate_limit_error(
|
||||
asyncio_sleep_mock.assert_called_once_with(retry_after)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_required_program_or_at_least_an_option(
|
||||
hass: HomeAssistant,
|
||||
device_registry: dr.DeviceRegistry,
|
||||
@ -254,7 +255,7 @@ async def test_required_program_or_at_least_an_option(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"Test that the set_program_and_options does raise an exception if no program nor options are set."
|
||||
|
||||
@ -264,7 +265,7 @@ async def test_required_program_or_at_least_an_option(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
with pytest.raises(
|
||||
@ -281,12 +282,13 @@ async def test_required_program_or_at_least_an_option(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_entity_migration(
|
||||
hass: HomeAssistant,
|
||||
device_registry: dr.DeviceRegistry,
|
||||
entity_registry: er.EntityRegistry,
|
||||
config_entry_v1_1: MockConfigEntry,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
platforms: list[Platform],
|
||||
) -> None:
|
||||
"""Test entity migration."""
|
||||
@ -295,7 +297,7 @@ async def test_entity_migration(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry_v1_1.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
test_entities = [
|
||||
@ -335,7 +337,7 @@ async def test_entity_migration(
|
||||
entity_registry.async_get_or_create(
|
||||
domain,
|
||||
DOMAIN,
|
||||
f"{appliance_ha_id}-{old_unique_id_suffix}",
|
||||
f"{appliance.ha_id}-{old_unique_id_suffix}",
|
||||
device_id=device_entry.id,
|
||||
config_entry=config_entry_v1_1,
|
||||
)
|
||||
@ -346,7 +348,7 @@ async def test_entity_migration(
|
||||
|
||||
for domain, _, expected_unique_id_suffix in test_entities:
|
||||
assert entity_registry.async_get_entity_id(
|
||||
domain, DOMAIN, f"{appliance_ha_id}-{expected_unique_id_suffix}"
|
||||
domain, DOMAIN, f"{appliance.ha_id}-{expected_unique_id_suffix}"
|
||||
)
|
||||
assert config_entry_v1_1.minor_version == 2
|
||||
|
||||
|
@ -12,6 +12,7 @@ from aiohomeconnect.model import (
|
||||
EventMessage,
|
||||
EventType,
|
||||
GetSetting,
|
||||
HomeAppliance,
|
||||
SettingKey,
|
||||
)
|
||||
from aiohomeconnect.model.error import HomeConnectApiError, HomeConnectError
|
||||
@ -21,9 +22,15 @@ from homeassistant.components.home_connect.const import (
|
||||
BSH_AMBIENT_LIGHT_COLOR_CUSTOM_COLOR,
|
||||
DOMAIN,
|
||||
)
|
||||
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
||||
from homeassistant.components.light import (
|
||||
ATTR_BRIGHTNESS,
|
||||
ATTR_HS_COLOR,
|
||||
ATTR_RGB_COLOR,
|
||||
DOMAIN as LIGHT_DOMAIN,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntryState
|
||||
from homeassistant.const import (
|
||||
ATTR_ENTITY_ID,
|
||||
SERVICE_TURN_OFF,
|
||||
SERVICE_TURN_ON,
|
||||
STATE_OFF,
|
||||
@ -58,9 +65,9 @@ async def test_light(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -74,7 +81,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -82,7 +89,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -90,7 +97,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -99,7 +106,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -107,14 +114,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -132,14 +139,14 @@ async def test_connected_devices(
|
||||
get_available_programs_mock = client.get_available_programs
|
||||
|
||||
async def get_settings_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
return await get_settings_original_mock.side_effect(ha_id)
|
||||
|
||||
async def get_available_programs_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -155,14 +162,14 @@ async def test_connected_devices(
|
||||
client.get_settings = get_settings_original_mock
|
||||
client.get_available_programs = get_available_programs_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -170,20 +177,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
async def test_light_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
async def test_light_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if light entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -201,7 +208,7 @@ async def test_light_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -215,7 +222,7 @@ async def test_light_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -236,7 +243,7 @@ async def test_light_availabilty(
|
||||
"service",
|
||||
"exprected_attributes",
|
||||
"state",
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
),
|
||||
[
|
||||
(
|
||||
@ -256,7 +263,7 @@ async def test_light_availabilty(
|
||||
SettingKey.COOKING_COMMON_LIGHTING_BRIGHTNESS: 80,
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{"brightness": 199},
|
||||
{ATTR_BRIGHTNESS: 199},
|
||||
STATE_ON,
|
||||
"Hood",
|
||||
),
|
||||
@ -277,7 +284,7 @@ async def test_light_availabilty(
|
||||
SettingKey.BSH_COMMON_AMBIENT_LIGHT_BRIGHTNESS: 80,
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{"brightness": 199},
|
||||
{ATTR_BRIGHTNESS: 199},
|
||||
STATE_ON,
|
||||
"Hood",
|
||||
),
|
||||
@ -310,7 +317,7 @@ async def test_light_availabilty(
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{
|
||||
"rgb_color": (255, 255, 0),
|
||||
ATTR_RGB_COLOR: (255, 255, 0),
|
||||
},
|
||||
STATE_ON,
|
||||
"Hood",
|
||||
@ -324,8 +331,8 @@ async def test_light_availabilty(
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{
|
||||
"hs_color": (255.484, 15.196),
|
||||
"brightness": 199,
|
||||
ATTR_HS_COLOR: (255.484, 15.196),
|
||||
ATTR_BRIGHTNESS: 199,
|
||||
},
|
||||
STATE_ON,
|
||||
"Hood",
|
||||
@ -341,7 +348,7 @@ async def test_light_availabilty(
|
||||
"FridgeFreezer",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_light_functionality(
|
||||
entity_id: str,
|
||||
@ -349,7 +356,7 @@ async def test_light_functionality(
|
||||
service: str,
|
||||
exprected_attributes: dict[str, Any],
|
||||
state: str,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -362,7 +369,7 @@ async def test_light_functionality(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
service_data = exprected_attributes.copy()
|
||||
service_data["entity_id"] = entity_id
|
||||
service_data[ATTR_ENTITY_ID] = entity_id
|
||||
await hass.services.async_call(
|
||||
LIGHT_DOMAIN,
|
||||
service,
|
||||
@ -371,7 +378,7 @@ async def test_light_functionality(
|
||||
await hass.async_block_till_done()
|
||||
client.set_setting.assert_has_calls(
|
||||
[
|
||||
call(appliance_ha_id, setting_key=setting_key, value=value)
|
||||
call(appliance.ha_id, setting_key=setting_key, value=value)
|
||||
for setting_key, value in set_settings_args.items()
|
||||
]
|
||||
)
|
||||
@ -386,7 +393,7 @@ async def test_light_functionality(
|
||||
(
|
||||
"entity_id",
|
||||
"events",
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
),
|
||||
[
|
||||
(
|
||||
@ -397,12 +404,12 @@ async def test_light_functionality(
|
||||
"Hood",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_light_color_different_than_custom(
|
||||
entity_id: str,
|
||||
events: dict[EventKey, Any],
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -417,21 +424,21 @@ async def test_light_color_different_than_custom(
|
||||
LIGHT_DOMAIN,
|
||||
SERVICE_TURN_ON,
|
||||
{
|
||||
"rgb_color": (255, 255, 0),
|
||||
"entity_id": entity_id,
|
||||
ATTR_RGB_COLOR: (255, 255, 0),
|
||||
ATTR_ENTITY_ID: entity_id,
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
entity_state = hass.states.get(entity_id)
|
||||
assert entity_state is not None
|
||||
assert entity_state.state == STATE_ON
|
||||
assert entity_state.attributes["rgb_color"] is not None
|
||||
assert entity_state.attributes["hs_color"] is not None
|
||||
assert entity_state.attributes[ATTR_RGB_COLOR] is not None
|
||||
assert entity_state.attributes[ATTR_HS_COLOR] is not None
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.NOTIFY,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -454,8 +461,8 @@ async def test_light_color_different_than_custom(
|
||||
entity_state = hass.states.get(entity_id)
|
||||
assert entity_state is not None
|
||||
assert entity_state.state == STATE_ON
|
||||
assert entity_state.attributes["rgb_color"] is None
|
||||
assert entity_state.attributes["hs_color"] is None
|
||||
assert entity_state.attributes[ATTR_RGB_COLOR] is None
|
||||
assert entity_state.attributes[ATTR_HS_COLOR] is None
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@ -485,7 +492,7 @@ async def test_light_color_different_than_custom(
|
||||
SettingKey.COOKING_COMMON_LIGHTING_BRIGHTNESS: 70,
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{"brightness": 200},
|
||||
{ATTR_BRIGHTNESS: 200},
|
||||
[HomeConnectError, HomeConnectError],
|
||||
r"Error.*turn.*on.*",
|
||||
),
|
||||
@ -517,7 +524,7 @@ async def test_light_color_different_than_custom(
|
||||
SettingKey.BSH_COMMON_AMBIENT_LIGHT_BRIGHTNESS: 70,
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{"brightness": 200},
|
||||
{ATTR_BRIGHTNESS: 200},
|
||||
[HomeConnectError, None, HomeConnectError],
|
||||
r"Error.*set.*brightness.*",
|
||||
),
|
||||
@ -530,7 +537,7 @@ async def test_light_color_different_than_custom(
|
||||
SettingKey.BSH_COMMON_AMBIENT_LIGHT_CUSTOM_COLOR: "#ffff00",
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{"rgb_color": (255, 255, 0)},
|
||||
{ATTR_RGB_COLOR: (255, 255, 0)},
|
||||
[HomeConnectError, None, HomeConnectError],
|
||||
r"Error.*select.*custom color.*",
|
||||
),
|
||||
@ -543,7 +550,7 @@ async def test_light_color_different_than_custom(
|
||||
SettingKey.BSH_COMMON_AMBIENT_LIGHT_CUSTOM_COLOR: "#ffff00",
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{"rgb_color": (255, 255, 0)},
|
||||
{ATTR_RGB_COLOR: (255, 255, 0)},
|
||||
[HomeConnectError, None, None, HomeConnectError],
|
||||
r"Error.*set.*color.*",
|
||||
),
|
||||
@ -556,8 +563,8 @@ async def test_light_color_different_than_custom(
|
||||
},
|
||||
SERVICE_TURN_ON,
|
||||
{
|
||||
"hs_color": (255.484, 15.196),
|
||||
"brightness": 199,
|
||||
ATTR_HS_COLOR: (255.484, 15.196),
|
||||
ATTR_BRIGHTNESS: 199,
|
||||
},
|
||||
[HomeConnectError, None, None, HomeConnectError],
|
||||
r"Error.*set.*color.*",
|
||||
@ -600,7 +607,7 @@ async def test_light_exception_handling(
|
||||
with pytest.raises(HomeConnectError):
|
||||
await client_with_exception.set_setting()
|
||||
|
||||
service_data["entity_id"] = entity_id
|
||||
service_data[ATTR_ENTITY_ID] = entity_id
|
||||
with pytest.raises(HomeAssistantError, match=exception_match):
|
||||
await hass.services.async_call(
|
||||
LIGHT_DOMAIN, service, service_data, blocking=True
|
||||
|
@ -12,6 +12,7 @@ from aiohomeconnect.model import (
|
||||
EventMessage,
|
||||
EventType,
|
||||
GetSetting,
|
||||
HomeAppliance,
|
||||
OptionKey,
|
||||
ProgramDefinition,
|
||||
ProgramKey,
|
||||
@ -69,8 +70,9 @@ async def test_number(
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -95,7 +97,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -103,7 +105,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -111,7 +113,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -120,7 +122,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -128,14 +130,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["FridgeFreezer"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["FridgeFreezer"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -152,7 +154,7 @@ async def test_connected_devices(
|
||||
get_settings_original_mock = client.get_settings
|
||||
|
||||
def get_settings_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -164,14 +166,14 @@ async def test_connected_devices(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
client.get_settings = get_settings_original_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -179,20 +181,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["FridgeFreezer"], indirect=True)
|
||||
async def test_number_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["FridgeFreezer"], indirect=True)
|
||||
async def test_number_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if number entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -215,7 +217,7 @@ async def test_number_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -229,7 +231,7 @@ async def test_number_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -243,7 +245,7 @@ async def test_number_entity_availabilty(
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["FridgeFreezer"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["FridgeFreezer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"entity_id",
|
||||
@ -279,7 +281,7 @@ async def test_number_entity_availabilty(
|
||||
],
|
||||
)
|
||||
async def test_number_entity_functionality(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
setting_key: SettingKey,
|
||||
type: str,
|
||||
@ -336,12 +338,12 @@ async def test_number_entity_functionality(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
client.set_setting.assert_awaited_once_with(
|
||||
appliance_ha_id, setting_key=setting_key, value=value
|
||||
appliance.ha_id, setting_key=setting_key, value=value
|
||||
)
|
||||
assert hass.states.is_state(entity_id, str(float(value)))
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["FridgeFreezer"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["FridgeFreezer"], indirect=True)
|
||||
@pytest.mark.parametrize("retry_after", [0, None])
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
@ -368,7 +370,7 @@ async def test_number_entity_functionality(
|
||||
@patch("homeassistant.components.home_connect.entity.API_DEFAULT_RETRY_AFTER", new=0)
|
||||
async def test_fetch_constraints_after_rate_limit_error(
|
||||
retry_after: int | None,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
setting_key: SettingKey,
|
||||
type: str,
|
||||
@ -385,7 +387,7 @@ async def test_fetch_constraints_after_rate_limit_error(
|
||||
"""Test that, if a API rate limit error is raised, the constraints are fetched later."""
|
||||
|
||||
def get_settings_side_effect(ha_id: str):
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return ArrayOfSettings([])
|
||||
return ArrayOfSettings(
|
||||
[
|
||||
@ -511,7 +513,7 @@ async def test_number_entity_error(
|
||||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
("appliance_ha_id", "entity_id", "option_key", "min", "max", "step_size", "unit"),
|
||||
("appliance", "entity_id", "option_key", "min", "max", "step_size", "unit"),
|
||||
[
|
||||
(
|
||||
"Oven",
|
||||
@ -523,12 +525,12 @@ async def test_number_entity_error(
|
||||
"°C",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_options_functionality(
|
||||
entity_id: str,
|
||||
option_key: OptionKey,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
min: int,
|
||||
max: int,
|
||||
step_size: int,
|
||||
@ -615,7 +617,7 @@ async def test_options_functionality(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert called_mock.called
|
||||
assert called_mock.call_args.args == (appliance_ha_id,)
|
||||
assert called_mock.call_args.args == (appliance.ha_id,)
|
||||
assert called_mock.call_args.kwargs == {
|
||||
"option_key": option_key,
|
||||
"value": 80,
|
||||
|
@ -12,6 +12,7 @@ from aiohomeconnect.model import (
|
||||
EventMessage,
|
||||
EventType,
|
||||
GetSetting,
|
||||
HomeAppliance,
|
||||
OptionKey,
|
||||
ProgramDefinition,
|
||||
ProgramKey,
|
||||
@ -72,8 +73,9 @@ async def test_select(
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -98,7 +100,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -106,7 +108,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -114,7 +116,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -123,7 +125,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -131,13 +133,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -156,13 +159,13 @@ async def test_connected_devices(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -170,19 +173,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
|
||||
|
||||
async def test_select_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_select_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if select entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -200,7 +204,7 @@ async def test_select_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -214,7 +218,7 @@ async def test_select_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -290,7 +294,7 @@ async def test_filter_programs(
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
"entity_id",
|
||||
"expected_initial_state",
|
||||
"mock_method",
|
||||
@ -318,10 +322,10 @@ async def test_filter_programs(
|
||||
EventKey.BSH_COMMON_ROOT_ACTIVE_PROGRAM,
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_select_program_functionality(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
expected_initial_state: str,
|
||||
mock_method: str,
|
||||
@ -347,14 +351,14 @@ async def test_select_program_functionality(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
getattr(client, mock_method).assert_awaited_once_with(
|
||||
appliance_ha_id, program_key=program_key
|
||||
appliance.ha_id, program_key=program_key
|
||||
)
|
||||
assert hass.states.is_state(entity_id, program_to_set)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.NOTIFY,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -433,13 +437,13 @@ async def test_select_exception_handling(
|
||||
await hass.services.async_call(
|
||||
SELECT_DOMAIN,
|
||||
SERVICE_SELECT_OPTION,
|
||||
{"entity_id": entity_id, "option": program_to_set},
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: program_to_set},
|
||||
blocking=True,
|
||||
)
|
||||
assert getattr(client_with_exception, mock_attr).call_count == 2
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"entity_id",
|
||||
@ -473,7 +477,7 @@ async def test_select_exception_handling(
|
||||
],
|
||||
)
|
||||
async def test_select_functionality(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
setting_key: SettingKey,
|
||||
expected_options: set[str],
|
||||
@ -497,12 +501,12 @@ async def test_select_functionality(
|
||||
await hass.services.async_call(
|
||||
SELECT_DOMAIN,
|
||||
SERVICE_SELECT_OPTION,
|
||||
{ATTR_ENTITY_ID: entity_id, "option": value_to_set},
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: value_to_set},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
client.set_setting.assert_called_once()
|
||||
assert client.set_setting.call_args.args == (appliance_ha_id,)
|
||||
assert client.set_setting.call_args.args == (appliance.ha_id,)
|
||||
assert client.set_setting.call_args.kwargs == {
|
||||
"setting_key": setting_key,
|
||||
"value": expected_value_call_arg,
|
||||
@ -510,7 +514,7 @@ async def test_select_functionality(
|
||||
assert hass.states.is_state(entity_id, value_to_set)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"entity_id",
|
||||
@ -537,7 +541,7 @@ async def test_select_functionality(
|
||||
],
|
||||
)
|
||||
async def test_fetch_allowed_values(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
test_setting_key: SettingKey,
|
||||
allowed_values: list[str | None],
|
||||
@ -554,7 +558,7 @@ async def test_fetch_allowed_values(
|
||||
async def get_setting_side_effect(
|
||||
ha_id: str, setting_key: SettingKey
|
||||
) -> GetSetting:
|
||||
if ha_id != appliance_ha_id or setting_key != test_setting_key:
|
||||
if ha_id != appliance.ha_id or setting_key != test_setting_key:
|
||||
return await original_get_setting_side_effect(ha_id, setting_key)
|
||||
return GetSetting(
|
||||
key=test_setting_key,
|
||||
@ -576,7 +580,7 @@ async def test_fetch_allowed_values(
|
||||
assert set(entity_state.attributes[ATTR_OPTIONS]) == expected_options
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"entity_id",
|
||||
@ -594,7 +598,7 @@ async def test_fetch_allowed_values(
|
||||
],
|
||||
)
|
||||
async def test_fetch_allowed_values_after_rate_limit_error(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
setting_key: SettingKey,
|
||||
allowed_values: list[str | None],
|
||||
@ -608,7 +612,7 @@ async def test_fetch_allowed_values_after_rate_limit_error(
|
||||
"""Test fetch allowed values."""
|
||||
|
||||
def get_settings_side_effect(ha_id: str):
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return ArrayOfSettings([])
|
||||
return ArrayOfSettings(
|
||||
[
|
||||
@ -648,7 +652,7 @@ async def test_fetch_allowed_values_after_rate_limit_error(
|
||||
assert set(entity_state.attributes[ATTR_OPTIONS]) == expected_options
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Hood"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"entity_id",
|
||||
@ -669,7 +673,7 @@ async def test_fetch_allowed_values_after_rate_limit_error(
|
||||
],
|
||||
)
|
||||
async def test_default_values_after_fetch_allowed_values_error(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
setting_key: SettingKey,
|
||||
exception: Exception,
|
||||
@ -683,7 +687,7 @@ async def test_default_values_after_fetch_allowed_values_error(
|
||||
"""Test fetch allowed values."""
|
||||
|
||||
def get_settings_side_effect(ha_id: str):
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return ArrayOfSettings([])
|
||||
return ArrayOfSettings(
|
||||
[
|
||||
@ -758,12 +762,13 @@ async def test_select_entity_error(
|
||||
await hass.services.async_call(
|
||||
SELECT_DOMAIN,
|
||||
SERVICE_SELECT_OPTION,
|
||||
{ATTR_ENTITY_ID: entity_id, "option": value_to_set},
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: value_to_set},
|
||||
blocking=True,
|
||||
)
|
||||
assert getattr(client_with_exception, mock_attr).call_count == 2
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"set_active_program_options_side_effect",
|
||||
@ -840,7 +845,7 @@ async def test_options_functionality(
|
||||
option_key: OptionKey,
|
||||
allowed_values: list[str | None] | None,
|
||||
expected_options: set[str],
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
set_active_program_options_side_effect: ActiveProgramNotSetError | None,
|
||||
set_selected_program_options_side_effect: SelectedProgramNotSetError | None,
|
||||
called_mock_method: str,
|
||||
@ -894,7 +899,7 @@ async def test_options_functionality(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert called_mock.called
|
||||
assert called_mock.call_args.args == (appliance_ha_id,)
|
||||
assert called_mock.call_args.args == (appliance.ha_id,)
|
||||
assert called_mock.call_args.kwargs == {
|
||||
"option_key": option_key,
|
||||
"value": "LaundryCare.Washer.EnumType.Temperature.UlWarm",
|
||||
|
@ -10,6 +10,7 @@ from aiohomeconnect.model import (
|
||||
EventKey,
|
||||
EventMessage,
|
||||
EventType,
|
||||
HomeAppliance,
|
||||
Status,
|
||||
StatusKey,
|
||||
)
|
||||
@ -99,8 +100,9 @@ async def test_sensors(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -114,7 +116,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -122,7 +124,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -130,7 +132,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -139,7 +141,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -147,13 +149,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -170,7 +173,7 @@ async def test_connected_devices(
|
||||
get_status_original_mock = client.get_status
|
||||
|
||||
def get_status_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -182,14 +185,14 @@ async def test_connected_devices(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
client.get_status = get_status_original_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -197,20 +200,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", [TEST_HC_APP], indirect=True)
|
||||
async def test_sensor_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", [TEST_HC_APP], indirect=True)
|
||||
async def test_sensor_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if sensor entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -229,7 +232,7 @@ async def test_sensor_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -243,7 +246,7 @@ async def test_sensor_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -257,7 +260,7 @@ async def test_sensor_entity_availabilty(
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
|
||||
# Appliance_ha_id program sequence with a delayed start.
|
||||
# Appliance program sequence with a delayed start.
|
||||
PROGRAM_SEQUENCE_EVENTS = (
|
||||
EVENT_PROG_DELAYED_START,
|
||||
EVENT_PROG_RUN,
|
||||
@ -292,7 +295,7 @@ ENTITY_ID_STATES = {
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", [TEST_HC_APP], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", [TEST_HC_APP], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("states", "event_run"),
|
||||
list(
|
||||
@ -305,7 +308,7 @@ ENTITY_ID_STATES = {
|
||||
)
|
||||
async def test_program_sensors(
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
states: tuple,
|
||||
event_run: dict[EventType, dict[EventKey, str | int]],
|
||||
freezer: FrozenDateTimeFactory,
|
||||
@ -335,7 +338,7 @@ async def test_program_sensors(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
event_type,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -359,7 +362,7 @@ async def test_program_sensors(
|
||||
assert hass.states.is_state(entity_id, state)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", [TEST_HC_APP], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", [TEST_HC_APP], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("initial_operation_state", "initial_state", "event_order", "entity_states"),
|
||||
[
|
||||
@ -382,7 +385,7 @@ async def test_program_sensor_edge_case(
|
||||
initial_state: str,
|
||||
event_order: tuple[EventType, EventType],
|
||||
entity_states: tuple[str, str],
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -413,7 +416,7 @@ async def test_program_sensor_edge_case(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
event_type,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -452,9 +455,9 @@ ENTITY_ID_EDGE_CASE_STATES = [
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", [TEST_HC_APP], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", [TEST_HC_APP], indirect=True)
|
||||
async def test_remaining_prog_time_edge_cases(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
freezer: FrozenDateTimeFactory,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
@ -478,7 +481,7 @@ async def test_remaining_prog_time_edge_cases(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
event_type,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -509,7 +512,7 @@ async def test_remaining_prog_time_edge_cases(
|
||||
"event_type",
|
||||
"event_value_update",
|
||||
"expected",
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
),
|
||||
[
|
||||
(
|
||||
@ -601,14 +604,14 @@ async def test_remaining_prog_time_edge_cases(
|
||||
"CoffeeMaker",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_sensors_states(
|
||||
entity_id: str,
|
||||
event_key: EventKey,
|
||||
event_type: EventType,
|
||||
event_value_update: str,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
expected: str,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
@ -616,7 +619,7 @@ async def test_sensors_states(
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
) -> None:
|
||||
"""Tests for Appliance_ha_id alarm sensors."""
|
||||
"""Tests for appliance alarm sensors."""
|
||||
assert config_entry.state == ConfigEntryState.NOT_LOADED
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
@ -624,7 +627,7 @@ async def test_sensors_states(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
event_type,
|
||||
ArrayOfEvents(
|
||||
[
|
||||
@ -647,7 +650,7 @@ async def test_sensors_states(
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
"entity_id",
|
||||
"status_key",
|
||||
"unit_get_status",
|
||||
@ -672,10 +675,10 @@ async def test_sensors_states(
|
||||
1,
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_sensor_unit_fetching(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
status_key: StatusKey,
|
||||
unit_get_status: str | None,
|
||||
@ -690,7 +693,7 @@ async def test_sensor_unit_fetching(
|
||||
"""Test that the sensor entities are capable of fetching units."""
|
||||
|
||||
async def get_status_mock(ha_id: str) -> ArrayOfStatus:
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return ArrayOfStatus([])
|
||||
return ArrayOfStatus(
|
||||
[
|
||||
@ -729,7 +732,7 @@ async def test_sensor_unit_fetching(
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
"entity_id",
|
||||
"status_key",
|
||||
),
|
||||
@ -740,10 +743,10 @@ async def test_sensor_unit_fetching(
|
||||
StatusKey.COOKING_OVEN_CURRENT_CAVITY_TEMPERATURE,
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_sensor_unit_fetching_error(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
status_key: StatusKey,
|
||||
hass: HomeAssistant,
|
||||
@ -755,7 +758,7 @@ async def test_sensor_unit_fetching_error(
|
||||
"""Test that the sensor entities are capable of fetching units."""
|
||||
|
||||
async def get_status_mock(ha_id: str) -> ArrayOfStatus:
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return ArrayOfStatus([])
|
||||
return ArrayOfStatus(
|
||||
[
|
||||
@ -779,7 +782,7 @@ async def test_sensor_unit_fetching_error(
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
"entity_id",
|
||||
"status_key",
|
||||
"unit",
|
||||
@ -792,10 +795,10 @@ async def test_sensor_unit_fetching_error(
|
||||
"°C",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_sensor_unit_fetching_after_rate_limit_error(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
status_key: StatusKey,
|
||||
unit: str,
|
||||
@ -808,7 +811,7 @@ async def test_sensor_unit_fetching_after_rate_limit_error(
|
||||
"""Test that the sensor entities are capable of fetching units."""
|
||||
|
||||
async def get_status_mock(ha_id: str) -> ArrayOfStatus:
|
||||
if ha_id != appliance_ha_id:
|
||||
if ha_id != appliance.ha_id:
|
||||
return ArrayOfStatus([])
|
||||
return ArrayOfStatus(
|
||||
[
|
||||
|
@ -5,7 +5,7 @@ from http import HTTPStatus
|
||||
from typing import Any
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from aiohomeconnect.model import OptionKey, ProgramKey, SettingKey
|
||||
from aiohomeconnect.model import HomeAppliance, OptionKey, ProgramKey, SettingKey
|
||||
import pytest
|
||||
from syrupy.assertion import SnapshotAssertion
|
||||
|
||||
@ -170,6 +170,7 @@ SERVICES_SET_PROGRAM_AND_OPTIONS = [
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
"service_call",
|
||||
SERVICE_KV_CALL_PARAMS + SERVICE_COMMAND_CALL_PARAMS + SERVICE_PROGRAM_CALL_PARAMS,
|
||||
@ -182,7 +183,7 @@ async def test_key_value_services(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Create and test services."""
|
||||
assert config_entry.state == ConfigEntryState.NOT_LOADED
|
||||
@ -191,7 +192,7 @@ async def test_key_value_services(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
service_name = service_call["service"]
|
||||
@ -203,6 +204,7 @@ async def test_key_value_services(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("service_call", "issue_id"),
|
||||
[
|
||||
@ -231,7 +233,7 @@ async def test_programs_and_options_actions_deprecation(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
issue_registry: ir.IssueRegistry,
|
||||
hass_client: ClientSessionGenerator,
|
||||
) -> None:
|
||||
@ -242,7 +244,7 @@ async def test_programs_and_options_actions_deprecation(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
service_call["service_data"]["device_id"] = device_entry.id
|
||||
@ -279,6 +281,7 @@ async def test_programs_and_options_actions_deprecation(
|
||||
assert len(issue_registry.issues) == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("service_call", "called_method"),
|
||||
zip(
|
||||
@ -301,7 +304,7 @@ async def test_set_program_and_options(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
snapshot: SnapshotAssertion,
|
||||
) -> None:
|
||||
"""Test recognized options."""
|
||||
@ -311,7 +314,7 @@ async def test_set_program_and_options(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
service_call["service_data"]["device_id"] = device_entry.id
|
||||
@ -322,6 +325,7 @@ async def test_set_program_and_options(
|
||||
assert method_mock.call_args == snapshot
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("service_call", "error_regex"),
|
||||
zip(
|
||||
@ -344,7 +348,7 @@ async def test_set_program_and_options_exceptions(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client_with_exception: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test recognized options."""
|
||||
assert config_entry.state == ConfigEntryState.NOT_LOADED
|
||||
@ -353,7 +357,7 @@ async def test_set_program_and_options_exceptions(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
service_call["service_data"]["device_id"] = device_entry.id
|
||||
@ -361,6 +365,7 @@ async def test_set_program_and_options_exceptions(
|
||||
await hass.services.async_call(**service_call)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
"service_call",
|
||||
SERVICE_KV_CALL_PARAMS + SERVICE_COMMAND_CALL_PARAMS + SERVICE_PROGRAM_CALL_PARAMS,
|
||||
@ -372,7 +377,7 @@ async def test_services_exception_device_id(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client_with_exception: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
device_registry: dr.DeviceRegistry,
|
||||
) -> None:
|
||||
"""Raise a HomeAssistantError when there is an API error."""
|
||||
@ -382,7 +387,7 @@ async def test_services_exception_device_id(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
service_call["service_data"]["device_id"] = device_entry.id
|
||||
@ -434,6 +439,7 @@ async def test_services_appliance_not_found(
|
||||
await hass.services.async_call(**service_call)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
"service_call",
|
||||
SERVICE_KV_CALL_PARAMS + SERVICE_COMMAND_CALL_PARAMS + SERVICE_PROGRAM_CALL_PARAMS,
|
||||
@ -445,7 +451,7 @@ async def test_services_exception(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client_with_exception: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
device_registry: dr.DeviceRegistry,
|
||||
) -> None:
|
||||
"""Raise a ValueError when device id does not match."""
|
||||
@ -455,7 +461,7 @@ async def test_services_exception(
|
||||
|
||||
device_entry = device_registry.async_get_or_create(
|
||||
config_entry_id=config_entry.entry_id,
|
||||
identifiers={(DOMAIN, appliance_ha_id)},
|
||||
identifiers={(DOMAIN, appliance.ha_id)},
|
||||
)
|
||||
|
||||
service_call["service_data"]["device_id"] = device_entry.id
|
||||
|
@ -13,6 +13,7 @@ from aiohomeconnect.model import (
|
||||
EventMessage,
|
||||
EventType,
|
||||
GetSetting,
|
||||
HomeAppliance,
|
||||
OptionKey,
|
||||
ProgramDefinition,
|
||||
ProgramKey,
|
||||
@ -79,8 +80,9 @@ async def test_switches(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -105,7 +107,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -113,7 +115,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -121,7 +123,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -130,7 +132,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -138,13 +140,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance", ["Washer"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -162,14 +165,14 @@ async def test_connected_devices(
|
||||
get_available_programs_mock = client.get_available_programs
|
||||
|
||||
async def get_settings_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
return await get_settings_original_mock.side_effect(ha_id)
|
||||
|
||||
async def get_available_programs_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -185,14 +188,14 @@ async def test_connected_devices(
|
||||
client.get_settings = get_settings_original_mock
|
||||
client.get_available_programs = get_available_programs_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -200,20 +203,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Dishwasher"], indirect=True)
|
||||
async def test_switch_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["Dishwasher"], indirect=True)
|
||||
async def test_switch_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if switch entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -233,7 +236,7 @@ async def test_switch_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -247,7 +250,7 @@ async def test_switch_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -268,7 +271,7 @@ async def test_switch_entity_availabilty(
|
||||
"settings_key_arg",
|
||||
"setting_value_arg",
|
||||
"state",
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
),
|
||||
[
|
||||
(
|
||||
@ -288,7 +291,7 @@ async def test_switch_entity_availabilty(
|
||||
"Dishwasher",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_switch_functionality(
|
||||
entity_id: str,
|
||||
@ -300,7 +303,7 @@ async def test_switch_functionality(
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
client: MagicMock,
|
||||
) -> None:
|
||||
"""Test switch functionality."""
|
||||
@ -312,13 +315,13 @@ async def test_switch_functionality(
|
||||
await hass.services.async_call(SWITCH_DOMAIN, service, {ATTR_ENTITY_ID: entity_id})
|
||||
await hass.async_block_till_done()
|
||||
client.set_setting.assert_awaited_once_with(
|
||||
appliance_ha_id, setting_key=settings_key_arg, value=setting_value_arg
|
||||
appliance.ha_id, setting_key=settings_key_arg, value=setting_value_arg
|
||||
)
|
||||
assert hass.states.is_state(entity_id, state)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "program_key", "initial_state", "appliance_ha_id"),
|
||||
("entity_id", "program_key", "initial_state", "appliance"),
|
||||
[
|
||||
(
|
||||
"switch.dryer_program_mix",
|
||||
@ -333,7 +336,7 @@ async def test_switch_functionality(
|
||||
"Dryer",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_program_switch_functionality(
|
||||
entity_id: str,
|
||||
@ -343,7 +346,7 @@ async def test_program_switch_functionality(
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
client: MagicMock,
|
||||
) -> None:
|
||||
"""Test switch functionality."""
|
||||
@ -383,7 +386,7 @@ async def test_program_switch_functionality(
|
||||
await hass.async_block_till_done()
|
||||
assert hass.states.is_state(entity_id, STATE_ON)
|
||||
client.start_program.assert_awaited_once_with(
|
||||
appliance_ha_id, program_key=program_key
|
||||
appliance.ha_id, program_key=program_key
|
||||
)
|
||||
|
||||
await hass.services.async_call(
|
||||
@ -391,7 +394,7 @@ async def test_program_switch_functionality(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
assert hass.states.is_state(entity_id, STATE_OFF)
|
||||
client.stop_program.assert_awaited_once_with(appliance_ha_id)
|
||||
client.stop_program.assert_awaited_once_with(appliance.ha_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@ -496,7 +499,7 @@ async def test_switch_exception_handling(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "status", "service", "state", "appliance_ha_id"),
|
||||
("entity_id", "status", "service", "state", "appliance"),
|
||||
[
|
||||
(
|
||||
"switch.fridgefreezer_freezer_super_mode",
|
||||
@ -513,7 +516,7 @@ async def test_switch_exception_handling(
|
||||
"FridgeFreezer",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_ent_desc_switch_functionality(
|
||||
entity_id: str,
|
||||
@ -524,7 +527,7 @@ async def test_ent_desc_switch_functionality(
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
client: MagicMock,
|
||||
) -> None:
|
||||
"""Test switch functionality - entity description setup."""
|
||||
@ -544,7 +547,7 @@ async def test_ent_desc_switch_functionality(
|
||||
"status",
|
||||
"service",
|
||||
"mock_attr",
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
"exception_match",
|
||||
),
|
||||
[
|
||||
@ -565,7 +568,7 @@ async def test_ent_desc_switch_functionality(
|
||||
r"Error.*turn.*off.*",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_ent_desc_switch_exception_handling(
|
||||
entity_id: str,
|
||||
@ -577,7 +580,7 @@ async def test_ent_desc_switch_exception_handling(
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
config_entry: MockConfigEntry,
|
||||
setup_credentials: None,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
client_with_exception: MagicMock,
|
||||
) -> None:
|
||||
"""Test switch exception handling - entity description setup."""
|
||||
@ -613,7 +616,7 @@ async def test_ent_desc_switch_exception_handling(
|
||||
"service",
|
||||
"setting_value_arg",
|
||||
"power_state",
|
||||
"appliance_ha_id",
|
||||
"appliance",
|
||||
),
|
||||
[
|
||||
(
|
||||
@ -649,9 +652,9 @@ async def test_ent_desc_switch_exception_handling(
|
||||
"Dishwasher",
|
||||
),
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_power_swtich(
|
||||
async def test_power_switch(
|
||||
entity_id: str,
|
||||
allowed_values: list[str | None] | None,
|
||||
service: str,
|
||||
@ -661,7 +664,7 @@ async def test_power_swtich(
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
client: MagicMock,
|
||||
) -> None:
|
||||
"""Test power switch functionality."""
|
||||
@ -686,7 +689,7 @@ async def test_power_swtich(
|
||||
await hass.services.async_call(SWITCH_DOMAIN, service, {ATTR_ENTITY_ID: entity_id})
|
||||
await hass.async_block_till_done()
|
||||
client.set_setting.assert_awaited_once_with(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
setting_key=SettingKey.BSH_COMMON_POWER_STATE,
|
||||
value=setting_value_arg,
|
||||
)
|
||||
@ -800,7 +803,7 @@ async def test_power_switch_service_validation_errors(
|
||||
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
|
||||
async def test_create_issue(
|
||||
hass: HomeAssistant,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
@ -882,7 +885,7 @@ async def test_create_issue(
|
||||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "option_key", "appliance_ha_id"),
|
||||
("entity_id", "option_key", "appliance"),
|
||||
[
|
||||
(
|
||||
"switch.dishwasher_half_load",
|
||||
@ -890,12 +893,12 @@ async def test_create_issue(
|
||||
"Dishwasher",
|
||||
)
|
||||
],
|
||||
indirect=["appliance_ha_id"],
|
||||
indirect=["appliance"],
|
||||
)
|
||||
async def test_options_functionality(
|
||||
entity_id: str,
|
||||
option_key: OptionKey,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
set_active_program_options_side_effect: ActiveProgramNotSetError | None,
|
||||
set_selected_program_options_side_effect: SelectedProgramNotSetError | None,
|
||||
called_mock_method: str,
|
||||
@ -933,7 +936,7 @@ async def test_options_functionality(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert called_mock.called
|
||||
assert called_mock.call_args.args == (appliance_ha_id,)
|
||||
assert called_mock.call_args.args == (appliance.ha_id,)
|
||||
assert called_mock.call_args.kwargs == {
|
||||
"option_key": option_key,
|
||||
"value": False,
|
||||
@ -946,7 +949,7 @@ async def test_options_functionality(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert called_mock.called
|
||||
assert called_mock.call_args.args == (appliance_ha_id,)
|
||||
assert called_mock.call_args.args == (appliance.ha_id,)
|
||||
assert called_mock.call_args.kwargs == {
|
||||
"option_key": option_key,
|
||||
"value": True,
|
||||
|
@ -10,6 +10,7 @@ from aiohomeconnect.model import (
|
||||
EventMessage,
|
||||
EventType,
|
||||
GetSetting,
|
||||
HomeAppliance,
|
||||
SettingKey,
|
||||
)
|
||||
from aiohomeconnect.model.error import HomeConnectApiError, HomeConnectError
|
||||
@ -44,9 +45,9 @@ async def test_time(
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Oven"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Oven"], indirect=True)
|
||||
async def test_paired_depaired_devices_flow(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -60,7 +61,7 @@ async def test_paired_depaired_devices_flow(
|
||||
assert await integration_setup(client)
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert entity_entries
|
||||
@ -68,7 +69,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DEPAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -76,7 +77,7 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert not device
|
||||
for entity_entry in entity_entries:
|
||||
assert not entity_registry.async_get(entity_entry.entity_id)
|
||||
@ -85,7 +86,7 @@ async def test_paired_depaired_devices_flow(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.PAIRED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -93,14 +94,14 @@ async def test_paired_depaired_devices_flow(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
assert device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
for entity_entry in entity_entries:
|
||||
assert entity_registry.async_get(entity_entry.entity_id)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Oven"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Oven"], indirect=True)
|
||||
async def test_connected_devices(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
@ -117,7 +118,7 @@ async def test_connected_devices(
|
||||
get_settings_original_mock = client.get_settings
|
||||
|
||||
async def get_settings_side_effect(ha_id: str):
|
||||
if ha_id == appliance_ha_id:
|
||||
if ha_id == appliance.ha_id:
|
||||
raise HomeConnectApiError(
|
||||
"SDK.Error.HomeAppliance.Connection.Initialization.Failed"
|
||||
)
|
||||
@ -129,14 +130,14 @@ async def test_connected_devices(
|
||||
assert config_entry.state == ConfigEntryState.LOADED
|
||||
client.get_settings = get_settings_original_mock
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
data=ArrayOfEvents([]),
|
||||
)
|
||||
@ -144,20 +145,20 @@ async def test_connected_devices(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance_ha_id)})
|
||||
device = device_registry.async_get_device(identifiers={(DOMAIN, appliance.ha_id)})
|
||||
assert device
|
||||
new_entity_entries = entity_registry.entities.get_entries_for_device_id(device.id)
|
||||
assert len(new_entity_entries) > len(entity_entries)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Oven"], indirect=True)
|
||||
async def test_time_entity_availabilty(
|
||||
@pytest.mark.parametrize("appliance", ["Oven"], indirect=True)
|
||||
async def test_time_entity_availability(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
client: MagicMock,
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
) -> None:
|
||||
"""Test if time entities availability are based on the appliance connection state."""
|
||||
entity_ids = [
|
||||
@ -175,7 +176,7 @@ async def test_time_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.DISCONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -189,7 +190,7 @@ async def test_time_entity_availabilty(
|
||||
await client.add_events(
|
||||
[
|
||||
EventMessage(
|
||||
appliance_ha_id,
|
||||
appliance.ha_id,
|
||||
EventType.CONNECTED,
|
||||
ArrayOfEvents([]),
|
||||
)
|
||||
@ -203,7 +204,7 @@ async def test_time_entity_availabilty(
|
||||
assert state.state != STATE_UNAVAILABLE
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appliance_ha_id", ["Oven"], indirect=True)
|
||||
@pytest.mark.parametrize("appliance", ["Oven"], indirect=True)
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "setting_key"),
|
||||
[
|
||||
@ -214,7 +215,7 @@ async def test_time_entity_availabilty(
|
||||
],
|
||||
)
|
||||
async def test_time_entity_functionality(
|
||||
appliance_ha_id: str,
|
||||
appliance: HomeAppliance,
|
||||
entity_id: str,
|
||||
setting_key: SettingKey,
|
||||
hass: HomeAssistant,
|
||||
@ -242,7 +243,7 @@ async def test_time_entity_functionality(
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
client.set_setting.assert_awaited_once_with(
|
||||
appliance_ha_id, setting_key=setting_key, value=value
|
||||
appliance.ha_id, setting_key=setting_key, value=value
|
||||
)
|
||||
assert hass.states.is_state(entity_id, str(time(second=value)))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user