Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
15 changes: 15 additions & 0 deletions homeassistant/components/brottsplatskartan/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,21 @@ class BPKConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):

VERSION = 1

async def async_step_import(self, config: dict[str, Any]) -> FlowResult:
"""Import a configuration from config.yaml."""

if config.get(CONF_LATITUDE):
config[CONF_LOCATION] = {
CONF_LATITUDE: config[CONF_LATITUDE],
CONF_LONGITUDE: config[CONF_LONGITUDE],
}
if not config.get(CONF_AREA):
config[CONF_AREA] = "none"
else:
config[CONF_AREA] = config[CONF_AREA][0]

return await self.async_step_user(user_input=config)

async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
Expand Down
53 changes: 48 additions & 5 deletions homeassistant/components/brottsplatskartan/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,62 @@
from datetime import timedelta

from brottsplatskartan import ATTRIBUTION, BrottsplatsKartan

from homeassistant.components.sensor import SensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE
import voluptuous as vol

from homeassistant.components.sensor import (
PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA,
SensorEntity,
)
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.device_registry import DeviceEntryType
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType

from .const import CONF_APP_ID, CONF_AREA, DOMAIN, LOGGER
from .const import AREAS, CONF_APP_ID, CONF_AREA, DEFAULT_NAME, DOMAIN, LOGGER

SCAN_INTERVAL = timedelta(minutes=30)

PLATFORM_SCHEMA = PARENT_PLATFORM_SCHEMA.extend(
{
vol.Inclusive(CONF_LATITUDE, "coordinates"): cv.latitude,
vol.Inclusive(CONF_LONGITUDE, "coordinates"): cv.longitude,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_AREA, default=[]): vol.All(cv.ensure_list, [vol.In(AREAS)]),
}
)


async def async_setup_platform(
hass: HomeAssistant,
config: ConfigType,
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the Brottsplatskartan platform."""

async_create_issue(
hass,
DOMAIN,
"deprecated_yaml",
breaks_in_ha_version="2023.11.0",
is_fixable=False,
severity=IssueSeverity.WARNING,
translation_key="deprecated_yaml",
)

hass.async_create_task(
hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_IMPORT},
data=config,
)
)


async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
Expand Down
6 changes: 6 additions & 0 deletions homeassistant/components/brottsplatskartan/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
}
}
},
"issues": {
"deprecated_yaml": {
"title": "The Brottsplatskartan YAML configuration is being removed",
"description": "Configuring Brottsplatskartan using YAML is being removed.\n\nYour existing YAML configuration has been imported into the UI automatically.\n\nRemove the Brottsplatskartan YAML configuration from your configuration.yaml file and restart Home Assistant to fix this issue."
}
},
"selector": {
"areas": {
"options": {
Expand Down
108 changes: 108 additions & 0 deletions tests/components/brottsplatskartan/test_config_flow.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""Test the Brottsplatskartan config flow."""
from __future__ import annotations

from unittest.mock import patch

import pytest

from homeassistant import config_entries
Expand All @@ -9,6 +11,8 @@
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType

from tests.common import MockConfigEntry

pytestmark = pytest.mark.usefixtures("mock_setup_entry")


Expand Down Expand Up @@ -99,3 +103,107 @@ async def test_form_area(hass: HomeAssistant) -> None:
"area": "Stockholms län",
"app_id": "ha-1234567890",
}


async def test_import_flow_success(hass: HomeAssistant) -> None:
"""Test a successful import of yaml."""

with patch(
"homeassistant.components.brottsplatskartan.sensor.BrottsplatsKartan",
):
result2 = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_IMPORT},
data={},
)
await hass.async_block_till_done()

assert result2["type"] == FlowResultType.CREATE_ENTRY
assert result2["title"] == "Brottsplatskartan HOME"
assert result2["data"] == {
"latitude": hass.config.latitude,
"longitude": hass.config.longitude,
"area": None,
"app_id": "ha-1234567890",
}


async def test_import_flow_location_success(hass: HomeAssistant) -> None:
"""Test a successful import of yaml with location."""

with patch(
"homeassistant.components.brottsplatskartan.sensor.BrottsplatsKartan",
):
result2 = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_IMPORT},
data={
CONF_LATITUDE: 59.32,
CONF_LONGITUDE: 18.06,
},
)
await hass.async_block_till_done()

assert result2["type"] == FlowResultType.CREATE_ENTRY
assert result2["title"] == "Brottsplatskartan 59.32, 18.06"
assert result2["data"] == {
"latitude": 59.32,
"longitude": 18.06,
"area": None,
"app_id": "ha-1234567890",
}


async def test_import_flow_location_area_success(hass: HomeAssistant) -> None:
"""Test a successful import of yaml with location and area."""

with patch(
"homeassistant.components.brottsplatskartan.sensor.BrottsplatsKartan",
):
result2 = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_IMPORT},
data={
CONF_LATITUDE: 59.32,
CONF_LONGITUDE: 18.06,
CONF_AREA: ["Blekinge län"],
},
)
await hass.async_block_till_done()

assert result2["type"] == FlowResultType.CREATE_ENTRY
assert result2["title"] == "Brottsplatskartan Blekinge län"
assert result2["data"] == {
"latitude": None,
"longitude": None,
"area": "Blekinge län",
"app_id": "ha-1234567890",
}


async def test_import_flow_already_exist(hass: HomeAssistant) -> None:
"""Test import of yaml already exist."""

MockConfigEntry(
domain=DOMAIN,
data={
"latitude": hass.config.latitude,
"longitude": hass.config.longitude,
"area": None,
"app_id": "ha-1234567890",
},
unique_id="bpk-home",
).add_to_hass(hass)

with patch(
"homeassistant.components.brottsplatskartan.sensor.BrottsplatsKartan",
):
result3 = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_IMPORT},
data={},
)
await hass.async_block_till_done()

assert result3["type"] == FlowResultType.ABORT
assert result3["reason"] == "already_configured"