diff --git a/tests/test_gateway.py b/tests/test_gateway.py index b3b69938..8a6fa8fa 100644 --- a/tests/test_gateway.py +++ b/tests/test_gateway.py @@ -730,6 +730,52 @@ async def test_pollers_skip( assert "Device availability checker interval skipped" in caplog.text +async def test_global_updater_guards( + zha_gateway: Gateway, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test global updater guards.""" + + assert ( + "listener already registered with global updater - nothing to register" + not in caplog.text + ) + assert ( + "listener not registered with global updater - nothing to remove" + not in caplog.text + ) + + def listener(): + pass + + zha_gateway.global_updater.register_update_listener(listener) + + assert ( + "listener already registered with global updater - nothing to register" + not in caplog.text + ) + + zha_gateway.global_updater.register_update_listener(listener) + + assert ( + "listener already registered with global updater - nothing to register" + in caplog.text + ) + + zha_gateway.global_updater.remove_update_listener(listener) + + assert ( + "listener not registered with global updater - nothing to remove" + not in caplog.text + ) + + zha_gateway.global_updater.remove_update_listener(listener) + + assert ( + "listener not registered with global updater - nothing to remove" in caplog.text + ) + + async def test_gateway_handle_message( zha_gateway: Gateway, zha_dev_basic: Device, # pylint: disable=redefined-outer-name diff --git a/zha/application/helpers.py b/zha/application/helpers.py index fc446911..300de007 100644 --- a/zha/application/helpers.py +++ b/zha/application/helpers.py @@ -397,11 +397,21 @@ def stop(self): def register_update_listener(self, listener: Callable): """Register an update listener.""" if listener in self._update_listeners: + _LOGGER.debug( + "listener already registered with global updater - nothing to register: %s", + listener, + ) return self._update_listeners.append(listener) def remove_update_listener(self, listener: Callable): """Remove an update listener.""" + if listener not in self._update_listeners: + _LOGGER.debug( + "listener not registered with global updater - nothing to remove: %s", + listener, + ) + return self._update_listeners.remove(listener) @periodic(_REFRESH_INTERVAL)