aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorTom Christie2014-09-09 17:46:28 +0100
committerTom Christie2014-09-09 17:46:28 +0100
commitb1c07670ca65084c5fef2bbb63d1f4163763014b (patch)
tree4f08654d698990d97fe275d8dbbbcc1164524086 /tests
parent21980b800d04a1d82a6003823abfdf4ab80ae979 (diff)
downloaddjango-rest-framework-b1c07670ca65084c5fef2bbb63d1f4163763014b.tar.bz2
Fleshing out serializer fields
Diffstat (limited to 'tests')
-rw-r--r--tests/test_model_field_mappings.py160
-rw-r--r--tests/test_modelinfo.py (renamed from tests/test_serializers.py)2
-rw-r--r--tests/test_relations.py12
-rw-r--r--tests/test_serializer_empty.py2
4 files changed, 168 insertions, 8 deletions
diff --git a/tests/test_model_field_mappings.py b/tests/test_model_field_mappings.py
new file mode 100644
index 00000000..dc254da4
--- /dev/null
+++ b/tests/test_model_field_mappings.py
@@ -0,0 +1,160 @@
+"""
+The `ModelSerializer` and `HyperlinkedModelSerializer` classes are essentially
+shortcuts for automatically creating serializers based on a given model class.
+
+These tests deal with ensuring that we correctly map the model fields onto
+an appropriate set of serializer fields for each case.
+"""
+from django.db import models
+from django.test import TestCase
+from rest_framework import serializers
+
+
+# Models for testing regular field mapping
+
+class RegularFieldsModel(models.Model):
+ auto_field = models.AutoField(primary_key=True)
+ big_integer_field = models.BigIntegerField()
+ boolean_field = models.BooleanField()
+ char_field = models.CharField(max_length=100)
+ comma_seperated_integer_field = models.CommaSeparatedIntegerField(max_length=100)
+ date_field = models.DateField()
+ datetime_field = models.DateTimeField()
+ decimal_field = models.DecimalField(max_digits=3, decimal_places=1)
+ email_field = models.EmailField(max_length=100)
+ float_field = models.FloatField()
+ integer_field = models.IntegerField()
+ null_boolean_field = models.NullBooleanField()
+ positive_integer_field = models.PositiveIntegerField()
+ positive_small_integer_field = models.PositiveSmallIntegerField()
+ slug_field = models.SlugField(max_length=100)
+ small_integer_field = models.SmallIntegerField()
+ text_field = models.TextField()
+ time_field = models.TimeField()
+ url_field = models.URLField(max_length=100)
+
+
+REGULAR_FIELDS_REPR = """
+TestSerializer():
+ auto_field = IntegerField(label='auto field', read_only=True)
+ big_integer_field = IntegerField(label='big integer field')
+ boolean_field = BooleanField(default=False, label='boolean field')
+ char_field = CharField(label='char field', max_length=100)
+ comma_seperated_integer_field = CharField(label='comma seperated integer field', max_length=100, validators=[<django.core.validators.RegexValidator object>])
+ date_field = DateField(label='date field')
+ datetime_field = DateTimeField(label='datetime field')
+ decimal_field = DecimalField(decimal_places=1, label='decimal field', max_digits=3)
+ email_field = EmailField(label='email field', max_length=100)
+ float_field = FloatField(label='float field')
+ integer_field = IntegerField(label='integer field')
+ null_boolean_field = BooleanField(label='null boolean field', required=False)
+ positive_integer_field = IntegerField(label='positive integer field')
+ positive_small_integer_field = IntegerField(label='positive small integer field')
+ slug_field = SlugField(label='slug field', max_length=100)
+ small_integer_field = IntegerField(label='small integer field')
+ text_field = CharField(label='text field')
+ time_field = TimeField(label='time field')
+ url_field = URLField(label='url field', max_length=100)
+""".strip()
+
+
+# Model for testing relational field mapping
+
+class ForeignKeyTarget(models.Model):
+ char_field = models.CharField(max_length=100)
+
+
+class ManyToManyTarget(models.Model):
+ char_field = models.CharField(max_length=100)
+
+
+class OneToOneTarget(models.Model):
+ char_field = models.CharField(max_length=100)
+
+
+class RelationalModel(models.Model):
+ foreign_key = models.ForeignKey(ForeignKeyTarget)
+ many_to_many = models.ManyToManyField(ManyToManyTarget)
+ one_to_one = models.OneToOneField(OneToOneTarget)
+
+
+RELATIONAL_FLAT_REPR = """
+TestSerializer():
+ id = IntegerField(label='ID', read_only=True)
+ foreign_key = PrimaryKeyRelatedField(label='foreign key', queryset=<django.db.models.manager.Manager object>)
+ one_to_one = PrimaryKeyRelatedField(label='one to one', queryset=<django.db.models.manager.Manager object>)
+ many_to_many = PrimaryKeyRelatedField(label='many to many', many=True, queryset=<django.db.models.manager.Manager object>)
+""".strip()
+
+
+RELATIONAL_NESTED_REPR = """
+TestSerializer():
+ id = IntegerField(label='ID', read_only=True)
+ foreign_key = NestedModelSerializer(read_only=True):
+ id = IntegerField(label='ID', read_only=True)
+ name = CharField(label='name', max_length=100)
+ one_to_one = NestedModelSerializer(read_only=True):
+ id = IntegerField(label='ID', read_only=True)
+ name = CharField(label='name', max_length=100)
+ many_to_many = NestedModelSerializer(many=True, read_only=True):
+ id = IntegerField(label='ID', read_only=True)
+ name = CharField(label='name', max_length=100)
+""".strip()
+
+
+HYPERLINKED_FLAT_REPR = """
+TestSerializer():
+ url = HyperlinkedIdentityField(view_name='relationalmodel-detail')
+ foreign_key = HyperlinkedRelatedField(label='foreign key', queryset=<django.db.models.manager.Manager object>, view_name='foreignkeytarget-detail')
+ one_to_one = HyperlinkedRelatedField(label='one to one', queryset=<django.db.models.manager.Manager object>, view_name='onetoonetarget-detail')
+ many_to_many = HyperlinkedRelatedField(label='many to many', many=True, queryset=<django.db.models.manager.Manager object>, view_name='manytomanytarget-detail')
+""".strip()
+
+
+HYPERLINKED_NESTED_REPR = """
+TestSerializer():
+ url = HyperlinkedIdentityField(view_name='relationalmodel-detail')
+ foreign_key = NestedModelSerializer(read_only=True):
+ id = IntegerField(label='ID', read_only=True)
+ name = CharField(label='name', max_length=100)
+ one_to_one = NestedModelSerializer(read_only=True):
+ id = IntegerField(label='ID', read_only=True)
+ name = CharField(label='name', max_length=100)
+ many_to_many = NestedModelSerializer(many=True, read_only=True):
+ id = IntegerField(label='ID', read_only=True)
+ name = CharField(label='name', max_length=100)
+""".strip()
+
+
+class TestSerializerMappings(TestCase):
+ def test_regular_fields(self):
+ class TestSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = RegularFieldsModel
+ self.assertEqual(repr(TestSerializer()), REGULAR_FIELDS_REPR)
+
+ def test_flat_relational_fields(self):
+ class TestSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = RelationalModel
+ self.assertEqual(repr(TestSerializer()), RELATIONAL_FLAT_REPR)
+
+ def test_nested_relational_fields(self):
+ class TestSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = RelationalModel
+ depth = 1
+ self.assertEqual(repr(TestSerializer()), RELATIONAL_NESTED_REPR)
+
+ def test_flat_hyperlinked_fields(self):
+ class TestSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = RelationalModel
+ self.assertEqual(repr(TestSerializer()), HYPERLINKED_FLAT_REPR)
+
+ def test_nested_hyperlinked_fields(self):
+ class TestSerializer(serializers.HyperlinkedModelSerializer):
+ class Meta:
+ model = RelationalModel
+ depth = 1
+ self.assertEqual(repr(TestSerializer()), HYPERLINKED_NESTED_REPR)
diff --git a/tests/test_serializers.py b/tests/test_modelinfo.py
index 31c41730..254a33c9 100644
--- a/tests/test_serializers.py
+++ b/tests/test_modelinfo.py
@@ -1,6 +1,6 @@
from django.test import TestCase
from django.utils import six
-from rest_framework.serializers import _resolve_model
+from rest_framework.utils.modelinfo import _resolve_model
from tests.models import BasicModel
diff --git a/tests/test_relations.py b/tests/test_relations.py
index a30b12e6..b1bc66b6 100644
--- a/tests/test_relations.py
+++ b/tests/test_relations.py
@@ -22,18 +22,18 @@
# https://github.com/tomchristie/django-rest-framework/issues/446
# """
# field = serializers.PrimaryKeyRelatedField(queryset=NullModel.objects.all())
-# self.assertRaises(serializers.ValidationError, field.from_native, '')
-# self.assertRaises(serializers.ValidationError, field.from_native, [])
+# self.assertRaises(serializers.ValidationError, field.to_primative, '')
+# self.assertRaises(serializers.ValidationError, field.to_primative, [])
# def test_hyperlinked_related_field_with_empty_string(self):
# field = serializers.HyperlinkedRelatedField(queryset=NullModel.objects.all(), view_name='')
-# self.assertRaises(serializers.ValidationError, field.from_native, '')
-# self.assertRaises(serializers.ValidationError, field.from_native, [])
+# self.assertRaises(serializers.ValidationError, field.to_primative, '')
+# self.assertRaises(serializers.ValidationError, field.to_primative, [])
# def test_slug_related_field_with_empty_string(self):
# field = serializers.SlugRelatedField(queryset=NullModel.objects.all(), slug_field='pk')
-# self.assertRaises(serializers.ValidationError, field.from_native, '')
-# self.assertRaises(serializers.ValidationError, field.from_native, [])
+# self.assertRaises(serializers.ValidationError, field.to_primative, '')
+# self.assertRaises(serializers.ValidationError, field.to_primative, [])
# class TestManyRelatedMixin(TestCase):
diff --git a/tests/test_serializer_empty.py b/tests/test_serializer_empty.py
index d0006ad3..4e4a7b42 100644
--- a/tests/test_serializer_empty.py
+++ b/tests/test_serializer_empty.py
@@ -6,7 +6,7 @@
# def test_empty_serializer(self):
# class FooBarSerializer(serializers.Serializer):
# foo = serializers.IntegerField()
-# bar = serializers.SerializerMethodField('get_bar')
+# bar = serializers.MethodField()
# def get_bar(self, obj):
# return 'bar'