mirror of
https://github.com/home-assistant/core.git
synced 2025-05-03 05:29:14 +00:00
Fix race fetching ESPHome dashboard when there are no devices set up (#96196)
* Fix fetching ESPHome dashboard when there are no devices setup fixes #96194 * coverage * fix
This commit is contained in:
parent
72f080bf8b
commit
b106ca7983
@ -35,7 +35,7 @@ from .const import (
|
|||||||
DEFAULT_NEW_CONFIG_ALLOW_ALLOW_SERVICE_CALLS,
|
DEFAULT_NEW_CONFIG_ALLOW_ALLOW_SERVICE_CALLS,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
from .dashboard import async_get_dashboard, async_set_dashboard_info
|
from .dashboard import async_get_or_create_dashboard_manager, async_set_dashboard_info
|
||||||
|
|
||||||
ERROR_REQUIRES_ENCRYPTION_KEY = "requires_encryption_key"
|
ERROR_REQUIRES_ENCRYPTION_KEY = "requires_encryption_key"
|
||||||
ERROR_INVALID_ENCRYPTION_KEY = "invalid_psk"
|
ERROR_INVALID_ENCRYPTION_KEY = "invalid_psk"
|
||||||
@ -406,7 +406,9 @@ class EsphomeFlowHandler(ConfigFlow, domain=DOMAIN):
|
|||||||
"""
|
"""
|
||||||
if (
|
if (
|
||||||
self._device_name is None
|
self._device_name is None
|
||||||
or (dashboard := async_get_dashboard(self.hass)) is None
|
or (manager := await async_get_or_create_dashboard_manager(self.hass))
|
||||||
|
is None
|
||||||
|
or (dashboard := manager.async_get()) is None
|
||||||
):
|
):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -143,7 +143,14 @@ class ESPHomeDashboardManager:
|
|||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_get_dashboard(hass: HomeAssistant) -> ESPHomeDashboard | None:
|
def async_get_dashboard(hass: HomeAssistant) -> ESPHomeDashboard | None:
|
||||||
"""Get an instance of the dashboard if set."""
|
"""Get an instance of the dashboard if set.
|
||||||
|
|
||||||
|
This is only safe to call after `async_setup` has been completed.
|
||||||
|
|
||||||
|
It should not be called from the config flow because there is a race
|
||||||
|
where manager can be an asyncio.Event instead of the actual manager
|
||||||
|
because the singleton decorator is not yet done.
|
||||||
|
"""
|
||||||
manager: ESPHomeDashboardManager | None = hass.data.get(KEY_DASHBOARD_MANAGER)
|
manager: ESPHomeDashboardManager | None = hass.data.get(KEY_DASHBOARD_MANAGER)
|
||||||
return manager.async_get() if manager else None
|
return manager.async_get() if manager else None
|
||||||
|
|
||||||
|
@ -1374,3 +1374,45 @@ async def test_option_flow(
|
|||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||||
assert result["data"] == {CONF_ALLOW_SERVICE_CALLS: option_value}
|
assert result["data"] == {CONF_ALLOW_SERVICE_CALLS: option_value}
|
||||||
assert len(mock_reload.mock_calls) == int(option_value)
|
assert len(mock_reload.mock_calls) == int(option_value)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_user_discovers_name_no_dashboard(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
mock_client,
|
||||||
|
mock_zeroconf: None,
|
||||||
|
mock_setup_entry: None,
|
||||||
|
) -> None:
|
||||||
|
"""Test user step can discover the name and the there is not dashboard."""
|
||||||
|
mock_client.device_info.side_effect = [
|
||||||
|
RequiresEncryptionAPIError,
|
||||||
|
InvalidEncryptionKeyAPIError("Wrong key", "test"),
|
||||||
|
DeviceInfo(
|
||||||
|
uses_password=False,
|
||||||
|
name="test",
|
||||||
|
mac_address="11:22:33:44:55:AA",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
"esphome",
|
||||||
|
context={"source": config_entries.SOURCE_USER},
|
||||||
|
data={CONF_HOST: "127.0.0.1", CONF_PORT: 6053},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert result["type"] == FlowResultType.FORM
|
||||||
|
assert result["step_id"] == "encryption_key"
|
||||||
|
|
||||||
|
result = await hass.config_entries.flow.async_configure(
|
||||||
|
result["flow_id"], user_input={CONF_NOISE_PSK: VALID_NOISE_PSK}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
||||||
|
assert result["data"] == {
|
||||||
|
CONF_HOST: "127.0.0.1",
|
||||||
|
CONF_PORT: 6053,
|
||||||
|
CONF_PASSWORD: "",
|
||||||
|
CONF_NOISE_PSK: VALID_NOISE_PSK,
|
||||||
|
CONF_DEVICE_NAME: "test",
|
||||||
|
}
|
||||||
|
assert mock_client.noise_psk == VALID_NOISE_PSK
|
||||||
|
Loading…
x
Reference in New Issue
Block a user