From 8dadea6796d16bc37463cff07b9b05973f69e120 Mon Sep 17 00:00:00 2001 From: Tim Schindler Date: Wed, 22 Jul 2026 07:48:43 +0200 Subject: [PATCH] test: address Copilot review on observe fixture typing and comment - Parameterize FakeObserveSession.notify_on_subscribe as dict[str, Any] | None to match the surrounding fully-typed attributes (the dict is delivered as the OBSERVE rep to on_notification); add the typing.Any import. - Reword the test_coordinator comment: subscribe() delivers a notification for every href it subscribes to (when notify_on_subscribe is set), not one. --- tests/localthings/conftest.py | 13 ++++++++----- tests/localthings/test_coordinator.py | 12 +++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tests/localthings/conftest.py b/tests/localthings/conftest.py index f4fcc56..a5a5e62 100644 --- a/tests/localthings/conftest.py +++ b/tests/localthings/conftest.py @@ -3,6 +3,7 @@ from __future__ import annotations import json from pathlib import Path +from typing import Any from unittest.mock import patch import cbor2 @@ -156,11 +157,13 @@ class FakeObserveSession: # when it answers a subscription with the current representation. # `try_enter_observe_mode` clears its notified set before it # subscribes, so this is the only way to deliver a notify that - # reliably lands inside the grace period: a notify raced in from - # another thread can be wiped by that clear (or arrive after the - # grace period ends) depending on scheduling. Set to None to model - # a device that answers subscriptions but never notifies. - self.notify_on_subscribe: dict | None = None + # reliably counts: it lands synchronously via on_notification, + # after that clear and before the post-sleep fraction check — a + # notify raced in from another thread can be wiped by the clear + # (or arrive after the check) depending on scheduling. Set to + # None to model a device that answers subscriptions but never + # notifies. + self.notify_on_subscribe: dict[str, Any] | None = None def subscribe(self, path_segs): href = '/' + '/'.join(path_segs) diff --git a/tests/localthings/test_coordinator.py b/tests/localthings/test_coordinator.py index 6b1572f..7739da5 100644 --- a/tests/localthings/test_coordinator.py +++ b/tests/localthings/test_coordinator.py @@ -258,11 +258,13 @@ async def test_enters_observe_mode_when_hot_warm_hrefs_notify( coordinator: LocalThingsCoordinator = hass.data[DOMAIN][mock_entry.entry_id] hrefs = coordinator._hot_hrefs + coordinator._warm_hrefs - # try_enter_observe_mode clears prior notifications as soon as it - # starts, so notifies must land *during* its grace-period sleep. The - # fake session delivers one synchronously from subscribe() (see - # FakeObserveSession.notify_on_subscribe in conftest.py), which puts - # them inside that window by construction rather than by timing. + # try_enter_observe_mode clears prior notifications before it + # subscribes, then checks the notified fraction after the grace-period + # sleep — a notify counts as long as it arrives in that window, not + # specifically during the sleep itself. The fake session delivers one + # synchronously from subscribe() for every href it subscribes to (see + # FakeObserveSession.notify_on_subscribe in conftest.py), which lands + # it in that window by construction rather than by timing. fake.notify_on_subscribe = {'notified': True} entered = await hass.async_add_executor_job( coordinator._observe.try_enter_observe_mode,