From 4885b22cb4c6773ca3f01dc03ede7610ba84eba1 Mon Sep 17 00:00:00 2001 From: Charles Garwood Date: Fri, 4 Sep 2020 15:52:47 -0400 Subject: [PATCH] Improve ozw websocket response when node is not found (#39653) * Return not_found error over ws if node is not found * Remove unrelated code from this PR * Only import ERR_NOT_FOUND from core websocket_api --- homeassistant/components/ozw/websocket_api.py | 18 ++++++++++++++++++ tests/components/ozw/test_websocket_api.py | 19 +++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/ozw/websocket_api.py b/homeassistant/components/ozw/websocket_api.py index a71723ed086..da9c2b1f598 100644 --- a/homeassistant/components/ozw/websocket_api.py +++ b/homeassistant/components/ozw/websocket_api.py @@ -150,6 +150,15 @@ def websocket_node_status(hass, connection, msg): """Get the status for a Z-Wave node.""" manager = hass.data[DOMAIN][MANAGER] node = manager.get_instance(msg[OZW_INSTANCE]).get_node(msg[NODE_ID]) + + if not node: + connection.send_message( + websocket_api.error_message( + msg[ID], websocket_api.const.ERR_NOT_FOUND, "OZW Node not found" + ) + ) + return + connection.send_result( msg[ID], { @@ -185,6 +194,15 @@ def websocket_node_metadata(hass, connection, msg): """Get the metadata for a Z-Wave node.""" manager = hass.data[DOMAIN][MANAGER] node = manager.get_instance(msg[OZW_INSTANCE]).get_node(msg[NODE_ID]) + + if not node: + connection.send_message( + websocket_api.error_message( + msg[ID], websocket_api.const.ERR_NOT_FOUND, "OZW Node not found" + ) + ) + return + connection.send_result( msg[ID], { diff --git a/tests/components/ozw/test_websocket_api.py b/tests/components/ozw/test_websocket_api.py index 5a8e11a77c8..353615c1812 100644 --- a/tests/components/ozw/test_websocket_api.py +++ b/tests/components/ozw/test_websocket_api.py @@ -19,6 +19,7 @@ from homeassistant.components.ozw.websocket_api import ( OZW_INSTANCE, TYPE, ) +from homeassistant.components.websocket_api.const import ERR_NOT_FOUND from .common import MQTTMessage, setup_ozw @@ -68,8 +69,13 @@ async def test_websocket_api(hass, generic_data, hass_ws_client): assert result[ATTR_NODE_SPECIFIC_STRING] == "Binary Power Switch" assert result[ATTR_NEIGHBORS] == [1, 33, 36, 37, 39] + await client.send_json({ID: 7, TYPE: "ozw/node_status", NODE_ID: 999}) + msg = await client.receive_json() + result = msg["error"] + assert result["code"] == ERR_NOT_FOUND + # Test node statistics - await client.send_json({ID: 7, TYPE: "ozw/node_statistics", NODE_ID: 39}) + await client.send_json({ID: 8, TYPE: "ozw/node_statistics", NODE_ID: 39}) msg = await client.receive_json() result = msg["result"] @@ -87,13 +93,18 @@ async def test_websocket_api(hass, generic_data, hass_ws_client): assert result["received_unsolicited"] == 3546 # Test node metadata - await client.send_json({ID: 8, TYPE: "ozw/node_metadata", NODE_ID: 39}) + await client.send_json({ID: 9, TYPE: "ozw/node_metadata", NODE_ID: 39}) msg = await client.receive_json() result = msg["result"] assert result["metadata"]["ProductPic"] == "images/aeotec/zwa002.png" + await client.send_json({ID: 10, TYPE: "ozw/node_metadata", NODE_ID: 999}) + msg = await client.receive_json() + result = msg["error"] + assert result["code"] == ERR_NOT_FOUND + # Test network statistics - await client.send_json({ID: 9, TYPE: "ozw/network_statistics"}) + await client.send_json({ID: 11, TYPE: "ozw/network_statistics"}) msg = await client.receive_json() result = msg["result"] assert result["readCnt"] == 92220 @@ -101,7 +112,7 @@ async def test_websocket_api(hass, generic_data, hass_ws_client): assert result["node_count"] == 5 # Test get nodes - await client.send_json({ID: 10, TYPE: "ozw/get_nodes"}) + await client.send_json({ID: 12, TYPE: "ozw/get_nodes"}) msg = await client.receive_json() result = msg["result"] assert len(result) == 5