mirror of
https://github.com/home-assistant/core.git
synced 2026-05-20 07:20:14 +01:00
db76773727
Co-authored-by: J. Nick Koston <nick@home-assistant.io> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
140 lines
4.6 KiB
Python
140 lines
4.6 KiB
Python
"""Test the ISY994 sensor platform."""
|
|
|
|
from collections.abc import Callable
|
|
from typing import Any
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
from syrupy.assertion import SnapshotAssertion
|
|
|
|
from homeassistant.const import Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from tests.common import MockConfigEntry, snapshot_platform
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def mock_sensor_platform():
|
|
"""Mock the platforms to only include sensor."""
|
|
with patch("homeassistant.components.isy994.PLATFORMS", [Platform.SENSOR]):
|
|
yield
|
|
|
|
|
|
async def test_sensor_snapshots(
|
|
hass: HomeAssistant,
|
|
snapshot: SnapshotAssertion,
|
|
mock_config_entry: MockConfigEntry,
|
|
entity_registry: er.EntityRegistry,
|
|
mock_isy: MagicMock,
|
|
mock_node: Callable[..., Any],
|
|
) -> None:
|
|
"""Test sensors with snapshots."""
|
|
mock_config_entry.add_to_hass(hass)
|
|
|
|
# Mock nodes covering various UOMs and device classes
|
|
nodes = []
|
|
|
|
# Standardized UOMs
|
|
# Node 1: Liters per Hour
|
|
node1 = mock_node(mock_isy, "22 22 22 1", "Flow Rate LPH", "GenericSensor")
|
|
node1.status = 1000
|
|
node1.uom = "130"
|
|
node1.prec = "1"
|
|
nodes.append(("Sensors/Flow Rate LPH", node1))
|
|
|
|
# Node 2: Gallons per Minute
|
|
node2 = mock_node(mock_isy, "22 22 22 2", "Flow Rate GPM", "GenericSensor")
|
|
node2.status = 50
|
|
node2.uom = "143"
|
|
node2.prec = "1"
|
|
nodes.append(("Sensors/Flow Rate GPM", node2))
|
|
|
|
# Node 3: Gallons per Hour
|
|
node3 = mock_node(mock_isy, "22 22 22 3", "Flow Rate GPH", "GenericSensor")
|
|
node3.status = 300
|
|
node3.uom = "144"
|
|
node3.prec = "0"
|
|
nodes.append(("Sensors/Flow Rate GPH", node3))
|
|
|
|
# Node 9: Gallons per Second (142) - Should have NO device_class due to guard
|
|
node9 = mock_node(mock_isy, "22 22 22 9", "Flow Rate GPS", "GenericSensor")
|
|
node9.status = 1
|
|
node9.uom = "142"
|
|
node9.prec = "1"
|
|
nodes.append(("Sensors/Flow Rate GPS", node9))
|
|
|
|
# Node 10: Gallons per Second (142) in ISYv4 list form - guard must still apply
|
|
node10 = mock_node(mock_isy, "22 22 22 10", "Flow Rate GPS List", "GenericSensor")
|
|
node10.status = 2
|
|
node10.uom = ["142"]
|
|
node10.prec = "1"
|
|
nodes.append(("Sensors/Flow Rate GPS List", node10))
|
|
|
|
# Other UOMs from test_mappings
|
|
# Temperature (4)
|
|
node4 = mock_node(mock_isy, "22 22 22 4", "Temperature", "GenericSensor")
|
|
node4.status = 215
|
|
node4.uom = "4"
|
|
node4.prec = "1"
|
|
nodes.append(("Sensors/Temperature", node4))
|
|
|
|
# Energy (33) - TOTAL_INCREASING
|
|
node5 = mock_node(mock_isy, "22 22 22 5", "Energy", "GenericSensor")
|
|
node5.status = 123456
|
|
node5.uom = "33"
|
|
node5.prec = "0"
|
|
nodes.append(("Sensors/Energy", node5))
|
|
|
|
# Precipitation Intensity (24)
|
|
node6 = mock_node(mock_isy, "22 22 22 6", "Rain Rate", "GenericSensor")
|
|
node6.status = 12
|
|
node6.uom = "24"
|
|
node6.prec = "1"
|
|
nodes.append(("Sensors/Rain Rate", node6))
|
|
|
|
# Water (69)
|
|
node7 = mock_node(mock_isy, "22 22 22 7", "Water Meter", "GenericSensor")
|
|
node7.status = 9876
|
|
node7.uom = "69"
|
|
node7.prec = "0"
|
|
nodes.append(("Sensors/Water Meter", node7))
|
|
|
|
# Aux Properties (TPW, CPW)
|
|
node8 = mock_node(mock_isy, "22 22 22 8", "Power Node", "GenericSensor")
|
|
node8.status = 0
|
|
node8.uom = "73" # Watts
|
|
node8.aux_properties = {
|
|
"TPW": MagicMock(value=50000, uom="33", prec="0"), # Total Power (Energy)
|
|
"CPW": MagicMock(value=250, uom="73", prec="0"), # Current Power
|
|
}
|
|
nodes.append(("Sensors/Power Node", node8))
|
|
|
|
# Aux FLOW with ISYv4 list-form UOM 142 (gal/s) - guard must clear
|
|
# device_class without raising TypeError on the unhashable list.
|
|
node11 = mock_node(mock_isy, "22 22 22 11", "Flow Aux List", "GenericSensor")
|
|
node11.status = 0
|
|
node11.uom = "73"
|
|
node11.aux_properties = {
|
|
"FLOW": MagicMock(value=1, uom=["142"], prec="1"),
|
|
}
|
|
nodes.append(("Sensors/Flow Aux List", node11))
|
|
|
|
mock_isy.nodes.__iter__.return_value = nodes
|
|
|
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
# Enable disabled entities (like aux sensors)
|
|
entity_entries = er.async_entries_for_config_entry(
|
|
entity_registry, mock_config_entry.entry_id
|
|
)
|
|
for entry in entity_entries:
|
|
if entry.disabled_by:
|
|
entity_registry.async_update_entity(entry.entity_id, disabled_by=None)
|
|
|
|
await hass.config_entries.async_reload(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
|