From 468c827aa59408d69c4509010897aea5a47edfea Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1=20Mr=C3=A1zek?= Date: Mon, 28 Aug 2023 15:17:40 +0200 Subject: [PATCH] datamodel: types: ListOrItem: empty list not allowed --- .../knot_resolver_manager/datamodel/types/generic_types.py | 6 ++++++ manager/tests/unit/datamodel/types/test_generic_types.py | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/manager/knot_resolver_manager/datamodel/types/generic_types.py b/manager/knot_resolver_manager/datamodel/types/generic_types.py index bf4e86802..247673ca0 100644 --- a/manager/knot_resolver_manager/datamodel/types/generic_types.py +++ b/manager/knot_resolver_manager/datamodel/types/generic_types.py @@ -12,7 +12,10 @@ class ListOrItem(BaseGenericTypeWrapper[Union[List[T], T]]): def __init__(self, source_value: Any, object_path: str = "/") -> None: # pylint: disable=unused-argument super().__init__(source_value) self._value_orig: Union[List[T], T] = source_value + self._list: List[T] = source_value if isinstance(source_value, list) else [source_value] + if len(self) == 0: + raise ValueError("empty list is not allowed") def __getitem__(self, index: Any) -> T: return self._list[index] @@ -29,5 +32,8 @@ class ListOrItem(BaseGenericTypeWrapper[Union[List[T], T]]): def __eq__(self, o: object) -> bool: return isinstance(o, ListOrItem) and o._value_orig == self._value_orig + def __len__(self) -> int: + return len(self._list) + def serialize(self) -> Union[List[T], T]: return self._value_orig diff --git a/manager/tests/unit/datamodel/types/test_generic_types.py b/manager/tests/unit/datamodel/types/test_generic_types.py index 7803ed005..40b401897 100644 --- a/manager/tests/unit/datamodel/types/test_generic_types.py +++ b/manager/tests/unit/datamodel/types/test_generic_types.py @@ -54,3 +54,8 @@ def test_list_or_item_invalid(typ: Any, val: Any): with raises(DataValidationError): ListOrItemSchema({"test": val}) + + +def test_list_or_item_empty(): + with raises(ValueError): + ListOrItem([]) -- 2.47.2