* Don't expose flows that aren't initialised. If a flow init does not return immediately then there is a window where our behaviour is screwy: * Can try to configure a flow that isn't ready * Can show notifications for discoveries that might yet return an abort This moves the flow discovery events and notifications to after the flow is initialised and hides flows that don't have a cur_step from async_progress * Fix tradfri test * Black. * Lint fixes
249 lines
8 KiB
Python
249 lines
8 KiB
Python
"""Test the Tradfri config flow."""
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from homeassistant import data_entry_flow
|
|
from homeassistant.components.tradfri import config_flow
|
|
|
|
from tests.common import MockConfigEntry, mock_coro
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_auth():
|
|
"""Mock authenticate."""
|
|
with patch(
|
|
"homeassistant.components.tradfri.config_flow.authenticate"
|
|
) as mock_auth:
|
|
yield mock_auth
|
|
|
|
|
|
async def test_user_connection_successful(hass, mock_auth, mock_entry_setup):
|
|
"""Test a successful connection."""
|
|
mock_auth.side_effect = lambda hass, host, code: mock_coro(
|
|
{"host": host, "gateway_id": "bla"}
|
|
)
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "user"}
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
flow["flow_id"], {"host": "123.123.123.123", "security_code": "abcd"}
|
|
)
|
|
|
|
assert len(mock_entry_setup.mock_calls) == 1
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
assert result["result"].data == {
|
|
"host": "123.123.123.123",
|
|
"gateway_id": "bla",
|
|
"import_groups": False,
|
|
}
|
|
|
|
|
|
async def test_user_connection_timeout(hass, mock_auth, mock_entry_setup):
|
|
"""Test a connection timeout."""
|
|
mock_auth.side_effect = config_flow.AuthError("timeout")
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "user"}
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
flow["flow_id"], {"host": "127.0.0.1", "security_code": "abcd"}
|
|
)
|
|
|
|
assert len(mock_entry_setup.mock_calls) == 0
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
assert result["errors"] == {"base": "timeout"}
|
|
|
|
|
|
async def test_user_connection_bad_key(hass, mock_auth, mock_entry_setup):
|
|
"""Test a connection with bad key."""
|
|
mock_auth.side_effect = config_flow.AuthError("invalid_security_code")
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "user"}
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
flow["flow_id"], {"host": "127.0.0.1", "security_code": "abcd"}
|
|
)
|
|
|
|
assert len(mock_entry_setup.mock_calls) == 0
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
assert result["errors"] == {"security_code": "invalid_security_code"}
|
|
|
|
|
|
async def test_discovery_connection(hass, mock_auth, mock_entry_setup):
|
|
"""Test a connection via discovery."""
|
|
mock_auth.side_effect = lambda hass, host, code: mock_coro(
|
|
{"host": host, "gateway_id": "bla"}
|
|
)
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "zeroconf"}, data={"host": "123.123.123.123"}
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
flow["flow_id"], {"security_code": "abcd"}
|
|
)
|
|
|
|
assert len(mock_entry_setup.mock_calls) == 1
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
assert result["result"].data == {
|
|
"host": "123.123.123.123",
|
|
"gateway_id": "bla",
|
|
"import_groups": False,
|
|
}
|
|
|
|
|
|
async def test_import_connection(hass, mock_auth, mock_entry_setup):
|
|
"""Test a connection via import."""
|
|
mock_auth.side_effect = lambda hass, host, code: mock_coro(
|
|
{"host": host, "gateway_id": "bla", "identity": "mock-iden", "key": "mock-key"}
|
|
)
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri",
|
|
context={"source": "import"},
|
|
data={"host": "123.123.123.123", "import_groups": True},
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
flow["flow_id"], {"security_code": "abcd"}
|
|
)
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
assert result["result"].data == {
|
|
"host": "123.123.123.123",
|
|
"gateway_id": "bla",
|
|
"identity": "mock-iden",
|
|
"key": "mock-key",
|
|
"import_groups": True,
|
|
}
|
|
|
|
assert len(mock_entry_setup.mock_calls) == 1
|
|
|
|
|
|
async def test_import_connection_no_groups(hass, mock_auth, mock_entry_setup):
|
|
"""Test a connection via import and no groups allowed."""
|
|
mock_auth.side_effect = lambda hass, host, code: mock_coro(
|
|
{"host": host, "gateway_id": "bla", "identity": "mock-iden", "key": "mock-key"}
|
|
)
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri",
|
|
context={"source": "import"},
|
|
data={"host": "123.123.123.123", "import_groups": False},
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
flow["flow_id"], {"security_code": "abcd"}
|
|
)
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
assert result["result"].data == {
|
|
"host": "123.123.123.123",
|
|
"gateway_id": "bla",
|
|
"identity": "mock-iden",
|
|
"key": "mock-key",
|
|
"import_groups": False,
|
|
}
|
|
|
|
assert len(mock_entry_setup.mock_calls) == 1
|
|
|
|
|
|
async def test_import_connection_legacy(hass, mock_gateway_info, mock_entry_setup):
|
|
"""Test a connection via import."""
|
|
mock_gateway_info.side_effect = lambda hass, host, identity, key: mock_coro(
|
|
{"host": host, "identity": identity, "key": key, "gateway_id": "mock-gateway"}
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
"tradfri",
|
|
context={"source": "import"},
|
|
data={"host": "123.123.123.123", "key": "mock-key", "import_groups": True},
|
|
)
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
assert result["result"].data == {
|
|
"host": "123.123.123.123",
|
|
"gateway_id": "mock-gateway",
|
|
"identity": "homeassistant",
|
|
"key": "mock-key",
|
|
"import_groups": True,
|
|
}
|
|
|
|
assert len(mock_gateway_info.mock_calls) == 1
|
|
assert len(mock_entry_setup.mock_calls) == 1
|
|
|
|
|
|
async def test_import_connection_legacy_no_groups(
|
|
hass, mock_gateway_info, mock_entry_setup
|
|
):
|
|
"""Test a connection via legacy import and no groups allowed."""
|
|
mock_gateway_info.side_effect = lambda hass, host, identity, key: mock_coro(
|
|
{"host": host, "identity": identity, "key": key, "gateway_id": "mock-gateway"}
|
|
)
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
"tradfri",
|
|
context={"source": "import"},
|
|
data={"host": "123.123.123.123", "key": "mock-key", "import_groups": False},
|
|
)
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
|
assert result["result"].data == {
|
|
"host": "123.123.123.123",
|
|
"gateway_id": "mock-gateway",
|
|
"identity": "homeassistant",
|
|
"key": "mock-key",
|
|
"import_groups": False,
|
|
}
|
|
|
|
assert len(mock_gateway_info.mock_calls) == 1
|
|
assert len(mock_entry_setup.mock_calls) == 1
|
|
|
|
|
|
async def test_discovery_duplicate_aborted(hass):
|
|
"""Test a duplicate discovery host is ignored."""
|
|
MockConfigEntry(domain="tradfri", data={"host": "some-host"}).add_to_hass(hass)
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "zeroconf"}, data={"host": "some-host"}
|
|
)
|
|
|
|
assert flow["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
|
assert flow["reason"] == "already_configured"
|
|
|
|
|
|
async def test_import_duplicate_aborted(hass):
|
|
"""Test a duplicate import host is ignored."""
|
|
MockConfigEntry(domain="tradfri", data={"host": "some-host"}).add_to_hass(hass)
|
|
|
|
flow = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "import"}, data={"host": "some-host"}
|
|
)
|
|
|
|
assert flow["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
|
assert flow["reason"] == "already_configured"
|
|
|
|
|
|
async def test_duplicate_discovery(hass, mock_auth, mock_entry_setup):
|
|
"""Test a duplicate discovery in progress is ignored."""
|
|
result = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "zeroconf"}, data={"host": "123.123.123.123"}
|
|
)
|
|
|
|
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
|
|
result2 = await hass.config_entries.flow.async_init(
|
|
"tradfri", context={"source": "zeroconf"}, data={"host": "123.123.123.123"}
|
|
)
|
|
|
|
assert result2["type"] == data_entry_flow.RESULT_TYPE_ABORT
|