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
import asyncio
from datetime import datetime, timedelta
from async_timeout import timeout
from sharkiq import (
@ -60,6 +61,13 @@ class SharkIqUpdateCoordinator(DataUpdateCoordinator[bool]):
async def _async_update_data(self) -> bool:
"""Update data device by device."""
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()
self._online_dsns = {
v["dsn"]
@ -78,7 +86,7 @@ class SharkIqUpdateCoordinator(DataUpdateCoordinator[bool]):
LOGGER.debug("Bad auth state. Attempting re-auth", exc_info=err)
raise ConfigEntryAuthFailed from 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
return True

View file

@ -3,6 +3,7 @@ from __future__ import annotations
from collections.abc import Iterable
from copy import deepcopy
from datetime import datetime, timedelta
import enum
from typing import Any
from unittest.mock import patch
@ -72,9 +73,14 @@ EXPECTED_FEATURES = (
class MockAyla(AylaApi):
"""Mocked AylaApi that doesn't do anything."""
desired_expiry = False
async def async_sign_in(self):
"""Instead of signing in, just return."""
async def async_refresh_auth(self):
"""Instead of refreshing auth, just return."""
async def async_sign_out(self):
"""Instead of signing out, just return."""
@ -92,6 +98,18 @@ class MockAyla(AylaApi):
async def async_request(self, http_method: str, url: str, **kwargs):
"""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):
"""Mocked SharkIqVacuum that won't hit the API."""