Remove IP / mDNS validation in airq integration setup (#106326)

Original design relied on aioairq.AirQ.__init__ checking if the input
was a valid IP address or an mDNS of a very specific structure,
and raising an InvalidInput otherwise.
Now, aioairq==0.3.2 removes said check completely following a user's
request to allow arbitrary host name and DNS entries.
In the config flow, "cannot_connect" covers the cases of misspelled
inputs now, which previously were covered by a dedicated "invalid_input"
pull/106463/head
Renat Sibgatulin 2023-12-27 09:56:13 +01:00 committed by GitHub
parent d6d8e914bc
commit 1031e416be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 51 deletions

View File

@ -4,7 +4,7 @@ from __future__ import annotations
import logging
from typing import Any
from aioairq import AirQ, InvalidAuth, InvalidInput
from aioairq import AirQ, InvalidAuth
from aiohttp.client_exceptions import ClientConnectionError
import voluptuous as vol
@ -42,44 +42,32 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
errors: dict[str, str] = {}
session = async_get_clientsession(self.hass)
airq = AirQ(user_input[CONF_IP_ADDRESS], user_input[CONF_PASSWORD], session)
try:
airq = AirQ(user_input[CONF_IP_ADDRESS], user_input[CONF_PASSWORD], session)
except InvalidInput:
await airq.validate()
except ClientConnectionError:
_LOGGER.debug(
"%s does not appear to be a valid IP address or mDNS name",
(
"Failed to connect to device %s. Check the IP address / device"
" ID as well as whether the device is connected to power and"
" the WiFi"
),
user_input[CONF_IP_ADDRESS],
)
errors["base"] = "invalid_input"
errors["base"] = "cannot_connect"
except InvalidAuth:
_LOGGER.debug(
"Incorrect password for device %s", user_input[CONF_IP_ADDRESS]
)
errors["base"] = "invalid_auth"
else:
try:
await airq.validate()
except ClientConnectionError:
_LOGGER.debug(
(
"Failed to connect to device %s. Check the IP address / device"
" ID as well as whether the device is connected to power and"
" the WiFi"
),
user_input[CONF_IP_ADDRESS],
)
errors["base"] = "cannot_connect"
except InvalidAuth:
_LOGGER.debug(
"Incorrect password for device %s", user_input[CONF_IP_ADDRESS]
)
errors["base"] = "invalid_auth"
else:
_LOGGER.debug(
"Successfully connected to %s", user_input[CONF_IP_ADDRESS]
)
_LOGGER.debug("Successfully connected to %s", user_input[CONF_IP_ADDRESS])
device_info = await airq.fetch_device_info()
await self.async_set_unique_id(device_info["id"])
self._abort_if_unique_id_configured()
device_info = await airq.fetch_device_info()
await self.async_set_unique_id(device_info["id"])
self._abort_if_unique_id_configured()
return self.async_create_entry(
title=device_info["name"], data=user_input
)
return self.async_create_entry(title=device_info["name"], data=user_input)
return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors

View File

@ -7,5 +7,5 @@
"integration_type": "hub",
"iot_class": "local_polling",
"loggers": ["aioairq"],
"requirements": ["aioairq==0.3.1"]
"requirements": ["aioairq==0.3.2"]
}

View File

@ -185,7 +185,7 @@ aio-geojson-usgs-earthquakes==0.2
aio-georss-gdacs==0.8
# homeassistant.components.airq
aioairq==0.3.1
aioairq==0.3.2
# homeassistant.components.airzone_cloud
aioairzone-cloud==0.3.6

View File

@ -164,7 +164,7 @@ aio-geojson-usgs-earthquakes==0.2
aio-georss-gdacs==0.8
# homeassistant.components.airq
aioairq==0.3.1
aioairq==0.3.2
# homeassistant.components.airzone_cloud
aioairzone-cloud==0.3.6

View File

@ -1,7 +1,7 @@
"""Test the air-Q config flow."""
from unittest.mock import patch
from aioairq import DeviceInfo, InvalidAuth, InvalidInput
from aioairq import DeviceInfo, InvalidAuth
from aiohttp.client_exceptions import ClientConnectionError
import pytest
@ -80,21 +80,6 @@ async def test_form_cannot_connect(hass: HomeAssistant) -> None:
assert result2["errors"] == {"base": "cannot_connect"}
async def test_form_invalid_input(hass: HomeAssistant) -> None:
"""Test we handle cannot connect error."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
with patch("aioairq.AirQ.validate", side_effect=InvalidInput):
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], TEST_USER_DATA | {CONF_IP_ADDRESS: "invalid_ip"}
)
assert result2["type"] == FlowResultType.FORM
assert result2["errors"] == {"base": "invalid_input"}
async def test_duplicate_error(hass: HomeAssistant) -> None:
"""Test that errors are shown when duplicates are added."""
MockConfigEntry(