From 36eda3801d8b897fed6f6c16476ba5e8de858ed6 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 19 Sep 2022 11:11:05 +0200 Subject: [PATCH] Add LaMetric integration init tests (#78679) --- .coveragerc | 2 - tests/components/lametric/conftest.py | 15 ++++++ tests/components/lametric/test_init.py | 72 ++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 tests/components/lametric/test_init.py diff --git a/.coveragerc b/.coveragerc index 811528b2911..1f73828daa4 100644 --- a/.coveragerc +++ b/.coveragerc @@ -648,9 +648,7 @@ omit = homeassistant/components/kostal_plenticore/switch.py homeassistant/components/kwb/sensor.py homeassistant/components/lacrosse/sensor.py - homeassistant/components/lametric/__init__.py homeassistant/components/lametric/button.py - homeassistant/components/lametric/coordinator.py homeassistant/components/lametric/entity.py homeassistant/components/lametric/notify.py homeassistant/components/lametric/number.py diff --git a/tests/components/lametric/conftest.py b/tests/components/lametric/conftest.py index 3640742c8ff..f040038743b 100644 --- a/tests/components/lametric/conftest.py +++ b/tests/components/lametric/conftest.py @@ -79,3 +79,18 @@ def mock_lametric_cloud_config_flow() -> Generator[MagicMock, None, None]: list[CloudDevice], load_fixture("cloud_devices.json", DOMAIN) ) yield lametric + + +@pytest.fixture +def mock_lametric() -> Generator[MagicMock, None, None]: + """Return a mocked LaMetric client.""" + with patch( + "homeassistant.components.lametric.coordinator.LaMetricDevice", autospec=True + ) as lametric_mock: + lametric = lametric_mock.return_value + lametric.api_key = "mock-api-key" + lametric.host = "127.0.0.1" + lametric.device.return_value = Device.parse_raw( + load_fixture("device.json", DOMAIN) + ) + yield lametric diff --git a/tests/components/lametric/test_init.py b/tests/components/lametric/test_init.py new file mode 100644 index 00000000000..965264e8917 --- /dev/null +++ b/tests/components/lametric/test_init.py @@ -0,0 +1,72 @@ +"""Tests for the LaMetric integration.""" +from collections.abc import Awaitable, Callable +from unittest.mock import MagicMock + +from aiohttp import ClientWebSocketResponse +from demetriek import LaMetricConnectionError, LaMetricConnectionTimeoutError +import pytest + +from homeassistant.components.lametric.const import DOMAIN +from homeassistant.config_entries import ConfigEntryState +from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET +from homeassistant.core import HomeAssistant +from homeassistant.setup import async_setup_component + +from tests.common import MockConfigEntry +from tests.components.repairs import get_repairs + + +async def test_load_unload_config_entry( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_lametric: MagicMock, +) -> None: + """Test the LaMetric configuration entry loading/unloading.""" + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.LOADED + assert len(mock_lametric.device.mock_calls) == 1 + + await hass.config_entries.async_unload(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.NOT_LOADED + + +@pytest.mark.parametrize( + "side_effect", [LaMetricConnectionTimeoutError, LaMetricConnectionError] +) +async def test_config_entry_not_ready( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_lametric: MagicMock, + side_effect: Exception, +) -> None: + """Test the LaMetric configuration entry not ready.""" + mock_lametric.device.side_effect = side_effect + + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert len(mock_lametric.device.mock_calls) == 1 + assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY + + +async def test_yaml_config_raises_repairs( + hass: HomeAssistant, + hass_ws_client: Callable[[HomeAssistant], Awaitable[ClientWebSocketResponse]], + caplog: pytest.LogCaptureFixture, +) -> None: + """Test that YAML configuration raises an repairs issue.""" + await async_setup_component( + hass, DOMAIN, {DOMAIN: {CONF_CLIENT_ID: "foo", CONF_CLIENT_SECRET: "bar"}} + ) + + assert "The 'lametric' option is deprecated" in caplog.text + + issues = await get_repairs(hass, hass_ws_client) + assert len(issues) == 1 + assert issues[0]["issue_id"] == "manual_migration"