Skip to content

Commit 36b417b

Browse files
committed
feat: Refactor maintenance coordinator integration in button and sensor components
1 parent 67a935e commit 36b417b

File tree

4 files changed

+59
-15
lines changed

4 files changed

+59
-15
lines changed

custom_components/qvantum/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class RuntimeData:
4949
"""Class to hold your data."""
5050

5151
coordinator: QvantumDataUpdateCoordinator
52-
firmware_coordinator: QvantumMaintenanceCoordinator | None = None
52+
maintenance_coordinator: QvantumMaintenanceCoordinator | None = None
5353
device: DeviceInfo | None = None
5454

5555

custom_components/qvantum/button.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from . import MyConfigEntry
1616
from .coordinator import QvantumDataUpdateCoordinator, handle_setting_update_response
17+
from .maintenance_coordinator import QvantumMaintenanceCoordinator
1718
from .entity import QvantumEntity
1819

1920
_LOGGER = logging.getLogger(__name__)
@@ -26,12 +27,19 @@ async def async_setup_entry(
2627
):
2728
"""Set up the Button."""
2829
coordinator: QvantumDataUpdateCoordinator = config_entry.runtime_data.coordinator
30+
maintenance_coordinator: QvantumMaintenanceCoordinator = (
31+
config_entry.runtime_data.maintenance_coordinator
32+
)
2933
device: DeviceInfo = config_entry.runtime_data.device
3034

3135
buttons = []
3236
buttons.append(QvantumButtonEntity(coordinator, "extra_tap_water_60min", device))
3337

34-
buttons.append(QvantumButtonEntity(coordinator, "elevate_access", device))
38+
buttons.append(
39+
QvantumButtonEntity(
40+
coordinator, "elevate_access", device, maintenance_coordinator
41+
)
42+
)
3543

3644
async_add_entities(buttons)
3745

@@ -46,8 +54,10 @@ def __init__(
4654
coordinator: QvantumDataUpdateCoordinator,
4755
button_key: str,
4856
device: DeviceInfo,
57+
maintenance_coordinator: QvantumMaintenanceCoordinator | None = None,
4958
) -> None:
5059
super().__init__(coordinator, button_key, device)
60+
self._maintenance_coordinator = maintenance_coordinator
5161

5262
if button_key == "elevate_access":
5363
self._attr_entity_category = EntityCategory.DIAGNOSTIC
@@ -76,6 +86,10 @@ async def async_press(self) -> None:
7686

7787
_LOGGER.info("Access level: %s", response)
7888

89+
# Refresh maintenance coordinator to update access level data
90+
if self._maintenance_coordinator:
91+
await self._maintenance_coordinator.async_refresh()
92+
7993
@property
8094
def available(self):
8195
"""Check if button is available."""

custom_components/qvantum/sensor.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,26 @@ async def async_setup_entry(
7878
)
7979

8080
# Add firmware sensors
81-
firmware_coordinator = config_entry.runtime_data.firmware_coordinator
81+
maintenance_coordinator = config_entry.runtime_data.maintenance_coordinator
8282
sensors.append(
83-
QvantumAccessExpireEntity(firmware_coordinator, "expiresAt", device, True)
83+
QvantumAccessExpireEntity(maintenance_coordinator, "expiresAt", device, True)
8484
)
8585
sensors.append(
8686
QvantumFirmwareSensorEntity(
87-
firmware_coordinator, "display_fw_version", device, True
87+
maintenance_coordinator, "display_fw_version", device, True
8888
)
8989
)
9090
sensors.append(
91-
QvantumFirmwareSensorEntity(firmware_coordinator, "cc_fw_version", device, True)
91+
QvantumFirmwareSensorEntity(maintenance_coordinator, "cc_fw_version", device, True)
9292
)
9393
sensors.append(
9494
QvantumFirmwareSensorEntity(
95-
firmware_coordinator, "inv_fw_version", device, True
95+
maintenance_coordinator, "inv_fw_version", device, True
9696
)
9797
)
9898
sensors.append(
9999
QvantumFirmwareLastCheckSensorEntity(
100-
firmware_coordinator, "firmware_last_check", device, True
100+
maintenance_coordinator, "firmware_last_check", device, True
101101
)
102102
)
103103

tests/test_button_working.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ def mock_coordinator():
2929
return coordinator
3030

3131

32+
@pytest.fixture
33+
def mock_maintenance_coordinator():
34+
"""Create a mock maintenance coordinator."""
35+
coordinator = MagicMock()
36+
coordinator.async_refresh = AsyncMock()
37+
return coordinator
38+
39+
3240
@pytest.fixture
3341
def mock_device():
3442
"""Create a mock device."""
@@ -57,7 +65,10 @@ def test_button_entity_initialization(self, mock_coordinator, mock_device):
5765

5866
# Test elevate_access button
5967
elevate_button = QvantumButtonEntity(
60-
mock_coordinator, "elevate_access", mock_device
68+
mock_coordinator,
69+
"elevate_access",
70+
mock_device,
71+
mock_maintenance_coordinator,
6172
)
6273

6374
assert elevate_button._metric_key == "elevate_access"
@@ -89,43 +100,62 @@ async def test_async_press_extra_tap_water_60min(
89100

90101
@pytest.mark.asyncio
91102
async def test_async_press_elevate_access(
92-
self, mock_coordinator, mock_device
103+
self, mock_coordinator, mock_device, mock_maintenance_coordinator
93104
):
94105
"""Test pressing the elevate access button."""
95106
button = QvantumButtonEntity(
96-
mock_coordinator, "elevate_access", mock_device
107+
mock_coordinator,
108+
"elevate_access",
109+
mock_device,
110+
mock_maintenance_coordinator,
97111
)
98112

99113
await button.async_press()
100114

101115
mock_coordinator.api.elevate_access.assert_called_once_with(
102116
"test_device_123"
103117
)
118+
# Verify maintenance coordinator is refreshed after elevating access
119+
mock_maintenance_coordinator.async_refresh.assert_called_once()
104120

105121
@pytest.mark.asyncio
106122
async def test_async_press_elevate_access_failure(
107-
self, mock_coordinator, mock_device, caplog
123+
self, mock_coordinator, mock_device, mock_maintenance_coordinator, caplog
108124
):
109125
"""Test pressing the elevate access button when elevation fails."""
110126
# Mock the API to return None (failure)
111127
mock_coordinator.api.elevate_access = AsyncMock(return_value=None)
112128

113-
button = QvantumButtonEntity(mock_coordinator, "elevate_access", mock_device)
129+
button = QvantumButtonEntity(
130+
mock_coordinator,
131+
"elevate_access",
132+
mock_device,
133+
mock_maintenance_coordinator,
134+
)
114135

115136
await button.async_press()
116137

117138
mock_coordinator.api.elevate_access.assert_called_once_with("test_device_123")
118139

119140
# Verify error is logged
120141
assert "Failed to elevate access" in caplog.text
142+
# Verify maintenance coordinator is not refreshed on failure
143+
mock_maintenance_coordinator.async_refresh.assert_not_called()
121144

122145
@pytest.mark.asyncio
123146
async def test_async_setup_entry(
124-
self, hass, mock_config_entry, mock_coordinator, mock_device
147+
self,
148+
hass,
149+
mock_config_entry,
150+
mock_coordinator,
151+
mock_device,
152+
mock_maintenance_coordinator,
125153
):
126154
"""Test setting up button entities."""
127155
mock_config_entry.runtime_data = RuntimeData(
128-
coordinator=mock_coordinator, device=mock_device
156+
coordinator=mock_coordinator,
157+
device=mock_device,
158+
maintenance_coordinator=mock_maintenance_coordinator,
129159
)
130160

131161
async_add_entities = MagicMock()

0 commit comments

Comments
 (0)