Try to load integration before starting option flow (#90111)

* Try to load integration before starting option flow

* Adjust tests
This commit is contained in:
Erik Montnemery 2023-03-22 20:10:10 +01:00 committed by GitHub
parent 6db8867b81
commit 3931e11fd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 20 deletions

View File

@ -954,25 +954,7 @@ class ConfigEntriesFlowManager(data_entry_flow.FlowManager):
Handler key is the domain of the component that we want to set up. Handler key is the domain of the component that we want to set up.
""" """
try: await _load_integration(self.hass, handler_key, self._hass_config)
integration = await loader.async_get_integration(self.hass, handler_key)
except loader.IntegrationNotFound as err:
_LOGGER.error("Cannot find integration %s", handler_key)
raise data_entry_flow.UnknownHandler from err
# Make sure requirements and dependencies of component are resolved
await async_process_deps_reqs(self.hass, self._hass_config, integration)
try:
integration.get_platform("config_flow")
except ImportError as err:
_LOGGER.error(
"Error occurred loading configuration flow for integration %s: %s",
handler_key,
err,
)
raise data_entry_flow.UnknownHandler
if (handler := HANDLERS.get(handler_key)) is None: if (handler := HANDLERS.get(handler_key)) is None:
raise data_entry_flow.UnknownHandler raise data_entry_flow.UnknownHandler
@ -1842,6 +1824,8 @@ class OptionsFlowManager(data_entry_flow.FlowManager):
if entry is None: if entry is None:
raise UnknownEntry(handler_key) raise UnknownEntry(handler_key)
await _load_integration(self.hass, entry.domain, {})
if entry.domain not in HANDLERS: if entry.domain not in HANDLERS:
raise data_entry_flow.UnknownHandler raise data_entry_flow.UnknownHandler
@ -2006,3 +1990,26 @@ async def support_remove_from_device(hass: HomeAssistant, domain: str) -> bool:
integration = await loader.async_get_integration(hass, domain) integration = await loader.async_get_integration(hass, domain)
component = integration.get_component() component = integration.get_component()
return hasattr(component, "async_remove_config_entry_device") return hasattr(component, "async_remove_config_entry_device")
async def _load_integration(
hass: HomeAssistant, domain: str, hass_config: ConfigType
) -> None:
try:
integration = await loader.async_get_integration(hass, domain)
except loader.IntegrationNotFound as err:
_LOGGER.error("Cannot find integration %s", domain)
raise data_entry_flow.UnknownHandler from err
# Make sure requirements and dependencies of component are resolved
await async_process_deps_reqs(hass, hass_config, integration)
try:
integration.get_platform("config_flow")
except ImportError as err:
_LOGGER.error(
"Error occurred loading flow for integration %s: %s",
domain,
err,
)
raise data_entry_flow.UnknownHandler

View File

@ -793,6 +793,8 @@ async def test_options_flow(hass: HomeAssistant, client) -> None:
return OptionsFlowHandler() return OptionsFlowHandler()
mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None)
MockConfigEntry( MockConfigEntry(
domain="test", domain="test",
entry_id="test1", entry_id="test1",
@ -824,6 +826,7 @@ async def test_two_step_options_flow(hass: HomeAssistant, client) -> None:
mock_integration( mock_integration(
hass, MockModule("test", async_setup_entry=AsyncMock(return_value=True)) hass, MockModule("test", async_setup_entry=AsyncMock(return_value=True))
) )
mock_entity_platform(hass, "config_flow.test", None)
class TestFlow(core_ce.ConfigFlow): class TestFlow(core_ce.ConfigFlow):
@staticmethod @staticmethod
@ -889,6 +892,7 @@ async def test_options_flow_with_invalid_data(hass: HomeAssistant, client) -> No
mock_integration( mock_integration(
hass, MockModule("test", async_setup_entry=AsyncMock(return_value=True)) hass, MockModule("test", async_setup_entry=AsyncMock(return_value=True))
) )
mock_entity_platform(hass, "config_flow.test", None)
class TestFlow(core_ce.ConfigFlow): class TestFlow(core_ce.ConfigFlow):
@staticmethod @staticmethod

View File

@ -11,6 +11,7 @@ from homeassistant.components.zha.core.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.setup import async_setup_component
from tests.common import MockConfigEntry, MockModule, mock_integration from tests.common import MockConfigEntry, MockModule, mock_integration
@ -159,6 +160,7 @@ async def test_option_flow_install_multi_pan_addon(
start_addon, start_addon,
) -> None: ) -> None:
"""Test installing the multi pan addon.""" """Test installing the multi pan addon."""
assert await async_setup_component(hass, "usb", {})
mock_integration(hass, MockModule("hassio")) mock_integration(hass, MockModule("hassio"))
# Setup the config entry # Setup the config entry
@ -253,6 +255,7 @@ async def test_option_flow_install_multi_pan_addon_zha(
start_addon, start_addon,
) -> None: ) -> None:
"""Test installing the multi pan addon when a zha config entry exists.""" """Test installing the multi pan addon when a zha config entry exists."""
assert await async_setup_component(hass, "usb", {})
mock_integration(hass, MockModule("hassio")) mock_integration(hass, MockModule("hassio"))
# Setup the config entry # Setup the config entry

View File

@ -23,7 +23,13 @@ from homeassistant.helpers.schema_config_entry_flow import (
) )
from homeassistant.util.decorator import Registry from homeassistant.util.decorator import Registry
from tests.common import MockConfigEntry, mock_platform from tests.common import (
MockConfigEntry,
MockModule,
mock_entity_platform,
mock_integration,
mock_platform,
)
TEST_DOMAIN = "test" TEST_DOMAIN = "test"
@ -226,6 +232,8 @@ async def test_options_flow_advanced_option(
config_flow = {} config_flow = {}
options_flow = OPTIONS_FLOW options_flow = OPTIONS_FLOW
mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None)
config_entry = MockConfigEntry( config_entry = MockConfigEntry(
data={}, data={},
domain="test", domain="test",
@ -513,6 +521,8 @@ async def test_suggested_values(
config_flow = {} config_flow = {}
options_flow = OPTIONS_FLOW options_flow = OPTIONS_FLOW
mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None)
config_entry = MockConfigEntry( config_entry = MockConfigEntry(
data={}, data={},
domain="test", domain="test",
@ -624,6 +634,8 @@ async def test_options_flow_state(hass: HomeAssistant) -> None:
config_flow = {} config_flow = {}
options_flow = OPTIONS_FLOW options_flow = OPTIONS_FLOW
mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None)
config_entry = MockConfigEntry( config_entry = MockConfigEntry(
data={}, data={},
domain="test", domain="test",

View File

@ -1101,6 +1101,8 @@ async def test_entry_options(
hass: HomeAssistant, manager: config_entries.ConfigEntries hass: HomeAssistant, manager: config_entries.ConfigEntries
) -> None: ) -> None:
"""Test that we can set options on an entry.""" """Test that we can set options on an entry."""
mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None)
entry = MockConfigEntry(domain="test", data={"first": True}, options=None) entry = MockConfigEntry(domain="test", data={"first": True}, options=None)
entry.add_to_manager(manager) entry.add_to_manager(manager)
@ -1137,6 +1139,8 @@ async def test_entry_options_abort(
hass: HomeAssistant, manager: config_entries.ConfigEntries hass: HomeAssistant, manager: config_entries.ConfigEntries
) -> None: ) -> None:
"""Test that we can abort options flow.""" """Test that we can abort options flow."""
mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None)
entry = MockConfigEntry(domain="test", data={"first": True}, options=None) entry = MockConfigEntry(domain="test", data={"first": True}, options=None)
entry.add_to_manager(manager) entry.add_to_manager(manager)