Teach validate_config to validate lists of conditions (#95380)

* Teach validate_config to validate lists of conditions

* Update test
This commit is contained in:
Erik Montnemery 2023-06-27 19:44:23 +02:00 committed by GitHub
parent e8cb9fba7b
commit e18f7dffb0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 6 deletions

View file

@ -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,

View file

@ -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:

View file

@ -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

View file

@ -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]"
), ),
), ),
( (