Skip to content

Commit ae5135e

Browse files
authored
Ignore repair events without action (#1296)
1 parent 8d61b87 commit ae5135e

3 files changed

Lines changed: 99 additions & 10 deletions

File tree

custom_components/spook/ectoplasms/repairs/event.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,21 @@ class RepairsSpookEventEntity(RepairsSpookEntity, EventEntity):
5151
entity_description: RepairsSpookEventEntityDescription
5252
_attr_name = None
5353

54-
async def async_added_to_hass(self) -> None:
55-
"""Register for event updates."""
54+
@callback
55+
def _handle_repairs_issue_registry_updated_event(self, event: Event) -> None:
56+
"""Handle repairs issue registry updates."""
57+
data = {**event.data}
58+
if (event_type := data.pop("action", None)) is None:
59+
return
5660

57-
@callback
58-
def _fire(event: Event) -> None:
59-
"""Update state."""
60-
data = {**event.data}
61-
event_type = data.pop("action")
62-
self._trigger_event(event_type, data)
63-
self.async_schedule_update_ha_state()
61+
self._trigger_event(event_type, data)
62+
self.async_schedule_update_ha_state()
6463

64+
async def async_added_to_hass(self) -> None:
65+
"""Register for event updates."""
6566
self.async_on_remove(
66-
self.hass.bus.async_listen(EVENT_REPAIRS_ISSUE_REGISTRY_UPDATED, _fire),
67+
self.hass.bus.async_listen(
68+
EVENT_REPAIRS_ISSUE_REGISTRY_UPDATED,
69+
self._handle_repairs_issue_registry_updated_event,
70+
),
6771
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Tests for the Spook repairs ectoplasm."""
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
"""Tests for repairs event entity."""
2+
# pylint: disable=protected-access
3+
4+
from __future__ import annotations
5+
6+
from typing import TYPE_CHECKING
7+
8+
from homeassistant.core import Event
9+
10+
from custom_components.spook.ectoplasms.repairs.event import (
11+
RepairsSpookEventEntity,
12+
RepairsSpookEventEntityDescription,
13+
)
14+
15+
if TYPE_CHECKING:
16+
import pytest
17+
18+
19+
def _create_entity() -> RepairsSpookEventEntity:
20+
"""Create a repairs event entity."""
21+
return RepairsSpookEventEntity(
22+
RepairsSpookEventEntityDescription(
23+
key="event",
24+
translation_key="repairs_event",
25+
entity_id="event.repair",
26+
event_types=["create", "remove", "update"],
27+
),
28+
)
29+
30+
31+
def test_repairs_event_ignores_event_without_action(
32+
monkeypatch: pytest.MonkeyPatch,
33+
) -> None:
34+
"""Test repairs events without an action are ignored."""
35+
entity = _create_entity()
36+
triggered = False
37+
scheduled = False
38+
39+
def _trigger_event(*_: object) -> None:
40+
nonlocal triggered
41+
triggered = True
42+
43+
def _schedule_update() -> None:
44+
nonlocal scheduled
45+
scheduled = True
46+
47+
monkeypatch.setattr(entity, "_trigger_event", _trigger_event)
48+
monkeypatch.setattr(entity, "async_schedule_update_ha_state", _schedule_update)
49+
50+
entity._handle_repairs_issue_registry_updated_event( # noqa: SLF001
51+
Event("repairs_issue_registry_updated", {"domain": "spook"})
52+
)
53+
54+
assert not triggered
55+
assert not scheduled
56+
57+
58+
def test_repairs_event_copies_event_data_before_popping_action(
59+
monkeypatch: pytest.MonkeyPatch,
60+
) -> None:
61+
"""Test repairs event handling does not mutate the shared event data."""
62+
entity = _create_entity()
63+
calls: list[tuple[str, dict[str, str]]] = []
64+
scheduled = False
65+
66+
def _trigger_event(event_type: str, data: dict[str, str]) -> None:
67+
calls.append((event_type, data))
68+
69+
def _schedule_update() -> None:
70+
nonlocal scheduled
71+
scheduled = True
72+
73+
monkeypatch.setattr(entity, "_trigger_event", _trigger_event)
74+
monkeypatch.setattr(entity, "async_schedule_update_ha_state", _schedule_update)
75+
event = Event(
76+
"repairs_issue_registry_updated",
77+
{"action": "create", "domain": "spook"},
78+
)
79+
80+
entity._handle_repairs_issue_registry_updated_event(event) # noqa: SLF001
81+
82+
assert calls == [("create", {"domain": "spook"})]
83+
assert scheduled
84+
assert event.data == {"action": "create", "domain": "spook"}

0 commit comments

Comments
 (0)