102 lines
3.4 KiB
Python
102 lines
3.4 KiB
Python
"""Test ESPHome dashboard features."""
|
|
from unittest.mock import patch
|
|
|
|
from aioesphomeapi import DeviceInfo, InvalidAuthAPIError
|
|
|
|
from homeassistant.components.esphome import CONF_NOISE_PSK, dashboard
|
|
from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntryState
|
|
from homeassistant.data_entry_flow import FlowResultType
|
|
|
|
from . import VALID_NOISE_PSK
|
|
|
|
|
|
async def test_new_info_reload_config_entries(hass, init_integration, mock_dashboard):
|
|
"""Test config entries are reloaded when new info is set."""
|
|
assert init_integration.state == ConfigEntryState.LOADED
|
|
|
|
with patch("homeassistant.components.esphome.async_setup_entry") as mock_setup:
|
|
await dashboard.async_set_dashboard_info(hass, "test-slug", "test-host", 6052)
|
|
|
|
assert len(mock_setup.mock_calls) == 1
|
|
assert mock_setup.mock_calls[0][1][1] == init_integration
|
|
|
|
# Test it's a no-op when the same info is set
|
|
with patch("homeassistant.components.esphome.async_setup_entry") as mock_setup:
|
|
await dashboard.async_set_dashboard_info(hass, "test-slug", "test-host", 6052)
|
|
|
|
assert len(mock_setup.mock_calls) == 0
|
|
|
|
|
|
async def test_new_dashboard_fix_reauth(
|
|
hass, mock_client, mock_config_entry, mock_dashboard
|
|
):
|
|
"""Test config entries waiting for reauth are triggered."""
|
|
mock_client.device_info.side_effect = (
|
|
InvalidAuthAPIError,
|
|
DeviceInfo(uses_password=False, name="test"),
|
|
)
|
|
|
|
with patch(
|
|
"homeassistant.components.esphome.dashboard.ESPHomeDashboardAPI.get_encryption_key",
|
|
return_value=VALID_NOISE_PSK,
|
|
) as mock_get_encryption_key:
|
|
result = await hass.config_entries.flow.async_init(
|
|
"esphome",
|
|
context={
|
|
"source": SOURCE_REAUTH,
|
|
"entry_id": mock_config_entry.entry_id,
|
|
"unique_id": mock_config_entry.unique_id,
|
|
},
|
|
)
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["step_id"] == "reauth_confirm"
|
|
assert len(mock_get_encryption_key.mock_calls) == 0
|
|
|
|
mock_dashboard["configured"].append(
|
|
{
|
|
"name": "test",
|
|
"configuration": "test.yaml",
|
|
}
|
|
)
|
|
|
|
await dashboard.async_get_dashboard(hass).async_refresh()
|
|
|
|
with patch(
|
|
"homeassistant.components.esphome.dashboard.ESPHomeDashboardAPI.get_encryption_key",
|
|
return_value=VALID_NOISE_PSK,
|
|
) as mock_get_encryption_key, patch(
|
|
"homeassistant.components.esphome.async_setup_entry", return_value=True
|
|
) as mock_setup:
|
|
await dashboard.async_set_dashboard_info(hass, "test-slug", "test-host", 6052)
|
|
await hass.async_block_till_done()
|
|
|
|
assert len(mock_get_encryption_key.mock_calls) == 1
|
|
assert len(mock_setup.mock_calls) == 1
|
|
assert mock_config_entry.data[CONF_NOISE_PSK] == VALID_NOISE_PSK
|
|
|
|
|
|
async def test_dashboard_supports_update(hass, mock_dashboard):
|
|
"""Test dashboard supports update."""
|
|
dash = dashboard.async_get_dashboard(hass)
|
|
|
|
# No data
|
|
assert not dash.supports_update
|
|
|
|
# supported version
|
|
mock_dashboard["configured"].append(
|
|
{
|
|
"name": "test",
|
|
"configuration": "test.yaml",
|
|
"current_version": "2023.2.0-dev",
|
|
}
|
|
)
|
|
await dash.async_refresh()
|
|
|
|
assert dash.supports_update
|
|
|
|
# unsupported version
|
|
mock_dashboard["configured"][0]["current_version"] = "2023.1.0"
|
|
await dash.async_refresh()
|
|
|
|
assert not dash.supports_update
|