Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Bram Kragten <mail@bramkragten.nl>
174 lines
5 KiB
Python
174 lines
5 KiB
Python
"""Test the Z-Wave JS Websocket API."""
|
|
from unittest.mock import patch
|
|
|
|
from zwave_js_server.event import Event
|
|
|
|
from homeassistant.components.zwave_js.api import ENTRY_ID, ID, NODE_ID, TYPE
|
|
from homeassistant.components.zwave_js.const import DOMAIN
|
|
from homeassistant.helpers.device_registry import async_get_registry
|
|
|
|
|
|
async def test_websocket_api(hass, integration, multisensor_6, hass_ws_client):
|
|
"""Test the network and node status websocket commands."""
|
|
entry = integration
|
|
ws_client = await hass_ws_client(hass)
|
|
|
|
await ws_client.send_json(
|
|
{ID: 2, TYPE: "zwave_js/network_status", ENTRY_ID: entry.entry_id}
|
|
)
|
|
msg = await ws_client.receive_json()
|
|
result = msg["result"]
|
|
|
|
assert result["client"]["ws_server_url"] == "ws://test:3000/zjs"
|
|
assert result["client"]["server_version"] == "1.0.0"
|
|
|
|
node = multisensor_6
|
|
await ws_client.send_json(
|
|
{
|
|
ID: 3,
|
|
TYPE: "zwave_js/node_status",
|
|
ENTRY_ID: entry.entry_id,
|
|
NODE_ID: node.node_id,
|
|
}
|
|
)
|
|
msg = await ws_client.receive_json()
|
|
result = msg["result"]
|
|
|
|
assert result[NODE_ID] == 52
|
|
assert result["ready"]
|
|
assert result["is_routing"]
|
|
assert not result["is_secure"]
|
|
assert result["status"] == 1
|
|
|
|
|
|
async def test_add_node(
|
|
hass, integration, client, hass_ws_client, nortek_thermostat_added_event
|
|
):
|
|
"""Test the add_node websocket command."""
|
|
entry = integration
|
|
ws_client = await hass_ws_client(hass)
|
|
|
|
client.async_send_command.return_value = {"success": True}
|
|
|
|
await ws_client.send_json(
|
|
{ID: 3, TYPE: "zwave_js/add_node", ENTRY_ID: entry.entry_id}
|
|
)
|
|
|
|
msg = await ws_client.receive_json()
|
|
assert msg["success"]
|
|
|
|
event = Event(
|
|
type="inclusion started",
|
|
data={
|
|
"source": "controller",
|
|
"event": "inclusion started",
|
|
"secure": False,
|
|
},
|
|
)
|
|
client.driver.receive_event(event)
|
|
|
|
msg = await ws_client.receive_json()
|
|
assert msg["event"]["event"] == "inclusion started"
|
|
|
|
client.driver.receive_event(nortek_thermostat_added_event)
|
|
msg = await ws_client.receive_json()
|
|
assert msg["event"]["event"] == "node added"
|
|
|
|
|
|
async def test_cancel_inclusion_exclusion(hass, integration, client, hass_ws_client):
|
|
"""Test cancelling the inclusion and exclusion process."""
|
|
entry = integration
|
|
ws_client = await hass_ws_client(hass)
|
|
|
|
client.async_send_command.return_value = {"success": True}
|
|
|
|
await ws_client.send_json(
|
|
{ID: 4, TYPE: "zwave_js/stop_inclusion", ENTRY_ID: entry.entry_id}
|
|
)
|
|
|
|
msg = await ws_client.receive_json()
|
|
assert msg["success"]
|
|
|
|
await ws_client.send_json(
|
|
{ID: 5, TYPE: "zwave_js/stop_exclusion", ENTRY_ID: entry.entry_id}
|
|
)
|
|
|
|
msg = await ws_client.receive_json()
|
|
assert msg["success"]
|
|
|
|
|
|
async def test_remove_node(
|
|
hass,
|
|
integration,
|
|
client,
|
|
hass_ws_client,
|
|
nortek_thermostat,
|
|
nortek_thermostat_removed_event,
|
|
):
|
|
"""Test the remove_node websocket command."""
|
|
entry = integration
|
|
ws_client = await hass_ws_client(hass)
|
|
|
|
client.async_send_command.return_value = {"success": True}
|
|
|
|
await ws_client.send_json(
|
|
{ID: 3, TYPE: "zwave_js/remove_node", ENTRY_ID: entry.entry_id}
|
|
)
|
|
|
|
msg = await ws_client.receive_json()
|
|
assert msg["success"]
|
|
|
|
event = Event(
|
|
type="exclusion started",
|
|
data={
|
|
"source": "controller",
|
|
"event": "exclusion started",
|
|
"secure": False,
|
|
},
|
|
)
|
|
client.driver.receive_event(event)
|
|
|
|
msg = await ws_client.receive_json()
|
|
assert msg["event"]["event"] == "exclusion started"
|
|
|
|
# Add mock node to controller
|
|
client.driver.controller.nodes[67] = nortek_thermostat
|
|
|
|
dev_reg = await async_get_registry(hass)
|
|
|
|
# Create device registry entry for mock node
|
|
device = dev_reg.async_get_or_create(
|
|
config_entry_id=entry.entry_id,
|
|
identifiers={(DOMAIN, "3245146787-67")},
|
|
name="Node 67",
|
|
)
|
|
|
|
# Fire node removed event
|
|
client.driver.receive_event(nortek_thermostat_removed_event)
|
|
msg = await ws_client.receive_json()
|
|
assert msg["event"]["event"] == "node removed"
|
|
|
|
# Verify device was removed from device registry
|
|
device = dev_reg.async_get_device(
|
|
identifiers={(DOMAIN, "3245146787-67")},
|
|
)
|
|
assert device is None
|
|
|
|
|
|
async def test_dump_view(integration, hass_client):
|
|
"""Test the HTTP dump view."""
|
|
client = await hass_client()
|
|
with patch(
|
|
"zwave_js_server.dump.dump_msgs",
|
|
return_value=[{"hello": "world"}, {"second": "msg"}],
|
|
):
|
|
resp = await client.get(f"/api/zwave_js/dump/{integration.entry_id}")
|
|
assert resp.status == 200
|
|
assert await resp.text() == '{"hello": "world"}\n{"second": "msg"}\n'
|
|
|
|
|
|
async def test_dump_view_invalid_entry_id(integration, hass_client):
|
|
"""Test an invalid config entry id parameter."""
|
|
client = await hass_client()
|
|
resp = await client.get("/api/zwave_js/dump/INVALID")
|
|
assert resp.status == 400
|