1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-20 07:20:14 +01:00
Files
2026-04-25 05:44:41 -05:00

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)