Neato config flow (#26579)
* initial commit * Minor changes * add async setup entry * Add translations and some other stuff * add and remove entry * use async_setup_entry * Update config_flows.py * dshokouhi's changes * Improve workflow * Add valid_vendors * Add entity registry * Add device registry * Update entry from configuration.yaml * Revert unneccesary changes * Update .coveragerc * Prepared tests * Add dshokouhi and Santobert as codeowners * Fix unload entry and abort when already_configured * First tests * Add test for abort cases * Add test for invalid credentials on import * Add one last test * Add test_init.py with some tests * Address reviews, part 1 * Update outdated entry * await instead of add_job * run IO inside an executor * remove faulty test * Fix pylint issues * Move IO out of constructur * Edit error translations * Edit imports * Minor changes * Remove test for invalid vendor * Async setup platform * Edit login function * Moved IO out if init * Update switches after added to hass * Revert update outdated entry * try and update new entrys from config.yaml * Add test invalid vendor * Default to neato
This commit is contained in:
1 parent
476f24e451
commit
bd6bbcd5af
17 files changed
+691
-190
No files matched your search
@@ -0,0 +1 @@
|
||||
"""Tests for the Neato component."""
|
||||
@@ -0,0 +1,129 @@
|
||||
"""Tests for the Neato config flow."""
|
||||
import pytest
|
||||
from unittest.mock import patch
|
||||
|
||||
from homeassistant import data_entry_flow
|
||||
from homeassistant.components.neato import config_flow
|
||||
from homeassistant.components.neato.const import NEATO_DOMAIN, CONF_VENDOR
|
||||
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
|
||||
USERNAME = "myUsername"
|
||||
PASSWORD = "myPassword"
|
||||
VENDOR_NEATO = "neato"
|
||||
VENDOR_VORWERK = "vorwerk"
|
||||
VENDOR_INVALID = "invalid"
|
||||
|
||||
|
||||
@pytest.fixture(name="account")
|
||||
def mock_controller_login():
|
||||
"""Mock a successful login."""
|
||||
with patch("pybotvac.Account", return_value=True):
|
||||
yield
|
||||
|
||||
|
||||
def init_config_flow(hass):
|
||||
"""Init a configuration flow."""
|
||||
flow = config_flow.NeatoConfigFlow()
|
||||
flow.hass = hass
|
||||
return flow
|
||||
|
||||
|
||||
async def test_user(hass, account):
|
||||
"""Test user config."""
|
||||
flow = init_config_flow(hass)
|
||||
|
||||
result = await flow.async_step_user()
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result["step_id"] == "user"
|
||||
|
||||
result = await flow.async_step_user(
|
||||
{CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_VENDOR: VENDOR_NEATO}
|
||||
)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == USERNAME
|
||||
assert result["data"][CONF_USERNAME] == USERNAME
|
||||
assert result["data"][CONF_PASSWORD] == PASSWORD
|
||||
assert result["data"][CONF_VENDOR] == VENDOR_NEATO
|
||||
|
||||
result = await flow.async_step_user(
|
||||
{CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_VENDOR: VENDOR_VORWERK}
|
||||
)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == USERNAME
|
||||
assert result["data"][CONF_USERNAME] == USERNAME
|
||||
assert result["data"][CONF_PASSWORD] == PASSWORD
|
||||
assert result["data"][CONF_VENDOR] == VENDOR_VORWERK
|
||||
|
||||
|
||||
async def test_import(hass, account):
|
||||
"""Test import step."""
|
||||
flow = init_config_flow(hass)
|
||||
|
||||
result = await flow.async_step_import(
|
||||
{CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_VENDOR: VENDOR_NEATO}
|
||||
)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == f"{USERNAME} (from configuration)"
|
||||
assert result["data"][CONF_USERNAME] == USERNAME
|
||||
assert result["data"][CONF_PASSWORD] == PASSWORD
|
||||
assert result["data"][CONF_VENDOR] == VENDOR_NEATO
|
||||
|
||||
|
||||
async def test_abort_if_already_setup(hass, account):
|
||||
"""Test we abort if Neato is already setup."""
|
||||
flow = init_config_flow(hass)
|
||||
MockConfigEntry(
|
||||
domain=NEATO_DOMAIN,
|
||||
data={
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_VENDOR: VENDOR_NEATO,
|
||||
},
|
||||
).add_to_hass(hass)
|
||||
|
||||
# Should fail, same USERNAME (import)
|
||||
result = await flow.async_step_import(
|
||||
{CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_VENDOR: VENDOR_NEATO}
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
|
||||
# Should fail, same USERNAME (flow)
|
||||
result = await flow.async_step_user(
|
||||
{CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_VENDOR: VENDOR_NEATO}
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
|
||||
|
||||
async def test_abort_on_invalid_credentials(hass):
|
||||
"""Test when we have invalid credentials."""
|
||||
from requests.exceptions import HTTPError
|
||||
|
||||
flow = init_config_flow(hass)
|
||||
|
||||
with patch("pybotvac.Account", side_effect=HTTPError()):
|
||||
result = await flow.async_step_user(
|
||||
{
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_VENDOR: VENDOR_NEATO,
|
||||
}
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result["errors"] == {"base": "invalid_credentials"}
|
||||
|
||||
result = await flow.async_step_import(
|
||||
{
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_VENDOR: VENDOR_NEATO,
|
||||
}
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "invalid_credentials"
|
||||
@@ -0,0 +1,70 @@
|
||||
"""Tests for the Neato init file."""
|
||||
import pytest
|
||||
from unittest.mock import patch
|
||||
|
||||
from homeassistant.components.neato.const import NEATO_DOMAIN, CONF_VENDOR
|
||||
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
|
||||
from homeassistant.setup import async_setup_component
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
|
||||
USERNAME = "myUsername"
|
||||
PASSWORD = "myPassword"
|
||||
VENDOR_NEATO = "neato"
|
||||
VENDOR_VORWERK = "vorwerk"
|
||||
VENDOR_INVALID = "invalid"
|
||||
|
||||
VALID_CONFIG = {
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_VENDOR: VENDOR_NEATO,
|
||||
}
|
||||
|
||||
INVALID_CONFIG = {
|
||||
CONF_USERNAME: USERNAME,
|
||||
CONF_PASSWORD: PASSWORD,
|
||||
CONF_VENDOR: VENDOR_INVALID,
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture(name="account")
|
||||
def mock_controller_login():
|
||||
"""Mock a successful login."""
|
||||
with patch("pybotvac.Account", return_value=True):
|
||||
yield
|
||||
|
||||
|
||||
async def test_no_config_entry(hass):
|
||||
"""There is nothing in configuration.yaml."""
|
||||
res = await async_setup_component(hass, NEATO_DOMAIN, {})
|
||||
assert res is True
|
||||
|
||||
|
||||
async def test_config_entries_in_sync(hass, account):
|
||||
"""The config entry and configuration.yaml are in sync."""
|
||||
MockConfigEntry(domain=NEATO_DOMAIN, data=VALID_CONFIG).add_to_hass(hass)
|
||||
|
||||
assert hass.config_entries.async_entries(NEATO_DOMAIN)
|
||||
assert await async_setup_component(hass, NEATO_DOMAIN, {NEATO_DOMAIN: VALID_CONFIG})
|
||||
await hass.async_block_till_done()
|
||||
|
||||
entries = hass.config_entries.async_entries(NEATO_DOMAIN)
|
||||
assert entries
|
||||
assert entries[0].data[CONF_USERNAME] == USERNAME
|
||||
assert entries[0].data[CONF_PASSWORD] == PASSWORD
|
||||
assert entries[0].data[CONF_VENDOR] == VENDOR_NEATO
|
||||
|
||||
|
||||
async def test_config_entries_not_in_sync(hass, account):
|
||||
"""The config entry and configuration.yaml are not in sync."""
|
||||
MockConfigEntry(domain=NEATO_DOMAIN, data=INVALID_CONFIG).add_to_hass(hass)
|
||||
|
||||
assert hass.config_entries.async_entries(NEATO_DOMAIN)
|
||||
assert await async_setup_component(hass, NEATO_DOMAIN, {NEATO_DOMAIN: VALID_CONFIG})
|
||||
await hass.async_block_till_done()
|
||||
|
||||
entries = hass.config_entries.async_entries(NEATO_DOMAIN)
|
||||
assert entries
|
||||
assert entries[0].data[CONF_USERNAME] == USERNAME
|
||||
assert entries[0].data[CONF_PASSWORD] == PASSWORD
|
||||
assert entries[0].data[CONF_VENDOR] == VENDOR_NEATO
|
||||
Reference in new issue
Block a user