async def test_failure_scenarios(hass, client, hank_binary_switch, integration): """Test failure scenarios.""" with pytest.raises(HomeAssistantError): await async_attach_trigger(hass, { "type": "failed.test", "device_id": "invalid_device_id" }, None, {}) with pytest.raises(HomeAssistantError): await async_attach_trigger( hass, { "type": "event.failed_type", "device_id": "invalid_device_id" }, None, {}, ) dev_reg = async_get_dev_reg(hass) device = async_entries_for_config_entry(dev_reg, integration.entry_id)[0] with pytest.raises(HomeAssistantError): await async_attach_trigger(hass, { "type": "failed.test", "device_id": device.id }, None, {}) with pytest.raises(HomeAssistantError): await async_attach_trigger( hass, { "type": "event.failed_type", "device_id": device.id }, None, {}, ) with patch( "homeassistant.components.zwave_js.device_trigger.async_get_node_from_device_id", return_value=None, ), patch( "homeassistant.components.zwave_js.helpers.get_zwave_value_from_config", return_value=None, ): assert (await async_get_trigger_capabilities(hass, { "type": "failed.test", "device_id": "invalid_device_id" }) == {}) with pytest.raises(HomeAssistantError): async_get_node_status_sensor_entity_id(hass, "invalid_device_id")
async def test_get_trigger_capabilities_node_status( hass, client, lock_schlage_be469, integration ): """Test we get the expected capabilities from a node_status trigger.""" dev_reg = async_get_dev_reg(hass) device = async_entries_for_config_entry(dev_reg, integration.entry_id)[0] ent_reg = async_get_ent_reg(hass) entity_id = async_get_node_status_sensor_entity_id( hass, device.id, ent_reg, dev_reg ) ent_reg.async_update_entity(entity_id, **{"disabled_by": None}) await hass.config_entries.async_reload(integration.entry_id) await hass.async_block_till_done() capabilities = await device_trigger.async_get_trigger_capabilities( hass, { "platform": "device", "domain": DOMAIN, "device_id": device.id, "entity_id": entity_id, "type": "state.node_status", }, ) assert capabilities and "extra_fields" in capabilities assert voluptuous_serialize.convert( capabilities["extra_fields"], custom_serializer=cv.custom_serializer ) == [ { "name": "from", "optional": True, "options": [ ("asleep", "asleep"), ("awake", "awake"), ("dead", "dead"), ("alive", "alive"), ], "type": "select", }, { "name": "to", "optional": True, "options": [ ("asleep", "asleep"), ("awake", "awake"), ("dead", "dead"), ("alive", "alive"), ], "type": "select", }, {"name": "for", "optional": True, "type": "positive_time_period_dict"}, ]
async def test_get_node_status_triggers(hass, client, lock_schlage_be469, integration): """Test we get the expected triggers from a device with node status sensor enabled.""" dev_reg = async_get_dev_reg(hass) device = async_entries_for_config_entry(dev_reg, integration.entry_id)[0] ent_reg = async_get_ent_reg(hass) entity_id = async_get_node_status_sensor_entity_id(hass, device.id, ent_reg, dev_reg) ent_reg.async_update_entity(entity_id, **{"disabled_by": None}) await hass.config_entries.async_reload(integration.entry_id) await hass.async_block_till_done() expected_trigger = { "platform": "device", "domain": DOMAIN, "type": "state.node_status", "device_id": device.id, "entity_id": entity_id, } triggers = await async_get_device_automations(hass, "trigger", device.id) assert expected_trigger in triggers
async def test_if_node_status_change_fires( hass, client, lock_schlage_be469, integration, calls ): """Test for node_status trigger firing.""" node: Node = lock_schlage_be469 dev_reg = async_get_dev_reg(hass) device = async_entries_for_config_entry(dev_reg, integration.entry_id)[0] ent_reg = async_get_ent_reg(hass) entity_id = async_get_node_status_sensor_entity_id( hass, device.id, ent_reg, dev_reg ) ent_reg.async_update_entity(entity_id, **{"disabled_by": None}) await hass.config_entries.async_reload(integration.entry_id) await hass.async_block_till_done() assert await async_setup_component( hass, automation.DOMAIN, { automation.DOMAIN: [ # from { "trigger": { "platform": "device", "domain": DOMAIN, "device_id": device.id, "entity_id": entity_id, "type": "state.node_status", "from": "alive", }, "action": { "service": "test.automation", "data_template": { "some": ( "state.node_status - " "{{ trigger.platform}} - " "{{ trigger.from_state.state }}" ) }, }, }, # no from or to { "trigger": { "platform": "device", "domain": DOMAIN, "device_id": device.id, "entity_id": entity_id, "type": "state.node_status", }, "action": { "service": "test.automation", "data_template": { "some": ( "state.node_status2 - " "{{ trigger.platform}} - " "{{ trigger.from_state.state }}" ) }, }, }, ] }, ) # Test status change event = Event( "dead", data={"source": "node", "event": "dead", "nodeId": node.node_id} ) node.receive_event(event) await hass.async_block_till_done() assert len(calls) == 2 assert calls[0].data["some"] == "state.node_status - device - alive" assert calls[1].data["some"] == "state.node_status2 - device - alive"
async def test_failure_scenarios(hass, client, hank_binary_switch, integration): """Test failure scenarios.""" with pytest.raises(HomeAssistantError): await device_trigger.async_attach_trigger( hass, {"type": "failed.test", "device_id": "invalid_device_id"}, None, {} ) with pytest.raises(HomeAssistantError): await device_trigger.async_attach_trigger( hass, {"type": "event.failed_type", "device_id": "invalid_device_id"}, None, {}, ) dev_reg = async_get_dev_reg(hass) device = async_entries_for_config_entry(dev_reg, integration.entry_id)[0] with pytest.raises(HomeAssistantError): await device_trigger.async_attach_trigger( hass, {"type": "failed.test", "device_id": device.id}, None, {} ) with pytest.raises(HomeAssistantError): await device_trigger.async_attach_trigger( hass, {"type": "event.failed_type", "device_id": device.id}, None, {}, ) with pytest.raises(HomeAssistantError): await device_trigger.async_attach_trigger( hass, {"type": "state.failed_type", "device_id": device.id}, None, {}, ) with patch( "homeassistant.components.zwave_js.device_trigger.async_get_node_from_device_id", return_value=None, ), patch( "homeassistant.components.zwave_js.helpers.get_zwave_value_from_config", return_value=None, ): assert ( await device_trigger.async_get_trigger_capabilities( hass, {"type": "failed.test", "device_id": "invalid_device_id"} ) == {} ) with pytest.raises(HomeAssistantError): async_get_node_status_sensor_entity_id(hass, "invalid_device_id") INVALID_CONFIG = { "platform": "device", "domain": DOMAIN, "device_id": device.id, "type": "zwave_js.value_updated.value", "command_class": CommandClass.DOOR_LOCK.value, "property": 9999, "property_key": 9999, "endpoint": 9999, } # Test that invalid config raises exception with pytest.raises(InvalidDeviceAutomationConfig): await device_trigger.async_validate_trigger_config(hass, INVALID_CONFIG) # Unload entry so we can verify that validation will pass on an invalid config # since we return early await hass.config_entries.async_unload(integration.entry_id) assert ( await device_trigger.async_validate_trigger_config(hass, INVALID_CONFIG) == INVALID_CONFIG ) # Test invalid device ID fails validation with pytest.raises(InvalidDeviceAutomationConfig): await device_trigger.async_validate_trigger_config( hass, { "platform": "device", "domain": DOMAIN, "device_id": "invalid_device_id", "type": "zwave_js.value_updated.value", "command_class": CommandClass.DOOR_LOCK.value, "property": 9999, "property_key": 9999, "endpoint": 9999, }, )