1
0
mirror of https://github.com/home-assistant/core.git synced 2026-04-17 15:44:52 +01:00

Raise on vacuum area mapping not configured (#164595)

This commit is contained in:
Artur Pragacz
2026-03-02 15:36:48 +01:00
committed by GitHub
parent c24302b5ce
commit 8fb384a5e1
3 changed files with 50 additions and 9 deletions

View File

@@ -23,6 +23,7 @@ from homeassistant.const import ( # noqa: F401 # STATE_PAUSED/IDLE are API
STATE_ON,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import config_validation as cv, issue_registry as ir
from homeassistant.helpers.entity import Entity, EntityDescription
from homeassistant.helpers.entity_component import EntityComponent
@@ -63,7 +64,6 @@ SERVICE_STOP = "stop"
DEFAULT_NAME = "Vacuum cleaner robot"
ISSUE_SEGMENTS_CHANGED = "segments_changed"
ISSUE_SEGMENTS_MAPPING_NOT_CONFIGURED = "segments_mapping_not_configured"
_BATTERY_DEPRECATION_IGNORED_PLATFORMS = ("template",)
@@ -438,7 +438,14 @@ class StateVacuumEntity(
)
options: Mapping[str, Any] = self.registry_entry.options.get(DOMAIN, {})
area_mapping: dict[str, list[str]] = options.get("area_mapping", {})
area_mapping: dict[str, list[str]] | None = options.get("area_mapping")
if area_mapping is None:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="area_mapping_not_configured",
translation_placeholders={"entity_id": self.entity_id},
)
# We use a dict to preserve the order of segments.
segment_ids: dict[str, None] = {}

View File

@@ -89,6 +89,11 @@
}
}
},
"exceptions": {
"area_mapping_not_configured": {
"message": "Area mapping is not configured for `{entity_id}`. Configure the segment-to-area mapping before using this action."
}
},
"issues": {
"segments_changed": {
"description": "",

View File

@@ -24,6 +24,7 @@ from homeassistant.components.vacuum import (
VacuumEntityFeature,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import entity_registry as er, issue_registry as ir
from . import (
@@ -276,6 +277,41 @@ async def test_clean_area_service(
assert mock_vacuum.clean_segments_calls[0][0] == targeted_segments
@pytest.mark.usefixtures("config_flow_fixture")
async def test_clean_area_not_configured(hass: HomeAssistant) -> None:
"""Test clean_area raises when area mapping is not configured."""
mock_vacuum = MockVacuumWithCleanArea(name="Testing", entity_id="vacuum.testing")
config_entry = MockConfigEntry(domain="test")
config_entry.add_to_hass(hass)
mock_integration(
hass,
MockModule(
"test",
async_setup_entry=help_async_setup_entry_init,
async_unload_entry=help_async_unload_entry,
),
)
setup_test_component_platform(hass, DOMAIN, [mock_vacuum], from_config_entry=True)
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
with pytest.raises(ServiceValidationError) as exc_info:
await hass.services.async_call(
DOMAIN,
SERVICE_CLEAN_AREA,
{"entity_id": mock_vacuum.entity_id, "cleaning_area_id": ["area_1"]},
blocking=True,
)
assert exc_info.value.translation_domain == DOMAIN
assert exc_info.value.translation_key == "area_mapping_not_configured"
assert exc_info.value.translation_placeholders == {
"entity_id": mock_vacuum.entity_id
}
@pytest.mark.usefixtures("config_flow_fixture")
@pytest.mark.parametrize(
("area_mapping", "targeted_areas"),
@@ -308,13 +344,6 @@ async def test_clean_area_no_segments(
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
await hass.services.async_call(
DOMAIN,
SERVICE_CLEAN_AREA,
{"entity_id": mock_vacuum.entity_id, "cleaning_area_id": targeted_areas},
blocking=True,
)
entity_registry.async_update_entity_options(
mock_vacuum.entity_id,
DOMAIN,