core/tests/helpers/test_significant_change.py

86 lines
3.4 KiB
Python
Raw Normal View History

2021-01-26 13:13:27 +00:00
"""Test significant change helper."""
import pytest
2021-12-17 10:09:24 +00:00
from homeassistant.components.sensor import SensorDeviceClass
2021-01-26 13:13:27 +00:00
from homeassistant.const import ATTR_DEVICE_CLASS, STATE_UNAVAILABLE, STATE_UNKNOWN
2023-02-20 10:42:56 +00:00
from homeassistant.core import HomeAssistant, State
2021-01-26 13:13:27 +00:00
from homeassistant.helpers import significant_change
@pytest.fixture(name="checker")
async def checker_fixture(hass):
"""Checker fixture."""
checker = await significant_change.create_checker(hass, "test")
def async_check_significant_change(
_hass, old_state, _old_attrs, new_state, _new_attrs, **kwargs
):
return abs(float(old_state) - float(new_state)) > 4
hass.data[significant_change.DATA_FUNCTIONS][
"test_domain"
] = async_check_significant_change
return checker
2023-02-20 10:42:56 +00:00
async def test_signicant_change(hass: HomeAssistant, checker) -> None:
2021-01-26 13:13:27 +00:00
"""Test initialize helper works."""
ent_id = "test_domain.test_entity"
2021-12-17 10:09:24 +00:00
attrs = {ATTR_DEVICE_CLASS: SensorDeviceClass.BATTERY}
2021-01-26 13:13:27 +00:00
assert checker.async_is_significant_change(State(ent_id, "100", attrs))
# Same state is not significant.
assert not checker.async_is_significant_change(State(ent_id, "100", attrs))
# State under 5 difference is not significant. (per test mock)
assert not checker.async_is_significant_change(State(ent_id, "96", attrs))
# Make sure we always compare against last significant change
assert checker.async_is_significant_change(State(ent_id, "95", attrs))
# State turned unknown
assert checker.async_is_significant_change(State(ent_id, STATE_UNKNOWN, attrs))
# State turned unavailable
assert checker.async_is_significant_change(State(ent_id, "100", attrs))
assert checker.async_is_significant_change(State(ent_id, STATE_UNAVAILABLE, attrs))
2023-02-20 10:42:56 +00:00
async def test_significant_change_extra(hass: HomeAssistant, checker) -> None:
"""Test extra significant checker works."""
ent_id = "test_domain.test_entity"
2021-12-17 10:09:24 +00:00
attrs = {ATTR_DEVICE_CLASS: SensorDeviceClass.BATTERY}
assert checker.async_is_significant_change(State(ent_id, "100", attrs), extra_arg=1)
assert checker.async_is_significant_change(State(ent_id, "200", attrs), extra_arg=1)
# Reset the last significiant change to 100 to repeat test but with
# extra checker installed.
assert checker.async_is_significant_change(State(ent_id, "100", attrs), extra_arg=1)
def extra_significant_check(
hass, old_state, old_attrs, old_extra_arg, new_state, new_attrs, new_extra_arg
):
return old_extra_arg != new_extra_arg
checker.extra_significant_check = extra_significant_check
# This is normally a significant change (100 -> 200), but the extra arg check marks it
# as insignificant.
assert not checker.async_is_significant_change(
State(ent_id, "200", attrs), extra_arg=1
)
assert checker.async_is_significant_change(State(ent_id, "200", attrs), extra_arg=2)
async def test_check_valid_float(hass: HomeAssistant) -> None:
"""Test extra significant checker works."""
assert significant_change.check_valid_float("1")
assert significant_change.check_valid_float("1.0")
assert significant_change.check_valid_float(1)
assert significant_change.check_valid_float(1.0)
assert not significant_change.check_valid_float("")
assert not significant_change.check_valid_float("invalid")
assert not significant_change.check_valid_float("1.1.1")