From d9aa9489a0b5fb384da9a0458c0bfef208df4bbb Mon Sep 17 00:00:00 2001 From: Edward Njoroge Date: Mon, 1 Mar 2021 05:11:05 +0300 Subject: [PATCH] Fix required support for false and 0 (#32) --- flask_sieve/rules_processor.py | 18 ++++----- tests/test_rules_processor.py | 67 ++++++++++++++-------------------- 2 files changed, 37 insertions(+), 48 deletions(-) diff --git a/flask_sieve/rules_processor.py b/flask_sieve/rules_processor.py index a850531..1ebae7a 100644 --- a/flask_sieve/rules_processor.py +++ b/flask_sieve/rules_processor.py @@ -246,10 +246,6 @@ def validate_extension(self, value, params, **kwargs): def validate_file(value, **kwargs): return isinstance(value, FileStorage) - @staticmethod - def validate_empty(value, **kwargs): - return value == '' - def validate_filled(self, value, attribute, nullable, **kwargs): if self.validate_present(attribute): return self.validate_required(value, attribute, nullable) @@ -368,7 +364,7 @@ def validate_json(self, value, **kwargs): def validate_lt(self, value, params, **kwargs): self._assert_params_size(size=1, params=params, rule='lt') - if value == '': + if self._is_value_empty(value): return False value = self._get_size(value) lower = self._get_size(self._attribute_value(params[0])) @@ -376,7 +372,7 @@ def validate_lt(self, value, params, **kwargs): def validate_lte(self, value, params, **kwargs): self._assert_params_size(size=1, params=params, rule='lte') - if value == '': + if self._is_value_empty(value): return False value = self._get_size(value) lower = self._get_size(self._attribute_value(params[0])) @@ -384,7 +380,7 @@ def validate_lte(self, value, params, **kwargs): def validate_max(self, value, params, **kwargs): self._assert_params_size(size=1, params=params, rule='max') - if value == '': + if self._is_value_empty(value): return False value = self._get_size(value) upper = self._get_size(params[0]) @@ -437,7 +433,7 @@ def validate_regex(self, value, params, **kwargs): return re.match(params[0], value) def validate_required(self, value, attribute, nullable, **kwargs): - if not value and not nullable: + if (not value and value != False and value != 0) and not nullable: return False return self.validate_present(attribute) @@ -636,7 +632,7 @@ def _get_type_from_value(self, value): return 'array' elif self.validate_file(value): return 'file' - elif self.validate_empty(value): + elif self._is_value_empty(value): return 'empty' return 'string' @@ -655,6 +651,10 @@ def _attribute_value(self, attribute): request_param = request_param[accessor] return request_param + @staticmethod + def _is_value_empty(value, **kwargs): + return (not value and value != 0) + @staticmethod def _assert_params_size(size, params, rule): if size > len(params): diff --git a/tests/test_rules_processor.py b/tests/test_rules_processor.py index 15cf856..0e0f939 100644 --- a/tests/test_rules_processor.py +++ b/tests/test_rules_processor.py @@ -549,6 +549,14 @@ def test_validates_lt(self): rules={'field': ['lt:field_2']}, request={'field': 10, 'field_2': 1} ) + self.assert_fails( + rules={'field': ['lt:field_2']}, + request={'field': None, 'field_2': 1} + ) + self.assert_fails( + rules={'field': ['lt:field_2']}, + request={'field': '', 'field_2': 1} + ) def test_validates_lte(self): self.assert_passes( @@ -563,6 +571,10 @@ def test_validates_lte(self): rules={'field': ['lte:field_2']}, request={'field': 10, 'field_2': 1} ) + self.assert_fails( + rules={'field': ['lte:field_2']}, + request={'field': None, 'field_2': 1} + ) def test_validates_max(self): self.assert_passes( @@ -573,6 +585,14 @@ def test_validates_max(self): rules={'field': ['max:10']}, request={'field': 30} ) + self.assert_passes( + rules={'field': ['max:10']}, + request={'field': 0} + ) + self.assert_fails( + rules={'field': ['max:10']}, + request={'field': None} + ) def test_validates_mime_types(self): self.assert_passes( @@ -685,6 +705,14 @@ def test_validates_required(self): rules={'field': ['required']}, request={'field': None} ) + self.assert_passes( + rules={'field': ['required']}, + request={'field': False} + ) + self.assert_passes( + rules={'field': ['required']}, + request={'field': 0} + ) def test_validates_required_if(self): self.assert_passes( @@ -935,45 +963,6 @@ def test_allows_nullable_fields(self): request={} ) - def test_validates_sometimes(self): - self.assert_passes( - rules={'number': ['sometimes', 'max:5']}, - request={} - ) - self.assert_passes( - rules={'number': ['sometimes', 'max:5']}, - request={'number': 2} - ) - self.assert_fails( - rules={'number': ['sometimes', 'max:5']}, - request={'number': ''} - ) - self.assert_fails( - rules={'number': ['sometimes', 'max:5']}, - request={'number': 10} - ) - self.assert_passes( - rules={ - 'zipCode': ['sometimes', 'numeric'], - 'website': ['sometimes', 'url'] - }, - request={} - ) - self.assert_passes( - rules={ - 'zipCode': ['sometimes', 'numeric'], - 'website': ['sometimes', 'url'] - }, - request={'website': 'https://google.com'} - ) - self.assert_fails( - rules={ - 'zipCode': ['sometimes', 'numeric'], - 'website': ['sometimes', 'url'] - }, - request={'website': 'ogle.com'} - ) - def test_validates_uuid(self): self.assert_passes(