mirror of
https://github.com/home-assistant/core.git
synced 2025-04-24 09:17:53 +00:00
Remove config import in EmonCMS (#142624)
This commit is contained in:
parent
8ec436423f
commit
f00dfd32d4
@ -17,7 +17,6 @@ from homeassistant.const import CONF_API_KEY, CONF_URL
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||
from homeassistant.helpers.selector import selector
|
||||
from homeassistant.helpers.typing import ConfigType
|
||||
|
||||
from .const import (
|
||||
CONF_MESSAGE,
|
||||
@ -27,7 +26,6 @@ from .const import (
|
||||
FEED_ID,
|
||||
FEED_NAME,
|
||||
FEED_TAG,
|
||||
LOGGER,
|
||||
)
|
||||
|
||||
|
||||
@ -153,24 +151,6 @@ class EmoncmsConfigFlow(ConfigFlow, domain=DOMAIN):
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
async def async_step_import(self, import_info: ConfigType) -> ConfigFlowResult:
|
||||
"""Import config from yaml."""
|
||||
url = import_info[CONF_URL]
|
||||
api_key = import_info[CONF_API_KEY]
|
||||
include_only_feeds = None
|
||||
if import_info.get(CONF_ONLY_INCLUDE_FEEDID) is not None:
|
||||
include_only_feeds = list(map(str, import_info[CONF_ONLY_INCLUDE_FEEDID]))
|
||||
config = {
|
||||
CONF_API_KEY: api_key,
|
||||
CONF_ONLY_INCLUDE_FEEDID: include_only_feeds,
|
||||
CONF_URL: url,
|
||||
}
|
||||
LOGGER.debug(config)
|
||||
result = await self.async_step_user(config)
|
||||
if errors := result.get("errors"):
|
||||
return self.async_abort(reason=errors["base"])
|
||||
return result
|
||||
|
||||
|
||||
class EmoncmsOptionsFlow(OptionsFlow):
|
||||
"""Emoncms Options flow handler."""
|
||||
|
@ -4,24 +4,16 @@ from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import (
|
||||
PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
|
||||
SensorDeviceClass,
|
||||
SensorEntity,
|
||||
SensorEntityDescription,
|
||||
SensorStateClass,
|
||||
)
|
||||
from homeassistant.config_entries import SOURCE_IMPORT
|
||||
from homeassistant.const import (
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||
CONCENTRATION_PARTS_PER_MILLION,
|
||||
CONF_API_KEY,
|
||||
CONF_ID,
|
||||
CONF_UNIT_OF_MEASUREMENT,
|
||||
CONF_URL,
|
||||
CONF_VALUE_TEMPLATE,
|
||||
PERCENTAGE,
|
||||
UnitOfApparentPower,
|
||||
UnitOfElectricCurrent,
|
||||
@ -36,22 +28,15 @@ from homeassistant.const import (
|
||||
UnitOfVolume,
|
||||
UnitOfVolumeFlowRate,
|
||||
)
|
||||
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant, callback
|
||||
from homeassistant.data_entry_flow import FlowResultType
|
||||
from homeassistant.helpers import config_validation as cv, template
|
||||
from homeassistant.helpers.entity_platform import (
|
||||
AddConfigEntryEntitiesCallback,
|
||||
AddEntitiesCallback,
|
||||
)
|
||||
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers import template
|
||||
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from .config_flow import sensor_name
|
||||
from .const import (
|
||||
CONF_EXCLUDE_FEEDID,
|
||||
CONF_ONLY_INCLUDE_FEEDID,
|
||||
DOMAIN,
|
||||
FEED_ID,
|
||||
FEED_NAME,
|
||||
FEED_TAG,
|
||||
@ -205,88 +190,7 @@ ATTR_LASTUPDATETIMESTR = "LastUpdatedStr"
|
||||
ATTR_SIZE = "Size"
|
||||
ATTR_TAG = "Tag"
|
||||
ATTR_USERID = "UserId"
|
||||
CONF_SENSOR_NAMES = "sensor_names"
|
||||
DECIMALS = 2
|
||||
DEFAULT_UNIT = UnitOfPower.WATT
|
||||
|
||||
ONLY_INCL_EXCL_NONE = "only_include_exclude_or_none"
|
||||
|
||||
PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
|
||||
{
|
||||
vol.Required(CONF_API_KEY): cv.string,
|
||||
vol.Required(CONF_URL): cv.string,
|
||||
vol.Required(CONF_ID): cv.positive_int,
|
||||
vol.Exclusive(CONF_ONLY_INCLUDE_FEEDID, ONLY_INCL_EXCL_NONE): vol.All(
|
||||
cv.ensure_list, [cv.positive_int]
|
||||
),
|
||||
vol.Exclusive(CONF_EXCLUDE_FEEDID, ONLY_INCL_EXCL_NONE): vol.All(
|
||||
cv.ensure_list, [cv.positive_int]
|
||||
),
|
||||
vol.Optional(CONF_SENSOR_NAMES): vol.All(
|
||||
{cv.positive_int: vol.All(cv.string, vol.Length(min=1))}
|
||||
),
|
||||
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
||||
vol.Optional(CONF_UNIT_OF_MEASUREMENT, default=DEFAULT_UNIT): cv.string,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
async def async_setup_platform(
|
||||
hass: HomeAssistant,
|
||||
config: ConfigType,
|
||||
async_add_entities: AddEntitiesCallback,
|
||||
discovery_info: DiscoveryInfoType | None = None,
|
||||
) -> None:
|
||||
"""Import config from yaml."""
|
||||
if CONF_VALUE_TEMPLATE in config:
|
||||
async_create_issue(
|
||||
hass,
|
||||
DOMAIN,
|
||||
f"remove_{CONF_VALUE_TEMPLATE}_{DOMAIN}",
|
||||
is_fixable=False,
|
||||
issue_domain=DOMAIN,
|
||||
severity=IssueSeverity.ERROR,
|
||||
translation_key=f"remove_{CONF_VALUE_TEMPLATE}",
|
||||
translation_placeholders={
|
||||
"domain": DOMAIN,
|
||||
"parameter": CONF_VALUE_TEMPLATE,
|
||||
},
|
||||
)
|
||||
return
|
||||
if CONF_ONLY_INCLUDE_FEEDID not in config:
|
||||
async_create_issue(
|
||||
hass,
|
||||
DOMAIN,
|
||||
f"missing_{CONF_ONLY_INCLUDE_FEEDID}_{DOMAIN}",
|
||||
is_fixable=False,
|
||||
issue_domain=DOMAIN,
|
||||
severity=IssueSeverity.WARNING,
|
||||
translation_key=f"missing_{CONF_ONLY_INCLUDE_FEEDID}",
|
||||
translation_placeholders={
|
||||
"domain": DOMAIN,
|
||||
},
|
||||
)
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": SOURCE_IMPORT}, data=config
|
||||
)
|
||||
if (
|
||||
result.get("type") == FlowResultType.CREATE_ENTRY
|
||||
or result.get("reason") == "already_configured"
|
||||
):
|
||||
async_create_issue(
|
||||
hass,
|
||||
HOMEASSISTANT_DOMAIN,
|
||||
f"deprecated_yaml_{DOMAIN}",
|
||||
is_fixable=False,
|
||||
issue_domain=DOMAIN,
|
||||
breaks_in_ha_version="2025.3.0",
|
||||
severity=IssueSeverity.WARNING,
|
||||
translation_key="deprecated_yaml",
|
||||
translation_placeholders={
|
||||
"domain": DOMAIN,
|
||||
"integration_title": "emoncms",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
|
@ -3,64 +3,16 @@
|
||||
from unittest.mock import AsyncMock
|
||||
|
||||
from homeassistant.components.emoncms.const import CONF_ONLY_INCLUDE_FEEDID, DOMAIN
|
||||
from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER
|
||||
from homeassistant.config_entries import SOURCE_USER
|
||||
from homeassistant.const import CONF_API_KEY, CONF_URL
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.data_entry_flow import FlowResultType
|
||||
|
||||
from . import setup_integration
|
||||
from .conftest import EMONCMS_FAILURE, FLOW_RESULT_SINGLE_FEED, SENSOR_NAME, YAML
|
||||
from .conftest import EMONCMS_FAILURE, SENSOR_NAME
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
|
||||
|
||||
async def test_flow_import_include_feeds(
|
||||
hass: HomeAssistant,
|
||||
mock_setup_entry: AsyncMock,
|
||||
emoncms_client: AsyncMock,
|
||||
) -> None:
|
||||
"""YAML import with included feed - success test."""
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": SOURCE_IMPORT},
|
||||
data=YAML,
|
||||
)
|
||||
assert result["type"] is FlowResultType.CREATE_ENTRY
|
||||
assert result["title"] == SENSOR_NAME
|
||||
assert result["data"] == FLOW_RESULT_SINGLE_FEED
|
||||
|
||||
|
||||
async def test_flow_import_failure(
|
||||
hass: HomeAssistant,
|
||||
emoncms_client: AsyncMock,
|
||||
) -> None:
|
||||
"""YAML import - failure test."""
|
||||
emoncms_client.async_request.return_value = EMONCMS_FAILURE
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": SOURCE_IMPORT},
|
||||
data=YAML,
|
||||
)
|
||||
assert result["type"] is FlowResultType.ABORT
|
||||
assert result["reason"] == "api_error"
|
||||
|
||||
|
||||
async def test_flow_import_already_configured(
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
emoncms_client: AsyncMock,
|
||||
) -> None:
|
||||
"""Test we abort import data set when entry is already configured."""
|
||||
config_entry.add_to_hass(hass)
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": SOURCE_IMPORT},
|
||||
data=YAML,
|
||||
)
|
||||
assert result["type"] is FlowResultType.ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
|
||||
|
||||
USER_INPUT = {
|
||||
CONF_URL: "http://1.1.1.1",
|
||||
CONF_API_KEY: "my_api_key",
|
||||
|
@ -7,12 +7,9 @@ import pytest
|
||||
from syrupy.assertion import SnapshotAssertion
|
||||
|
||||
from homeassistant.components.emoncms.const import DOMAIN
|
||||
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
||||
from homeassistant.config_entries import ConfigEntryState
|
||||
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
|
||||
from homeassistant.helpers import entity_registry as er, issue_registry as ir
|
||||
from homeassistant.helpers.typing import ConfigType
|
||||
from homeassistant.setup import async_setup_component
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers import entity_registry as er
|
||||
|
||||
from . import setup_integration
|
||||
from .conftest import EMONCMS_FAILURE, get_feed
|
||||
@ -20,56 +17,6 @@ from .conftest import EMONCMS_FAILURE, get_feed
|
||||
from tests.common import MockConfigEntry, async_fire_time_changed, snapshot_platform
|
||||
|
||||
|
||||
async def test_deprecated_yaml(
|
||||
hass: HomeAssistant,
|
||||
issue_registry: ir.IssueRegistry,
|
||||
emoncms_yaml_config: ConfigType,
|
||||
emoncms_client: AsyncMock,
|
||||
) -> None:
|
||||
"""Test an issue is created when we import from yaml config."""
|
||||
|
||||
await async_setup_component(hass, SENSOR_DOMAIN, emoncms_yaml_config)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert issue_registry.async_get_issue(
|
||||
domain=HOMEASSISTANT_DOMAIN, issue_id=f"deprecated_yaml_{DOMAIN}"
|
||||
)
|
||||
|
||||
|
||||
async def test_yaml_with_template(
|
||||
hass: HomeAssistant,
|
||||
issue_registry: ir.IssueRegistry,
|
||||
emoncms_yaml_config_with_template: ConfigType,
|
||||
emoncms_client: AsyncMock,
|
||||
) -> None:
|
||||
"""Test an issue is created when we import a yaml config with a value_template parameter."""
|
||||
|
||||
await async_setup_component(hass, SENSOR_DOMAIN, emoncms_yaml_config_with_template)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert issue_registry.async_get_issue(
|
||||
domain=DOMAIN, issue_id=f"remove_value_template_{DOMAIN}"
|
||||
)
|
||||
|
||||
|
||||
async def test_yaml_no_include_only_feed_id(
|
||||
hass: HomeAssistant,
|
||||
issue_registry: ir.IssueRegistry,
|
||||
emoncms_yaml_config_no_include_only_feed_id: ConfigType,
|
||||
emoncms_client: AsyncMock,
|
||||
) -> None:
|
||||
"""Test an issue is created when we import a yaml config without a include_only_feed_id parameter."""
|
||||
|
||||
await async_setup_component(
|
||||
hass, SENSOR_DOMAIN, emoncms_yaml_config_no_include_only_feed_id
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert issue_registry.async_get_issue(
|
||||
domain=DOMAIN, issue_id=f"missing_include_only_feed_id_{DOMAIN}"
|
||||
)
|
||||
|
||||
|
||||
async def test_no_feed_selected(
|
||||
hass: HomeAssistant,
|
||||
config_no_feed: MockConfigEntry,
|
||||
|
Loading…
x
Reference in New Issue
Block a user