aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/tests/serializer.py
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework/tests/serializer.py')
-rw-r--r--rest_framework/tests/serializer.py132
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)