mirror of
https://github.com/home-assistant/core.git
synced 2025-11-10 03:19:34 +00:00
Co-authored-by: J. Nick Koston <nick@home-assistant.io> Co-authored-by: J. Nick Koston <nick@koston.org>
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""Test usage_prediction integration."""
|
|
|
|
import asyncio
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from homeassistant.components.usage_prediction import get_cached_common_control
|
|
from homeassistant.components.usage_prediction.models import EntityUsagePredictions
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
|
|
@pytest.mark.usefixtures("recorder_mock")
|
|
async def test_usage_prediction_caching(hass: HomeAssistant) -> None:
|
|
"""Test that usage prediction results are cached for 24 hours."""
|
|
|
|
assert await async_setup_component(hass, "usage_prediction", {})
|
|
|
|
finish_event = asyncio.Event()
|
|
|
|
async def mock_common_control_error(*args) -> EntityUsagePredictions:
|
|
await finish_event.wait()
|
|
raise Exception("Boom") # noqa: TRY002
|
|
|
|
with patch(
|
|
"homeassistant.components.usage_prediction.common_control.async_predict_common_control",
|
|
mock_common_control_error,
|
|
):
|
|
# First call, should trigger prediction
|
|
task1 = asyncio.create_task(get_cached_common_control(hass, "user_1"))
|
|
task2 = asyncio.create_task(get_cached_common_control(hass, "user_1"))
|
|
await asyncio.sleep(0)
|
|
finish_event.set()
|
|
with pytest.raises(Exception, match="Boom"):
|
|
await task2
|
|
with pytest.raises(Exception, match="Boom"):
|
|
await task1
|
|
|
|
finish_event.clear()
|
|
results = EntityUsagePredictions(
|
|
morning=["light.kitchen"],
|
|
afternoon=["climate.thermostat"],
|
|
evening=["light.bedroom"],
|
|
night=["lock.front_door"],
|
|
)
|
|
|
|
# The exception is not cached, we hit the method again.
|
|
async def mock_common_control(*args) -> EntityUsagePredictions:
|
|
await finish_event.wait()
|
|
return results
|
|
|
|
with patch(
|
|
"homeassistant.components.usage_prediction.common_control.async_predict_common_control",
|
|
mock_common_control,
|
|
):
|
|
# First call, should trigger prediction
|
|
task1 = asyncio.create_task(get_cached_common_control(hass, "user_1"))
|
|
task2 = asyncio.create_task(get_cached_common_control(hass, "user_1"))
|
|
await asyncio.sleep(0)
|
|
finish_event.set()
|
|
assert await task2 is results
|
|
assert await task1 is results
|