core/tests/components/vicare/conftest.py

103 lines
3.2 KiB
Python

"""Fixtures for ViCare integration tests."""
from __future__ import annotations
from dataclasses import dataclass
from unittest.mock import AsyncMock, Mock, patch
import pytest
from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig
from PyViCare.PyViCareService import ViCareDeviceAccessor, readFeature
from typing_extensions import AsyncGenerator, Generator
from homeassistant.components.vicare.const import DOMAIN
from homeassistant.core import HomeAssistant
from . import ENTRY_CONFIG, MODULE
from tests.common import MockConfigEntry, load_json_object_fixture
@dataclass
class Fixture:
"""Fixture representation with the assigned roles and dummy data location."""
roles: set[str]
data_file: str
class MockPyViCare:
"""Mocked PyVicare class based on a json dump."""
def __init__(self, fixtures: list[Fixture]) -> None:
"""Init a single device from json dump."""
self.devices = []
for idx, fixture in enumerate(fixtures):
self.devices.append(
PyViCareDeviceConfig(
MockViCareService(
f"installation{idx}", f"gateway{idx}", f"device{idx}", fixture
),
f"deviceId{idx}",
f"model{idx}",
f"online{idx}",
)
)
class MockViCareService:
"""PyVicareService mock using a json dump."""
def __init__(
self, installation_id: str, gateway_id: str, device_id: str, fixture: Fixture
) -> None:
"""Initialize the mock from a json dump."""
self._test_data = load_json_object_fixture(fixture.data_file)
self.fetch_all_features = Mock(return_value=self._test_data)
self.roles = fixture.roles
self.accessor = ViCareDeviceAccessor(installation_id, gateway_id, device_id)
def hasRoles(self, requested_roles: list[str]) -> bool:
"""Return true if requested roles are assigned."""
return requested_roles and set(requested_roles).issubset(self.roles)
def getProperty(self, property_name: str):
"""Read a property from json dump."""
return readFeature(self._test_data["data"], property_name)
@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
"""Return the default mocked config entry."""
return MockConfigEntry(
domain=DOMAIN,
unique_id="ViCare",
entry_id="1234",
data=ENTRY_CONFIG,
)
@pytest.fixture
async def mock_vicare_gas_boiler(
hass: HomeAssistant, mock_config_entry: MockConfigEntry
) -> AsyncGenerator[MockConfigEntry]:
"""Return a mocked ViCare API representing a single gas boiler device."""
fixtures: list[Fixture] = [Fixture({"type:boiler"}, "vicare/Vitodens300W.json")]
with patch(
f"{MODULE}.vicare_login",
return_value=MockPyViCare(fixtures),
):
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
yield mock_config_entry
@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
"""Mock setting up a config entry."""
with patch(f"{MODULE}.async_setup_entry", return_value=True) as mock_setup_entry:
yield mock_setup_entry