Fix SharkIQ token expiration (#89357)

This commit is contained in:
Mark Adkins 2023-04-16 08:04:18 -04:00 committed by GitHub
parent 9d68cdca18
commit 0cf29f0f84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 1 deletions

View File

@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from datetime import datetime, timedelta
from async_timeout import timeout from async_timeout import timeout
from sharkiq import ( from sharkiq import (
@ -60,6 +61,13 @@ class SharkIqUpdateCoordinator(DataUpdateCoordinator[bool]):
async def _async_update_data(self) -> bool: async def _async_update_data(self) -> bool:
"""Update data device by device.""" """Update data device by device."""
try: try:
if self.ayla_api.token_expiring_soon:
await self.ayla_api.async_refresh_auth()
elif datetime.now() > self.ayla_api.auth_expiration - timedelta(
seconds=600
):
await self.ayla_api.async_refresh_auth()
all_vacuums = await self.ayla_api.async_list_devices() all_vacuums = await self.ayla_api.async_list_devices()
self._online_dsns = { self._online_dsns = {
v["dsn"] v["dsn"]
@ -78,7 +86,7 @@ class SharkIqUpdateCoordinator(DataUpdateCoordinator[bool]):
LOGGER.debug("Bad auth state. Attempting re-auth", exc_info=err) LOGGER.debug("Bad auth state. Attempting re-auth", exc_info=err)
raise ConfigEntryAuthFailed from err raise ConfigEntryAuthFailed from err
except Exception as err: except Exception as err:
LOGGER.exception("Unexpected error updating SharkIQ") LOGGER.exception("Unexpected error updating SharkIQ. Attempting re-auth")
raise UpdateFailed(err) from err raise UpdateFailed(err) from err
return True return True

View File

@ -3,6 +3,7 @@ from __future__ import annotations
from collections.abc import Iterable from collections.abc import Iterable
from copy import deepcopy from copy import deepcopy
from datetime import datetime, timedelta
import enum import enum
from typing import Any from typing import Any
from unittest.mock import patch from unittest.mock import patch
@ -72,9 +73,14 @@ EXPECTED_FEATURES = (
class MockAyla(AylaApi): class MockAyla(AylaApi):
"""Mocked AylaApi that doesn't do anything.""" """Mocked AylaApi that doesn't do anything."""
desired_expiry = False
async def async_sign_in(self): async def async_sign_in(self):
"""Instead of signing in, just return.""" """Instead of signing in, just return."""
async def async_refresh_auth(self):
"""Instead of refreshing auth, just return."""
async def async_sign_out(self): async def async_sign_out(self):
"""Instead of signing out, just return.""" """Instead of signing out, just return."""
@ -92,6 +98,18 @@ class MockAyla(AylaApi):
async def async_request(self, http_method: str, url: str, **kwargs): async def async_request(self, http_method: str, url: str, **kwargs):
"""Don't make an HTTP request.""" """Don't make an HTTP request."""
@property
def token_expiring_soon(self) -> bool:
"""Toggling Property for Token Expiration Flag."""
# Alternate expiry flag for each test
self.desired_expiry = not self.desired_expiry
return self.desired_expiry
@property
def auth_expiration(self) -> datetime:
"""Sample expiration timestamp that is always 1200 seconds behind now()."""
return datetime.now() - timedelta(seconds=1200)
class MockShark(SharkIqVacuum): class MockShark(SharkIqVacuum):
"""Mocked SharkIqVacuum that won't hit the API.""" """Mocked SharkIqVacuum that won't hit the API."""