From 8a9478b71400e8be84948b5fa959f109fb27c342 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Sun, 4 Feb 2024 11:05:51 -0500 Subject: [PATCH] Update Flo test to address review comment (#109604) * Update Flo test to address review comment * update comment * clean up * cleanup * change mock * remove unnecessary assert * review comment --- tests/components/flo/test_device.py | 52 ++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/tests/components/flo/test_device.py b/tests/components/flo/test_device.py index 6a633c774ed..884c9e3ca7e 100644 --- a/tests/components/flo/test_device.py +++ b/tests/components/flo/test_device.py @@ -3,15 +3,13 @@ from datetime import timedelta from unittest.mock import patch from aioflo.errors import RequestError -import pytest +from freezegun.api import FrozenDateTimeFactory from homeassistant.components.flo.const import DOMAIN as FLO_DOMAIN from homeassistant.components.flo.device import FloDeviceDataUpdateCoordinator -from homeassistant.const import CONF_PASSWORD, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, STATE_UNAVAILABLE from homeassistant.core import HomeAssistant -from homeassistant.helpers.update_coordinator import UpdateFailed from homeassistant.setup import async_setup_component -from homeassistant.util import dt as dt_util from .common import TEST_PASSWORD, TEST_USER_ID @@ -24,6 +22,7 @@ async def test_device( config_entry, aioclient_mock_fixture, aioclient_mock: AiohttpClientMocker, + freezer: FrozenDateTimeFactory, ) -> None: """Test Flo by Moen devices.""" config_entry.add_to_hass(hass) @@ -83,18 +82,47 @@ async def test_device( call_count = aioclient_mock.call_count - async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=90)) + freezer.tick(timedelta(seconds=90)) + async_fire_time_changed(hass) await hass.async_block_till_done() assert aioclient_mock.call_count == call_count + 6 - # test error sending device ping + +async def test_device_failures( + hass: HomeAssistant, + config_entry, + aioclient_mock_fixture, + aioclient_mock: AiohttpClientMocker, + freezer: FrozenDateTimeFactory, +) -> None: + """Test Flo by Moen devices buffer API failures.""" + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + def assert_state(state: str) -> None: + assert ( + hass.states.get("sensor.smart_water_shutoff_current_system_mode").state + == state + ) + + assert_state("home") + + async def move_time_and_assert_state(state: str) -> None: + freezer.tick(timedelta(seconds=65)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert_state(state) + + aioclient_mock.clear_requests() with patch( "homeassistant.components.flo.device.FloDeviceDataUpdateCoordinator.send_presence_ping", side_effect=RequestError, - ), pytest.raises(UpdateFailed): - # simulate 4 updates failing - await valve._async_update_data() - await valve._async_update_data() - await valve._async_update_data() - await valve._async_update_data() + ): + # simulate 4 updates failing. The failures should be buffered so that it takes 4 + # consecutive failures to mark the device and entities as unavailable. + await move_time_and_assert_state("home") + await move_time_and_assert_state("home") + await move_time_and_assert_state("home") + await move_time_and_assert_state(STATE_UNAVAILABLE)