diff --git a/tests/serializers/models.py b/tests/serializers/models.py index 078fa05722..023a2e8f85 100644 --- a/tests/serializers/models.py +++ b/tests/serializers/models.py @@ -9,6 +9,10 @@ from __future__ import unicode_literals from decimal import Decimal +from django.contrib.contenttypes.fields import ( + GenericForeignKey, GenericRelation, +) +from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils import six from django.utils.encoding import python_2_unicode_compatible @@ -198,3 +202,309 @@ class NaturalKeyAnchor(models.Model): class FKDataNaturalKey(models.Model): data = models.ForeignKey(NaturalKeyAnchor, models.SET_NULL, null=True) + + +# ******** Models for test_data.py *********** +# The following classes are for testing basic data marshalling, including +# NULL values, where allowed. +# The basic idea is to have a model for each Django data type. + +class BinaryData(models.Model): + data = models.BinaryField(null=True) + + +class BooleanData(models.Model): + data = models.BooleanField(default=False) + + +class CharData(models.Model): + data = models.CharField(max_length=30, null=True) + + +class DateData(models.Model): + data = models.DateField(null=True) + + +class DateTimeData(models.Model): + data = models.DateTimeField(null=True) + + +class DecimalData(models.Model): + data = models.DecimalField(null=True, decimal_places=3, max_digits=5) + + +class EmailData(models.Model): + data = models.EmailField(null=True) + + +class FileData(models.Model): + data = models.FileField(null=True, upload_to='/foo/bar') + + +class FilePathData(models.Model): + data = models.FilePathField(null=True) + + +class FloatData(models.Model): + data = models.FloatField(null=True) + + +class IntegerData(models.Model): + data = models.IntegerField(null=True) + + +class BigIntegerData(models.Model): + data = models.BigIntegerField(null=True) + +# class ImageData(models.Model): +# data = models.ImageField(null=True) + + +class GenericIPAddressData(models.Model): + data = models.GenericIPAddressField(null=True) + + +class NullBooleanData(models.Model): + data = models.NullBooleanField(null=True) + + +class PositiveIntegerData(models.Model): + data = models.PositiveIntegerField(null=True) + + +class PositiveSmallIntegerData(models.Model): + data = models.PositiveSmallIntegerField(null=True) + + +class SlugData(models.Model): + data = models.SlugField(null=True) + + +class SmallData(models.Model): + data = models.SmallIntegerField(null=True) + + +class TextData(models.Model): + data = models.TextField(null=True) + + +class TimeData(models.Model): + data = models.TimeField(null=True) + + +class Tag(models.Model): + """A tag on an item.""" + data = models.SlugField() + content_type = models.ForeignKey(ContentType, models.CASCADE) + object_id = models.PositiveIntegerField() + + content_object = GenericForeignKey() + + class Meta: + ordering = ["data"] + + +class GenericData(models.Model): + data = models.CharField(max_length=30) + + tags = GenericRelation(Tag) + +# The following test classes are all for validation +# of related objects; in particular, forward, backward, +# and self references. + + +class Anchor(models.Model): + """This is a model that can be used as + something for other models to point at""" + + data = models.CharField(max_length=30) + + class Meta: + ordering = ('id',) + + +class UniqueAnchor(models.Model): + """This is a model that can be used as + something for other models to point at""" + + data = models.CharField(unique=True, max_length=30) + + +class FKData(models.Model): + data = models.ForeignKey(Anchor, models.SET_NULL, null=True) + + +class M2MData(models.Model): + data = models.ManyToManyField(Anchor) + + +class O2OData(models.Model): + # One to one field can't be null here, since it is a PK. + data = models.OneToOneField(Anchor, models.CASCADE, primary_key=True) + + +class FKSelfData(models.Model): + data = models.ForeignKey('self', models.CASCADE, null=True) + + +class M2MSelfData(models.Model): + data = models.ManyToManyField('self', symmetrical=False) + + +class FKDataToField(models.Model): + data = models.ForeignKey(UniqueAnchor, models.SET_NULL, null=True, to_field='data') + + +class FKDataToO2O(models.Model): + data = models.ForeignKey(O2OData, models.SET_NULL, null=True) + + +class M2MIntermediateData(models.Model): + data = models.ManyToManyField(Anchor, through='Intermediate') + + +class Intermediate(models.Model): + left = models.ForeignKey(M2MIntermediateData, models.CASCADE) + right = models.ForeignKey(Anchor, models.CASCADE) + extra = models.CharField(max_length=30, blank=True, default="doesn't matter") + +# The following test classes are for validating the +# deserialization of objects that use a user-defined +# field as the primary key. +# Some of these data types have been commented out +# because they can't be used as a primary key on one +# or all database backends. + + +class BooleanPKData(models.Model): + data = models.BooleanField(primary_key=True, default=False) + + +class CharPKData(models.Model): + data = models.CharField(max_length=30, primary_key=True) + +# class DatePKData(models.Model): +# data = models.DateField(primary_key=True) + +# class DateTimePKData(models.Model): +# data = models.DateTimeField(primary_key=True) + + +class DecimalPKData(models.Model): + data = models.DecimalField(primary_key=True, decimal_places=3, max_digits=5) + + +class EmailPKData(models.Model): + data = models.EmailField(primary_key=True) + +# class FilePKData(models.Model): +# data = models.FileField(primary_key=True, upload_to='/foo/bar') + + +class FilePathPKData(models.Model): + data = models.FilePathField(primary_key=True) + + +class FloatPKData(models.Model): + data = models.FloatField(primary_key=True) + + +class IntegerPKData(models.Model): + data = models.IntegerField(primary_key=True) + +# class ImagePKData(models.Model): +# data = models.ImageField(primary_key=True) + + +class GenericIPAddressPKData(models.Model): + data = models.GenericIPAddressField(primary_key=True) + +# This is just a Boolean field with null=True, and we can't test a PK value of NULL. +# class NullBooleanPKData(models.Model): +# data = models.NullBooleanField(primary_key=True) + + +class PositiveIntegerPKData(models.Model): + data = models.PositiveIntegerField(primary_key=True) + + +class PositiveSmallIntegerPKData(models.Model): + data = models.PositiveSmallIntegerField(primary_key=True) + + +class SlugPKData(models.Model): + data = models.SlugField(primary_key=True) + + +class SmallPKData(models.Model): + data = models.SmallIntegerField(primary_key=True) + +# class TextPKData(models.Model): +# data = models.TextField(primary_key=True) + +# class TimePKData(models.Model): +# data = models.TimeField(primary_key=True) + + +class UUIDData(models.Model): + data = models.UUIDField(primary_key=True) + + +class FKToUUID(models.Model): + data = models.ForeignKey(UUIDData, models.CASCADE) + + +# Tests for handling fields with pre_save functions, or +# models with save functions that modify data + + +class AutoNowDateTimeData(models.Model): + data = models.DateTimeField(null=True, auto_now=True) + + +class ModifyingSaveData(models.Model): + data = models.IntegerField(null=True) + + def save(self, *args, **kwargs): + """ + A save method that modifies the data in the object. + Verifies that a user-defined save() method isn't called when objects + are deserialized (#4459). + """ + self.data = 666 + super(ModifyingSaveData, self).save(*args, **kwargs) + +# Tests for serialization of models using inheritance. +# Regression for #7202, #7350 + + +class AbstractBaseModel(models.Model): + parent_data = models.IntegerField() + + class Meta: + abstract = True + + +class InheritAbstractModel(AbstractBaseModel): + child_data = models.IntegerField() + + +class BaseModel(models.Model): + parent_data = models.IntegerField() + + +class InheritBaseModel(BaseModel): + child_data = models.IntegerField() + + +class ExplicitInheritBaseModel(BaseModel): + parent = models.OneToOneField(BaseModel, models.CASCADE) + child_data = models.IntegerField() + + +class LengthModel(models.Model): + data = models.IntegerField() + + def __len__(self): + return self.data diff --git a/tests/serializers_regress/tests.py b/tests/serializers/test_data.py similarity index 93% rename from tests/serializers_regress/tests.py rename to tests/serializers/test_data.py index 053e952e15..5f0cd45643 100644 --- a/tests/serializers_regress/tests.py +++ b/tests/serializers/test_data.py @@ -14,25 +14,24 @@ import uuid from django.core import serializers from django.db import connection, models -from django.http import HttpResponse from django.test import TestCase from django.utils import six -from django.utils.functional import curry from .models import ( - Anchor, AutoNowDateTimeData, BigIntegerData, BinaryData, - BooleanData, BooleanPKData, CharData, CharPKData, DateData, - DateTimeData, DecimalData, DecimalPKData, EmailData, EmailPKData, - ExplicitInheritBaseModel, FileData, FilePathData, FilePathPKData, FKData, - FKDataToField, FKDataToO2O, FKSelfData, FKToUUID, - FloatData, FloatPKData, GenericData, GenericIPAddressData, - GenericIPAddressPKData, InheritAbstractModel, InheritBaseModel, - IntegerData, IntegerPKData, Intermediate, LengthModel, M2MData, - M2MIntermediateData, M2MSelfData, ModifyingSaveData, + Anchor, AutoNowDateTimeData, BigIntegerData, BinaryData, BooleanData, + BooleanPKData, CharData, CharPKData, DateData, DateTimeData, DecimalData, + DecimalPKData, EmailData, EmailPKData, ExplicitInheritBaseModel, FileData, + FilePathData, FilePathPKData, FKData, FKDataToField, FKDataToO2O, + FKSelfData, FKToUUID, FloatData, FloatPKData, GenericData, + GenericIPAddressData, GenericIPAddressPKData, InheritAbstractModel, + InheritBaseModel, IntegerData, IntegerPKData, Intermediate, LengthModel, + M2MData, M2MIntermediateData, M2MSelfData, ModifyingSaveData, NullBooleanData, O2OData, PositiveIntegerData, PositiveIntegerPKData, PositiveSmallIntegerData, PositiveSmallIntegerPKData, SlugData, SlugPKData, SmallData, SmallPKData, Tag, TextData, TimeData, UniqueAnchor, UUIDData, ) +from .tests import register_tests + # A set of functions that can be used to recreate # test data objects of various kinds. @@ -385,9 +384,10 @@ if connection.features.allows_auto_pk_0: ]) -class SerializerTests(TestCase): +class SerializerDataTests(TestCase): pass + def serializerTest(format, self): # Create all the objects defined in the test data @@ -421,6 +421,4 @@ def serializerTest(format, self): self.assertEqual(count, klass.objects.count()) -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)) +register_tests(SerializerDataTests, 'test_%s_serializer', serializerTest) diff --git a/tests/serializers_regress/__init__.py b/tests/serializers_regress/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/serializers_regress/models.py b/tests/serializers_regress/models.py deleted file mode 100644 index fb8aa9f411..0000000000 --- a/tests/serializers_regress/models.py +++ /dev/null @@ -1,316 +0,0 @@ -""" -A test spanning all the capabilities of all the serializers. - -This class sets up a model for each model field type -(except for image types, because of the Pillow dependency). -""" -from django.contrib.contenttypes.fields import ( - GenericForeignKey, GenericRelation, -) -from django.contrib.contenttypes.models import ContentType -from django.db import models - - -# The following classes are for testing basic data -# marshalling, including NULL values, where allowed. - - -class BinaryData(models.Model): - data = models.BinaryField(null=True) - - -class BooleanData(models.Model): - data = models.BooleanField(default=False) - - -class CharData(models.Model): - data = models.CharField(max_length=30, null=True) - - -class DateData(models.Model): - data = models.DateField(null=True) - - -class DateTimeData(models.Model): - data = models.DateTimeField(null=True) - - -class DecimalData(models.Model): - data = models.DecimalField(null=True, decimal_places=3, max_digits=5) - - -class EmailData(models.Model): - data = models.EmailField(null=True) - - -class FileData(models.Model): - data = models.FileField(null=True, upload_to='/foo/bar') - - -class FilePathData(models.Model): - data = models.FilePathField(null=True) - - -class FloatData(models.Model): - data = models.FloatField(null=True) - - -class IntegerData(models.Model): - data = models.IntegerField(null=True) - - -class BigIntegerData(models.Model): - data = models.BigIntegerField(null=True) - -# class ImageData(models.Model): -# data = models.ImageField(null=True) - - -class GenericIPAddressData(models.Model): - data = models.GenericIPAddressField(null=True) - - -class NullBooleanData(models.Model): - data = models.NullBooleanField(null=True) - - -class PositiveIntegerData(models.Model): - data = models.PositiveIntegerField(null=True) - - -class PositiveSmallIntegerData(models.Model): - data = models.PositiveSmallIntegerField(null=True) - - -class SlugData(models.Model): - data = models.SlugField(null=True) - - -class SmallData(models.Model): - data = models.SmallIntegerField(null=True) - - -class TextData(models.Model): - data = models.TextField(null=True) - - -class TimeData(models.Model): - data = models.TimeField(null=True) - - -class Tag(models.Model): - """A tag on an item.""" - data = models.SlugField() - content_type = models.ForeignKey(ContentType, models.CASCADE) - object_id = models.PositiveIntegerField() - - content_object = GenericForeignKey() - - class Meta: - ordering = ["data"] - - -class GenericData(models.Model): - data = models.CharField(max_length=30) - - tags = GenericRelation(Tag) - -# The following test classes are all for validation -# of related objects; in particular, forward, backward, -# and self references. - - -class Anchor(models.Model): - """This is a model that can be used as - something for other models to point at""" - - data = models.CharField(max_length=30) - - class Meta: - ordering = ('id',) - - -class UniqueAnchor(models.Model): - """This is a model that can be used as - something for other models to point at""" - - data = models.CharField(unique=True, max_length=30) - - -class FKData(models.Model): - data = models.ForeignKey(Anchor, models.SET_NULL, null=True) - - -class M2MData(models.Model): - data = models.ManyToManyField(Anchor) - - -class O2OData(models.Model): - # One to one field can't be null here, since it is a PK. - data = models.OneToOneField(Anchor, models.CASCADE, primary_key=True) - - -class FKSelfData(models.Model): - data = models.ForeignKey('self', models.CASCADE, null=True) - - -class M2MSelfData(models.Model): - data = models.ManyToManyField('self', symmetrical=False) - - -class FKDataToField(models.Model): - data = models.ForeignKey(UniqueAnchor, models.SET_NULL, null=True, to_field='data') - - -class FKDataToO2O(models.Model): - data = models.ForeignKey(O2OData, models.SET_NULL, null=True) - - -class M2MIntermediateData(models.Model): - data = models.ManyToManyField(Anchor, through='Intermediate') - - -class Intermediate(models.Model): - left = models.ForeignKey(M2MIntermediateData, models.CASCADE) - right = models.ForeignKey(Anchor, models.CASCADE) - extra = models.CharField(max_length=30, blank=True, default="doesn't matter") - -# The following test classes are for validating the -# deserialization of objects that use a user-defined -# field as the primary key. -# Some of these data types have been commented out -# because they can't be used as a primary key on one -# or all database backends. - - -class BooleanPKData(models.Model): - data = models.BooleanField(primary_key=True, default=False) - - -class CharPKData(models.Model): - data = models.CharField(max_length=30, primary_key=True) - -# class DatePKData(models.Model): -# data = models.DateField(primary_key=True) - -# class DateTimePKData(models.Model): -# data = models.DateTimeField(primary_key=True) - - -class DecimalPKData(models.Model): - data = models.DecimalField(primary_key=True, decimal_places=3, max_digits=5) - - -class EmailPKData(models.Model): - data = models.EmailField(primary_key=True) - -# class FilePKData(models.Model): -# data = models.FileField(primary_key=True, upload_to='/foo/bar') - - -class FilePathPKData(models.Model): - data = models.FilePathField(primary_key=True) - - -class FloatPKData(models.Model): - data = models.FloatField(primary_key=True) - - -class IntegerPKData(models.Model): - data = models.IntegerField(primary_key=True) - -# class ImagePKData(models.Model): -# data = models.ImageField(primary_key=True) - - -class GenericIPAddressPKData(models.Model): - data = models.GenericIPAddressField(primary_key=True) - -# This is just a Boolean field with null=True, and we can't test a PK value of NULL. -# class NullBooleanPKData(models.Model): -# data = models.NullBooleanField(primary_key=True) - - -class PositiveIntegerPKData(models.Model): - data = models.PositiveIntegerField(primary_key=True) - - -class PositiveSmallIntegerPKData(models.Model): - data = models.PositiveSmallIntegerField(primary_key=True) - - -class SlugPKData(models.Model): - data = models.SlugField(primary_key=True) - - -class SmallPKData(models.Model): - data = models.SmallIntegerField(primary_key=True) - -# class TextPKData(models.Model): -# data = models.TextField(primary_key=True) - -# class TimePKData(models.Model): -# data = models.TimeField(primary_key=True) - - -class UUIDData(models.Model): - data = models.UUIDField(primary_key=True) - - -class FKToUUID(models.Model): - data = models.ForeignKey(UUIDData, models.CASCADE) - - -# Tests for handling fields with pre_save functions, or -# models with save functions that modify data - - -class AutoNowDateTimeData(models.Model): - data = models.DateTimeField(null=True, auto_now=True) - - -class ModifyingSaveData(models.Model): - data = models.IntegerField(null=True) - - def save(self, *args, **kwargs): - """ - A save method that modifies the data in the object. - Verifies that a user-defined save() method isn't called when objects - are deserialized (#4459). - """ - self.data = 666 - super(ModifyingSaveData, self).save(*args, **kwargs) - -# Tests for serialization of models using inheritance. -# Regression for #7202, #7350 - - -class AbstractBaseModel(models.Model): - parent_data = models.IntegerField() - - class Meta: - abstract = True - - -class InheritAbstractModel(AbstractBaseModel): - child_data = models.IntegerField() - - -class BaseModel(models.Model): - parent_data = models.IntegerField() - - -class InheritBaseModel(BaseModel): - child_data = models.IntegerField() - - -class ExplicitInheritBaseModel(BaseModel): - parent = models.OneToOneField(BaseModel, models.CASCADE) - child_data = models.IntegerField() - - -class LengthModel(models.Model): - data = models.IntegerField() - - def __len__(self): - return self.data