From 35d9f7b79f6afd165568db9671441a8f41cf34cf Mon Sep 17 00:00:00 2001 From: Frank Sachsenheim Date: Sun, 23 Jul 2023 16:46:57 +0200 Subject: [PATCH] Skips *of-rules for valid None values Closes #582. --- cerberus/tests/test_validation.py | 14 ++++++++++++++ cerberus/validator.py | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/cerberus/tests/test_validation.py b/cerberus/tests/test_validation.py index ae5f5444..cbcb6874 100644 --- a/cerberus/tests/test_validation.py +++ b/cerberus/tests/test_validation.py @@ -80,6 +80,20 @@ def test_nullable_skips_allowed(): assert_success({'role': None}, schema) +@mark.parametrize("rule", ("all", "any", "none", "one")) +def test_nullable_skips_of_roles(rule): + assert_success( + schema={ + "foo": { + "type": "dict", + "nullable": True, + rule + "of_schema": [{"bar": {"type": "string"}}], + } + }, + document={"foo": None}, + ) + + def test_readonly_field(): field = 'a_readonly_string' assert_fail( diff --git a/cerberus/validator.py b/cerberus/validator.py index c13ecc43..0d54eb53 100644 --- a/cerberus/validator.py +++ b/cerberus/validator.py @@ -1374,7 +1374,9 @@ def _validate_nullable(self, nullable, field, value): if not nullable: self._error(field, errors.NOT_NULLABLE) self._drop_remaining_rules( + "allof", 'allowed', + "anyof", 'empty', 'forbidden', 'items', @@ -1383,6 +1385,8 @@ def _validate_nullable(self, nullable, field, value): 'max', 'minlength', 'maxlength', + "noneof", + "oneof", 'regex', 'schema', 'type',