diff --git a/tests/serializers/models.py b/tests/serializers/models.py index c3663b5339..078fa05722 100644 --- a/tests/serializers/models.py +++ b/tests/serializers/models.py @@ -159,6 +159,26 @@ class Player(models.Model): return '%s (%d) playing for %s' % (self.name, self.rank, self.team.to_string()) +class BaseModel(models.Model): + parent_data = models.IntegerField() + + +class ProxyBaseModel(BaseModel): + class Meta: + proxy = True + + +class ProxyProxyBaseModel(ProxyBaseModel): + class Meta: + proxy = True + + +class ComplexModel(models.Model): + field1 = models.CharField(max_length=10) + field2 = models.CharField(max_length=10) + field3 = models.CharField(max_length=10) + + # ******** Models for test_natural.py *********** class NaturalKeyAnchorManager(models.Manager): diff --git a/tests/serializers/tests.py b/tests/serializers/tests.py index 2de9ce8796..7dc2513fed 100644 --- a/tests/serializers/tests.py +++ b/tests/serializers/tests.py @@ -4,8 +4,10 @@ from __future__ import unicode_literals from datetime import datetime from django.core import serializers +from django.core.serializers import SerializerDoesNotExist from django.core.serializers.base import ProgressBar from django.db import connection, transaction +from django.http import HttpResponse from django.test import ( SimpleTestCase, mock, override_settings, skipUnlessDBFeature, ) @@ -14,8 +16,8 @@ from django.utils.functional import curry from django.utils.six import StringIO from .models import ( - Actor, Article, Author, AuthorProfile, Category, Movie, Player, Score, - Team, + Actor, Article, Author, AuthorProfile, BaseModel, Category, ComplexModel, + Movie, Player, ProxyBaseModel, ProxyProxyBaseModel, Score, Team, ) @@ -51,6 +53,10 @@ class SerializerRegistrationTests(SimpleTestCase): self.assertNotIn('xml', public_formats) self.assertIn('json3', public_formats) + def test_unregister_unknown_serializer(self): + with self.assertRaises(SerializerDoesNotExist): + serializers.unregister_serializer("nonsense") + def test_builtin_serializers(self): "Requesting a list of serializer formats popuates the registry" all_formats = set(serializers.get_serializer_formats()) @@ -65,8 +71,29 @@ class SerializerRegistrationTests(SimpleTestCase): self.assertIn('python', all_formats) self.assertNotIn('python', public_formats) + def test_get_unknown_serializer(self): + """ + #15889: get_serializer('nonsense') raises a SerializerDoesNotExist + """ + with self.assertRaises(SerializerDoesNotExist): + serializers.get_serializer("nonsense") + + with self.assertRaises(KeyError): + serializers.get_serializer("nonsense") + + # SerializerDoesNotExist is instantiated with the nonexistent format + with self.assertRaises(SerializerDoesNotExist) as cm: + serializers.get_serializer("nonsense") + self.assertEqual(cm.exception.args, ("nonsense",)) + + def test_get_unknown_deserializer(self): + with self.assertRaises(SerializerDoesNotExist): + serializers.get_deserializer("nonsense") + class SerializersTestBase(object): + serializer_name = None # Set by subclasses to the serialization format name + @staticmethod def _comparison_value(value): return value @@ -108,6 +135,38 @@ class SerializersTestBase(object): models = list(serializers.deserialize(self.serializer_name, serial_str)) self.assertEqual(len(models), 2) + def test_serialize_to_stream(self): + obj = ComplexModel(field1='first', field2='second', field3='third') + obj.save_base(raw=True) + + # Serialize the test database to a stream + for stream in (StringIO(), HttpResponse()): + serializers.serialize(self.serializer_name, [obj], indent=2, stream=stream) + + # Serialize normally for a comparison + string_data = serializers.serialize(self.serializer_name, [obj], indent=2) + + # Check that the two are the same + if isinstance(stream, StringIO): + self.assertEqual(string_data, stream.getvalue()) + else: + self.assertEqual(string_data, stream.content.decode('utf-8')) + + def test_serialize_specific_fields(self): + obj = ComplexModel(field1='first', field2='second', field3='third') + obj.save_base(raw=True) + + # Serialize then deserialize the test database + serialized_data = serializers.serialize( + self.serializer_name, [obj], indent=2, fields=('field1', 'field3') + ) + result = next(serializers.deserialize(self.serializer_name, serialized_data)) + + # Check that the deserialized object contains data in only the serialized fields. + self.assertEqual(result.object.field1, 'first') + self.assertEqual(result.object.field2, '') + self.assertEqual(result.object.field3, 'third') + def test_altering_serialized_output(self): """ Tests the ability to create new objects by @@ -294,6 +353,18 @@ class SerializersTestBase(object): deserial_obj.save(force_insert=False) mock_model.save_base.assert_called_with(deserial_obj.object, raw=True, using=None, force_insert=False) + @skipUnlessDBFeature('can_defer_constraint_checks') + def test_serialize_proxy_model(self): + BaseModel.objects.create(parent_data=1) + base_objects = BaseModel.objects.all() + proxy_objects = ProxyBaseModel.objects.all() + proxy_proxy_objects = ProxyProxyBaseModel.objects.all() + base_data = serializers.serialize("json", base_objects) + proxy_data = serializers.serialize("json", proxy_objects) + proxy_proxy_data = serializers.serialize("json", proxy_proxy_objects) + self.assertEqual(base_data, proxy_data.replace('proxy', '')) + self.assertEqual(base_data, proxy_proxy_data.replace('proxy', '')) + class SerializersTransactionTestBase(object): diff --git a/tests/serializers_regress/models.py b/tests/serializers_regress/models.py index 56c5f4f3cd..fb8aa9f411 100644 --- a/tests/serializers_regress/models.py +++ b/tests/serializers_regress/models.py @@ -261,11 +261,6 @@ class FKToUUID(models.Model): data = models.ForeignKey(UUIDData, models.CASCADE) -class ComplexModel(models.Model): - field1 = models.CharField(max_length=10) - field2 = models.CharField(max_length=10) - field3 = models.CharField(max_length=10) - # Tests for handling fields with pre_save functions, or # models with save functions that modify data @@ -314,16 +309,6 @@ class ExplicitInheritBaseModel(BaseModel): child_data = models.IntegerField() -class ProxyBaseModel(BaseModel): - class Meta: - proxy = True - - -class ProxyProxyBaseModel(ProxyBaseModel): - class Meta: - proxy = True - - class LengthModel(models.Model): data = models.IntegerField() diff --git a/tests/serializers_regress/tests.py b/tests/serializers_regress/tests.py index 81d4a9de0e..053e952e15 100644 --- a/tests/serializers_regress/tests.py +++ b/tests/serializers_regress/tests.py @@ -13,16 +13,15 @@ import decimal import uuid from django.core import serializers -from django.core.serializers import SerializerDoesNotExist from django.db import connection, models from django.http import HttpResponse -from django.test import TestCase, skipUnlessDBFeature +from django.test import TestCase from django.utils import six from django.utils.functional import curry from .models import ( - Anchor, AutoNowDateTimeData, BaseModel, BigIntegerData, BinaryData, - BooleanData, BooleanPKData, CharData, CharPKData, ComplexModel, DateData, + Anchor, AutoNowDateTimeData, BigIntegerData, BinaryData, + BooleanData, BooleanPKData, CharData, CharPKData, DateData, DateTimeData, DecimalData, DecimalPKData, EmailData, EmailPKData, ExplicitInheritBaseModel, FileData, FilePathData, FilePathPKData, FKData, FKDataToField, FKDataToO2O, FKSelfData, FKToUUID, @@ -31,9 +30,8 @@ from .models import ( IntegerData, IntegerPKData, Intermediate, LengthModel, M2MData, M2MIntermediateData, M2MSelfData, ModifyingSaveData, NullBooleanData, O2OData, PositiveIntegerData, PositiveIntegerPKData, - PositiveSmallIntegerData, PositiveSmallIntegerPKData, ProxyBaseModel, - ProxyProxyBaseModel, SlugData, SlugPKData, SmallData, SmallPKData, Tag, - TextData, TimeData, UniqueAnchor, UUIDData, + PositiveSmallIntegerData, PositiveSmallIntegerPKData, SlugData, SlugPKData, + SmallData, SmallPKData, Tag, TextData, TimeData, UniqueAnchor, UUIDData, ) # A set of functions that can be used to recreate @@ -387,42 +385,8 @@ if connection.features.allows_auto_pk_0: ]) -@skipUnlessDBFeature('can_defer_constraint_checks') class SerializerTests(TestCase): - def test_get_unknown_serializer(self): - """ - #15889: get_serializer('nonsense') raises a SerializerDoesNotExist - """ - with self.assertRaises(SerializerDoesNotExist): - serializers.get_serializer("nonsense") - - with self.assertRaises(KeyError): - serializers.get_serializer("nonsense") - - # SerializerDoesNotExist is instantiated with the nonexistent format - with self.assertRaises(SerializerDoesNotExist) as cm: - serializers.get_serializer("nonsense") - self.assertEqual(cm.exception.args, ("nonsense",)) - - def test_unregister_unknown_serializer(self): - with self.assertRaises(SerializerDoesNotExist): - serializers.unregister_serializer("nonsense") - - def test_get_unknown_deserializer(self): - with self.assertRaises(SerializerDoesNotExist): - serializers.get_deserializer("nonsense") - - def test_serialize_proxy_model(self): - BaseModel.objects.create(parent_data=1) - base_objects = BaseModel.objects.all() - proxy_objects = ProxyBaseModel.objects.all() - proxy_proxy_objects = ProxyProxyBaseModel.objects.all() - base_data = serializers.serialize("json", base_objects) - proxy_data = serializers.serialize("json", proxy_objects) - proxy_proxy_data = serializers.serialize("json", proxy_proxy_objects) - self.assertEqual(base_data, proxy_data.replace('proxy', '')) - self.assertEqual(base_data, proxy_proxy_data.replace('proxy', '')) - + pass def serializerTest(format, self): @@ -457,41 +421,6 @@ def serializerTest(format, self): self.assertEqual(count, klass.objects.count()) -def fieldsTest(format, self): - obj = ComplexModel(field1='first', field2='second', field3='third') - obj.save_base(raw=True) - - # Serialize then deserialize the test database - serialized_data = serializers.serialize(format, [obj], indent=2, fields=('field1', 'field3')) - result = next(serializers.deserialize(format, serialized_data)) - - # Check that the deserialized object contains data in only the serialized fields. - self.assertEqual(result.object.field1, 'first') - self.assertEqual(result.object.field2, '') - self.assertEqual(result.object.field3, 'third') - - -def streamTest(format, self): - obj = ComplexModel(field1='first', field2='second', field3='third') - obj.save_base(raw=True) - - # Serialize the test database to a stream - for stream in (six.StringIO(), HttpResponse()): - serializers.serialize(format, [obj], indent=2, stream=stream) - - # Serialize normally for a comparison - string_data = serializers.serialize(format, [obj], indent=2) - - # Check that the two are the same - if isinstance(stream, six.StringIO): - self.assertEqual(string_data, stream.getvalue()) - else: - self.assertEqual(string_data, stream.content.decode('utf-8')) - - for format in [f for f in serializers.get_serializer_formats() if not isinstance(serializers.get_serializer(f), serializers.BadSerializer) and not f == 'geojson']: setattr(SerializerTests, 'test_' + format + '_serializer', curry(serializerTest, format)) - setattr(SerializerTests, 'test_' + format + '_serializer_fields', curry(fieldsTest, format)) - if format != 'python': - setattr(SerializerTests, 'test_' + format + '_serializer_stream', curry(streamTest, format))