mirror of https://github.com/home-assistant/core
330 lines
9.3 KiB
Python
330 lines
9.3 KiB
Python
"""Test label registry API."""
|
|
|
|
from datetime import datetime
|
|
|
|
from freezegun.api import FrozenDateTimeFactory
|
|
import pytest
|
|
|
|
from homeassistant.components.config import label_registry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import label_registry as lr
|
|
|
|
from tests.typing import MockHAClientWebSocket, WebSocketGenerator
|
|
|
|
|
|
@pytest.fixture(name="client")
|
|
async def client_fixture(
|
|
hass: HomeAssistant, hass_ws_client: WebSocketGenerator
|
|
) -> MockHAClientWebSocket:
|
|
"""Fixture that can interact with the config manager API."""
|
|
label_registry.async_setup(hass)
|
|
return await hass_ws_client(hass)
|
|
|
|
|
|
async def test_list_labels(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
freezer: FrozenDateTimeFactory,
|
|
) -> None:
|
|
"""Test list entries."""
|
|
created_1 = datetime.fromisoformat("2024-07-16T13:30:00.900075+00:00")
|
|
freezer.move_to(created_1)
|
|
label_registry.async_create("mock 1")
|
|
|
|
created_2 = datetime.fromisoformat("2024-07-16T13:45:00.900075+00:00")
|
|
freezer.move_to(created_2)
|
|
label_registry.async_create(
|
|
name="mock 2",
|
|
color="#00FF00",
|
|
icon="mdi:two",
|
|
description="This is the second label",
|
|
)
|
|
|
|
assert len(label_registry.labels) == 2
|
|
|
|
# update mock 1 to change modified_at
|
|
label_registry.async_update(
|
|
"mock_1",
|
|
name="Mock 1...",
|
|
)
|
|
|
|
await client.send_json_auto_id({"type": "config/label_registry/list"})
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(msg["result"]) == len(label_registry.labels)
|
|
assert msg["result"][0] == {
|
|
"color": None,
|
|
"created_at": created_1.timestamp(),
|
|
"description": None,
|
|
"icon": None,
|
|
"label_id": "mock_1",
|
|
"modified_at": created_2.timestamp(),
|
|
"name": "Mock 1...",
|
|
}
|
|
assert msg["result"][1] == {
|
|
"color": "#00FF00",
|
|
"created_at": created_2.timestamp(),
|
|
"description": "This is the second label",
|
|
"icon": "mdi:two",
|
|
"label_id": "mock_2",
|
|
"modified_at": created_2.timestamp(),
|
|
"name": "mock 2",
|
|
}
|
|
|
|
|
|
async def test_create_label(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
freezer: FrozenDateTimeFactory,
|
|
) -> None:
|
|
"""Test create entry."""
|
|
created_1 = datetime.fromisoformat("2024-07-16T13:30:00.900075+00:00")
|
|
freezer.move_to(created_1)
|
|
await client.send_json_auto_id(
|
|
{
|
|
"name": "MOCK",
|
|
"type": "config/label_registry/create",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(label_registry.labels) == 1
|
|
assert msg["result"] == {
|
|
"color": None,
|
|
"created_at": created_1.timestamp(),
|
|
"description": None,
|
|
"icon": None,
|
|
"label_id": "mock",
|
|
"name": "MOCK",
|
|
"modified_at": created_1.timestamp(),
|
|
}
|
|
|
|
created_2 = datetime.fromisoformat("2024-07-17T13:30:00.900075+00:00")
|
|
freezer.move_to(created_2)
|
|
await client.send_json_auto_id(
|
|
{
|
|
"id": 2,
|
|
"name": "MOCKERY",
|
|
"type": "config/label_registry/create",
|
|
"color": "#00FF00",
|
|
"description": "This is the second label",
|
|
"icon": "mdi:two",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(label_registry.labels) == 2
|
|
assert msg["result"] == {
|
|
"color": "#00FF00",
|
|
"created_at": created_2.timestamp(),
|
|
"description": "This is the second label",
|
|
"icon": "mdi:two",
|
|
"label_id": "mockery",
|
|
"modified_at": created_2.timestamp(),
|
|
"name": "MOCKERY",
|
|
}
|
|
|
|
created_3 = datetime.fromisoformat("2024-07-18T13:30:00.900075+00:00")
|
|
freezer.move_to(created_3)
|
|
await client.send_json_auto_id(
|
|
{
|
|
"name": "MAGIC",
|
|
"type": "config/label_registry/create",
|
|
"color": "indigo",
|
|
"description": "This is the third label",
|
|
"icon": "mdi:three",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(label_registry.labels) == 3
|
|
assert msg["result"] == {
|
|
"color": "indigo",
|
|
"created_at": created_3.timestamp(),
|
|
"description": "This is the third label",
|
|
"icon": "mdi:three",
|
|
"label_id": "magic",
|
|
"modified_at": created_3.timestamp(),
|
|
"name": "MAGIC",
|
|
}
|
|
|
|
|
|
async def test_create_label_with_name_already_in_use(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
) -> None:
|
|
"""Test create entry that should fail."""
|
|
label_registry.async_create("mock")
|
|
assert len(label_registry.labels) == 1
|
|
|
|
await client.send_json_auto_id(
|
|
{"name": "mock", "type": "config/label_registry/create"}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert not msg["success"]
|
|
assert msg["error"]["code"] == "invalid_info"
|
|
assert msg["error"]["message"] == "The name mock (mock) is already in use"
|
|
assert len(label_registry.labels) == 1
|
|
|
|
|
|
async def test_delete_label(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
) -> None:
|
|
"""Test delete entry."""
|
|
label = label_registry.async_create("mock")
|
|
assert len(label_registry.labels) == 1
|
|
|
|
await client.send_json_auto_id(
|
|
{"label_id": label.label_id, "type": "config/label_registry/delete"}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert msg["success"]
|
|
assert not label_registry.labels
|
|
|
|
|
|
async def test_delete_non_existing_label(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
) -> None:
|
|
"""Test delete entry that should fail."""
|
|
label_registry.async_create("mock")
|
|
assert len(label_registry.labels) == 1
|
|
|
|
await client.send_json_auto_id(
|
|
{"label_id": "omg_puppies", "type": "config/label_registry/delete"}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert not msg["success"]
|
|
assert msg["error"]["code"] == "invalid_info"
|
|
assert msg["error"]["message"] == "Label ID doesn't exist"
|
|
assert len(label_registry.labels) == 1
|
|
|
|
|
|
async def test_update_label(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
freezer: FrozenDateTimeFactory,
|
|
) -> None:
|
|
"""Test update entry."""
|
|
created_at = datetime.fromisoformat("2024-07-16T13:30:00.900075+00:00")
|
|
freezer.move_to(created_at)
|
|
label = label_registry.async_create("mock")
|
|
assert len(label_registry.labels) == 1
|
|
|
|
modified_at = datetime.fromisoformat("2024-07-16T13:45:00.900075+00:00")
|
|
freezer.move_to(modified_at)
|
|
|
|
await client.send_json_auto_id(
|
|
{
|
|
"label_id": label.label_id,
|
|
"name": "UPDATED",
|
|
"icon": "mdi:test",
|
|
"color": "#00FF00",
|
|
"description": "This is a label description",
|
|
"type": "config/label_registry/update",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(label_registry.labels) == 1
|
|
assert msg["result"] == {
|
|
"color": "#00FF00",
|
|
"created_at": created_at.timestamp(),
|
|
"description": "This is a label description",
|
|
"icon": "mdi:test",
|
|
"label_id": "mock",
|
|
"modified_at": modified_at.timestamp(),
|
|
"name": "UPDATED",
|
|
}
|
|
|
|
modified_at = datetime.fromisoformat("2024-07-16T13:50:00.900075+00:00")
|
|
freezer.move_to(modified_at)
|
|
|
|
await client.send_json_auto_id(
|
|
{
|
|
"label_id": label.label_id,
|
|
"name": "UPDATED AGAIN",
|
|
"icon": None,
|
|
"color": None,
|
|
"description": None,
|
|
"type": "config/label_registry/update",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(label_registry.labels) == 1
|
|
assert msg["result"] == {
|
|
"color": None,
|
|
"created_at": created_at.timestamp(),
|
|
"description": None,
|
|
"icon": None,
|
|
"label_id": "mock",
|
|
"modified_at": modified_at.timestamp(),
|
|
"name": "UPDATED AGAIN",
|
|
}
|
|
|
|
modified_at = datetime.fromisoformat("2024-07-16T13:55:00.900075+00:00")
|
|
freezer.move_to(modified_at)
|
|
|
|
await client.send_json_auto_id(
|
|
{
|
|
"label_id": label.label_id,
|
|
"name": "UPDATED YET AGAIN",
|
|
"icon": None,
|
|
"color": "primary",
|
|
"description": None,
|
|
"type": "config/label_registry/update",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert len(label_registry.labels) == 1
|
|
assert msg["result"] == {
|
|
"color": "primary",
|
|
"created_at": created_at.timestamp(),
|
|
"description": None,
|
|
"icon": None,
|
|
"label_id": "mock",
|
|
"modified_at": modified_at.timestamp(),
|
|
"name": "UPDATED YET AGAIN",
|
|
}
|
|
|
|
|
|
async def test_update_with_name_already_in_use(
|
|
client: MockHAClientWebSocket,
|
|
label_registry: lr.LabelRegistry,
|
|
) -> None:
|
|
"""Test update entry."""
|
|
label = label_registry.async_create("mock 1")
|
|
label_registry.async_create("mock 2")
|
|
assert len(label_registry.labels) == 2
|
|
|
|
await client.send_json_auto_id(
|
|
{
|
|
"label_id": label.label_id,
|
|
"name": "mock 2",
|
|
"type": "config/label_registry/update",
|
|
}
|
|
)
|
|
|
|
msg = await client.receive_json()
|
|
|
|
assert not msg["success"]
|
|
assert msg["error"]["code"] == "invalid_info"
|
|
assert msg["error"]["message"] == "The name mock 2 (mock2) is already in use"
|
|
assert len(label_registry.labels) == 2
|