mirror of
https://github.com/esphome/esphome.git
synced 2025-09-02 19:32:19 +01:00
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
"""Integration test for entity icons with USE_ENTITY_ICON feature."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
|
|
from aioesphomeapi import EntityState
|
|
import pytest
|
|
|
|
from .types import APIClientConnectedFactory, RunCompiledFunction
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_entity_icon(
|
|
yaml_config: str,
|
|
run_compiled: RunCompiledFunction,
|
|
api_client_connected: APIClientConnectedFactory,
|
|
) -> None:
|
|
"""Test that entities with custom icons work correctly with USE_ENTITY_ICON."""
|
|
# Write, compile and run the ESPHome device, then connect to API
|
|
async with run_compiled(yaml_config), api_client_connected() as client:
|
|
# Get all entities
|
|
entities = await client.list_entities_services()
|
|
|
|
# Create a map of entity names to entity info
|
|
entity_map = {entity.name: entity for entity in entities[0]}
|
|
|
|
# Test entities with icons
|
|
icon_test_cases = [
|
|
# (entity_name, expected_icon)
|
|
("Sensor With Icon", "mdi:temperature-celsius"),
|
|
("Binary Sensor With Icon", "mdi:motion-sensor"),
|
|
("Text Sensor With Icon", "mdi:text-box"),
|
|
("Switch With Icon", "mdi:toggle-switch"),
|
|
("Button With Icon", "mdi:gesture-tap-button"),
|
|
("Number With Icon", "mdi:numeric"),
|
|
("Select With Icon", "mdi:format-list-bulleted"),
|
|
]
|
|
|
|
# Test entities without icons (should have empty string)
|
|
no_icon_test_cases = [
|
|
"Sensor Without Icon",
|
|
"Binary Sensor Without Icon",
|
|
]
|
|
|
|
# Verify entities with icons
|
|
for entity_name, expected_icon in icon_test_cases:
|
|
assert entity_name in entity_map, (
|
|
f"Entity '{entity_name}' not found in API response"
|
|
)
|
|
entity = entity_map[entity_name]
|
|
|
|
# Check icon field
|
|
assert entity.icon == expected_icon, (
|
|
f"{entity_name}: icon mismatch - "
|
|
f"expected '{expected_icon}', got '{entity.icon}'"
|
|
)
|
|
|
|
# Verify entities without icons
|
|
for entity_name in no_icon_test_cases:
|
|
assert entity_name in entity_map, (
|
|
f"Entity '{entity_name}' not found in API response"
|
|
)
|
|
entity = entity_map[entity_name]
|
|
|
|
# Check icon field is empty
|
|
assert entity.icon == "", (
|
|
f"{entity_name}: icon should be empty string for entities without icons, "
|
|
f"got '{entity.icon}'"
|
|
)
|
|
|
|
# Subscribe to states to ensure everything works normally
|
|
states: dict[int, EntityState] = {}
|
|
state_received = asyncio.Event()
|
|
|
|
def on_state(state: EntityState) -> None:
|
|
states[state.key] = state
|
|
state_received.set()
|
|
|
|
client.subscribe_states(on_state)
|
|
|
|
# Wait for states
|
|
try:
|
|
await asyncio.wait_for(state_received.wait(), timeout=5.0)
|
|
except TimeoutError:
|
|
pytest.fail("No states received within 5 seconds")
|
|
|
|
# Verify we received states
|
|
assert len(states) > 0, (
|
|
"No states received - entities may not be working correctly"
|
|
)
|