diff options
| author | Tom Christie | 2013-01-23 01:21:26 -0800 | 
|---|---|---|
| committer | Tom Christie | 2013-01-23 01:21:26 -0800 | 
| commit | 4a4fe60e33437a2a77a1614c2ca2c9628067ab9f (patch) | |
| tree | 834d12ee2c17deb03cecf6512b8774f5554dc763 /rest_framework | |
| parent | b7abf14d3a4b78da25f303685b8cc1ccd8912b44 (diff) | |
| parent | 30046cae8c64790d7ae0d9ca4d2faee1cd2968aa (diff) | |
| download | django-rest-framework-4a4fe60e33437a2a77a1614c2ca2c9628067ab9f.tar.bz2 | |
Merge pull request #603 from minddust/validation_error
Add failed testcase for fieldvalidation + fix
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/serializers.py | 2 | ||||
| -rw-r--r-- | rest_framework/tests/serializer.py | 88 | 
2 files changed, 61 insertions, 29 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 27458f96..1450b9c7 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -227,6 +227,8 @@ class BaseSerializer(Field):          Run `validate_<fieldname>()` and `validate()` methods on the serializer          """          for field_name, field in self.fields.items(): +            if field_name in self._errors: +                continue              try:                  validate_method = getattr(self, 'validate_%s' % field_name, None)                  if validate_method: diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index bd96ba23..b4428ca3 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -162,7 +162,6 @@ class BasicTests(TestCase):          """          Attempting to update fields set as read_only should have no effect.          """ -          serializer = PersonSerializer(self.person, data={'name': 'dwight', 'age': 99})          self.assertEquals(serializer.is_valid(), True)          instance = serializer.save() @@ -183,8 +182,7 @@ class ValidationTests(TestCase):              'content': 'x' * 1001,              'created': datetime.datetime(2012, 1, 1)          } -        self.actionitem = ActionItem(title='Some to do item', -        ) +        self.actionitem = ActionItem(title='Some to do item',)      def test_create(self):          serializer = CommentSerializer(data=self.data) @@ -216,31 +214,6 @@ class ValidationTests(TestCase):          self.assertEquals(serializer.is_valid(), True)          self.assertEquals(serializer.errors, {}) -    def test_field_validation(self): - -        class CommentSerializerWithFieldValidator(CommentSerializer): - -            def validate_content(self, attrs, source): -                value = attrs[source] -                if "test" not in value: -                    raise serializers.ValidationError("Test not in value") -                return attrs - -        data = { -            'email': 'tom@example.com', -            'content': 'A test comment', -            'created': datetime.datetime(2012, 1, 1) -        } - -        serializer = CommentSerializerWithFieldValidator(data=data) -        self.assertTrue(serializer.is_valid()) - -        data['content'] = 'This should not validate' - -        serializer = CommentSerializerWithFieldValidator(data=data) -        self.assertFalse(serializer.is_valid()) -        self.assertEquals(serializer.errors, {'content': [u'Test not in value']}) -      def test_bad_type_data_is_false(self):          """          Data of the wrong type is not valid. @@ -310,12 +283,69 @@ class ValidationTests(TestCase):          self.assertEquals(serializer.errors, {'info': [u'Ensure this value has at most 12 characters (it has 13).']}) +class CustomValidationTests(TestCase): +    class CommentSerializerWithFieldValidator(CommentSerializer): + +        def validate_email(self, attrs, source): +            value = attrs[source] + +            return attrs + +        def validate_content(self, attrs, source): +            value = attrs[source] +            if "test" not in value: +                raise serializers.ValidationError("Test not in value") +            return attrs + +    def test_field_validation(self): +        data = { +            'email': 'tom@example.com', +            'content': 'A test comment', +            'created': datetime.datetime(2012, 1, 1) +        } + +        serializer = self.CommentSerializerWithFieldValidator(data=data) +        self.assertTrue(serializer.is_valid()) + +        data['content'] = 'This should not validate' + +        serializer = self.CommentSerializerWithFieldValidator(data=data) +        self.assertFalse(serializer.is_valid()) +        self.assertEquals(serializer.errors, {'content': [u'Test not in value']}) + +    def test_missing_data(self): +        """ +        Make sure that validate_content isn't called if the field is missing +        """ +        incomplete_data = { +            'email': 'tom@example.com', +            'created': datetime.datetime(2012, 1, 1) +        } +        serializer = self.CommentSerializerWithFieldValidator(data=incomplete_data) +        self.assertFalse(serializer.is_valid()) +        self.assertEquals(serializer.errors, {'content': [u'This field is required.']}) + +    def test_wrong_data(self): +        """ +        Make sure that validate_content isn't called if the field input is wrong +        """ +        wrong_data = { +            'email': 'not an email', +            'content': 'A test comment', +            'created': datetime.datetime(2012, 1, 1) +        } +        serializer = self.CommentSerializerWithFieldValidator(data=wrong_data) +        self.assertFalse(serializer.is_valid()) +        self.assertEquals(serializer.errors, {'email': [u'Enter a valid e-mail address.']}) + +  class PositiveIntegerAsChoiceTests(TestCase):      def test_positive_integer_in_json_is_correctly_parsed(self): -        data = {'some_integer':1} +        data = {'some_integer': 1}          serializer = PositiveIntegerAsChoiceSerializer(data=data)          self.assertEquals(serializer.is_valid(), True) +  class ModelValidationTests(TestCase):      def test_validate_unique(self):          """  | 
