Fix whirlpool initial availability (#181655)

This commit is contained in:
Abílio Costa
2026-09-08 17:57:41 +02:00
committed by GitHub
parent cc1e9dec3d
commit 4c01a1969d
3 changed files with 68 additions and 49 deletions
@@ -39,6 +39,7 @@ class WhirlpoolEntity(Entity):
async def async_added_to_hass(self) -> None:
"""Register attribute updates callback."""
self._appliance.register_attr_callback(self._async_attr_callback)
self._async_attr_callback()
@override
async def async_will_remove_from_hass(self) -> None:
@@ -362,50 +362,3 @@ async def test_service_unsupported(
{ATTR_ENTITY_ID: entity_id, **service_data},
blocking=True,
)
async def test_availability_logs(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
multiple_climate_entities: tuple[str, str],
request: pytest.FixtureRequest,
) -> None:
"""Test that availability status changes are logged correctly."""
entity_id, mock_fixture = multiple_climate_entities
mock_instance = request.getfixturevalue(mock_fixture)
await init_integration(hass)
caplog.clear()
mock_instance.get_online.return_value = True
state = await update_ac_state(hass, entity_id, mock_instance)
assert state.state != STATE_UNAVAILABLE
# Make the entity go offline - should log unavailable message
mock_instance.get_online.return_value = False
state = await update_ac_state(hass, entity_id, mock_instance)
assert state.state == STATE_UNAVAILABLE
unavailable_log = f"The entity {entity_id} is unavailable"
assert unavailable_log in caplog.text
# Clear logs and update the offline entity again - should NOT log again
caplog.clear()
state = await update_ac_state(hass, entity_id, mock_instance)
assert unavailable_log not in caplog.text
# Now bring the entity back online - should log back online message
mock_instance.get_online.return_value = True
state = await update_ac_state(hass, entity_id, mock_instance)
assert state.state != STATE_UNAVAILABLE
available_log = f"The entity {entity_id} is back online"
assert available_log in caplog.text
# Clear logs and make update again - should NOT log again
caplog.clear()
state = await update_ac_state(hass, entity_id, mock_instance)
assert available_log not in caplog.text
# Test offline again to ensure the flag resets properly
mock_instance.get_online.return_value = False
state = await update_ac_state(hass, entity_id, mock_instance)
assert state.state == STATE_UNAVAILABLE
assert unavailable_log in caplog.text
+67 -2
View File
@@ -1,5 +1,6 @@
"""Test the Whirlpool Sixth Sense init."""
import logging
from unittest.mock import AsyncMock, MagicMock
import aiohttp
@@ -9,10 +10,16 @@ from whirlpool.backendselector import Brand, Region
from homeassistant.components.whirlpool.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import CONF_PASSWORD, CONF_REGION, CONF_USERNAME
from homeassistant.const import (
CONF_PASSWORD,
CONF_REGION,
CONF_USERNAME,
STATE_UNAVAILABLE,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import init_integration, init_integration_with_entry
from . import init_integration, init_integration_with_entry, trigger_attr_callback
from tests.common import MockConfigEntry
@@ -145,3 +152,61 @@ async def test_unload_entry(hass: HomeAssistant) -> None:
assert entry.state is ConfigEntryState.NOT_LOADED
assert not hass.data.get(DOMAIN)
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_availability_logs(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
entity_registry: er.EntityRegistry,
mock_appliances_manager_api: MagicMock,
) -> None:
"""Test availability and transition logs for every appliance entity."""
manager = mock_appliances_manager_api.return_value
appliances = [
*manager.aircons,
*manager.washers,
*manager.dryers,
*manager.ovens,
*manager.refrigerators,
]
for appliance in appliances:
appliance.get_online.return_value = False
entry = await init_integration(hass)
entity_ids = {
entity.entity_id
for entity in er.async_entries_for_config_entry(entity_registry, entry.entry_id)
}
assert entity_ids
for entity_id in entity_ids:
assert (state := hass.states.get(entity_id)) is not None
assert state.state == STATE_UNAVAILABLE
# Repeated updates must not log again; subsequent transitions must log again.
for online, message, log_count in (
(True, "is back online", 1),
(False, "is unavailable", 1),
(False, "is unavailable", 0),
(True, "is back online", 1),
(True, "is back online", 0),
(False, "is unavailable", 1),
):
caplog.clear()
for appliance in appliances:
appliance.get_online.return_value = online
await trigger_attr_callback(hass, appliance)
for entity_id in entity_ids:
assert (state := hass.states.get(entity_id)) is not None
assert (state.state != STATE_UNAVAILABLE) is online
assert (
caplog.record_tuples.count(
(
"homeassistant.components.whirlpool.entity",
logging.INFO,
f"The entity {entity_id} {message}",
)
)
== log_count
)