Commit ddd6a530 authored by Claude Paroz's avatar Claude Paroz
Browse files

Moved more serializers_regress to serializers tests

parent d59d3caf
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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):
+73 −2
Original line number Diff line number Diff line
@@ -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):

+0 −15
Original line number Diff line number Diff line
@@ -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()

+6 −77
Original line number Diff line number Diff line
@@ -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))