Use location selector in tomorrowio config flow (#68431)

This commit is contained in:
Raman Gupta 2022-03-29 19:53:31 -04:00 committed by GitHub
parent 91c0baf086
commit 603601b32e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 75 additions and 44 deletions

View file

@ -18,7 +18,13 @@ from pytomorrowio.exceptions import (
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.const import (
CONF_API_KEY,
CONF_LATITUDE,
CONF_LOCATION,
CONF_LONGITUDE,
CONF_NAME,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.aiohttp_client import async_get_clientsession
@ -194,8 +200,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
api = TomorrowioV4(
entry.data[CONF_API_KEY],
entry.data[CONF_LATITUDE],
entry.data[CONF_LONGITUDE],
entry.data[CONF_LOCATION][CONF_LATITUDE],
entry.data[CONF_LOCATION][CONF_LONGITUDE],
session=async_get_clientsession(hass),
)

View file

@ -20,13 +20,14 @@ from homeassistant.const import (
CONF_API_VERSION,
CONF_FRIENDLY_NAME,
CONF_LATITUDE,
CONF_LOCATION,
CONF_LONGITUDE,
CONF_NAME,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.selector import selector
from .const import (
AUTO_MIGRATION_MESSAGE,
@ -63,19 +64,21 @@ def _get_config_schema(
if source == config_entries.SOURCE_IMPORT:
return vol.Schema(api_key_schema, extra=vol.REMOVE_EXTRA)
default_location = (
input_dict[CONF_LOCATION]
if CONF_LOCATION in input_dict
else {
CONF_LATITUDE: hass.config.latitude,
CONF_LONGITUDE: hass.config.longitude,
}
)
return vol.Schema(
{
**api_key_schema,
vol.Required(
CONF_LATITUDE,
"location",
default=input_dict.get(CONF_LATITUDE, hass.config.latitude),
): cv.latitude,
vol.Required(
CONF_LONGITUDE,
"location",
default=input_dict.get(CONF_LONGITUDE, hass.config.longitude),
): cv.longitude,
CONF_LOCATION,
default=default_location,
): selector({"location": {"radius": False}}),
},
)
@ -84,8 +87,8 @@ def _get_unique_id(hass: HomeAssistant, input_dict: dict[str, Any]):
"""Return unique ID from config data."""
return (
f"{input_dict[CONF_API_KEY]}"
f"_{input_dict.get(CONF_LATITUDE, hass.config.latitude)}"
f"_{input_dict.get(CONF_LONGITUDE, hass.config.longitude)}"
f"_{input_dict[CONF_LOCATION][CONF_LATITUDE]}"
f"_{input_dict[CONF_LOCATION][CONF_LONGITUDE]}"
)
@ -138,14 +141,23 @@ class TomorrowioConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
# Grab the API key and add it to the rest of the config before continuing
if self._import_config:
self._import_config[CONF_API_KEY] = user_input[CONF_API_KEY]
self._import_config[CONF_LOCATION] = {
CONF_LATITUDE: self._import_config.pop(
CONF_LATITUDE, self.hass.config.latitude
),
CONF_LONGITUDE: self._import_config.pop(
CONF_LONGITUDE, self.hass.config.longitude
),
}
user_input = self._import_config.copy()
await self.async_set_unique_id(
unique_id=_get_unique_id(self.hass, user_input)
)
self._abort_if_unique_id_configured()
latitude = user_input.get(CONF_LATITUDE, self.hass.config.latitude)
longitude = user_input.get(CONF_LONGITUDE, self.hass.config.longitude)
location = user_input[CONF_LOCATION]
latitude = location[CONF_LATITUDE]
longitude = location[CONF_LONGITUDE]
if CONF_NAME not in user_input:
user_input[CONF_NAME] = DEFAULT_NAME
# Append zone name if it exists and we are using the default name

View file

@ -6,8 +6,7 @@
"data": {
"name": "[%key:common::config_flow::data::name%]",
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]"
"location": "[%key:common::config_flow::data::location%]"
}
}
},

View file

@ -13,7 +13,7 @@ API_KEY = "aa"
API_V3_ENTRY_DATA = {
CONF_NAME: "ClimaCell",
CONF_API_KEY: API_KEY,
CONF_LATITUDE: 80,
CONF_LONGITUDE: 80,
CONF_LATITUDE: 80.0,
CONF_LONGITUDE: 80.0,
CONF_API_VERSION: 3,
}

View file

@ -1,6 +1,10 @@
"""Constants for tomorrowio tests."""
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE
from homeassistant.const import (
CONF_API_KEY,
CONF_LATITUDE,
CONF_LOCATION,
CONF_LONGITUDE,
)
API_KEY = "aa"
@ -8,14 +12,10 @@ MIN_CONFIG = {
CONF_API_KEY: API_KEY,
}
V1_ENTRY_DATA = {
CONF_API_KEY: API_KEY,
CONF_LATITUDE: 80,
CONF_LONGITUDE: 80,
}
API_V4_ENTRY_DATA = {
CONF_API_KEY: API_KEY,
CONF_LATITUDE: 80,
CONF_LONGITUDE: 80,
CONF_LOCATION: {
CONF_LATITUDE: 80.0,
CONF_LONGITUDE: 80.0,
},
}

View file

@ -25,6 +25,7 @@ from homeassistant.const import (
CONF_API_KEY,
CONF_API_VERSION,
CONF_LATITUDE,
CONF_LOCATION,
CONF_LONGITUDE,
CONF_NAME,
CONF_RADIUS,
@ -55,8 +56,8 @@ async def test_user_flow_minimum_fields(hass: HomeAssistant) -> None:
assert result["title"] == DEFAULT_NAME
assert result["data"][CONF_NAME] == DEFAULT_NAME
assert result["data"][CONF_API_KEY] == API_KEY
assert result["data"][CONF_LATITUDE] == hass.config.latitude
assert result["data"][CONF_LONGITUDE] == hass.config.longitude
assert result["data"][CONF_LOCATION][CONF_LATITUDE] == hass.config.latitude
assert result["data"][CONF_LOCATION][CONF_LONGITUDE] == hass.config.longitude
async def test_user_flow_minimum_fields_in_zone(hass: HomeAssistant) -> None:
@ -88,8 +89,8 @@ async def test_user_flow_minimum_fields_in_zone(hass: HomeAssistant) -> None:
assert result["title"] == f"{DEFAULT_NAME} - Home"
assert result["data"][CONF_NAME] == f"{DEFAULT_NAME} - Home"
assert result["data"][CONF_API_KEY] == API_KEY
assert result["data"][CONF_LATITUDE] == hass.config.latitude
assert result["data"][CONF_LONGITUDE] == hass.config.longitude
assert result["data"][CONF_LOCATION][CONF_LATITUDE] == hass.config.latitude
assert result["data"][CONF_LOCATION][CONF_LONGITUDE] == hass.config.longitude
async def test_user_flow_same_unique_ids(hass: HomeAssistant) -> None:
@ -219,7 +220,7 @@ async def test_import_flow_v4(hass: HomeAssistant) -> None:
domain=CC_DOMAIN,
data=user_config,
source=SOURCE_USER,
unique_id=_get_unique_id(hass, user_config),
unique_id="test",
version=1,
)
old_entry.add_to_hass(hass)
@ -243,7 +244,7 @@ async def test_import_flow_v3(
domain=CC_DOMAIN,
data=user_config,
source=SOURCE_USER,
unique_id=_get_unique_id(hass, user_config),
unique_id="test",
version=1,
)
old_entry.add_to_hass(hass)
@ -264,8 +265,10 @@ async def test_import_flow_v3(
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result["data"] == {
CONF_API_KEY: "this is a test",
CONF_LATITUDE: 80,
CONF_LONGITUDE: 80,
CONF_LOCATION: {
CONF_LATITUDE: 80.0,
CONF_LONGITUDE: 80.0,
},
CONF_NAME: "ClimaCell",
"old_config_entry_id": old_entry.entry_id,
}

View file

@ -7,7 +7,14 @@ from homeassistant.components.tomorrowio.config_flow import (
from homeassistant.components.tomorrowio.const import DOMAIN
from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN
from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER
from homeassistant.const import CONF_API_KEY, CONF_API_VERSION, CONF_NAME
from homeassistant.const import (
CONF_API_KEY,
CONF_API_VERSION,
CONF_LATITUDE,
CONF_LOCATION,
CONF_LONGITUDE,
CONF_NAME,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
@ -49,7 +56,7 @@ async def test_climacell_migration_logic(
old_config_entry = MockConfigEntry(
domain=CC_DOMAIN,
data=old_data,
unique_id=_get_unique_id(hass, old_data),
unique_id="v3apikey_80.0_80.0",
version=1,
)
old_config_entry.add_to_hass(hass)
@ -70,7 +77,7 @@ async def test_climacell_migration_logic(
old_entity_daily = ent_reg.async_get_or_create(
"weather",
CC_DOMAIN,
f"{_get_unique_id(hass, old_data)}_daily",
"v3apikey_80.0_80.0_daily",
config_entry=old_config_entry,
original_name="ClimaCell - Daily",
suggested_object_id="climacell_daily",
@ -79,7 +86,7 @@ async def test_climacell_migration_logic(
old_entity_hourly = ent_reg.async_get_or_create(
"weather",
CC_DOMAIN,
f"{_get_unique_id(hass, old_data)}_hourly",
"v3apikey_80.0_80.0_hourly",
config_entry=old_config_entry,
original_name="ClimaCell - Hourly",
suggested_object_id="climacell_hourly",
@ -89,7 +96,7 @@ async def test_climacell_migration_logic(
old_entity_nowcast = ent_reg.async_get_or_create(
"weather",
CC_DOMAIN,
f"{_get_unique_id(hass, old_data)}_nowcast",
"v3apikey_80.0_80.0_nowcast",
config_entry=old_config_entry,
original_name="ClimaCell - Nowcast",
suggested_object_id="climacell_nowcast",
@ -101,6 +108,10 @@ async def test_climacell_migration_logic(
# climacell import and see what happens - we are also changing the API key to ensure
# that things work as expected
new_data = API_V3_ENTRY_DATA.copy()
new_data[CONF_LOCATION] = {
CONF_LATITUDE: float(new_data.pop(CONF_LATITUDE)),
CONF_LONGITUDE: float(new_data.pop(CONF_LONGITUDE)),
}
new_data[CONF_API_VERSION] = 4
new_data["old_config_entry_id"] = old_config_entry.entry_id
config_entry = MockConfigEntry(