From d11b55648ca657d7036a312cafe6c76db491d3cc Mon Sep 17 00:00:00 2001 From: David Medina Date: Wed, 29 May 2013 12:47:43 +0200 Subject: [PATCH 1/2] Bugfix: Fix run validation layer with invalid data --- rest_framework/serializers.py | 3 ++- rest_framework/tests/test_validation.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 3e5c366ec..e7b8fdc02 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -315,7 +315,8 @@ class BaseSerializer(WritableField): self._errors = {} if data is not None or files is not None: attrs = self.restore_fields(data, files) - attrs = self.perform_validation(attrs) + if attrs is not None: + attrs = self.perform_validation(attrs) else: self._errors['non_field_errors'] = ['No input provided'] diff --git a/rest_framework/tests/test_validation.py b/rest_framework/tests/test_validation.py index cbdd6515e..5202ebe43 100644 --- a/rest_framework/tests/test_validation.py +++ b/rest_framework/tests/test_validation.py @@ -63,3 +63,16 @@ class TestPreSaveValidationExclusions(TestCase): # does not have `blank=True`, so this serializer should not validate. serializer = ShouldValidateModelSerializer(data={'renamed': ''}) self.assertEqual(serializer.is_valid(), False) + + +class FieldValidationSerializer(serializers.Serializer): + foo = serializers.CharField() + + def validate_foo(self, attrs, source): + raise StandardError("validate_foo was called") + + +class TestFieldValidationWithInvalidData(TestCase): + def test_validate_foo_was_not_called(self): + serializer = FieldValidationSerializer(data='invalid data') + self.assertFalse(serializer.is_valid()) From c176af35e5ad18e8aced7156af7f4791e8f23ca2 Mon Sep 17 00:00:00 2001 From: David Medina Date: Thu, 30 May 2013 09:07:30 +0200 Subject: [PATCH 2/2] Improve avoid validation test: #900 --- rest_framework/tests/test_validation.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/rest_framework/tests/test_validation.py b/rest_framework/tests/test_validation.py index 5202ebe43..a6ec0e993 100644 --- a/rest_framework/tests/test_validation.py +++ b/rest_framework/tests/test_validation.py @@ -65,14 +65,23 @@ class TestPreSaveValidationExclusions(TestCase): self.assertEqual(serializer.is_valid(), False) -class FieldValidationSerializer(serializers.Serializer): +class ValidationSerializer(serializers.Serializer): foo = serializers.CharField() def validate_foo(self, attrs, source): - raise StandardError("validate_foo was called") + raise serializers.ValidationError("foo invalid") + + def validate(self, attrs): + raise serializers.ValidationError("serializer invalid") -class TestFieldValidationWithInvalidData(TestCase): - def test_validate_foo_was_not_called(self): - serializer = FieldValidationSerializer(data='invalid data') +class TestAvoidValidation(TestCase): + """ + If serializer was initialized with invalid data (None or non dict-like), it + should avoid validation layer (validate_ and validate methods) + """ + def test_serializer_errors_has_only_invalid_data_error(self): + serializer = ValidationSerializer(data='invalid data') self.assertFalse(serializer.is_valid()) + self.assertDictEqual(serializer.errors, + {'non_field_errors': ['Invalid data']})