diff --git a/tests/components/nws/conftest.py b/tests/components/nws/conftest.py index 48401fe87ba..65276a1a115 100644 --- a/tests/components/nws/conftest.py +++ b/tests/components/nws/conftest.py @@ -11,8 +11,12 @@ from .const import DEFAULT_FORECAST, DEFAULT_OBSERVATION @pytest.fixture def mock_simple_nws(): """Mock pynws SimpleNWS with default values.""" - - with patch("homeassistant.components.nws.SimpleNWS") as mock_nws: + # set RETRY_STOP and RETRY_INTERVAL to avoid retries inside pynws in tests + with ( + patch("homeassistant.components.nws.SimpleNWS") as mock_nws, + patch("homeassistant.components.nws.coordinator.RETRY_STOP", 0), + patch("homeassistant.components.nws.coordinator.RETRY_INTERVAL", 0), + ): instance = mock_nws.return_value instance.set_station = AsyncMock(return_value=None) instance.update_observation = AsyncMock(return_value=None) @@ -29,7 +33,12 @@ def mock_simple_nws(): @pytest.fixture def mock_simple_nws_times_out(): """Mock pynws SimpleNWS that times out.""" - with patch("homeassistant.components.nws.SimpleNWS") as mock_nws: + # set RETRY_STOP and RETRY_INTERVAL to avoid retries inside pynws in tests + with ( + patch("homeassistant.components.nws.SimpleNWS") as mock_nws, + patch("homeassistant.components.nws.coordinator.RETRY_STOP", 0), + patch("homeassistant.components.nws.coordinator.RETRY_INTERVAL", 0), + ): instance = mock_nws.return_value instance.set_station = AsyncMock(side_effect=asyncio.TimeoutError) instance.update_observation = AsyncMock(side_effect=asyncio.TimeoutError) diff --git a/tests/components/nws/test_weather.py b/tests/components/nws/test_weather.py index 32cbfe4befe..5406636c324 100644 --- a/tests/components/nws/test_weather.py +++ b/tests/components/nws/test_weather.py @@ -1,7 +1,6 @@ """Tests for the NWS weather component.""" from datetime import timedelta -from unittest.mock import patch import aiohttp from freezegun.api import FrozenDateTimeFactory @@ -24,7 +23,6 @@ from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er from homeassistant.setup import async_setup_component -import homeassistant.util.dt as dt_util from homeassistant.util.unit_system import METRIC_SYSTEM, US_CUSTOMARY_SYSTEM from .const import ( @@ -127,47 +125,43 @@ async def test_data_caching_error_observation( caplog, ) -> None: """Test caching of data with errors.""" - with ( - patch("homeassistant.components.nws.coordinator.RETRY_STOP", 0), - patch("homeassistant.components.nws.coordinator.RETRY_INTERVAL", 0), - ): - instance = mock_simple_nws.return_value + instance = mock_simple_nws.return_value - entry = MockConfigEntry( - domain=nws.DOMAIN, - data=NWS_CONFIG, - ) - entry.add_to_hass(hass) - await hass.config_entries.async_setup(entry.entry_id) - await hass.async_block_till_done() + entry = MockConfigEntry( + domain=nws.DOMAIN, + data=NWS_CONFIG, + ) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() - state = hass.states.get("weather.abc") - assert state.state == "sunny" + state = hass.states.get("weather.abc") + assert state.state == "sunny" - # data is still valid even when update fails - instance.update_observation.side_effect = NwsNoDataError("Test") + # data is still valid even when update fails + instance.update_observation.side_effect = NwsNoDataError("Test") - freezer.tick(DEFAULT_SCAN_INTERVAL + timedelta(seconds=100)) - async_fire_time_changed(hass) - await hass.async_block_till_done() + freezer.tick(DEFAULT_SCAN_INTERVAL + timedelta(seconds=100)) + async_fire_time_changed(hass) + await hass.async_block_till_done() - state = hass.states.get("weather.abc") - assert state.state == "sunny" + state = hass.states.get("weather.abc") + assert state.state == "sunny" - assert ( - "NWS observation update failed, but data still valid. Last success: " - in caplog.text - ) + assert ( + "NWS observation update failed, but data still valid. Last success: " + in caplog.text + ) - # data is no longer valid after OBSERVATION_VALID_TIME - freezer.tick(OBSERVATION_VALID_TIME + timedelta(seconds=1)) - async_fire_time_changed(hass) - await hass.async_block_till_done() + # data is no longer valid after OBSERVATION_VALID_TIME + freezer.tick(OBSERVATION_VALID_TIME + timedelta(seconds=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done() - state = hass.states.get("weather.abc") - assert state.state == STATE_UNAVAILABLE + state = hass.states.get("weather.abc") + assert state.state == STATE_UNAVAILABLE - assert "Error fetching NWS observation station ABC data: Test" in caplog.text + assert "Error fetching NWS observation station ABC data: Test" in caplog.text async def test_no_data_error_observation( @@ -302,26 +296,23 @@ async def test_error_observation( hass: HomeAssistant, mock_simple_nws, no_sensor ) -> None: """Test error during update observation.""" - utc_time = dt_util.utcnow() - with patch("homeassistant.components.nws.coordinator.utcnow") as mock_utc: - mock_utc.return_value = utc_time - instance = mock_simple_nws.return_value - # first update fails - instance.update_observation.side_effect = aiohttp.ClientError + instance = mock_simple_nws.return_value + # first update fails + instance.update_observation.side_effect = aiohttp.ClientError - entry = MockConfigEntry( - domain=nws.DOMAIN, - data=NWS_CONFIG, - ) - entry.add_to_hass(hass) - await hass.config_entries.async_setup(entry.entry_id) - await hass.async_block_till_done() + entry = MockConfigEntry( + domain=nws.DOMAIN, + data=NWS_CONFIG, + ) + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() - instance.update_observation.assert_called_once() + instance.update_observation.assert_called_once() - state = hass.states.get("weather.abc") - assert state - assert state.state == STATE_UNAVAILABLE + state = hass.states.get("weather.abc") + assert state + assert state.state == STATE_UNAVAILABLE async def test_new_config_entry(hass: HomeAssistant, no_sensor) -> None: