core/tests/components/html5/test_config_flow.py

204 lines
6.3 KiB
Python

"""Test the HTML5 config flow."""
from unittest.mock import patch
import pytest
from homeassistant import config_entries, data_entry_flow
from homeassistant.components.html5.const import (
ATTR_VAPID_EMAIL,
ATTR_VAPID_PRV_KEY,
ATTR_VAPID_PUB_KEY,
DOMAIN,
)
from homeassistant.components.html5.issues import (
FAILED_IMPORT_TRANSLATION_KEY,
SUCCESSFUL_IMPORT_TRANSLATION_KEY,
)
from homeassistant.const import CONF_NAME
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
import homeassistant.helpers.issue_registry as ir
MOCK_CONF = {
ATTR_VAPID_EMAIL: "test@example.com",
ATTR_VAPID_PRV_KEY: "h6acSRds8_KR8hT9djD8WucTL06Gfe29XXyZ1KcUjN8",
}
MOCK_CONF_PUB_KEY = "BIUtPN7Rq_8U7RBEqClZrfZ5dR9zPCfvxYPtLpWtRVZTJEc7lzv2dhzDU6Aw1m29Ao0-UA1Uq6XO9Df8KALBKqA"
async def test_step_user_success(hass: HomeAssistant) -> None:
"""Test a successful user config flow."""
with patch(
"homeassistant.components.html5.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_USER},
data=MOCK_CONF.copy(),
)
await hass.async_block_till_done()
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
assert result["data"] == {
ATTR_VAPID_PRV_KEY: MOCK_CONF[ATTR_VAPID_PRV_KEY],
ATTR_VAPID_PUB_KEY: MOCK_CONF_PUB_KEY,
ATTR_VAPID_EMAIL: MOCK_CONF[ATTR_VAPID_EMAIL],
CONF_NAME: DOMAIN,
}
assert mock_setup_entry.call_count == 1
async def test_step_user_success_generate(hass: HomeAssistant) -> None:
"""Test a successful user config flow, generating a key pair."""
with patch(
"homeassistant.components.html5.async_setup_entry",
return_value=True,
) as mock_setup_entry:
conf = {ATTR_VAPID_EMAIL: MOCK_CONF[ATTR_VAPID_EMAIL]}
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}, data=conf
)
await hass.async_block_till_done()
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
assert result["data"][ATTR_VAPID_EMAIL] == MOCK_CONF[ATTR_VAPID_EMAIL]
assert mock_setup_entry.call_count == 1
async def test_step_user_new_form(hass: HomeAssistant) -> None:
"""Test new user input."""
with patch(
"homeassistant.components.html5.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}, data=None
)
await hass.async_block_till_done()
assert result["type"] is data_entry_flow.FlowResultType.FORM
assert mock_setup_entry.call_count == 0
result = await hass.config_entries.flow.async_configure(
result["flow_id"], MOCK_CONF
)
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
assert mock_setup_entry.call_count == 1
@pytest.mark.parametrize(
("key", "value"),
[
(ATTR_VAPID_PRV_KEY, "invalid"),
],
)
async def test_step_user_form_invalid_key(
hass: HomeAssistant, key: str, value: str
) -> None:
"""Test invalid user input."""
with patch(
"homeassistant.components.html5.async_setup_entry",
return_value=True,
) as mock_setup_entry:
bad_conf = MOCK_CONF.copy()
bad_conf[key] = value
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}, data=bad_conf
)
await hass.async_block_till_done()
assert result["type"] == data_entry_flow.FlowResultType.FORM
assert mock_setup_entry.call_count == 0
result = await hass.config_entries.flow.async_configure(
result["flow_id"], MOCK_CONF
)
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
assert mock_setup_entry.call_count == 1
async def test_step_import_good(
hass: HomeAssistant,
issue_registry: ir.IssueRegistry,
) -> None:
"""Test valid import input."""
with (
patch(
"homeassistant.components.html5.async_setup_entry",
return_value=True,
) as mock_setup_entry,
):
conf = MOCK_CONF.copy()
conf[ATTR_VAPID_PUB_KEY] = MOCK_CONF_PUB_KEY
conf["random_key"] = "random_value"
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=conf
)
await hass.async_block_till_done()
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
assert result["data"] == {
ATTR_VAPID_PRV_KEY: conf[ATTR_VAPID_PRV_KEY],
ATTR_VAPID_PUB_KEY: MOCK_CONF_PUB_KEY,
ATTR_VAPID_EMAIL: conf[ATTR_VAPID_EMAIL],
CONF_NAME: DOMAIN,
}
assert mock_setup_entry.call_count == 1
assert len(issue_registry.issues) == 1
issue = issue_registry.async_get_issue(
HOMEASSISTANT_DOMAIN, f"deprecated_yaml_{DOMAIN}"
)
assert issue
assert issue.translation_key == SUCCESSFUL_IMPORT_TRANSLATION_KEY
@pytest.mark.parametrize(
("key", "value"),
[
(ATTR_VAPID_PRV_KEY, "invalid"),
],
)
async def test_step_import_bad(
hass: HomeAssistant, issue_registry: ir.IssueRegistry, key: str, value: str
) -> None:
"""Test invalid import input."""
with (
patch(
"homeassistant.components.html5.async_setup_entry",
return_value=True,
) as mock_setup_entry,
):
bad_conf = MOCK_CONF.copy()
bad_conf[key] = value
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, data=bad_conf
)
await hass.async_block_till_done()
assert result["type"] == data_entry_flow.FlowResultType.ABORT
assert mock_setup_entry.call_count == 0
assert len(issue_registry.issues) == 1
issue = issue_registry.async_get_issue(DOMAIN, f"deprecated_yaml_{DOMAIN}")
assert issue
assert issue.translation_key == FAILED_IMPORT_TRANSLATION_KEY