Fix flaky netatmo tests (#53644)

This commit is contained in:
Tobias Sauerwein 2021-07-30 20:07:23 +02:00 committed by GitHub
parent b0c650e088
commit 8e61ed39fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 31 deletions

View File

@ -58,6 +58,7 @@ from .data_handler import (
HOMESTATUS_DATA_CLASS_NAME, HOMESTATUS_DATA_CLASS_NAME,
NetatmoDataHandler, NetatmoDataHandler,
) )
from .helper import get_all_home_ids, update_climate_schedules
from .netatmo_entity_base import NetatmoBase from .netatmo_entity_base import NetatmoBase
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -131,9 +132,6 @@ async def async_setup_entry(
if not home_data or home_data.raw_data == {}: if not home_data or home_data.raw_data == {}:
raise PlatformNotReady raise PlatformNotReady
if HOMEDATA_DATA_CLASS_NAME not in data_handler.data:
raise PlatformNotReady
entities = [] entities = []
for home_id in get_all_home_ids(home_data): for home_id in get_all_home_ids(home_data):
for room_id in home_data.rooms[home_id]: for room_id in home_data.rooms[home_id]:
@ -145,12 +143,12 @@ async def async_setup_entry(
if home_status and room_id in home_status.rooms: if home_status and room_id in home_status.rooms:
entities.append(NetatmoThermostat(data_handler, home_id, room_id)) entities.append(NetatmoThermostat(data_handler, home_id, room_id))
hass.data[DOMAIN][DATA_SCHEDULES][home_id] = { hass.data[DOMAIN][DATA_SCHEDULES].update(
schedule_id: schedule_data.get("name") update_climate_schedules(
for schedule_id, schedule_data in ( home_ids=get_all_home_ids(home_data),
data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules[home_id].items() schedules=data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules,
) )
} )
hass.data[DOMAIN][DATA_HOMES] = { hass.data[DOMAIN][DATA_HOMES] = {
home_id: home_data.get("name") home_id: home_data.get("name")
@ -257,7 +255,8 @@ class NetatmoThermostat(NetatmoBase, ClimateEntity):
assert device assert device
self.hass.data[DOMAIN][DATA_DEVICE_IDS][self._home_id] = device.id self.hass.data[DOMAIN][DATA_DEVICE_IDS][self._home_id] = device.id
async def handle_event(self, event: dict) -> None: @callback
def handle_event(self, event: dict) -> None:
"""Handle webhook events.""" """Handle webhook events."""
data = event["data"] data = event["data"]
@ -617,14 +616,3 @@ class NetatmoThermostat(NetatmoBase, ClimateEntity):
device_info: DeviceInfo = super().device_info device_info: DeviceInfo = super().device_info
device_info["suggested_area"] = self._room_data["name"] device_info["suggested_area"] = self._room_data["name"]
return device_info return device_info
def get_all_home_ids(home_data: pyatmo.HomeData | None) -> list[str]:
"""Get all the home ids returned by NetAtmo API."""
if home_data is None:
return []
return [
home_data.homes[home_id]["id"]
for home_id in home_data.homes
if "modules" in home_data.homes[home_id]
]

View File

@ -1,7 +1,11 @@
"""Helper for Netatmo integration.""" """Helper for Netatmo integration."""
from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from uuid import UUID, uuid4 from uuid import UUID, uuid4
import pyatmo
@dataclass @dataclass
class NetatmoArea: class NetatmoArea:
@ -15,3 +19,25 @@ class NetatmoArea:
mode: str mode: str
show_on_map: bool show_on_map: bool
uuid: UUID = uuid4() uuid: UUID = uuid4()
def get_all_home_ids(home_data: pyatmo.HomeData | None) -> list[str]:
"""Get all the home ids returned by NetAtmo API."""
if home_data is None:
return []
return [
home_data.homes[home_id]["id"]
for home_id in home_data.homes
if "modules" in home_data.homes[home_id]
]
def update_climate_schedules(home_ids: list[str], schedules: dict) -> dict:
"""Get updated list of all climate schedules."""
return {
home_id: {
schedule_id: schedule_data.get("name")
for schedule_id, schedule_data in schedules[home_id].items()
}
for home_id in home_ids
}

View File

@ -13,7 +13,6 @@ from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .climate import get_all_home_ids
from .const import ( from .const import (
DATA_HANDLER, DATA_HANDLER,
DATA_SCHEDULES, DATA_SCHEDULES,
@ -23,6 +22,7 @@ from .const import (
SIGNAL_NAME, SIGNAL_NAME,
) )
from .data_handler import HOMEDATA_DATA_CLASS_NAME, NetatmoDataHandler from .data_handler import HOMEDATA_DATA_CLASS_NAME, NetatmoDataHandler
from .helper import get_all_home_ids, update_climate_schedules
from .netatmo_entity_base import NetatmoBase from .netatmo_entity_base import NetatmoBase
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -42,8 +42,12 @@ async def async_setup_entry(
if not home_data or home_data.raw_data == {}: if not home_data or home_data.raw_data == {}:
raise PlatformNotReady raise PlatformNotReady
if HOMEDATA_DATA_CLASS_NAME not in data_handler.data: hass.data[DOMAIN][DATA_SCHEDULES].update(
raise PlatformNotReady update_climate_schedules(
home_ids=get_all_home_ids(home_data),
schedules=data_handler.data[HOMEDATA_DATA_CLASS_NAME].schedules,
)
)
entities = [ entities = [
NetatmoScheduleSelect( NetatmoScheduleSelect(
@ -51,8 +55,7 @@ async def async_setup_entry(
home_id, home_id,
list(hass.data[DOMAIN][DATA_SCHEDULES][home_id].values()), list(hass.data[DOMAIN][DATA_SCHEDULES][home_id].values()),
) )
for home_id in get_all_home_ids(home_data) for home_id in hass.data[DOMAIN][DATA_SCHEDULES]
if home_id in hass.data[DOMAIN][DATA_SCHEDULES]
] ]
_LOGGER.debug("Adding climate schedule select entities %s", entities) _LOGGER.debug("Adding climate schedule select entities %s", entities)
@ -105,7 +108,8 @@ class NetatmoScheduleSelect(NetatmoBase, SelectEntity):
) )
) )
async def handle_event(self, event: dict) -> None: @callback
def handle_event(self, event: dict) -> None:
"""Handle webhook events.""" """Handle webhook events."""
data = event["data"] data = event["data"]

View File

@ -19,10 +19,6 @@ async def test_select_schedule_thermostats(hass, config_entry, caplog, netatmo_a
select_entity = "select.netatmo_myhome" select_entity = "select.netatmo_myhome"
assert hass.states.get(select_entity).state == "Default" assert hass.states.get(select_entity).state == "Default"
assert hass.states.get(select_entity).attributes[ATTR_OPTIONS] == [
"Default",
"Winter",
]
# Fake backend response changing schedule # Fake backend response changing schedule
response = { response = {
@ -32,8 +28,13 @@ async def test_select_schedule_thermostats(hass, config_entry, caplog, netatmo_a
"push_type": "home_event_changed", "push_type": "home_event_changed",
} }
await simulate_webhook(hass, webhook_id, response) await simulate_webhook(hass, webhook_id, response)
await hass.async_block_till_done()
assert hass.states.get(select_entity).state == "Winter" assert hass.states.get(select_entity).state == "Winter"
assert hass.states.get(select_entity).attributes[ATTR_OPTIONS] == [
"Default",
"Winter",
]
# Test setting a different schedule # Test setting a different schedule
with patch( with patch(