Support action YAML syntax in old-style notify groups (#123457)
This commit is contained in:
parent
97410474f5
commit
228db1c063
2 changed files with 67 additions and 5 deletions
|
@ -22,8 +22,9 @@ from homeassistant.components.notify import (
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_ENTITY_ID,
|
ATTR_ENTITY_ID,
|
||||||
ATTR_SERVICE,
|
CONF_ACTION,
|
||||||
CONF_ENTITIES,
|
CONF_ENTITIES,
|
||||||
|
CONF_SERVICE,
|
||||||
STATE_UNAVAILABLE,
|
STATE_UNAVAILABLE,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
|
@ -36,11 +37,37 @@ from .entity import GroupEntity
|
||||||
|
|
||||||
CONF_SERVICES = "services"
|
CONF_SERVICES = "services"
|
||||||
|
|
||||||
|
|
||||||
|
def _backward_compat_schema(value: Any | None) -> Any:
|
||||||
|
"""Backward compatibility for notify service schemas."""
|
||||||
|
|
||||||
|
if not isinstance(value, dict):
|
||||||
|
return value
|
||||||
|
|
||||||
|
# `service` has been renamed to `action`
|
||||||
|
if CONF_SERVICE in value:
|
||||||
|
if CONF_ACTION in value:
|
||||||
|
raise vol.Invalid(
|
||||||
|
"Cannot specify both 'service' and 'action'. Please use 'action' only."
|
||||||
|
)
|
||||||
|
value[CONF_ACTION] = value.pop(CONF_SERVICE)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend(
|
PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_SERVICES): vol.All(
|
vol.Required(CONF_SERVICES): vol.All(
|
||||||
cv.ensure_list,
|
cv.ensure_list,
|
||||||
[{vol.Required(ATTR_SERVICE): cv.slug, vol.Optional(ATTR_DATA): dict}],
|
[
|
||||||
|
vol.All(
|
||||||
|
_backward_compat_schema,
|
||||||
|
{
|
||||||
|
vol.Required(CONF_ACTION): cv.slug,
|
||||||
|
vol.Optional(ATTR_DATA): dict,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -88,7 +115,7 @@ class GroupNotifyPlatform(BaseNotificationService):
|
||||||
tasks.append(
|
tasks.append(
|
||||||
asyncio.create_task(
|
asyncio.create_task(
|
||||||
self.hass.services.async_call(
|
self.hass.services.async_call(
|
||||||
DOMAIN, entity[ATTR_SERVICE], sending_payload, blocking=True
|
DOMAIN, entity[CONF_ACTION], sending_payload, blocking=True
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -122,7 +122,7 @@ async def test_send_message_with_data(hass: HomeAssistant, tmp_path: Path) -> No
|
||||||
"services": [
|
"services": [
|
||||||
{"service": "test_service1"},
|
{"service": "test_service1"},
|
||||||
{
|
{
|
||||||
"service": "test_service2",
|
"action": "test_service2",
|
||||||
"data": {
|
"data": {
|
||||||
"target": "unnamed device",
|
"target": "unnamed device",
|
||||||
"data": {"test": "message", "default": "default"},
|
"data": {"test": "message", "default": "default"},
|
||||||
|
@ -202,6 +202,41 @@ async def test_send_message_with_data(hass: HomeAssistant, tmp_path: Path) -> No
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_invalid_configuration(
|
||||||
|
hass: HomeAssistant, tmp_path: Path, caplog: pytest.LogCaptureFixture
|
||||||
|
) -> None:
|
||||||
|
"""Test failing to set up group with an invalid configuration."""
|
||||||
|
assert await async_setup_component(
|
||||||
|
hass,
|
||||||
|
"group",
|
||||||
|
{},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
group_setup = [
|
||||||
|
{
|
||||||
|
"platform": "group",
|
||||||
|
"name": "My invalid notification group",
|
||||||
|
"services": [
|
||||||
|
{
|
||||||
|
"service": "test_service1",
|
||||||
|
"action": "test_service2",
|
||||||
|
"data": {
|
||||||
|
"target": "unnamed device",
|
||||||
|
"data": {"test": "message", "default": "default"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
await help_setup_notify(hass, tmp_path, {"service1": 1, "service2": 2}, group_setup)
|
||||||
|
assert not hass.services.has_service("notify", "my_invalid_notification_group")
|
||||||
|
assert (
|
||||||
|
"Invalid config for 'notify' from integration 'group':"
|
||||||
|
" Cannot specify both 'service' and 'action'." in caplog.text
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_reload_notify(hass: HomeAssistant, tmp_path: Path) -> None:
|
async def test_reload_notify(hass: HomeAssistant, tmp_path: Path) -> None:
|
||||||
"""Verify we can reload the notify service."""
|
"""Verify we can reload the notify service."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
|
@ -219,7 +254,7 @@ async def test_reload_notify(hass: HomeAssistant, tmp_path: Path) -> None:
|
||||||
{
|
{
|
||||||
"name": "group_notify",
|
"name": "group_notify",
|
||||||
"platform": "group",
|
"platform": "group",
|
||||||
"services": [{"service": "test_service1"}],
|
"services": [{"action": "test_service1"}],
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue