Teach validate_config to validate lists of conditions (#95380)
* Teach validate_config to validate lists of conditions * Update test
This commit is contained in:
parent
e8cb9fba7b
commit
e18f7dffb0
4 changed files with 12 additions and 6 deletions
|
@ -41,8 +41,6 @@ from .helpers import async_get_blueprints
|
||||||
|
|
||||||
PACKAGE_MERGE_HINT = "list"
|
PACKAGE_MERGE_HINT = "list"
|
||||||
|
|
||||||
_CONDITION_SCHEMA = vol.All(cv.ensure_list, [cv.CONDITION_SCHEMA])
|
|
||||||
|
|
||||||
_MINIMAL_PLATFORM_SCHEMA = vol.Schema(
|
_MINIMAL_PLATFORM_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
CONF_ID: str,
|
CONF_ID: str,
|
||||||
|
@ -65,7 +63,7 @@ PLATFORM_SCHEMA = vol.All(
|
||||||
vol.Optional(CONF_INITIAL_STATE): cv.boolean,
|
vol.Optional(CONF_INITIAL_STATE): cv.boolean,
|
||||||
vol.Optional(CONF_HIDE_ENTITY): cv.boolean,
|
vol.Optional(CONF_HIDE_ENTITY): cv.boolean,
|
||||||
vol.Required(CONF_TRIGGER): cv.TRIGGER_SCHEMA,
|
vol.Required(CONF_TRIGGER): cv.TRIGGER_SCHEMA,
|
||||||
vol.Optional(CONF_CONDITION): _CONDITION_SCHEMA,
|
vol.Optional(CONF_CONDITION): cv.CONDITIONS_SCHEMA,
|
||||||
vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA,
|
vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA,
|
||||||
vol.Optional(CONF_TRIGGER_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA,
|
vol.Optional(CONF_TRIGGER_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA,
|
||||||
vol.Required(CONF_ACTION): cv.SCRIPT_SCHEMA,
|
vol.Required(CONF_ACTION): cv.SCRIPT_SCHEMA,
|
||||||
|
|
|
@ -725,14 +725,14 @@ async def handle_validate_config(
|
||||||
|
|
||||||
for key, schema, validator in (
|
for key, schema, validator in (
|
||||||
("trigger", cv.TRIGGER_SCHEMA, trigger.async_validate_trigger_config),
|
("trigger", cv.TRIGGER_SCHEMA, trigger.async_validate_trigger_config),
|
||||||
("condition", cv.CONDITION_SCHEMA, condition.async_validate_condition_config),
|
("condition", cv.CONDITIONS_SCHEMA, condition.async_validate_conditions_config),
|
||||||
("action", cv.SCRIPT_SCHEMA, script.async_validate_actions_config),
|
("action", cv.SCRIPT_SCHEMA, script.async_validate_actions_config),
|
||||||
):
|
):
|
||||||
if key not in msg:
|
if key not in msg:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await validator(hass, schema(msg[key])) # type: ignore[operator]
|
await validator(hass, schema(msg[key]))
|
||||||
except vol.Invalid as err:
|
except vol.Invalid as err:
|
||||||
result[key] = {"valid": False, "error": str(err)}
|
result[key] = {"valid": False, "error": str(err)}
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1527,6 +1527,7 @@ CONDITION_SCHEMA: vol.Schema = vol.Schema(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CONDITIONS_SCHEMA = vol.All(ensure_list, [CONDITION_SCHEMA])
|
||||||
|
|
||||||
dynamic_template_condition_action = vol.All(
|
dynamic_template_condition_action = vol.All(
|
||||||
# Wrap a shorthand template condition action in a template condition
|
# Wrap a shorthand template condition action in a template condition
|
||||||
|
|
|
@ -1823,11 +1823,17 @@ async def test_integration_setup_info(
|
||||||
("key", "config"),
|
("key", "config"),
|
||||||
(
|
(
|
||||||
("trigger", {"platform": "event", "event_type": "hello"}),
|
("trigger", {"platform": "event", "event_type": "hello"}),
|
||||||
|
("trigger", [{"platform": "event", "event_type": "hello"}]),
|
||||||
(
|
(
|
||||||
"condition",
|
"condition",
|
||||||
{"condition": "state", "entity_id": "hello.world", "state": "paulus"},
|
{"condition": "state", "entity_id": "hello.world", "state": "paulus"},
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
"condition",
|
||||||
|
[{"condition": "state", "entity_id": "hello.world", "state": "paulus"}],
|
||||||
|
),
|
||||||
("action", {"service": "domain_test.test_service"}),
|
("action", {"service": "domain_test.test_service"}),
|
||||||
|
("action", [{"service": "domain_test.test_service"}]),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_validate_config_works(websocket_client, key, config) -> None:
|
async def test_validate_config_works(websocket_client, key, config) -> None:
|
||||||
|
@ -1858,7 +1864,8 @@ async def test_validate_config_works(websocket_client, key, config) -> None:
|
||||||
},
|
},
|
||||||
(
|
(
|
||||||
"Unexpected value for condition: 'non_existing'. Expected and, device,"
|
"Unexpected value for condition: 'non_existing'. Expected and, device,"
|
||||||
" not, numeric_state, or, state, sun, template, time, trigger, zone"
|
" not, numeric_state, or, state, sun, template, time, trigger, zone "
|
||||||
|
"@ data[0]"
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue