mirror of https://github.com/home-assistant/core
230 lines
8.0 KiB
Python
230 lines
8.0 KiB
Python
"""Test the IntelliFire config flow."""
|
|
|
|
from unittest.mock import AsyncMock
|
|
|
|
from intellifire4py.exceptions import LoginError
|
|
|
|
from homeassistant import config_entries
|
|
from homeassistant.components import dhcp
|
|
from homeassistant.components.intellifire.const import CONF_SERIAL, DOMAIN
|
|
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.data_entry_flow import FlowResultType
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
async def test_standard_config_with_single_fireplace(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_apis_single_fp,
|
|
) -> None:
|
|
"""Test standard flow with a user who has only a single fireplace."""
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["errors"] == {}
|
|
assert result["step_id"] == "cloud_api"
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
# For a single fireplace we just create it
|
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
|
assert result["data"] == {
|
|
"ip_address": "192.168.2.108",
|
|
"api_key": "B5C4DA27AAEF31D1FB21AFF9BFA6BCD2",
|
|
"serial": "3FB284769E4736F30C8973A7ED358123",
|
|
"auth_cookie": "B984F21A6378560019F8A1CDE41B6782",
|
|
"web_client_id": "FA2B1C3045601234D0AE17D72F8E975",
|
|
"user_id": "52C3F9E8B9D3AC99F8E4D12345678901FE9A2BC7D85F7654E28BF98BCD123456",
|
|
"username": "grumpypanda@china.cn",
|
|
"password": "you-stole-my-pandas",
|
|
}
|
|
|
|
|
|
async def test_standard_config_with_pre_configured_fireplace(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_config_entry_current,
|
|
mock_apis_single_fp,
|
|
) -> None:
|
|
"""What if we try to configure an already configured fireplace."""
|
|
# Configure an existing entry
|
|
mock_config_entry_current.add_to_hass(hass)
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["errors"] == {}
|
|
assert result["step_id"] == "cloud_api"
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
|
|
# For a single fireplace we just create it
|
|
assert result["type"] == FlowResultType.ABORT
|
|
assert result["reason"] == "no_available_devices"
|
|
|
|
|
|
async def test_standard_config_with_single_fireplace_and_bad_credentials(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_apis_single_fp,
|
|
) -> None:
|
|
"""Test bad credentials on a login."""
|
|
mock_local_interface, mock_cloud_interface, mock_fp = mock_apis_single_fp
|
|
# Set login error
|
|
mock_cloud_interface.login_with_credentials.side_effect = LoginError
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
assert result["type"] is FlowResultType.FORM
|
|
assert result["errors"] == {}
|
|
assert result["step_id"] == "cloud_api"
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
|
|
# Erase the error
|
|
mock_cloud_interface.login_with_credentials.side_effect = None
|
|
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["errors"] == {"base": "api_error"}
|
|
assert result["step_id"] == "cloud_api"
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
# For a single fireplace we just create it
|
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
|
assert result["data"] == {
|
|
"ip_address": "192.168.2.108",
|
|
"api_key": "B5C4DA27AAEF31D1FB21AFF9BFA6BCD2",
|
|
"serial": "3FB284769E4736F30C8973A7ED358123",
|
|
"auth_cookie": "B984F21A6378560019F8A1CDE41B6782",
|
|
"web_client_id": "FA2B1C3045601234D0AE17D72F8E975",
|
|
"user_id": "52C3F9E8B9D3AC99F8E4D12345678901FE9A2BC7D85F7654E28BF98BCD123456",
|
|
"username": "grumpypanda@china.cn",
|
|
"password": "you-stole-my-pandas",
|
|
}
|
|
|
|
|
|
async def test_standard_config_with_multiple_fireplace(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_apis_multifp,
|
|
) -> None:
|
|
"""Test multi-fireplace user who must be very rich."""
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
|
)
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["errors"] == {}
|
|
assert result["step_id"] == "cloud_api"
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
# When we have multiple fireplaces we get to pick a serial
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["step_id"] == "pick_cloud_device"
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_SERIAL: "4GC295860E5837G40D9974B7FD459234"},
|
|
)
|
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
|
assert result["data"] == {
|
|
"ip_address": "192.168.2.109",
|
|
"api_key": "D4C5EB28BBFF41E1FB21AFF9BFA6CD34",
|
|
"serial": "4GC295860E5837G40D9974B7FD459234",
|
|
"auth_cookie": "B984F21A6378560019F8A1CDE41B6782",
|
|
"web_client_id": "FA2B1C3045601234D0AE17D72F8E975",
|
|
"user_id": "52C3F9E8B9D3AC99F8E4D12345678901FE9A2BC7D85F7654E28BF98BCD123456",
|
|
"username": "grumpypanda@china.cn",
|
|
"password": "you-stole-my-pandas",
|
|
}
|
|
|
|
|
|
async def test_dhcp_discovery_intellifire_device(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_apis_multifp,
|
|
) -> None:
|
|
"""Test successful DHCP Discovery."""
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN,
|
|
context={"source": config_entries.SOURCE_DHCP},
|
|
data=dhcp.DhcpServiceInfo(
|
|
ip="1.1.1.1",
|
|
macaddress="aabbcceeddff",
|
|
hostname="zentrios-Test",
|
|
),
|
|
)
|
|
assert result["type"] == FlowResultType.FORM
|
|
assert result["step_id"] == "cloud_api"
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
|
|
|
|
|
async def test_dhcp_discovery_non_intellifire_device(
|
|
hass: HomeAssistant,
|
|
mock_setup_entry: AsyncMock,
|
|
mock_apis_multifp,
|
|
) -> None:
|
|
"""Test successful DHCP Discovery of a non intellifire device.."""
|
|
|
|
# Patch poll with an exception
|
|
mock_local_interface, mock_cloud_interface, mock_fp = mock_apis_multifp
|
|
mock_local_interface.poll.side_effect = ConnectionError
|
|
|
|
result = await hass.config_entries.flow.async_init(
|
|
DOMAIN,
|
|
context={"source": config_entries.SOURCE_DHCP},
|
|
data=dhcp.DhcpServiceInfo(
|
|
ip="1.1.1.1",
|
|
macaddress="aabbcceeddff",
|
|
hostname="zentrios-Evil",
|
|
),
|
|
)
|
|
assert result["type"] == FlowResultType.ABORT
|
|
assert result["reason"] == "not_intellifire_device"
|
|
# Test is finished - the DHCP scanner detected a hostname that "might" be an IntelliFire device, but it was not.
|
|
|
|
|
|
async def test_reauth_flow(
|
|
hass: HomeAssistant,
|
|
mock_config_entry_current: MockConfigEntry,
|
|
mock_apis_single_fp,
|
|
mock_setup_entry: AsyncMock,
|
|
) -> None:
|
|
"""Test reauth."""
|
|
|
|
mock_config_entry_current.add_to_hass(hass)
|
|
result = await mock_config_entry_current.start_reauth_flow(hass)
|
|
assert result["type"] == FlowResultType.FORM
|
|
result["step_id"] = "cloud_api"
|
|
|
|
result = await hass.config_entries.flow.async_configure(
|
|
result["flow_id"],
|
|
{CONF_USERNAME: "donJulio", CONF_PASSWORD: "Tequila0FD00m"},
|
|
)
|
|
|
|
assert result["type"] == FlowResultType.ABORT
|
|
assert result["reason"] == "reauth_successful"
|