From 3fa2db84f0227a419024671b6988dcd3adf1c5f8 Mon Sep 17 00:00:00 2001 From: Thomas55555 <59625598+Thomas55555@users.noreply.github.com> Date: Thu, 9 May 2024 16:56:26 +0200 Subject: [PATCH] Catch auth exception in husqvarna automower (#115365) * Catch AuthException in Husqvarna Automower * don't use getattr * raise ConfigEntryAuthFailed --- .../husqvarna_automower/coordinator.py | 9 ++++++- .../husqvarna_automower/test_init.py | 24 +++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/husqvarna_automower/coordinator.py b/homeassistant/components/husqvarna_automower/coordinator.py index 8d9588db5b7..817789727ca 100644 --- a/homeassistant/components/husqvarna_automower/coordinator.py +++ b/homeassistant/components/husqvarna_automower/coordinator.py @@ -4,12 +4,17 @@ import asyncio from datetime import timedelta import logging -from aioautomower.exceptions import ApiException, HusqvarnaWSServerHandshakeError +from aioautomower.exceptions import ( + ApiException, + AuthException, + HusqvarnaWSServerHandshakeError, +) from aioautomower.model import MowerAttributes from aioautomower.session import AutomowerSession from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback +from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from .const import DOMAIN @@ -46,6 +51,8 @@ class AutomowerDataUpdateCoordinator(DataUpdateCoordinator[dict[str, MowerAttrib return await self.api.get_status() except ApiException as err: raise UpdateFailed(err) from err + except AuthException as err: + raise ConfigEntryAuthFailed(err) from err @callback def callback(self, ws_data: dict[str, MowerAttributes]) -> None: diff --git a/tests/components/husqvarna_automower/test_init.py b/tests/components/husqvarna_automower/test_init.py index dbf1d429eee..387c90cec38 100644 --- a/tests/components/husqvarna_automower/test_init.py +++ b/tests/components/husqvarna_automower/test_init.py @@ -5,7 +5,11 @@ import http import time from unittest.mock import AsyncMock -from aioautomower.exceptions import ApiException, HusqvarnaWSServerHandshakeError +from aioautomower.exceptions import ( + ApiException, + AuthException, + HusqvarnaWSServerHandshakeError, +) from freezegun.api import FrozenDateTimeFactory import pytest from syrupy.assertion import SnapshotAssertion @@ -75,19 +79,25 @@ async def test_expired_token_refresh_failure( assert mock_config_entry.state is expected_state +@pytest.mark.parametrize( + ("exception", "entry_state"), + [ + (ApiException, ConfigEntryState.SETUP_RETRY), + (AuthException, ConfigEntryState.SETUP_ERROR), + ], +) async def test_update_failed( hass: HomeAssistant, mock_automower_client: AsyncMock, mock_config_entry: MockConfigEntry, + exception: Exception, + entry_state: ConfigEntryState, ) -> None: - """Test load and unload entry.""" - getattr(mock_automower_client, "get_status").side_effect = ApiException( - "Test error" - ) + """Test update failed.""" + mock_automower_client.get_status.side_effect = exception("Test error") await setup_integration(hass, mock_config_entry) entry = hass.config_entries.async_entries(DOMAIN)[0] - - assert entry.state is ConfigEntryState.SETUP_RETRY + assert entry.state is entry_state async def test_websocket_not_available(