@@ -114,6 +114,14 @@ async def _send_time_changed(zha_gateway: Gateway, seconds: int):
114
114
"zha.zigbee.cluster_handlers.general.BasicClusterHandler.async_initialize" ,
115
115
new = mock .AsyncMock (),
116
116
)
117
+ @pytest .mark .parametrize (
118
+ "zha_gateway" ,
119
+ [
120
+ "zha_gateway" ,
121
+ "ws_gateways" ,
122
+ ],
123
+ indirect = True ,
124
+ )
117
125
async def test_check_available_success (
118
126
zha_gateway : Gateway ,
119
127
caplog : pytest .LogCaptureFixture ,
@@ -124,19 +132,28 @@ async def test_check_available_success(
124
132
)
125
133
zha_device = await join_zigpy_device (zha_gateway , device_with_basic_cluster_handler )
126
134
basic_ch = device_with_basic_cluster_handler .endpoints [3 ].basic
135
+ if hasattr (zha_gateway , "ws_gateway" ):
136
+ server_device = zha_gateway .ws_gateway .devices [zha_device .ieee ]
137
+ server_gateway = zha_gateway .ws_gateway
138
+ else :
139
+ server_device = zha_device
140
+ server_gateway = zha_gateway
127
141
128
142
assert not zha_device .is_coordinator
129
143
assert not zha_device .is_active_coordinator
130
144
131
145
basic_ch .read_attributes .reset_mock ()
132
146
device_with_basic_cluster_handler .last_seen = None
133
147
assert zha_device .available is True
134
- await _send_time_changed (zha_gateway , zha_device .consider_unavailable_time + 2 )
148
+ await _send_time_changed (zha_gateway , server_device .consider_unavailable_time + 2 )
135
149
assert zha_device .available is False
136
150
assert basic_ch .read_attributes .await_count == 0
137
151
152
+ for entity in server_device .platform_entities .values ():
153
+ assert not entity .available
154
+
138
155
device_with_basic_cluster_handler .last_seen = (
139
- time .time () - zha_device .consider_unavailable_time - 100
156
+ time .time () - server_device .consider_unavailable_time - 100
140
157
)
141
158
_seens = [time .time (), device_with_basic_cluster_handler .last_seen ]
142
159
@@ -146,63 +163,82 @@ def _update_last_seen(*args, **kwargs): # pylint: disable=unused-argument
146
163
147
164
basic_ch .read_attributes .side_effect = _update_last_seen
148
165
149
- for entity in zha_device .platform_entities .values ():
166
+ for entity in server_device .platform_entities .values ():
150
167
entity .emit = mock .MagicMock (wraps = entity .emit )
151
168
152
169
# we want to test the device availability handling alone
153
- zha_gateway .global_updater .stop ()
170
+ server_gateway .global_updater .stop ()
154
171
155
172
# successfully ping zigpy device, but zha_device is not yet available
156
173
await _send_time_changed (
157
- zha_gateway , zha_gateway ._device_availability_checker .__polling_interval + 1
174
+ zha_gateway , server_gateway ._device_availability_checker .__polling_interval + 1
158
175
)
159
176
assert basic_ch .read_attributes .await_count == 1
160
177
assert basic_ch .read_attributes .await_args [0 ][0 ] == ["manufacturer" ]
161
178
assert zha_device .available is False
162
179
163
- for entity in zha_device .platform_entities .values ():
180
+ for entity in server_device .platform_entities .values ():
164
181
entity .emit .assert_not_called ()
165
182
assert not entity .available
183
+ if server_device != zha_device :
184
+ assert not zha_device .platform_entities [
185
+ (entity .PLATFORM , entity .unique_id )
186
+ ].available
166
187
entity .emit .reset_mock ()
167
188
168
189
# There was traffic from the device: pings, but not yet available
169
190
await _send_time_changed (
170
- zha_gateway , zha_gateway ._device_availability_checker .__polling_interval + 1
191
+ zha_gateway , server_gateway ._device_availability_checker .__polling_interval + 1
171
192
)
172
193
assert basic_ch .read_attributes .await_count == 2
173
194
assert basic_ch .read_attributes .await_args [0 ][0 ] == ["manufacturer" ]
174
195
assert zha_device .available is False
175
196
176
- for entity in zha_device .platform_entities .values ():
197
+ for entity in server_device .platform_entities .values ():
177
198
entity .emit .assert_not_called ()
178
199
assert not entity .available
200
+ if server_device != zha_device :
201
+ assert not zha_device .platform_entities [
202
+ (entity .PLATFORM , entity .unique_id )
203
+ ].available
179
204
entity .emit .reset_mock ()
180
205
181
206
# There was traffic from the device: don't try to ping, marked as available
182
207
await _send_time_changed (
183
- zha_gateway , zha_gateway ._device_availability_checker .__polling_interval + 1
208
+ zha_gateway , server_gateway ._device_availability_checker .__polling_interval + 1
184
209
)
185
210
assert basic_ch .read_attributes .await_count == 2
186
211
assert basic_ch .read_attributes .await_args [0 ][0 ] == ["manufacturer" ]
187
212
assert zha_device .available is True
188
213
assert zha_device .on_network is True
189
214
190
- for entity in zha_device .platform_entities .values ():
215
+ for entity in server_device .platform_entities .values ():
191
216
entity .emit .assert_called ()
217
+ if server_device != zha_device :
218
+ assert zha_device .platform_entities [
219
+ (entity .PLATFORM , entity .unique_id )
220
+ ].available
192
221
assert entity .available
193
222
entity .emit .reset_mock ()
194
223
195
224
assert "Device is not on the network, marking unavailable" not in caplog .text
196
- zha_device .on_network = False
225
+ server_gateway ._device_availability_checker .stop ()
226
+
227
+ server_device .on_network = False
228
+ await zha_gateway .async_block_till_done (wait_background_tasks = True )
197
229
198
230
assert zha_device .available is False
199
231
assert zha_device .on_network is False
200
232
201
233
assert "Device is not on the network, marking unavailable" in caplog .text
202
234
203
- for entity in zha_device .platform_entities .values ():
235
+ for entity in server_device .platform_entities .values ():
204
236
entity .emit .assert_called ()
205
237
assert not entity .available
238
+ if server_device != zha_device :
239
+ assert not zha_device .platform_entities [
240
+ (entity .PLATFORM , entity .unique_id )
241
+ ].available
206
242
entity .emit .reset_mock ()
207
243
208
244
0 commit comments