"""Tests for the Plugwise Climate integration.""" import asyncio from unittest.mock import MagicMock import aiohttp from plugwise.exceptions import ( ConnectionFailedError, PlugwiseException, XMLDataMissingError, ) import pytest from homeassistant.components.plugwise.const import DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er from tests.common import MockConfigEntry HEATER_ID = "1cbf783bb11e4a7c8a6843dee3a86927" # Opentherm device_id for migration PLUG_ID = "cd0ddb54ef694e11ac18ed1cbce5dbbd" # VCR device_id for migration async def test_load_unload_config_entry( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_smile_anna: MagicMock, ) -> None: """Test the Plugwise 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_smile_anna.connect.mock_calls) == 1 await hass.config_entries.async_unload(mock_config_entry.entry_id) await hass.async_block_till_done() assert not hass.data.get(DOMAIN) assert mock_config_entry.state is ConfigEntryState.NOT_LOADED @pytest.mark.parametrize( "side_effect", [ (ConnectionFailedError), (PlugwiseException), (XMLDataMissingError), (asyncio.TimeoutError), (aiohttp.ClientConnectionError), ], ) async def test_config_entry_not_ready( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_smile_anna: MagicMock, side_effect: Exception, ) -> None: """Test the Plugwise configuration entry not ready.""" mock_smile_anna.connect.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_smile_anna.connect.mock_calls) == 1 assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY @pytest.mark.parametrize( "entitydata,old_unique_id,new_unique_id", [ ( { "domain": SENSOR_DOMAIN, "platform": DOMAIN, "unique_id": f"{HEATER_ID}-outdoor_temperature", "suggested_object_id": f"{HEATER_ID}-outdoor_temperature", "disabled_by": None, }, f"{HEATER_ID}-outdoor_temperature", f"{HEATER_ID}-outdoor_air_temperature", ), ], ) async def test_migrate_unique_id_temperature( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_smile_anna: MagicMock, entitydata: dict, old_unique_id: str, new_unique_id: str, ) -> None: """Test migration of unique_id.""" mock_config_entry.add_to_hass(hass) entity_registry = er.async_get(hass) entity: er.RegistryEntry = entity_registry.async_get_or_create( **entitydata, config_entry=mock_config_entry, ) assert entity.unique_id == old_unique_id assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() entity_migrated = entity_registry.async_get(entity.entity_id) assert entity_migrated assert entity_migrated.unique_id == new_unique_id @pytest.mark.parametrize( "entitydata,old_unique_id,new_unique_id", [ ( { "domain": SWITCH_DOMAIN, "platform": DOMAIN, "unique_id": f"{PLUG_ID}-plug", "suggested_object_id": f"{PLUG_ID}-plug", "disabled_by": None, }, f"{PLUG_ID}-plug", f"{PLUG_ID}-relay", ), ], ) async def test_migrate_unique_id_relay( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_smile_adam: MagicMock, entitydata: dict, old_unique_id: str, new_unique_id: str, ) -> None: """Test migration of unique_id.""" mock_config_entry.add_to_hass(hass) entity_registry = er.async_get(hass) entity: er.RegistryEntry = entity_registry.async_get_or_create( **entitydata, config_entry=mock_config_entry, ) assert entity.unique_id == old_unique_id assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() entity_migrated = entity_registry.async_get(entity.entity_id) assert entity_migrated assert entity_migrated.unique_id == new_unique_id