mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Remove YAML import from lcl integration after 6 months deprecation (#130305)
This commit is contained in:
parent
f7f1830b7e
commit
c52a893e21
@ -8,7 +8,7 @@ import logging
|
|||||||
import pypck
|
import pypck
|
||||||
from pypck.connection import PchkConnectionManager
|
from pypck.connection import PchkConnectionManager
|
||||||
|
|
||||||
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_DEVICE_ID,
|
CONF_DEVICE_ID,
|
||||||
CONF_DOMAIN,
|
CONF_DOMAIN,
|
||||||
@ -21,7 +21,6 @@ from homeassistant.const import (
|
|||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import device_registry as dr
|
from homeassistant.helpers import device_registry as dr
|
||||||
from homeassistant.helpers.typing import ConfigType
|
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
ADD_ENTITIES_CALLBACKS,
|
ADD_ENTITIES_CALLBACKS,
|
||||||
@ -39,37 +38,15 @@ from .helpers import (
|
|||||||
InputType,
|
InputType,
|
||||||
async_update_config_entry,
|
async_update_config_entry,
|
||||||
generate_unique_id,
|
generate_unique_id,
|
||||||
import_lcn_config,
|
|
||||||
register_lcn_address_devices,
|
register_lcn_address_devices,
|
||||||
register_lcn_host_device,
|
register_lcn_host_device,
|
||||||
)
|
)
|
||||||
from .schemas import CONFIG_SCHEMA # noqa: F401
|
|
||||||
from .services import SERVICES
|
from .services import SERVICES
|
||||||
from .websocket import register_panel_and_ws_api
|
from .websocket import register_panel_and_ws_api
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
||||||
"""Set up the LCN component."""
|
|
||||||
if DOMAIN not in config:
|
|
||||||
return True
|
|
||||||
|
|
||||||
# initialize a config_flow for all LCN configurations read from
|
|
||||||
# configuration.yaml
|
|
||||||
config_entries_data = import_lcn_config(config[DOMAIN])
|
|
||||||
|
|
||||||
for config_entry_data in config_entries_data:
|
|
||||||
hass.async_create_task(
|
|
||||||
hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN,
|
|
||||||
context={"source": SOURCE_IMPORT},
|
|
||||||
data=config_entry_data,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
||||||
"""Set up a connection to PCHK host from a config entry."""
|
"""Set up a connection to PCHK host from a config entry."""
|
||||||
hass.data.setdefault(DOMAIN, {})
|
hass.data.setdefault(DOMAIN, {})
|
||||||
|
@ -9,7 +9,6 @@ import pypck
|
|||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.config_entries import ConfigFlowResult
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_BASE,
|
CONF_BASE,
|
||||||
CONF_DEVICES,
|
CONF_DEVICES,
|
||||||
@ -20,14 +19,12 @@ from homeassistant.const import (
|
|||||||
CONF_PORT,
|
CONF_PORT,
|
||||||
CONF_USERNAME,
|
CONF_USERNAME,
|
||||||
)
|
)
|
||||||
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
|
|
||||||
from . import PchkConnectionManager
|
from . import PchkConnectionManager
|
||||||
from .const import CONF_ACKNOWLEDGE, CONF_DIM_MODE, CONF_SK_NUM_TRIES, DIM_MODES, DOMAIN
|
from .const import CONF_ACKNOWLEDGE, CONF_DIM_MODE, CONF_SK_NUM_TRIES, DIM_MODES, DOMAIN
|
||||||
from .helpers import purge_device_registry, purge_entity_registry
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -113,55 +110,6 @@ class LcnFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
MINOR_VERSION = 1
|
MINOR_VERSION = 1
|
||||||
|
|
||||||
async def async_step_import(self, import_data: dict[str, Any]) -> ConfigFlowResult:
|
|
||||||
"""Import existing configuration from LCN."""
|
|
||||||
# validate the imported connection parameters
|
|
||||||
if error := await validate_connection(import_data):
|
|
||||||
async_create_issue(
|
|
||||||
self.hass,
|
|
||||||
DOMAIN,
|
|
||||||
error,
|
|
||||||
is_fixable=False,
|
|
||||||
issue_domain=DOMAIN,
|
|
||||||
severity=IssueSeverity.ERROR,
|
|
||||||
translation_key=error,
|
|
||||||
translation_placeholders={
|
|
||||||
"url": "/config/integrations/dashboard/add?domain=lcn"
|
|
||||||
},
|
|
||||||
)
|
|
||||||
return self.async_abort(reason=error)
|
|
||||||
|
|
||||||
async_create_issue(
|
|
||||||
self.hass,
|
|
||||||
HOMEASSISTANT_DOMAIN,
|
|
||||||
f"deprecated_yaml_{DOMAIN}",
|
|
||||||
breaks_in_ha_version="2024.12.0",
|
|
||||||
is_fixable=False,
|
|
||||||
is_persistent=False,
|
|
||||||
issue_domain=DOMAIN,
|
|
||||||
severity=IssueSeverity.WARNING,
|
|
||||||
translation_key="deprecated_yaml",
|
|
||||||
translation_placeholders={
|
|
||||||
"domain": DOMAIN,
|
|
||||||
"integration_title": "LCN",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
# check if we already have a host with the same address configured
|
|
||||||
if entry := get_config_entry(self.hass, import_data):
|
|
||||||
entry.source = config_entries.SOURCE_IMPORT
|
|
||||||
# Cleanup entity and device registry, if we imported from configuration.yaml to
|
|
||||||
# remove orphans when entities were removed from configuration
|
|
||||||
purge_entity_registry(self.hass, entry.entry_id, import_data)
|
|
||||||
purge_device_registry(self.hass, entry.entry_id, import_data)
|
|
||||||
|
|
||||||
self.hass.config_entries.async_update_entry(entry, data=import_data)
|
|
||||||
return self.async_abort(reason="existing_configuration_updated")
|
|
||||||
|
|
||||||
return self.async_create_entry(
|
|
||||||
title=f"{import_data[CONF_HOST]}", data=import_data
|
|
||||||
)
|
|
||||||
|
|
||||||
async def async_step_user(
|
async def async_step_user(
|
||||||
self, user_input: dict[str, Any] | None = None
|
self, user_input: dict[str, Any] | None = None
|
||||||
) -> config_entries.ConfigFlowResult:
|
) -> config_entries.ConfigFlowResult:
|
||||||
|
@ -4,20 +4,9 @@ import voluptuous as vol
|
|||||||
|
|
||||||
from homeassistant.components.climate import DEFAULT_MAX_TEMP, DEFAULT_MIN_TEMP
|
from homeassistant.components.climate import DEFAULT_MAX_TEMP, DEFAULT_MIN_TEMP
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_ADDRESS,
|
|
||||||
CONF_BINARY_SENSORS,
|
|
||||||
CONF_COVERS,
|
|
||||||
CONF_HOST,
|
|
||||||
CONF_LIGHTS,
|
|
||||||
CONF_NAME,
|
|
||||||
CONF_PASSWORD,
|
|
||||||
CONF_PORT,
|
|
||||||
CONF_SCENE,
|
CONF_SCENE,
|
||||||
CONF_SENSORS,
|
|
||||||
CONF_SOURCE,
|
CONF_SOURCE,
|
||||||
CONF_SWITCHES,
|
|
||||||
CONF_UNIT_OF_MEASUREMENT,
|
CONF_UNIT_OF_MEASUREMENT,
|
||||||
CONF_USERNAME,
|
|
||||||
UnitOfTemperature,
|
UnitOfTemperature,
|
||||||
)
|
)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
@ -25,9 +14,6 @@ from homeassistant.helpers.typing import VolDictType
|
|||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
BINSENSOR_PORTS,
|
BINSENSOR_PORTS,
|
||||||
CONF_CLIMATES,
|
|
||||||
CONF_CONNECTIONS,
|
|
||||||
CONF_DIM_MODE,
|
|
||||||
CONF_DIMMABLE,
|
CONF_DIMMABLE,
|
||||||
CONF_LOCKABLE,
|
CONF_LOCKABLE,
|
||||||
CONF_MAX_TEMP,
|
CONF_MAX_TEMP,
|
||||||
@ -37,12 +23,8 @@ from .const import (
|
|||||||
CONF_OUTPUTS,
|
CONF_OUTPUTS,
|
||||||
CONF_REGISTER,
|
CONF_REGISTER,
|
||||||
CONF_REVERSE_TIME,
|
CONF_REVERSE_TIME,
|
||||||
CONF_SCENES,
|
|
||||||
CONF_SETPOINT,
|
CONF_SETPOINT,
|
||||||
CONF_SK_NUM_TRIES,
|
|
||||||
CONF_TRANSITION,
|
CONF_TRANSITION,
|
||||||
DIM_MODES,
|
|
||||||
DOMAIN,
|
|
||||||
KEYS,
|
KEYS,
|
||||||
LED_PORTS,
|
LED_PORTS,
|
||||||
LOGICOP_PORTS,
|
LOGICOP_PORTS,
|
||||||
@ -56,7 +38,6 @@ from .const import (
|
|||||||
VAR_UNITS,
|
VAR_UNITS,
|
||||||
VARIABLES,
|
VARIABLES,
|
||||||
)
|
)
|
||||||
from .helpers import has_unique_host_names, is_address
|
|
||||||
|
|
||||||
ADDRESS_SCHEMA = vol.Coerce(tuple)
|
ADDRESS_SCHEMA = vol.Coerce(tuple)
|
||||||
|
|
||||||
@ -130,72 +111,3 @@ DOMAIN_DATA_SWITCH: VolDictType = {
|
|||||||
vol.In(OUTPUT_PORTS + RELAY_PORTS + SETPOINTS + KEYS),
|
vol.In(OUTPUT_PORTS + RELAY_PORTS + SETPOINTS + KEYS),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Configuration
|
|
||||||
#
|
|
||||||
|
|
||||||
DOMAIN_DATA_BASE: VolDictType = {
|
|
||||||
vol.Required(CONF_NAME): cv.string,
|
|
||||||
vol.Required(CONF_ADDRESS): is_address,
|
|
||||||
}
|
|
||||||
|
|
||||||
BINARY_SENSORS_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_BINARY_SENSOR})
|
|
||||||
|
|
||||||
CLIMATES_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_CLIMATE})
|
|
||||||
|
|
||||||
COVERS_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_COVER})
|
|
||||||
|
|
||||||
LIGHTS_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_LIGHT})
|
|
||||||
|
|
||||||
SCENES_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_SCENE})
|
|
||||||
|
|
||||||
SENSORS_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_SENSOR})
|
|
||||||
|
|
||||||
SWITCHES_SCHEMA = vol.Schema({**DOMAIN_DATA_BASE, **DOMAIN_DATA_SWITCH})
|
|
||||||
|
|
||||||
CONNECTION_SCHEMA = vol.Schema(
|
|
||||||
{
|
|
||||||
vol.Required(CONF_HOST): cv.string,
|
|
||||||
vol.Required(CONF_PORT): cv.port,
|
|
||||||
vol.Required(CONF_USERNAME): cv.string,
|
|
||||||
vol.Required(CONF_PASSWORD): cv.string,
|
|
||||||
vol.Optional(CONF_SK_NUM_TRIES, default=0): cv.positive_int,
|
|
||||||
vol.Optional(CONF_DIM_MODE, default="steps50"): vol.All(
|
|
||||||
vol.Upper, vol.In(DIM_MODES)
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_NAME): cv.string,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema(
|
|
||||||
vol.All(
|
|
||||||
cv.deprecated(DOMAIN),
|
|
||||||
{
|
|
||||||
DOMAIN: vol.Schema(
|
|
||||||
{
|
|
||||||
vol.Required(CONF_CONNECTIONS): vol.All(
|
|
||||||
cv.ensure_list, has_unique_host_names, [CONNECTION_SCHEMA]
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_BINARY_SENSORS): vol.All(
|
|
||||||
cv.ensure_list, [BINARY_SENSORS_SCHEMA]
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_CLIMATES): vol.All(
|
|
||||||
cv.ensure_list, [CLIMATES_SCHEMA]
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_COVERS): vol.All(cv.ensure_list, [COVERS_SCHEMA]),
|
|
||||||
vol.Optional(CONF_LIGHTS): vol.All(cv.ensure_list, [LIGHTS_SCHEMA]),
|
|
||||||
vol.Optional(CONF_SCENES): vol.All(cv.ensure_list, [SCENES_SCHEMA]),
|
|
||||||
vol.Optional(CONF_SENSORS): vol.All(
|
|
||||||
cv.ensure_list, [SENSORS_SCHEMA]
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_SWITCHES): vol.All(
|
|
||||||
cv.ensure_list, [SWITCHES_SCHEMA]
|
|
||||||
),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
},
|
|
||||||
),
|
|
||||||
extra=vol.ALLOW_EXTRA,
|
|
||||||
)
|
|
||||||
|
@ -23,9 +23,7 @@ from homeassistant.const import (
|
|||||||
CONF_PORT,
|
CONF_PORT,
|
||||||
CONF_USERNAME,
|
CONF_USERNAME,
|
||||||
)
|
)
|
||||||
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.data_entry_flow import FlowResultType
|
|
||||||
from homeassistant.helpers import issue_registry as ir
|
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
@ -48,83 +46,6 @@ IMPORT_DATA = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_step_import(
|
|
||||||
hass: HomeAssistant, issue_registry: ir.IssueRegistry
|
|
||||||
) -> None:
|
|
||||||
"""Test for import step."""
|
|
||||||
|
|
||||||
with (
|
|
||||||
patch("homeassistant.components.lcn.PchkConnectionManager.async_connect"),
|
|
||||||
patch("homeassistant.components.lcn.async_setup", return_value=True),
|
|
||||||
patch("homeassistant.components.lcn.async_setup_entry", return_value=True),
|
|
||||||
):
|
|
||||||
data = IMPORT_DATA.copy()
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=data
|
|
||||||
)
|
|
||||||
|
|
||||||
assert result["type"] is FlowResultType.CREATE_ENTRY
|
|
||||||
assert result["title"] == "pchk"
|
|
||||||
assert result["data"] == IMPORT_DATA
|
|
||||||
assert issue_registry.async_get_issue(
|
|
||||||
HOMEASSISTANT_DOMAIN, f"deprecated_yaml_{DOMAIN}"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def test_step_import_existing_host(
|
|
||||||
hass: HomeAssistant, issue_registry: ir.IssueRegistry
|
|
||||||
) -> None:
|
|
||||||
"""Test for update of config_entry if imported host already exists."""
|
|
||||||
|
|
||||||
# Create config entry and add it to hass
|
|
||||||
mock_data = IMPORT_DATA.copy()
|
|
||||||
mock_data.update({CONF_SK_NUM_TRIES: 3, CONF_DIM_MODE: 50})
|
|
||||||
mock_entry = MockConfigEntry(domain=DOMAIN, data=mock_data)
|
|
||||||
mock_entry.add_to_hass(hass)
|
|
||||||
# Initialize a config flow with different data but same host address
|
|
||||||
with patch("homeassistant.components.lcn.PchkConnectionManager.async_connect"):
|
|
||||||
imported_data = IMPORT_DATA.copy()
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=imported_data
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if config entry was updated
|
|
||||||
assert result["type"] is FlowResultType.ABORT
|
|
||||||
assert result["reason"] == "existing_configuration_updated"
|
|
||||||
assert mock_entry.source == config_entries.SOURCE_IMPORT
|
|
||||||
assert mock_entry.data == IMPORT_DATA
|
|
||||||
assert issue_registry.async_get_issue(
|
|
||||||
HOMEASSISTANT_DOMAIN, f"deprecated_yaml_{DOMAIN}"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
("error", "reason"),
|
|
||||||
[
|
|
||||||
(PchkAuthenticationError, "authentication_error"),
|
|
||||||
(PchkLicenseError, "license_error"),
|
|
||||||
(TimeoutError, "connection_refused"),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
async def test_step_import_error(
|
|
||||||
hass: HomeAssistant, issue_registry: ir.IssueRegistry, error, reason
|
|
||||||
) -> None:
|
|
||||||
"""Test for error in import is handled correctly."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.lcn.PchkConnectionManager.async_connect",
|
|
||||||
side_effect=error,
|
|
||||||
):
|
|
||||||
data = IMPORT_DATA.copy()
|
|
||||||
data.update({CONF_HOST: "pchk"})
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=data
|
|
||||||
)
|
|
||||||
|
|
||||||
assert result["type"] is FlowResultType.ABORT
|
|
||||||
assert result["reason"] == reason
|
|
||||||
assert issue_registry.async_get_issue(DOMAIN, reason)
|
|
||||||
|
|
||||||
|
|
||||||
async def test_show_form(hass: HomeAssistant) -> None:
|
async def test_show_form(hass: HomeAssistant) -> None:
|
||||||
"""Test that the form is served with no input."""
|
"""Test that the form is served with no input."""
|
||||||
flow = LcnFlowHandler()
|
flow = LcnFlowHandler()
|
||||||
@ -140,7 +61,6 @@ async def test_step_user(hass: HomeAssistant) -> None:
|
|||||||
"""Test for user step."""
|
"""Test for user step."""
|
||||||
with (
|
with (
|
||||||
patch("homeassistant.components.lcn.PchkConnectionManager.async_connect"),
|
patch("homeassistant.components.lcn.PchkConnectionManager.async_connect"),
|
||||||
patch("homeassistant.components.lcn.async_setup", return_value=True),
|
|
||||||
patch("homeassistant.components.lcn.async_setup_entry", return_value=True),
|
patch("homeassistant.components.lcn.async_setup_entry", return_value=True),
|
||||||
):
|
):
|
||||||
data = CONNECTION_DATA.copy()
|
data = CONNECTION_DATA.copy()
|
||||||
@ -210,7 +130,6 @@ async def test_step_reconfigure(hass: HomeAssistant, entry: MockConfigEntry) ->
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
patch("homeassistant.components.lcn.PchkConnectionManager.async_connect"),
|
patch("homeassistant.components.lcn.PchkConnectionManager.async_connect"),
|
||||||
patch("homeassistant.components.lcn.async_setup", return_value=True),
|
|
||||||
patch("homeassistant.components.lcn.async_setup_entry", return_value=True),
|
patch("homeassistant.components.lcn.async_setup_entry", return_value=True),
|
||||||
):
|
):
|
||||||
result = await hass.config_entries.flow.async_configure(
|
result = await hass.config_entries.flow.async_configure(
|
||||||
|
@ -16,7 +16,6 @@ from .conftest import (
|
|||||||
MockPchkConnectionManager,
|
MockPchkConnectionManager,
|
||||||
create_config_entry,
|
create_config_entry,
|
||||||
init_integration,
|
init_integration,
|
||||||
setup_component,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -83,18 +82,6 @@ async def test_async_setup_entry_update(
|
|||||||
assert dummy_entity in entity_registry.entities.values()
|
assert dummy_entity in entity_registry.entities.values()
|
||||||
assert dummy_device in device_registry.devices.values()
|
assert dummy_device in device_registry.devices.values()
|
||||||
|
|
||||||
# setup new entry with same data via import step (should cleanup dummy device)
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.lcn.config_flow.validate_connection",
|
|
||||||
return_value=None,
|
|
||||||
):
|
|
||||||
await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=entry.data
|
|
||||||
)
|
|
||||||
|
|
||||||
assert dummy_device not in device_registry.devices.values()
|
|
||||||
assert dummy_entity not in entity_registry.entities.values()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"exception", [PchkAuthenticationError, PchkLicenseError, TimeoutError]
|
"exception", [PchkAuthenticationError, PchkLicenseError, TimeoutError]
|
||||||
@ -114,20 +101,6 @@ async def test_async_setup_entry_raises_authentication_error(
|
|||||||
assert entry.state is ConfigEntryState.SETUP_ERROR
|
assert entry.state is ConfigEntryState.SETUP_ERROR
|
||||||
|
|
||||||
|
|
||||||
async def test_async_setup_from_configuration_yaml(hass: HomeAssistant) -> None:
|
|
||||||
"""Test a successful setup using data from configuration.yaml."""
|
|
||||||
with (
|
|
||||||
patch(
|
|
||||||
"homeassistant.components.lcn.config_flow.validate_connection",
|
|
||||||
return_value=None,
|
|
||||||
),
|
|
||||||
patch("homeassistant.components.lcn.async_setup_entry") as async_setup_entry,
|
|
||||||
):
|
|
||||||
await setup_component(hass)
|
|
||||||
|
|
||||||
assert async_setup_entry.await_count == 2
|
|
||||||
|
|
||||||
|
|
||||||
@patch("homeassistant.components.lcn.PchkConnectionManager", MockPchkConnectionManager)
|
@patch("homeassistant.components.lcn.PchkConnectionManager", MockPchkConnectionManager)
|
||||||
async def test_migrate_1_1(hass: HomeAssistant, entry) -> None:
|
async def test_migrate_1_1(hass: HomeAssistant, entry) -> None:
|
||||||
"""Test migration config entry."""
|
"""Test migration config entry."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user