mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 23:27:37 +00:00
Fix derivative migration from 'none' unit_prefix (#147820)
This commit is contained in:
parent
e4359e74c6
commit
26d71fcdba
@ -2,6 +2,8 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import CONF_SOURCE, Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
@ -11,6 +13,8 @@ from homeassistant.helpers.device import (
|
||||
)
|
||||
from homeassistant.helpers.helper_integration import async_handle_source_entity_changes
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
"""Set up Derivative from a config entry."""
|
||||
@ -54,3 +58,37 @@ async def config_entry_update_listener(hass: HomeAssistant, entry: ConfigEntry)
|
||||
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
"""Unload a config entry."""
|
||||
return await hass.config_entries.async_unload_platforms(entry, (Platform.SENSOR,))
|
||||
|
||||
|
||||
async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
||||
"""Migrate old entry."""
|
||||
|
||||
_LOGGER.debug(
|
||||
"Migrating configuration from version %s.%s",
|
||||
config_entry.version,
|
||||
config_entry.minor_version,
|
||||
)
|
||||
|
||||
if config_entry.version > 1:
|
||||
# This means the user has downgraded from a future version
|
||||
return False
|
||||
|
||||
if config_entry.version == 1:
|
||||
if config_entry.minor_version < 2:
|
||||
new_options = {**config_entry.options}
|
||||
|
||||
if new_options.get("unit_prefix") == "none":
|
||||
# Before we had support for optional selectors, "none" was used for selecting nothing
|
||||
del new_options["unit_prefix"]
|
||||
|
||||
hass.config_entries.async_update_entry(
|
||||
config_entry, options=new_options, version=1, minor_version=2
|
||||
)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Migration to configuration version %s.%s successful",
|
||||
config_entry.version,
|
||||
config_entry.minor_version,
|
||||
)
|
||||
|
||||
return True
|
||||
|
@ -141,6 +141,9 @@ class ConfigFlowHandler(SchemaConfigFlowHandler, domain=DOMAIN):
|
||||
config_flow = CONFIG_FLOW
|
||||
options_flow = OPTIONS_FLOW
|
||||
|
||||
VERSION = 1
|
||||
MINOR_VERSION = 2
|
||||
|
||||
def async_config_entry_title(self, options: Mapping[str, Any]) -> str:
|
||||
"""Return config entry title."""
|
||||
return cast(str, options[CONF_NAME])
|
||||
|
@ -123,10 +123,6 @@ async def async_setup_entry(
|
||||
source_entity_id,
|
||||
)
|
||||
|
||||
if (unit_prefix := config_entry.options.get(CONF_UNIT_PREFIX)) == "none":
|
||||
# Before we had support for optional selectors, "none" was used for selecting nothing
|
||||
unit_prefix = None
|
||||
|
||||
if max_sub_interval_dict := config_entry.options.get(CONF_MAX_SUB_INTERVAL, None):
|
||||
max_sub_interval = cv.time_period(max_sub_interval_dict)
|
||||
else:
|
||||
@ -139,7 +135,7 @@ async def async_setup_entry(
|
||||
time_window=cv.time_period_dict(config_entry.options[CONF_TIME_WINDOW]),
|
||||
unique_id=config_entry.entry_id,
|
||||
unit_of_measurement=None,
|
||||
unit_prefix=unit_prefix,
|
||||
unit_prefix=config_entry.options.get(CONF_UNIT_PREFIX),
|
||||
unit_time=config_entry.options[CONF_UNIT_TIME],
|
||||
device_info=device_info,
|
||||
max_sub_interval=max_sub_interval,
|
||||
|
@ -7,7 +7,7 @@ import pytest
|
||||
from homeassistant.components import derivative
|
||||
from homeassistant.components.derivative.config_flow import ConfigFlowHandler
|
||||
from homeassistant.components.derivative.const import DOMAIN
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.config_entries import ConfigEntry, ConfigEntryState
|
||||
from homeassistant.core import Event, HomeAssistant
|
||||
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
||||
from homeassistant.helpers.event import async_track_entity_registry_updated_event
|
||||
@ -421,3 +421,65 @@ async def test_async_handle_source_entity_new_entity_id(
|
||||
|
||||
# Check we got the expected events
|
||||
assert events == []
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("unit_prefix", "expect_prefix"),
|
||||
[
|
||||
({}, None),
|
||||
({"unit_prefix": "k"}, "k"),
|
||||
({"unit_prefix": "none"}, None),
|
||||
],
|
||||
)
|
||||
async def test_migration(hass: HomeAssistant, unit_prefix, expect_prefix) -> None:
|
||||
"""Test migration from v1.1 deletes "none" unit_prefix."""
|
||||
|
||||
config_entry = MockConfigEntry(
|
||||
data={},
|
||||
domain=DOMAIN,
|
||||
options={
|
||||
"name": "My derivative",
|
||||
"round": 1.0,
|
||||
"source": "sensor.power",
|
||||
"time_window": {"seconds": 0.0},
|
||||
**unit_prefix,
|
||||
"unit_time": "min",
|
||||
},
|
||||
title="My derivative",
|
||||
version=1,
|
||||
minor_version=1,
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
assert config_entry.options["unit_time"] == "min"
|
||||
assert config_entry.options.get("unit_prefix") == expect_prefix
|
||||
|
||||
|
||||
async def test_migration_from_future_version(
|
||||
hass: HomeAssistant,
|
||||
) -> None:
|
||||
"""Test migration from future version."""
|
||||
|
||||
config_entry = MockConfigEntry(
|
||||
data={},
|
||||
domain=DOMAIN,
|
||||
options={
|
||||
"name": "My derivative",
|
||||
"round": 1.0,
|
||||
"source": "sensor.power",
|
||||
"time_window": {"seconds": 0.0},
|
||||
"unit_prefix": "k",
|
||||
"unit_time": "min",
|
||||
},
|
||||
title="My derivative",
|
||||
version=2,
|
||||
minor_version=1,
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert config_entry.state is ConfigEntryState.MIGRATION_ERROR
|
||||
|
Loading…
x
Reference in New Issue
Block a user