Skip to content

Commit cf904ef

Browse files
committed
more coverage
1 parent 08aa07f commit cf904ef

File tree

10 files changed

+53
-40
lines changed

10 files changed

+53
-40
lines changed

tests/test_button.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ async def test_button(
109109
)
110110
assert entity.PLATFORM == Platform.BUTTON
111111

112+
assert entity.args == [5]
113+
assert entity.kwargs == {}
114+
112115
with patch(
113116
"zigpy.zcl.Cluster.request",
114117
return_value=mock_coro([0x00, zcl_f.Status.SUCCESS]),

tests/test_sensor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ async def async_test_illuminance(
126126
await send_attributes_report(zha_gateway, cluster, {0: 0xFFFF})
127127
assert_state(entity, None, "lx")
128128

129+
assert entity.extra_state_attribute_names is None
130+
129131

130132
async def async_test_metering(
131133
zha_gateway: Gateway, cluster: Cluster, entity: PlatformEntity

tests/websocket/test_client_controller.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@
2828
WriteClusterAttributeResponse,
2929
)
3030
from zha.zigbee.device import Device, WebSocketClientDevice
31-
from zha.zigbee.group import Group, GroupMemberReference, WebSocketClientGroup
31+
from zha.zigbee.group import (
32+
Group,
33+
GroupMemberReference,
34+
WebSocketClientGroup,
35+
WebSocketClientGroupMember,
36+
)
3237
from zha.zigbee.model import GroupInfo
3338

3439
from ..common import (
@@ -481,3 +486,37 @@ async def test_ws_client_gateway_groups(
481486
assert response.name == "Test Group Controller"
482487
assert client_device1.ieee in response.members_by_ieee
483488
assert client_device2.ieee in response.members_by_ieee
489+
490+
# test member info and removal from member
491+
492+
member_info = response.members_by_ieee[client_device1.ieee]
493+
assert member_info is not None
494+
assert member_info.endpoint_id == entity1.info_object.endpoint_id
495+
assert member_info.ieee == entity1.info_object.device_ieee
496+
assert member_info.device_info is not None
497+
assert member_info.device_info.ieee == entity1._device.extended_device_info.ieee
498+
assert member_info.device_info.nwk == entity1._device.extended_device_info.nwk
499+
assert (
500+
member_info.device_info.manufacturer
501+
== entity1._device.extended_device_info.manufacturer
502+
)
503+
assert member_info.device_info.model == entity1._device.extended_device_info.model
504+
assert (
505+
member_info.device_info.signature
506+
== entity1._device.extended_device_info.signature
507+
)
508+
509+
client_group: WebSocketClientGroup = ws_client_gateway.get_group(response.group_id)
510+
assert client_group is not None
511+
members = client_group.members
512+
assert len(members) == 2
513+
entity_1_member: WebSocketClientGroupMember
514+
for member in members:
515+
if member.member_info.ieee == entity1.info_object.device_ieee:
516+
entity_1_member = member
517+
break
518+
519+
assert entity_1_member is not None
520+
await entity_1_member.async_remove_from_group()
521+
await zha_gateway.async_block_till_done()
522+
assert len(client_group.members) == 1

zha/application/gateway.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
SwitchHelper,
101101
UpdateHelper,
102102
)
103-
from zha.websocket.const import ControllerEvents, DeviceEvents
103+
from zha.websocket.const import WEBSOCKET_API, ControllerEvents, DeviceEvents
104104
from zha.websocket.server.client import ClientManager, load_api as load_client_api
105105
from zha.zigbee.device import BaseDevice, Device, WebSocketClientDevice
106106
from zha.zigbee.endpoint import ATTR_IN_CLUSTERS, ATTR_OUT_CLUSTERS
@@ -813,6 +813,7 @@ def __init__(self, config: ZHAData) -> None:
813813
self.data: dict[Any, Any] = {}
814814
for platform in discovery.PLATFORMS:
815815
self.data.setdefault(platform, [])
816+
self.data.setdefault(WEBSOCKET_API, {})
816817
self._register_api_commands()
817818

818819
@property

zha/application/platforms/climate/__init__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,6 @@ async def async_set_preset_mode(self, preset_mode: str) -> None:
154154
async def async_set_temperature(self, **kwargs: Any) -> None:
155155
"""Set new target temperature."""
156156

157-
@abstractmethod
158-
async def async_preset_handler(self, preset: str, enable: bool = False) -> None:
159-
"""Set the preset mode via handler."""
160-
161157

162158
@MULTI_MATCH(
163159
cluster_handler_names=CLUSTER_HANDLER_THERMOSTAT,
@@ -1081,9 +1077,3 @@ async def async_set_temperature(self, **kwargs: Any) -> None:
10811077
await self._device.gateway.thermostats.set_temperature(
10821078
self.info_object, **kwargs
10831079
)
1084-
1085-
async def async_preset_handler(self, preset: str, enable: bool = False) -> None:
1086-
"""Set the preset mode via handler."""
1087-
await self._device.gateway.thermostats.preset_handler(
1088-
self.info_object, preset, enable
1089-
)

zha/model.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ def serialize_ieee(self, ieee: EUI64):
9090
)
9191
def serialize_nwk(self, nwk: NWK):
9292
"""Serialize nwk as hex string."""
93-
if nwk is not None:
94-
return repr(nwk)
95-
return nwk
93+
return repr(nwk)
9694

9795

9896
class TypedBaseModel(BaseModel):

zha/websocket/client/helpers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
CoverSetPositionCommand,
3737
CoverSetTiltPositionCommand,
3838
CoverStopCommand,
39+
CoverStopTiltCommand,
3940
)
4041
from zha.application.platforms.fan.model import FanEntityInfo
4142
from zha.application.platforms.fan.websocket_api import (
@@ -371,7 +372,7 @@ async def stop_cover_tilt(
371372
self, cover_platform_entity: CoverEntityInfo
372373
) -> WebSocketCommandResponse:
373374
"""Stop a cover tilt."""
374-
command = CoverStopCommand(
375+
command = CoverStopTiltCommand(
375376
ieee=cover_platform_entity.device_ieee,
376377
unique_id=cover_platform_entity.unique_id,
377378
)

zha/websocket/server/api/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,4 @@ def register_api_command(
2626
model = handler._ws_command_model # type: ignore[attr-defined]
2727
else:
2828
command = command_or_handler
29-
if (handlers := gateway.data.get(WEBSOCKET_API)) is None:
30-
handlers = gateway.data[WEBSOCKET_API] = {}
31-
handlers[command] = (handler, model)
29+
gateway.data[WEBSOCKET_API][command] = (handler, model)

zha/websocket/server/api/decorators.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,7 @@ async def _handle_async_response(
2828
msg: T_WebSocketCommand,
2929
) -> None:
3030
"""Create a response and handle exception."""
31-
try:
32-
await func(gateway, client, msg)
33-
except Exception as err: # pylint: disable=broad-except
34-
# TODO fix this to send a real error code and message
35-
_LOGGER.exception("Error handling message", exc_info=err)
36-
client.send_result_error(msg, "API_COMMAND_HANDLER_ERROR", str(err))
31+
await func(gateway, client, msg)
3732

3833

3934
def async_response(

zha/zigbee/device.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
)
7878

7979
if TYPE_CHECKING:
80-
from zha.application.gateway import BaseGateway, Gateway, WebSocketClientGateway
80+
from zha.application.gateway import Gateway, WebSocketClientGateway
8181
from zha.application.platforms.events import EntityStateChangedEvent
8282

8383
_LOGGER = logging.getLogger(__name__)
@@ -212,11 +212,6 @@ def sw_version(self) -> int | None:
212212
def platform_entities(self) -> dict[tuple[Platform, str], T]:
213213
"""Return the platform entities for this device."""
214214

215-
@property
216-
def gateway(self) -> BaseGateway:
217-
"""Return the gateway for this device."""
218-
return self._gateway
219-
220215
def get_platform_entity(self, platform: Platform, unique_id: str) -> T:
221216
"""Get a platform entity by unique id."""
222217
return self.platform_entities[(platform, unique_id)]
@@ -459,15 +454,6 @@ def gateway(self) -> Gateway:
459454
"""Return the gateway for this device."""
460455
return self._gateway
461456

462-
@cached_property
463-
def device_automation_commands(self) -> dict[str, list[tuple[str, str]]]:
464-
"""Return the a lookup of commands to etype/sub_type."""
465-
commands: dict[str, list[tuple[str, str]]] = {}
466-
for etype_subtype, trigger in self.device_automation_triggers.items():
467-
if command := trigger.get(ATTR_COMMAND):
468-
commands.setdefault(command, []).append(etype_subtype)
469-
return commands
470-
471457
@cached_property
472458
def device_automation_triggers(self) -> dict[tuple[str, str], dict[str, Any]]:
473459
"""Return the device automation triggers for this device."""

0 commit comments

Comments
 (0)