* knx entity CRUD - initial commit - switch * platform dependent schema * coerce empty GA-lists to None * read entity configuration from WS * use entity_id instead of unique_id for lookup * Add device support * Rename KNXEntityStore to KNXConfigStore * fix test after rename * Send schema options for creating / editing entities * Return entity_id after entity creation * remove device_class config in favour of more-info-dialog settings * refactor group address schema for custom selector * Rename GA keys and remove invalid keys from schema * fix rebase * Fix deleting devices and their entities * Validate entity schema in extra step - return validation infos * Use exception to signal validation error; return validated data * Forward validation result when editing entities * Get proper validation error message for optional GAs * Add entity validation only WS command * use ulid instead of uuid * Fix error handling for edit unknown entity * Remove unused optional group address sets from validated schema * Add optional dpt field for ga_schema * Move knx config things to sub-key * Add light platform * async_forward_entry_setups only once * Test crate and remove devices * Test removing entities of a removed device * Test entity creation and storage * Test deleting entities * Test unsuccessful entity creation * Test updating entity data * Test get entity config * Test validate entity * Update entity data by entity_id instead of unique_id * Remove unnecessary uid unique check * remove schema_options * test fixture for entity creation * clean up group address schema class can be used to add custom serializer later * Revert: Add light platfrom * remove unused optional_ga_schema * Test GASelector * lint tests * Review * group entities before adding * fix / ignore mypy * always has_entity_name * Entity name: check for empty string when no device * use constants instead of strings in schema * Fix mypy errors for voluptuous schemas --------- Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
"""Test KNX devices."""
|
|
|
|
from typing import Any
|
|
|
|
from homeassistant.components.knx.const import DOMAIN
|
|
from homeassistant.components.knx.storage.config_store import (
|
|
STORAGE_KEY as KNX_CONFIG_STORAGE_KEY,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from .conftest import KNXTestKit
|
|
|
|
from tests.typing import WebSocketGenerator
|
|
|
|
|
|
async def test_create_device(
|
|
hass: HomeAssistant,
|
|
knx: KNXTestKit,
|
|
device_registry: dr.DeviceRegistry,
|
|
hass_ws_client: WebSocketGenerator,
|
|
) -> None:
|
|
"""Test device creation."""
|
|
await knx.setup_integration({})
|
|
client = await hass_ws_client(hass)
|
|
|
|
await client.send_json_auto_id(
|
|
{
|
|
"type": "knx/create_device",
|
|
"name": "Test Device",
|
|
}
|
|
)
|
|
res = await client.receive_json()
|
|
assert res["success"], res
|
|
assert res["result"]["name"] == "Test Device"
|
|
assert res["result"]["manufacturer"] == "KNX"
|
|
assert res["result"]["identifiers"]
|
|
assert res["result"]["config_entries"][0] == knx.mock_config_entry.entry_id
|
|
|
|
device_identifier = res["result"]["identifiers"][0][1]
|
|
assert device_registry.async_get_device({(DOMAIN, device_identifier)})
|
|
device_id = res["result"]["id"]
|
|
assert device_registry.async_get(device_id)
|
|
|
|
|
|
async def test_remove_device(
|
|
hass: HomeAssistant,
|
|
knx: KNXTestKit,
|
|
device_registry: dr.DeviceRegistry,
|
|
entity_registry: er.EntityRegistry,
|
|
hass_ws_client: WebSocketGenerator,
|
|
load_config_store: None,
|
|
hass_storage: dict[str, Any],
|
|
) -> None:
|
|
"""Test device removal."""
|
|
assert await async_setup_component(hass, "config", {})
|
|
await knx.setup_integration({})
|
|
client = await hass_ws_client(hass)
|
|
|
|
await knx.assert_read("1/0/45", response=True)
|
|
|
|
assert hass_storage[KNX_CONFIG_STORAGE_KEY]["data"]["entities"].get("switch")
|
|
test_device = device_registry.async_get_device(
|
|
{(DOMAIN, "knx_vdev_4c80a564f5fe5da701ed293966d6384d")}
|
|
)
|
|
device_id = test_device.id
|
|
device_entities = entity_registry.entities.get_entries_for_device_id(device_id)
|
|
assert len(device_entities) == 1
|
|
|
|
response = await client.remove_device(device_id, knx.mock_config_entry.entry_id)
|
|
assert response["success"]
|
|
assert not device_registry.async_get_device(
|
|
{(DOMAIN, "knx_vdev_4c80a564f5fe5da701ed293966d6384d")}
|
|
)
|
|
assert not entity_registry.entities.get_entries_for_device_id(device_id)
|
|
assert not hass_storage[KNX_CONFIG_STORAGE_KEY]["data"]["entities"].get("switch")
|