Fix pyload async_update SensorEntity raising exceptions (#119655)

* Fix Sensorentity raising exceptions

* Increase test coverage
This commit is contained in:
Mr. Bubbles 2024-06-14 20:47:06 +02:00 committed by GitHub
parent 05cbda0e50
commit c077c2a972
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 18 deletions

View File

@ -33,7 +33,6 @@ from homeassistant.helpers.aiohttp_client import async_create_clientsession
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.helpers.update_coordinator import UpdateFailed
from .const import DEFAULT_HOST, DEFAULT_NAME, DEFAULT_PORT from .const import DEFAULT_HOST, DEFAULT_NAME, DEFAULT_PORT
@ -132,20 +131,24 @@ class PyLoadSensor(SensorEntity):
_LOGGER.info("Authentication failed, trying to reauthenticate") _LOGGER.info("Authentication failed, trying to reauthenticate")
try: try:
await self.api.login() await self.api.login()
except InvalidAuth as e: except InvalidAuth:
raise PlatformNotReady( _LOGGER.error(
f"Authentication failed for {self.api.username}, check your login credentials" "Authentication failed for %s, check your login credentials",
) from e self.api.username,
else:
raise UpdateFailed(
"Unable to retrieve data due to cookie expiration but re-authentication was successful."
) )
except CannotConnect as e: return
raise UpdateFailed( else:
"Unable to connect and retrieve data from pyLoad API" _LOGGER.info(
) from e "Unable to retrieve data due to cookie expiration "
except ParserError as e: "but re-authentication was successful"
raise UpdateFailed("Unable to parse data from pyLoad API") from e )
return
except CannotConnect:
_LOGGER.debug("Unable to connect and retrieve data from pyLoad API")
return
except ParserError:
_LOGGER.error("Unable to parse data from pyLoad API")
return
value = getattr(self.data, self.type) value = getattr(self.data, self.type)

View File

@ -2,15 +2,19 @@
from unittest.mock import AsyncMock from unittest.mock import AsyncMock
from freezegun.api import FrozenDateTimeFactory
from pyloadapi.exceptions import CannotConnect, InvalidAuth, ParserError from pyloadapi.exceptions import CannotConnect, InvalidAuth, ParserError
import pytest import pytest
from syrupy.assertion import SnapshotAssertion from syrupy.assertion import SnapshotAssertion
from homeassistant.components.pyload.sensor import SCAN_INTERVAL
from homeassistant.components.sensor import DOMAIN from homeassistant.components.sensor import DOMAIN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from tests.common import async_fire_time_changed
@pytest.mark.usefixtures("mock_pyloadapi") @pytest.mark.usefixtures("mock_pyloadapi")
async def test_setup( async def test_setup(
@ -60,9 +64,9 @@ async def test_setup_exceptions(
@pytest.mark.parametrize( @pytest.mark.parametrize(
("exception", "expected_exception"), ("exception", "expected_exception"),
[ [
(CannotConnect, "UpdateFailed"), (CannotConnect, "Unable to connect and retrieve data from pyLoad API"),
(ParserError, "UpdateFailed"), (ParserError, "Unable to parse data from pyLoad API"),
(InvalidAuth, "UpdateFailed"), (InvalidAuth, "Authentication failed, trying to reauthenticate"),
], ],
) )
async def test_sensor_update_exceptions( async def test_sensor_update_exceptions(
@ -80,5 +84,31 @@ async def test_sensor_update_exceptions(
assert await async_setup_component(hass, DOMAIN, pyload_config) assert await async_setup_component(hass, DOMAIN, pyload_config)
await hass.async_block_till_done() await hass.async_block_till_done()
assert len(hass.states.async_all(DOMAIN)) == 0 assert len(hass.states.async_all(DOMAIN)) == 1
assert expected_exception in caplog.text assert expected_exception in caplog.text
async def test_sensor_invalid_auth(
hass: HomeAssistant,
pyload_config: ConfigType,
mock_pyloadapi: AsyncMock,
caplog: pytest.LogCaptureFixture,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test invalid auth during sensor update."""
assert await async_setup_component(hass, DOMAIN, pyload_config)
await hass.async_block_till_done()
assert len(hass.states.async_all(DOMAIN)) == 1
mock_pyloadapi.get_status.side_effect = InvalidAuth
mock_pyloadapi.login.side_effect = InvalidAuth
freezer.tick(SCAN_INTERVAL)
async_fire_time_changed(hass)
await hass.async_block_till_done()
assert (
"Authentication failed for username, check your login credentials"
in caplog.text
)