Use snapshot in deCONZ sensor tests (#122543)

This commit is contained in:
Robert Svensson 2024-07-24 18:07:18 +02:00 committed by GitHub
parent 5bda072141
commit 277883e756
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 2321 additions and 337 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2,31 +2,22 @@
from datetime import timedelta
from typing import Any
from unittest.mock import patch
import pytest
from syrupy import SnapshotAssertion
from homeassistant.components.deconz.const import CONF_ALLOW_CLIP_SENSOR
from homeassistant.components.sensor import (
DOMAIN as SENSOR_DOMAIN,
SensorDeviceClass,
SensorStateClass,
)
from homeassistant.config_entries import RELOAD_AFTER_UPDATE_DELAY, ConfigEntry
from homeassistant.const import (
ATTR_DEVICE_CLASS,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
STATE_UNAVAILABLE,
EntityCategory,
)
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.config_entries import RELOAD_AFTER_UPDATE_DELAY
from homeassistant.const import STATE_UNAVAILABLE, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers import entity_registry as er
from homeassistant.util import dt as dt_util
from .conftest import ConfigEntryFactoryType, WebsocketDataType
from tests.common import async_fire_time_changed
from tests.common import async_fire_time_changed, snapshot_platform
TEST_DATA = [
( # Air quality sensor
@ -51,17 +42,7 @@ TEST_DATA = [
"uniqueid": "00:12:4b:00:14:4d:00:07-02-fdef",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.bosch_air_quality_sensor",
"unique_id": "00:12:4b:00:14:4d:00:07-02-fdef-air_quality",
"state": "poor",
"entity_category": None,
"device_class": None,
"state_class": None,
"attributes": {
"friendly_name": "BOSCH Air quality sensor",
},
"websocket_event": {"state": {"airquality": "excellent"}},
"next_state": "excellent",
},
@ -88,19 +69,7 @@ TEST_DATA = [
"uniqueid": "00:12:4b:00:14:4d:00:07-02-fdef",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.bosch_air_quality_sensor_ppb",
"unique_id": "00:12:4b:00:14:4d:00:07-02-fdef-air_quality_ppb",
"state": "809",
"entity_category": None,
"device_class": None,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"friendly_name": "BOSCH Air quality sensor PPB",
"state_class": "measurement",
"unit_of_measurement": CONCENTRATION_PARTS_PER_BILLION,
},
"websocket_event": {"state": {"airqualityppb": 1000}},
"next_state": "1000",
},
@ -127,20 +96,7 @@ TEST_DATA = [
"uniqueid": "00:00:00:00:00:00:00:01-02-0113",
},
{
"entity_count": 4,
"device_count": 3,
"entity_id": "sensor.airquality_1_co2",
"unique_id": "00:00:00:00:00:00:00:01-02-0113-air_quality_co2",
"state": "359",
"entity_category": None,
"device_class": SensorDeviceClass.CO2,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"friendly_name": "AirQuality 1 CO2",
"device_class": SensorDeviceClass.CO2,
"state_class": SensorStateClass.MEASUREMENT,
"unit_of_measurement": CONCENTRATION_PARTS_PER_MILLION,
},
"websocket_event": {"state": {"airquality_co2_density": 332}},
"next_state": "332",
},
@ -167,20 +123,7 @@ TEST_DATA = [
"uniqueid": "00:00:00:00:00:00:00:01-02-0113",
},
{
"entity_count": 4,
"device_count": 3,
"entity_id": "sensor.airquality_1_ch2o",
"unique_id": "00:00:00:00:00:00:00:01-02-0113-air_quality_formaldehyde",
"state": "4",
"entity_category": None,
"device_class": SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"friendly_name": "AirQuality 1 CH2O",
"device_class": SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
"state_class": SensorStateClass.MEASUREMENT,
"unit_of_measurement": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
},
"websocket_event": {"state": {"airquality_formaldehyde_density": 5}},
"next_state": "5",
},
@ -207,20 +150,7 @@ TEST_DATA = [
"uniqueid": "00:00:00:00:00:00:00:01-02-0113",
},
{
"entity_count": 4,
"device_count": 3,
"entity_id": "sensor.airquality_1_pm25",
"unique_id": "00:00:00:00:00:00:00:01-02-0113-air_quality_pm2_5",
"state": "8",
"entity_category": None,
"device_class": SensorDeviceClass.PM25,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"friendly_name": "AirQuality 1 PM25",
"device_class": SensorDeviceClass.PM25,
"state_class": SensorStateClass.MEASUREMENT,
"unit_of_measurement": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
},
"websocket_event": {"state": {"pm2_5": 11}},
"next_state": "11",
},
@ -246,21 +176,7 @@ TEST_DATA = [
"uniqueid": "00:0d:6f:ff:fe:01:23:45-01-0001",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.fyrtur_block_out_roller_blind_battery",
"unique_id": "00:0d:6f:ff:fe:01:23:45-01-0001-battery",
"state": "100",
"entity_category": EntityCategory.DIAGNOSTIC,
"device_class": SensorDeviceClass.BATTERY,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"on": True,
"unit_of_measurement": "%",
"device_class": "battery",
"friendly_name": "FYRTUR block-out roller blind Battery",
},
"websocket_event": {"state": {"battery": 50}},
"next_state": "50",
},
@ -290,20 +206,7 @@ TEST_DATA = [
"uniqueid": "xx:xx:xx:xx:xx:xx:xx:xx-01-040d",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.carbondioxide_35",
"unique_id": "xx:xx:xx:xx:xx:xx:xx:xx-01-040d-carbon_dioxide",
"state": "370",
"entity_category": None,
"device_class": SensorDeviceClass.CO2,
"state_class": CONCENTRATION_PARTS_PER_BILLION,
"attributes": {
"device_class": "carbon_dioxide",
"friendly_name": "CarbonDioxide 35",
"state_class": SensorStateClass.MEASUREMENT,
"unit_of_measurement": CONCENTRATION_PARTS_PER_BILLION,
},
"websocket_event": {"state": {"measured_value": 500}},
"next_state": "500",
},
@ -325,22 +228,7 @@ TEST_DATA = [
"uniqueid": "00:0d:6f:00:0b:7a:64:29-01-0702",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.consumption_15",
"unique_id": "00:0d:6f:00:0b:7a:64:29-01-0702-consumption",
"state": "11.342",
"entity_category": None,
"device_class": SensorDeviceClass.ENERGY,
"state_class": SensorStateClass.TOTAL_INCREASING,
"attributes": {
"state_class": "total_increasing",
"on": True,
"power": 123,
"unit_of_measurement": "kWh",
"device_class": "energy",
"friendly_name": "Consumption 15",
},
"websocket_event": {"state": {"consumption": 10000}},
"next_state": "10.0",
},
@ -368,21 +256,7 @@ TEST_DATA = [
},
{
"enable_entity": True,
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.daylight",
"unique_id": "01:23:4E:FF:FF:56:78:9A-01-daylight_status",
"old-unique_id": "01:23:4E:FF:FF:56:78:9A-01",
"state": "solar_noon",
"entity_category": None,
"device_class": None,
"state_class": None,
"attributes": {
"on": True,
"daylight": True,
"icon": "mdi:white-balance-sunny",
"friendly_name": "Daylight",
},
"websocket_event": {"state": {"status": 210}},
"next_state": "dusk",
},
@ -412,20 +286,7 @@ TEST_DATA = [
"uniqueid": "xx:xx:xx:xx:xx:xx:xx:xx-01-042b",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.formaldehyde_34",
"unique_id": "xx:xx:xx:xx:xx:xx:xx:xx-01-042b-formaldehyde",
"state": "1",
"entity_category": None,
"device_class": SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"device_class": "volatile_organic_compounds",
"friendly_name": "Formaldehyde 34",
"state_class": SensorStateClass.MEASUREMENT,
"unit_of_measurement": CONCENTRATION_PARTS_PER_BILLION,
},
"websocket_event": {"state": {"measured_value": 2}},
"next_state": "2",
},
@ -449,18 +310,7 @@ TEST_DATA = [
"uniqueid": "fsm-state-1520195376277",
},
{
"entity_count": 1,
"device_count": 2,
"entity_id": "sensor.fsm_state_motion_stair",
"unique_id": "fsm-state-1520195376277-status",
"state": "0",
"entity_category": None,
"device_class": None,
"state_class": None,
"attributes": {
"on": True,
"friendly_name": "FSM_STATE Motion stair",
},
"websocket_event": {"state": {"status": 1}},
"next_state": "1",
},
@ -487,24 +337,7 @@ TEST_DATA = [
"uniqueid": "00:15:8d:00:02:45:dc:53-01-0405",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.mi_temperature_1",
"unique_id": "00:15:8d:00:02:45:dc:53-01-0405-humidity",
"state": "35.55",
"entity_category": None,
"device_class": SensorDeviceClass.HUMIDITY,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"on": True,
"unit_of_measurement": "%",
"device_class": "humidity",
"friendly_name": "Mi temperature 1",
},
"options": {
"suggested_display_precision": 1,
},
"websocket_event": {"state": {"humidity": 1000}},
"next_state": "10.0",
},
@ -528,20 +361,7 @@ TEST_DATA = [
"uniqueid": "a4:c1:38:fe:86:8f:07:a3-01-0408",
},
{
"entity_count": 3,
"device_count": 3,
"entity_id": "sensor.soil_sensor",
"unique_id": "a4:c1:38:fe:86:8f:07:a3-01-0408-moisture",
"state": "72.13",
"entity_category": None,
"device_class": SensorDeviceClass.MOISTURE,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"unit_of_measurement": "%",
"device_class": "moisture",
"friendly_name": "Soil Sensor",
},
"websocket_event": {"state": {"moisture": 6923}},
"next_state": "69.23",
},
@ -576,23 +396,7 @@ TEST_DATA = [
"uniqueid": "00:17:88:01:03:28:8c:9b-02-0400",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.motion_sensor_4",
"unique_id": "00:17:88:01:03:28:8c:9b-02-0400-light_level",
"state": "5.0",
"entity_category": None,
"device_class": SensorDeviceClass.ILLUMINANCE,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"on": True,
"dark": True,
"daylight": False,
"unit_of_measurement": "lx",
"device_class": "illuminance",
"friendly_name": "Motion sensor 4",
"state_class": "measurement",
},
"websocket_event": {"state": {"lightlevel": 1000}},
"next_state": "1.3",
},
@ -628,20 +432,7 @@ TEST_DATA = [
"uniqueid": "xx:xx:xx:xx:xx:xx:xx:xx-01-042a",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.starkvind_airpurifier_pm25",
"unique_id": "xx:xx:xx:xx:xx:xx:xx:xx-01-042a-particulate_matter_pm2_5",
"state": "1",
"entity_category": None,
"device_class": SensorDeviceClass.PM25,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"friendly_name": "STARKVIND AirPurifier PM25",
"device_class": SensorDeviceClass.PM25,
"state_class": SensorStateClass.MEASUREMENT,
"unit_of_measurement": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
},
"websocket_event": {"state": {"measured_value": 2}},
"next_state": "2",
},
@ -667,23 +458,7 @@ TEST_DATA = [
"uniqueid": "00:0d:6f:00:0b:7a:64:29-01-0b04",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.power_16",
"unique_id": "00:0d:6f:00:0b:7a:64:29-01-0b04-power",
"state": "64",
"entity_category": None,
"device_class": SensorDeviceClass.POWER,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"on": True,
"current": 34,
"voltage": 231,
"unit_of_measurement": "W",
"device_class": "power",
"friendly_name": "Power 16",
},
"websocket_event": {"state": {"power": 1000}},
"next_state": "1000",
},
@ -709,21 +484,7 @@ TEST_DATA = [
"uniqueid": "00:15:8d:00:02:45:dc:53-01-0403",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.mi_temperature_1",
"unique_id": "00:15:8d:00:02:45:dc:53-01-0403-pressure",
"state": "1010",
"entity_category": None,
"device_class": SensorDeviceClass.PRESSURE,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"on": True,
"unit_of_measurement": "hPa",
"device_class": "pressure",
"friendly_name": "Mi temperature 1",
},
"websocket_event": {"state": {"pressure": 500}},
"next_state": "500",
},
@ -750,24 +511,7 @@ TEST_DATA = [
"uniqueid": "00:15:8d:00:02:45:dc:53-01-0402",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.mi_temperature_1",
"unique_id": "00:15:8d:00:02:45:dc:53-01-0402-temperature",
"state": "21.82",
"entity_category": None,
"device_class": SensorDeviceClass.TEMPERATURE,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"on": True,
"unit_of_measurement": "°C",
"device_class": "temperature",
"friendly_name": "Mi temperature 1",
},
"options": {
"suggested_display_precision": 1,
},
"websocket_event": {"state": {"temperature": 1800}},
"next_state": "18.0",
},
@ -796,17 +540,7 @@ TEST_DATA = [
"uniqueid": "cc:cc:cc:ff:fe:38:4d:b3-01-000a",
},
{
"entity_count": 2,
"device_count": 3,
"entity_id": "sensor.etrv_sejour",
"unique_id": "cc:cc:cc:ff:fe:38:4d:b3-01-000a-last_set",
"state": "2020-11-19T08:07:08+00:00",
"entity_category": None,
"device_class": SensorDeviceClass.TIMESTAMP,
"attributes": {
"device_class": "timestamp",
"friendly_name": "eTRV Séjour",
},
"websocket_event": {"state": {"lastset": "2020-12-14T10:12:14Z"}},
"next_state": "2020-12-14T10:12:14+00:00",
},
@ -835,20 +569,7 @@ TEST_DATA = [
"uniqueid": "00:15:8d:00:02:b5:d1:80-01-0500",
},
{
"entity_count": 3,
"device_count": 3,
"entity_id": "sensor.alarm_10_temperature",
"unique_id": "00:15:8d:00:02:b5:d1:80-01-0500-internal_temperature",
"state": "26.0",
"entity_category": None,
"device_class": SensorDeviceClass.TEMPERATURE,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"unit_of_measurement": "°C",
"device_class": "temperature",
"friendly_name": "Alarm 10 Temperature",
},
"websocket_event": {"state": {"temperature": 1800}},
"next_state": "26.0",
},
@ -876,22 +597,7 @@ TEST_DATA = [
"uniqueid": "00:17:88:01:02:0e:32:a3-02-fc00",
},
{
"entity_count": 1,
"device_count": 3,
"entity_id": "sensor.dimmer_switch_3_battery",
"unique_id": "00:17:88:01:02:0e:32:a3-02-fc00-battery",
"state": "90",
"entity_category": EntityCategory.DIAGNOSTIC,
"device_class": SensorDeviceClass.BATTERY,
"state_class": SensorStateClass.MEASUREMENT,
"attributes": {
"state_class": "measurement",
"on": True,
"event_id": "dimmer_switch_3",
"unit_of_measurement": "%",
"device_class": "battery",
"friendly_name": "Dimmer switch 3 Battery",
},
"websocket_event": {"config": {"battery": 80}},
"next_state": "80",
},
@ -903,13 +609,16 @@ TEST_DATA = [
@pytest.mark.parametrize("config_entry_options", [{CONF_ALLOW_CLIP_SENSOR: True}])
async def test_sensors(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
entity_registry: er.EntityRegistry,
config_entry_setup: ConfigEntry,
config_entry_factory: ConfigEntryFactoryType,
sensor_ws_data: WebsocketDataType,
expected: dict[str, Any],
snapshot: SnapshotAssertion,
) -> None:
"""Test successful creation of sensor entities."""
with patch("homeassistant.components.deconz.PLATFORMS", [Platform.SENSOR]):
config_entry = await config_entry_factory()
# Enable in entity registry
if expected.get("enable_entity"):
entity_registry.async_update_entity(
@ -923,32 +632,7 @@ async def test_sensors(
)
await hass.async_block_till_done()
assert len(hass.states.async_all()) == expected["entity_count"]
# Verify entity state
sensor = hass.states.get(expected["entity_id"])
assert sensor.state == expected["state"]
assert sensor.attributes.get(ATTR_DEVICE_CLASS) == expected["device_class"]
assert sensor.attributes == expected["attributes"]
# Verify entity registry
assert (
entity_registry.async_get(expected["entity_id"]).entity_category
is expected["entity_category"]
)
ent_reg_entry = entity_registry.async_get(expected["entity_id"])
assert ent_reg_entry.entity_category is expected["entity_category"]
assert ent_reg_entry.unique_id == expected["unique_id"]
# Verify device registry
assert (
len(
dr.async_entries_for_config_entry(
device_registry, config_entry_setup.entry_id
)
)
== expected["device_count"]
)
await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id)
# Change state
@ -957,12 +641,12 @@ async def test_sensors(
# Unload entry
await hass.config_entries.async_unload(config_entry_setup.entry_id)
await hass.config_entries.async_unload(config_entry.entry_id)
assert hass.states.get(expected["entity_id"]).state == STATE_UNAVAILABLE
# Remove entry
await hass.config_entries.async_remove(config_entry_setup.entry_id)
await hass.config_entries.async_remove(config_entry.entry_id)
await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0
@ -1021,17 +705,20 @@ async def test_not_allow_clip_sensor(hass: HomeAssistant) -> None:
)
@pytest.mark.parametrize("config_entry_options", [{CONF_ALLOW_CLIP_SENSOR: True}])
async def test_allow_clip_sensors(
hass: HomeAssistant, config_entry_setup: ConfigEntry
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
config_entry_factory: ConfigEntryFactoryType,
snapshot: SnapshotAssertion,
) -> None:
"""Test that CLIP sensors can be allowed."""
assert len(hass.states.async_all()) == 4
assert hass.states.get("sensor.clip_light_level_sensor").state == "999.8"
assert hass.states.get("sensor.clip_flur").state == "0"
with patch("homeassistant.components.deconz.PLATFORMS", [Platform.SENSOR]):
config_entry = await config_entry_factory()
await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id)
# Disallow clip sensors
hass.config_entries.async_update_entry(
config_entry_setup, options={CONF_ALLOW_CLIP_SENSOR: False}
config_entry, options={CONF_ALLOW_CLIP_SENSOR: False}
)
await hass.async_block_till_done()
@ -1042,7 +729,7 @@ async def test_allow_clip_sensors(
# Allow clip sensors
hass.config_entries.async_update_entry(
config_entry_setup, options={CONF_ALLOW_CLIP_SENSOR: True}
config_entry, options={CONF_ALLOW_CLIP_SENSOR: True}
)
await hass.async_block_till_done()