diff options
Diffstat (limited to 'rest_framework/tests/serializer.py')
| -rw-r--r-- | rest_framework/tests/serializer.py | 132 |
1 files changed, 52 insertions, 80 deletions
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 3c56f127..701b2f47 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -2,7 +2,7 @@ import datetime import pickle from django.test import TestCase from rest_framework import serializers -from rest_framework.tests.models import (Album, ActionItem, Anchor, BasicModel, +from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, BlankFieldModel, BlogPost, Book, CallableDefaultValueModel, DefaultValueModel, ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo) @@ -69,6 +69,11 @@ class AlbumsSerializer(serializers.ModelSerializer): model = Album fields = ['title'] # lists are also valid options +class PositiveIntegerAsChoiceSerializer(serializers.ModelSerializer): + class Meta: + model = HasPositiveIntegerAsChoice + fields = ['some_integer'] + class BasicTests(TestCase): def setUp(self): @@ -285,6 +290,12 @@ class ValidationTests(TestCase): self.assertEquals(serializer.errors, {'info': [u'Ensure this value has at most 12 characters (it has 13).']}) +class PositiveIntegerAsChoiceTests(TestCase): + def test_positive_integer_in_json_is_correctly_parsed(self): + data = {'some_integer':1} + serializer = PositiveIntegerAsChoiceSerializer(data=data) + self.assertEquals(serializer.is_valid(), True) + class ModelValidationTests(TestCase): def test_validate_unique(self): """ @@ -297,6 +308,38 @@ class ModelValidationTests(TestCase): self.assertFalse(second_serializer.is_valid()) self.assertEqual(second_serializer.errors, {'title': [u'Album with this Title already exists.']}) + def test_foreign_key_with_partial(self): + """ + Test ModelSerializer validation with partial=True + + Specifically test foreign key validation. + """ + + album = Album(title='test') + album.save() + + class PhotoSerializer(serializers.ModelSerializer): + class Meta: + model = Photo + + photo_serializer = PhotoSerializer(data={'description': 'test', 'album': album.pk}) + self.assertTrue(photo_serializer.is_valid()) + photo = photo_serializer.save() + + # Updating only the album (foreign key) + photo_serializer = PhotoSerializer(instance=photo, data={'album': album.pk}, partial=True) + self.assertTrue(photo_serializer.is_valid()) + self.assertTrue(photo_serializer.save()) + + # Updating only the description + photo_serializer = PhotoSerializer(instance=photo, + data={'description': 'new'}, + partial=True) + + self.assertTrue(photo_serializer.is_valid()) + self.assertTrue(photo_serializer.save()) + + class RegexValidationTest(TestCase): def test_create_failed(self): @@ -688,6 +731,10 @@ class BlankFieldTests(TestCase): serializer = self.model_serializer_class(data=self.data) self.assertEquals(serializer.is_valid(), True) + def test_create_model_null_field(self): + serializer = self.model_serializer_class(data={'title': None}) + self.assertEquals(serializer.is_valid(), True) + def test_create_not_blank_field(self): """ Test to ensure blank data in a field not marked as blank=True @@ -704,6 +751,10 @@ class BlankFieldTests(TestCase): serializer = self.not_blank_model_serializer_class(data=self.data) self.assertEquals(serializer.is_valid(), False) + def test_create_model_null_field(self): + serializer = self.model_serializer_class(data={}) + self.assertEquals(serializer.is_valid(), True) + #test for issue #460 class SerializerPickleTests(TestCase): @@ -816,82 +867,3 @@ class NestedSerializerContextTests(TestCase): # This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers AlbumCollectionSerializer(album_collection, context={'context_item': 'album context'}).data - - -class ManyPrimaryKeyRelatedCreateTest(TestCase): - - def test_create_is_valid_with_title_and_empty_comments_list(self): - data = {'title': 'foobar', 'comments': []} - serializer = self.build_model_serializer(data) - self.assertEquals(serializer.is_valid(), True) - - def test_create_is_valid_with_title_and_comment(self): - data = {'title': 'foobar', 'comments': [self.comment.pk]} - serializer = self.build_model_serializer(data) - self.assertEquals(serializer.is_valid(), True) - - def test_create_is_not_valid_when_title_is_empty_string(self): - data = {'title': '', 'comments': [self.comment.pk]} - serializer = self.build_model_serializer(data) - self.assertEquals(serializer.is_valid(), False) - self.assertEquals(serializer.errors, {'title': [u'This field is required.']}) - - def test_create_is_not_valid_when_title_present_but_no_comments(self): - data = {'title': 'foobar'} - serializer = self.build_model_serializer(data) - try: - self.assertEquals(serializer.is_valid(), False) - except TypeError as e: - self.assertEqual(e.message, "'NoneType' object is not iterable") - - def test_create_without_comment_returns_expected_json_result(self): - data = {'title': 'foobar', 'comments': []} - serializer = self.build_model_serializer(data) - self.assertEquals(serializer.is_valid(), True) - instance = serializer.save() - expected = { - 'title': u'foobar', - 'comments': [] - } - self.assertEqual(serializer.data, expected) - - def test_create_with_comment_returns_expected_json_result(self): - data = {'title': 'foobar', 'comments': [self.comment.pk]} - serializer = self.build_model_serializer(data) - self.assertEquals(serializer.is_valid(), True) - instance = serializer.save() - expected = { - 'title': u'foobar', - 'comments': [self.comment.pk] - } - self.assertEqual(serializer.data, expected) - - @property - def comment(self): - if not hasattr(self, '_comment'): - from rest_framework.tests.models import BlogPostRelatedComment - self._comment = BlogPostRelatedComment.objects.create(text="I love this blog post", blog_post=self.post) - return self._comment - - @property - def post(self): - if not hasattr(self, '_post'): - from rest_framework.tests.models import BlogPost - self._post = BlogPost.objects.create(title="Test blog post") - return self._post - - def build_model_serializer(self, data): - from rest_framework.tests.models import BlogPost, BlogPostRelatedComment - - class BlogPostRelatedCommentSerializer(serializers.ModelSerializer): - class Meta: - model = BlogPostRelatedComment - fields = ("text") - - class BlogPostSerializer(serializers.ModelSerializer): - comments = serializers.ManyPrimaryKeyRelatedField() - class Meta: - model = BlogPost - fields = ("title", "comments") - - return BlogPostSerializer(data=data) |
