Fix hassio data fetching over list[Repository] (#128206)

* Fix hassio data fetching over list[Repository]

* Parameterize store mock and add store data to sensor tests
This commit is contained in:
Jan Bouwhuis 2024-10-12 14:44:26 +02:00 committed by GitHub
parent b5a6bb74ce
commit edb30af441
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 75 additions and 5 deletions

View File

@ -337,7 +337,7 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator):
if store_data: if store_data:
repositories = { repositories = {
repo[ATTR_SLUG]: repo[ATTR_NAME] repo.slug: repo.name
for repo in StoreInfo.from_dict(store_data).repositories for repo in StoreInfo.from_dict(store_data).repositories
} }
else: else:

View File

@ -8,7 +8,7 @@ from pathlib import Path
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch
from aiohasupervisor.models import StoreInfo from aiohasupervisor.models import Repository, StoreAddon, StoreInfo
import pytest import pytest
from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.const import STATE_OFF, STATE_ON
@ -407,10 +407,28 @@ def update_addon_fixture() -> Generator[AsyncMock]:
yield from mock_update_addon() yield from mock_update_addon()
@pytest.fixture(name="store_addons")
def store_addons_fixture() -> list[StoreAddon]:
"""Mock store addons list."""
return []
@pytest.fixture(name="store_repositories")
def store_repositories_fixture() -> list[Repository]:
"""Mock store repositories list."""
return []
@pytest.fixture(name="store_info") @pytest.fixture(name="store_info")
def store_info_fixture(supervisor_client: AsyncMock) -> AsyncMock: def store_info_fixture(
supervisor_client: AsyncMock,
store_addons: list[StoreAddon],
store_repositories: list[Repository],
) -> AsyncMock:
"""Mock store info.""" """Mock store info."""
supervisor_client.store.info.return_value = StoreInfo(addons=[], repositories=[]) supervisor_client.store.info.return_value = StoreInfo(
addons=store_addons, repositories=store_repositories
)
return supervisor_client.store.info return supervisor_client.store.info

View File

@ -9,7 +9,13 @@ from types import MethodType
from typing import Any from typing import Any
from unittest.mock import DEFAULT, AsyncMock, Mock, patch from unittest.mock import DEFAULT, AsyncMock, Mock, patch
from aiohasupervisor.models import InstalledAddonComplete, StoreAddonComplete from aiohasupervisor.models import (
AddonStage,
InstalledAddonComplete,
Repository,
StoreAddon,
StoreAddonComplete,
)
from homeassistant.components.hassio.addon_manager import AddonManager from homeassistant.components.hassio.addon_manager import AddonManager
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -18,6 +24,39 @@ LOGGER = logging.getLogger(__name__)
INSTALLED_ADDON_FIELDS = [field.name for field in fields(InstalledAddonComplete)] INSTALLED_ADDON_FIELDS = [field.name for field in fields(InstalledAddonComplete)]
STORE_ADDON_FIELDS = [field.name for field in fields(StoreAddonComplete)] STORE_ADDON_FIELDS = [field.name for field in fields(StoreAddonComplete)]
MOCK_STORE_ADDONS = [
StoreAddon(
name="test",
arch=[],
documentation=False,
advanced=False,
available=True,
build=False,
description="Test add-on service",
homeassistant=None,
icon=False,
logo=False,
repository="core",
slug="core_test",
stage=AddonStage.EXPERIMENTAL,
update_available=False,
url="https://example.com/addons/tree/master/test",
version_latest="1.0.0",
version="1.0.0",
installed=True,
)
]
MOCK_REPOSITORIES = [
Repository(
slug="core",
name="Official add-ons",
source="core",
url="https://home-assistant.io/addons",
maintainer="Home Assistant",
)
]
def mock_to_dict(obj: Mock, fields: list[str]) -> dict[str, Any]: def mock_to_dict(obj: Mock, fields: list[str]) -> dict[str, Any]:
"""Aiohasupervisor mocks to dictionary representation.""" """Aiohasupervisor mocks to dictionary representation."""

View File

@ -10,6 +10,8 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from .common import MOCK_REPOSITORIES, MOCK_STORE_ADDONS
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@ -177,6 +179,9 @@ def mock_all(aioclient_mock: AiohttpClientMocker, addon_installed, store_info) -
) )
@pytest.mark.parametrize(
("store_addons", "store_repositories"), [(MOCK_STORE_ADDONS, MOCK_REPOSITORIES)]
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("entity_id", "expected", "addon_state"), ("entity_id", "expected", "addon_state"),
[ [

View File

@ -21,6 +21,8 @@ from homeassistant.helpers import entity_registry as er
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .common import MOCK_REPOSITORIES, MOCK_STORE_ADDONS
from tests.common import MockConfigEntry, async_fire_time_changed from tests.common import MockConfigEntry, async_fire_time_changed
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@ -203,6 +205,9 @@ def _install_default_mocks(aioclient_mock: AiohttpClientMocker):
) )
@pytest.mark.parametrize(
("store_addons", "store_repositories"), [(MOCK_STORE_ADDONS, MOCK_REPOSITORIES)]
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("entity_id", "expected"), ("entity_id", "expected"),
[ [
@ -261,6 +266,9 @@ async def test_sensor(
assert state.state == expected assert state.state == expected
@pytest.mark.parametrize(
("store_addons", "store_repositories"), [(MOCK_STORE_ADDONS, MOCK_REPOSITORIES)]
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
("entity_id", "expected"), ("entity_id", "expected"),
[ [