diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index 0fc9dbbaae1..1ff2644fa58 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -588,22 +588,24 @@ def ensure_list_csv(value: Any) -> List: return ensure_list(value) -def multi_select(options: dict) -> Callable[[List], List]: +class multi_select: """Multi select validator returning list of selected values.""" - def validator(selected: List) -> list: - """Return list of selected values.""" + def __init__(self, options: dict) -> None: + """Initialize multi select.""" + self.options = options + + def __call__(self, selected: list) -> list: + """Validate input.""" if not isinstance(selected, list): raise vol.Invalid("Not a list") for value in selected: - if value not in options: + if value not in self.options: raise vol.Invalid(f"{value} is not a valid option") return selected - return validator - def deprecated( key: str, @@ -730,8 +732,8 @@ def custom_serializer(schema: Any) -> Any: if schema is positive_time_period_dict: return {"type": "positive_time_period_dict"} - if schema is multi_select: - return {"type": "multi_select"} + if isinstance(schema, multi_select): + return {"type": "multi_select", "options": schema.options} return voluptuous_serialize.UNSUPPORTED diff --git a/tests/helpers/test_config_validation.py b/tests/helpers/test_config_validation.py index afb215822c4..9b6aa6b812d 100644 --- a/tests/helpers/test_config_validation.py +++ b/tests/helpers/test_config_validation.py @@ -488,6 +488,14 @@ def test_multi_select(): schema(["robban", "paulus"]) +def test_multi_select_in_serializer(): + """Test multi_select with custom_serializer.""" + assert cv.custom_serializer(cv.multi_select({"paulus": "Paulus"})) == { + "type": "multi_select", + "options": {"paulus": "Paulus"}, + } + + @pytest.fixture def schema(): """Create a schema used for testing deprecation."""