mirror of https://github.com/home-assistant/core
107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
"""Test the igloohome config flow."""
|
|
|
|
from collections.abc import Generator
|
|
from unittest.mock import AsyncMock
|
|
|
|
from aiohttp import ClientError
|
|
from igloohome_api import AuthException
|
|
import pytest
|
|
|
|
from homeassistant import config_entries
|
|
from homeassistant.components.igloohome.const import DOMAIN
|
|
from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.data_entry_flow import FlowResultType
|
|
|
|
from . import setup_integration
|
|
|
|
FORM_USER_INPUT = {
|
|
CONF_CLIENT_ID: "client-id",
|
|
CONF_CLIENT_SECRET: "client-secret",
|
|
}
|
|
|
|
|
|
async def test_form_valid_input(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: Generator[AsyncMock],
|
|
mock_auth: Generator[AsyncMock],
|
|
) -> None:
|
|
"""Test that the form correct reacts to valid input."""
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
assert result["type"] is FlowResultType.FORM
|
|
assert result["errors"] == {}
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
FORM_USER_INPUT,
|
|
)
|
|
|
|
assert result["type"] is FlowResultType.CREATE_ENTRY
|
|
assert result["title"] == "Client Credentials"
|
|
assert result["data"] == FORM_USER_INPUT
|
|
assert len(mock_setup_entry.mock_calls) == 1
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("exception", "result_error"),
|
|
[(AuthException(), "invalid_auth"), (ClientError(), "cannot_connect")],
|
|
)
|
|
async def test_form_invalid_input(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_auth: Generator[AsyncMock],
|
|
exception: Exception,
|
|
result_error: str,
|
|
) -> None:
|
|
"""Tests where we handle errors in the config flow."""
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
|
|
mock_auth.side_effect = exception
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
FORM_USER_INPUT,
|
|
)
|
|
|
|
assert result["type"] is FlowResultType.FORM
|
|
assert result["errors"] == {"base": result_error}
|
|
|
|
# Make sure the config flow tests finish with either an
|
|
# FlowResultType.CREATE_ENTRY or FlowResultType.ABORT so
|
|
# we can show the config flow is able to recover from an error.
|
|
mock_auth.side_effect = None
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
FORM_USER_INPUT,
|
|
)
|
|
|
|
assert result["type"] is FlowResultType.CREATE_ENTRY
|
|
assert result["title"] == "Client Credentials"
|
|
assert result["data"] == FORM_USER_INPUT
|
|
assert len(mock_setup_entry.mock_calls) == 1
|
|
|
|
|
|
async def test_form_abort_on_matching_entry(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: Generator[AsyncMock],
|
|
mock_auth: Generator[AsyncMock],
|
|
) -> None:
|
|
"""Tests where we handle errors in the config flow."""
|
|
# Create first config flow.
|
|
await setup_integration(hass, mock_config_entry)
|
|
|
|
# Attempt another config flow with the same client credentials
|
|
# and ensure that FlowResultType.ABORT is returned.
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
FORM_USER_INPUT,
|
|
)
|
|
assert result["type"] is FlowResultType.ABORT
|
|
assert result["reason"] == "already_configured"
|