Deduplicate sensor recorder tests (#122516)

This commit is contained in:
Erik Montnemery 2024-07-25 12:31:11 +02:00 committed by GitHub
parent a94e9d472b
commit c12a79ecba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3,7 +3,7 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
import math import math
from statistics import mean from statistics import mean
from typing import Literal from typing import Any, Literal
from unittest.mock import patch from unittest.mock import patch
from freezegun import freeze_time from freezegun import freeze_time
@ -52,7 +52,11 @@ from tests.components.recorder.common import (
do_adhoc_statistics, do_adhoc_statistics,
statistics_during_period, statistics_during_period,
) )
from tests.typing import RecorderInstanceGenerator, WebSocketGenerator from tests.typing import (
MockHAClientWebSocket,
RecorderInstanceGenerator,
WebSocketGenerator,
)
BATTERY_SENSOR_ATTRIBUTES = { BATTERY_SENSOR_ATTRIBUTES = {
"device_class": "battery", "device_class": "battery",
@ -116,6 +120,33 @@ async def async_list_statistic_ids(
) )
async def assert_statistic_ids(
hass: HomeAssistant,
expected_result: list[dict[str, Any]],
) -> None:
"""Assert statistic ids."""
with session_scope(hass=hass, read_only=True) as session:
db_states = list(session.query(StatisticsMeta))
assert len(db_states) == len(expected_result)
for i, db_state in enumerate(db_states):
assert db_state.statistic_id == expected_result[i]["statistic_id"]
assert (
db_state.unit_of_measurement
== expected_result[i]["unit_of_measurement"]
)
async def assert_validation_result(
client: MockHAClientWebSocket,
expected_result: dict[str, list[dict[str, Any]]],
) -> None:
"""Assert statistics validation result."""
await client.send_json_auto_id({"type": "recorder/validate_statistics"})
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
@pytest.mark.parametrize( @pytest.mark.parametrize(
( (
"device_class", "device_class",
@ -4178,20 +4209,6 @@ async def test_validate_unit_change_convertible(
The test also asserts that the sensor's device class is ignored. The test also asserts that the sensor's device class is ignored.
""" """
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
@ -4292,21 +4309,6 @@ async def test_validate_statistics_unit_ignore_device_class(
The test asserts that the sensor's device class is ignored. The test asserts that the sensor's device class is ignored.
""" """
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
hass.config.units = units hass.config.units = units
@ -4384,23 +4386,9 @@ async def test_validate_statistics_unit_change_no_device_class(
conversion, and the unit is then changed to a unit which can and cannot be conversion, and the unit is then changed to a unit which can and cannot be
converted to the original unit. converted to the original unit.
""" """
msg_id = 1
attributes = dict(attributes) attributes = dict(attributes)
attributes.pop("device_class") attributes.pop("device_class")
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
hass.config.units = units hass.config.units = units
@ -4498,21 +4486,6 @@ async def test_validate_statistics_unsupported_state_class(
unit, unit,
) -> None: ) -> None:
"""Test validate_statistics.""" """Test validate_statistics."""
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
hass.config.units = units hass.config.units = units
@ -4566,21 +4539,6 @@ async def test_validate_statistics_sensor_no_longer_recorded(
unit, unit,
) -> None: ) -> None:
"""Test validate_statistics.""" """Test validate_statistics."""
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
hass.config.units = units hass.config.units = units
@ -4633,21 +4591,6 @@ async def test_validate_statistics_sensor_not_recorded(
unit, unit,
) -> None: ) -> None:
"""Test validate_statistics.""" """Test validate_statistics."""
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
hass.config.units = units hass.config.units = units
@ -4697,21 +4640,6 @@ async def test_validate_statistics_sensor_removed(
unit, unit,
) -> None: ) -> None:
"""Test validate_statistics.""" """Test validate_statistics."""
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
now = dt_util.utcnow() now = dt_util.utcnow()
hass.config.units = units hass.config.units = units
@ -4760,32 +4688,6 @@ async def test_validate_statistics_unit_change_no_conversion(
unit2, unit2,
) -> None: ) -> None:
"""Test validate_statistics.""" """Test validate_statistics."""
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
async def assert_statistic_ids(expected_result):
with session_scope(hass=hass, read_only=True) as session:
db_states = list(session.query(StatisticsMeta))
assert len(db_states) == len(expected_result)
for i, db_state in enumerate(db_states):
assert db_state.statistic_id == expected_result[i]["statistic_id"]
assert (
db_state.unit_of_measurement
== expected_result[i]["unit_of_measurement"]
)
now = dt_util.utcnow() now = dt_util.utcnow()
await async_setup_component(hass, "sensor", {}) await async_setup_component(hass, "sensor", {})
@ -4811,7 +4713,7 @@ async def test_validate_statistics_unit_change_no_conversion(
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
do_adhoc_statistics(hass, start=now) do_adhoc_statistics(hass, start=now)
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
await assert_statistic_ids([]) await assert_statistic_ids(hass, [])
# No statistics, original unit - empty response # No statistics, original unit - empty response
hass.states.async_set( hass.states.async_set(
@ -4824,7 +4726,7 @@ async def test_validate_statistics_unit_change_no_conversion(
do_adhoc_statistics(hass, start=now + timedelta(hours=1)) do_adhoc_statistics(hass, start=now + timedelta(hours=1))
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
await assert_statistic_ids( await assert_statistic_ids(
[{"statistic_id": "sensor.test", "unit_of_measurement": unit1}] hass, [{"statistic_id": "sensor.test", "unit_of_measurement": unit1}]
) )
await assert_validation_result(client, {}) await assert_validation_result(client, {})
@ -4894,32 +4796,6 @@ async def test_validate_statistics_unit_change_equivalent_units(
This tests no validation issue is created when a sensor's unit changes to an This tests no validation issue is created when a sensor's unit changes to an
equivalent unit. equivalent unit.
""" """
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
async def assert_statistic_ids(expected_result):
with session_scope(hass=hass, read_only=True) as session:
db_states = list(session.query(StatisticsMeta))
assert len(db_states) == len(expected_result)
for i, db_state in enumerate(db_states):
assert db_state.statistic_id == expected_result[i]["statistic_id"]
assert (
db_state.unit_of_measurement
== expected_result[i]["unit_of_measurement"]
)
now = dt_util.utcnow() now = dt_util.utcnow()
await async_setup_component(hass, "sensor", {}) await async_setup_component(hass, "sensor", {})
@ -4940,7 +4816,7 @@ async def test_validate_statistics_unit_change_equivalent_units(
do_adhoc_statistics(hass, start=now) do_adhoc_statistics(hass, start=now)
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
await assert_statistic_ids( await assert_statistic_ids(
[{"statistic_id": "sensor.test", "unit_of_measurement": unit1}] hass, [{"statistic_id": "sensor.test", "unit_of_measurement": unit1}]
) )
# Units changed to an equivalent unit - empty response # Units changed to an equivalent unit - empty response
@ -4954,7 +4830,7 @@ async def test_validate_statistics_unit_change_equivalent_units(
do_adhoc_statistics(hass, start=now + timedelta(hours=1)) do_adhoc_statistics(hass, start=now + timedelta(hours=1))
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
await assert_statistic_ids( await assert_statistic_ids(
[{"statistic_id": "sensor.test", "unit_of_measurement": unit2}] hass, [{"statistic_id": "sensor.test", "unit_of_measurement": unit2}]
) )
await assert_validation_result(client, {}) await assert_validation_result(client, {})
@ -4978,33 +4854,6 @@ async def test_validate_statistics_unit_change_equivalent_units_2(
This tests a validation issue is created when a sensor's unit changes to an This tests a validation issue is created when a sensor's unit changes to an
equivalent unit which is not known to the unit converters. equivalent unit which is not known to the unit converters.
""" """
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
async def assert_statistic_ids(expected_result):
with session_scope(hass=hass, read_only=True) as session:
db_states = list(session.query(StatisticsMeta))
assert len(db_states) == len(expected_result)
for i, db_state in enumerate(db_states):
assert db_state.statistic_id == expected_result[i]["statistic_id"]
assert (
db_state.unit_of_measurement
== expected_result[i]["unit_of_measurement"]
)
now = dt_util.utcnow() now = dt_util.utcnow()
await async_setup_component(hass, "sensor", {}) await async_setup_component(hass, "sensor", {})
@ -5025,7 +4874,7 @@ async def test_validate_statistics_unit_change_equivalent_units_2(
do_adhoc_statistics(hass, start=now) do_adhoc_statistics(hass, start=now)
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
await assert_statistic_ids( await assert_statistic_ids(
[{"statistic_id": "sensor.test", "unit_of_measurement": unit1}] hass, [{"statistic_id": "sensor.test", "unit_of_measurement": unit1}]
) )
# Units changed to an equivalent unit which is not known by the unit converters # Units changed to an equivalent unit which is not known by the unit converters
@ -5052,7 +4901,7 @@ async def test_validate_statistics_unit_change_equivalent_units_2(
do_adhoc_statistics(hass, start=now + timedelta(hours=1)) do_adhoc_statistics(hass, start=now + timedelta(hours=1))
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
await assert_statistic_ids( await assert_statistic_ids(
[{"statistic_id": "sensor.test", "unit_of_measurement": unit1}] hass, [{"statistic_id": "sensor.test", "unit_of_measurement": unit1}]
) )
await assert_validation_result(client, expected) await assert_validation_result(client, expected)
@ -5061,21 +4910,6 @@ async def test_validate_statistics_other_domain(
hass: HomeAssistant, hass_ws_client: WebSocketGenerator hass: HomeAssistant, hass_ws_client: WebSocketGenerator
) -> None: ) -> None:
"""Test sensor does not raise issues for statistics for other domains.""" """Test sensor does not raise issues for statistics for other domains."""
msg_id = 1
def next_id():
nonlocal msg_id
msg_id += 1
return msg_id
async def assert_validation_result(client, expected_result):
await client.send_json(
{"id": next_id(), "type": "recorder/validate_statistics"}
)
response = await client.receive_json()
assert response["success"]
assert response["result"] == expected_result
await async_setup_component(hass, "sensor", {}) await async_setup_component(hass, "sensor", {})
await async_recorder_block_till_done(hass) await async_recorder_block_till_done(hass)
client = await hass_ws_client() client = await hass_ws_client()