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
pull/127725/head^2
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:
repositories = {
repo[ATTR_SLUG]: repo[ATTR_NAME]
repo.slug: repo.name
for repo in StoreInfo.from_dict(store_data).repositories
}
else:

View File

@ -8,7 +8,7 @@ from pathlib import Path
from typing import TYPE_CHECKING, Any
from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch
from aiohasupervisor.models import StoreInfo
from aiohasupervisor.models import Repository, StoreAddon, StoreInfo
import pytest
from homeassistant.const import STATE_OFF, STATE_ON
@ -407,10 +407,28 @@ def update_addon_fixture() -> Generator[AsyncMock]:
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")
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."""
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

View File

@ -9,7 +9,13 @@ from types import MethodType
from typing import Any
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.core import HomeAssistant
@ -18,6 +24,39 @@ LOGGER = logging.getLogger(__name__)
INSTALLED_ADDON_FIELDS = [field.name for field in fields(InstalledAddonComplete)]
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]:
"""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.setup import async_setup_component
from .common import MOCK_REPOSITORIES, MOCK_STORE_ADDONS
from tests.common import MockConfigEntry
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(
("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
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.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(
("entity_id", "expected"),
[
@ -261,6 +266,9 @@ async def test_sensor(
assert state.state == expected
@pytest.mark.parametrize(
("store_addons", "store_repositories"), [(MOCK_STORE_ADDONS, MOCK_REPOSITORIES)]
)
@pytest.mark.parametrize(
("entity_id", "expected"),
[