core/tests/components/intellifire/test_config_flow.py

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"