Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions homeassistant/components/airvisual/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ async def _async_set_unique_id(self, unique_id):
await self.async_set_unique_id(unique_id)
self._abort_if_unique_id_configured()

async def _async_test_client_api_key(self, api_key):
"""Test that a client API key works."""
websession = aiohttp_client.async_get_clientsession(self.hass)
client = Client(websession, api_key=api_key)

try:
await client.api.nearest_city()
except InvalidKeyError:
return await self._show_form(errors={CONF_API_KEY: "invalid_api_key"})

@callback
async def _show_form(self, errors=None):
"""Show the form to the user."""
Expand All @@ -48,6 +58,8 @@ async def async_step_import(self, import_config):
"""Import a config entry from configuration.yaml."""
await self._async_set_unique_id(import_config[CONF_API_KEY])

await self._async_test_client_api_key(import_config[CONF_API_KEY])
Comment thread
bachya marked this conversation as resolved.
Outdated

data = {**import_config}
if not data.get(CONF_GEOGRAPHIES):
data[CONF_GEOGRAPHIES] = [
Expand All @@ -69,14 +81,7 @@ async def async_step_user(self, user_input=None):

await self._async_set_unique_id(user_input[CONF_API_KEY])

websession = aiohttp_client.async_get_clientsession(self.hass)

client = Client(websession, api_key=user_input[CONF_API_KEY])

try:
await client.api.nearest_city()
except InvalidKeyError:
return await self._show_form(errors={CONF_API_KEY: "invalid_api_key"})
await self._async_test_client_api_key(user_input[CONF_API_KEY])

return self.async_create_entry(
title=f"Cloud API (API key: {user_input[CONF_API_KEY][:4]}...)",
Expand Down
31 changes: 15 additions & 16 deletions tests/components/airvisual/test_config_flow.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
"""Define tests for the AirVisual config flow."""
from unittest.mock import patch

from asynctest import patch
from pyairvisual.errors import InvalidKeyError

from homeassistant import data_entry_flow
from homeassistant.components.airvisual import CONF_GEOGRAPHIES, DOMAIN
from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE

from tests.common import MockConfigEntry, mock_coro
from tests.common import MockConfigEntry


async def test_duplicate_error(hass):
Expand All @@ -30,8 +29,7 @@ async def test_invalid_api_key(hass):
conf = {CONF_API_KEY: "abcde12345"}

with patch(
"pyairvisual.api.API.nearest_city",
return_value=mock_coro(exception=InvalidKeyError),
"pyairvisual.api.API.nearest_city", side_effect=InvalidKeyError,
):
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}, data=conf
Expand All @@ -53,16 +51,17 @@ async def test_step_import(hass):
"""Test that the import step works."""
conf = {CONF_API_KEY: "abcde12345"}

result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_IMPORT}, data=conf
)
with patch("homeassistant.components.wwlln.async_setup_entry", return_value=True):
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_IMPORT}, data=conf
)

assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result["title"] == "Cloud API (API key: abcd...)"
assert result["data"] == {
CONF_API_KEY: "abcde12345",
CONF_GEOGRAPHIES: [{CONF_LATITUDE: 32.87336, CONF_LONGITUDE: -117.22743}],
}
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result["title"] == "Cloud API (API key: abcd...)"
assert result["data"] == {
CONF_API_KEY: "abcde12345",
CONF_GEOGRAPHIES: [{CONF_LATITUDE: 32.87336, CONF_LONGITUDE: -117.22743}],
}


async def test_step_user(hass):
Expand All @@ -74,8 +73,8 @@ async def test_step_user(hass):
}

with patch(
"pyairvisual.api.API.nearest_city", return_value=mock_coro(),
):
"homeassistant.components.wwlln.async_setup_entry", return_value=True
), patch("pyairvisual.api.API.nearest_city"):
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}, data=conf
)
Expand Down