Add Home Assistant integration scaffold
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
"""Tests du cycle de vie de la config entry Arkteos."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from unittest.mock import AsyncMock
|
||||
|
||||
import pytest
|
||||
from pytest_homeassistant_custom_component.common import MockConfigEntry
|
||||
|
||||
from custom_components.arkteos.const import CONF_HOST, CONF_PORT, DOMAIN
|
||||
|
||||
|
||||
class FakeClient:
|
||||
instances: list["FakeClient"] = []
|
||||
|
||||
def __init__(self, _host: str, _port: int) -> None:
|
||||
self.started = False
|
||||
self.stopped = False
|
||||
self.available = False
|
||||
self._callbacks: list[object] = []
|
||||
self.__class__.instances.append(self)
|
||||
|
||||
async def start(self) -> None:
|
||||
self.started = True
|
||||
|
||||
async def stop(self) -> None:
|
||||
self.stopped = True
|
||||
|
||||
def add_availability_callback(self, callback) -> None:
|
||||
self._callbacks.append(callback)
|
||||
|
||||
def remove_availability_callback(self, callback) -> None:
|
||||
self._callbacks.remove(callback)
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def mock_client(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
FakeClient.instances.clear()
|
||||
monkeypatch.setattr(integration, "ArkteosClient", FakeClient)
|
||||
|
||||
|
||||
def _entry() -> MockConfigEntry:
|
||||
return MockConfigEntry(domain=DOMAIN, data={CONF_HOST: "proxy.local", CONF_PORT: 9641})
|
||||
|
||||
|
||||
async def test_setup_creates_one_client(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
entry = _entry()
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock()
|
||||
assert await integration.async_setup_entry(hass, entry)
|
||||
assert len(FakeClient.instances) == 1
|
||||
|
||||
|
||||
async def test_setup_starts_client(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock()
|
||||
assert await integration.async_setup_entry(hass, _entry())
|
||||
assert FakeClient.instances[0].started
|
||||
|
||||
|
||||
async def test_unload_stops_client(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
entry = _entry()
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock()
|
||||
hass.config_entries.async_unload_platforms = AsyncMock(return_value=True)
|
||||
await integration.async_setup_entry(hass, entry)
|
||||
assert await integration.async_unload_entry(hass, entry)
|
||||
assert FakeClient.instances[0].stopped
|
||||
|
||||
|
||||
async def test_unload_removes_runtime_data(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
entry = _entry()
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock()
|
||||
hass.config_entries.async_unload_platforms = AsyncMock(return_value=True)
|
||||
await integration.async_setup_entry(hass, entry)
|
||||
await integration.async_unload_entry(hass, entry)
|
||||
assert integration._get_client(hass, entry) is None
|
||||
|
||||
|
||||
async def test_platform_failure_stops_client(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock(side_effect=RuntimeError("platform"))
|
||||
assert not await integration.async_setup_entry(hass, _entry())
|
||||
assert FakeClient.instances[0].stopped
|
||||
|
||||
|
||||
async def test_double_setup_keeps_single_client(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
entry = _entry()
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock()
|
||||
await integration.async_setup_entry(hass, entry)
|
||||
await integration.async_setup_entry(hass, entry)
|
||||
assert len(FakeClient.instances) == 1
|
||||
|
||||
|
||||
async def test_double_unload_is_safe(hass) -> None:
|
||||
import custom_components.arkteos as integration
|
||||
|
||||
entry = _entry()
|
||||
hass.config_entries.async_forward_entry_setups = AsyncMock()
|
||||
hass.config_entries.async_unload_platforms = AsyncMock(return_value=True)
|
||||
await integration.async_setup_entry(hass, entry)
|
||||
assert await integration.async_unload_entry(hass, entry)
|
||||
assert await integration.async_unload_entry(hass, entry)
|
||||
|
||||
|
||||
def test_no_polling_platform_is_declared() -> None:
|
||||
from custom_components.arkteos.const import PLATFORMS
|
||||
|
||||
assert len(PLATFORMS) == 1
|
||||
|
||||
|
||||
def test_no_mqtt_dependency_in_manifest() -> None:
|
||||
from pathlib import Path
|
||||
|
||||
manifest = (Path(__file__).parents[1] / "custom_components" / "arkteos" / "manifest.json").read_text()
|
||||
assert "mqtt" not in manifest.lower()
|
||||
Reference in New Issue
Block a user