diff options
| author | Tom Christie | 2012-11-02 19:11:40 +0000 |
|---|---|---|
| committer | Tom Christie | 2012-11-02 19:11:40 +0000 |
| commit | e84ce60a0da77c0e07e0d6e5f627694ae3f4422f (patch) | |
| tree | ee73e7a8f69d817ded27b740e2fddd716f8ba41b /rest_framework/tests/pk_relations.py | |
| parent | b9bff2a984767c4258cad4860addc53a9623bb11 (diff) | |
| download | django-rest-framework-e84ce60a0da77c0e07e0d6e5f627694ae3f4422f.tar.bz2 | |
Initial PK relationship tests
Diffstat (limited to 'rest_framework/tests/pk_relations.py')
| -rw-r--r-- | rest_framework/tests/pk_relations.py | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/rest_framework/tests/pk_relations.py b/rest_framework/tests/pk_relations.py new file mode 100644 index 00000000..eca534c2 --- /dev/null +++ b/rest_framework/tests/pk_relations.py @@ -0,0 +1,86 @@ +from django.db import models +from django.test import TestCase +from rest_framework import serializers + + +class Target(models.Model): + name = models.CharField(max_length=100) + + +class Source(models.Model): + name = models.CharField(max_length=100) + targets = models.ManyToManyField(Target, related_name='sources') + + +class TargetSerializer(serializers.ModelSerializer): + sources = serializers.ManyPrimaryKeyRelatedField() + + class Meta: + fields = ('id', 'name', 'sources') + model = Target + + +class SourceSerializer(serializers.ModelSerializer): + class Meta: + model = Source + + +# TODO: Add test that .data cannot be accessed prior to .is_valid + +class PrimaryKeyManyToManyTests(TestCase): + def setUp(self): + for idx in range(1, 4): + target = Target(name='target-%d' % idx) + target.save() + source = Source(name='source-%d' % idx) + source.save() + for target in Target.objects.all(): + source.targets.add(target) + + def test_many_to_many_retrieve(self): + serializer = SourceSerializer(instance=Source.objects.all()) + expected = [ + {'id': 1, 'name': u'source-1', 'targets': [1]}, + {'id': 2, 'name': u'source-2', 'targets': [1, 2]}, + {'id': 3, 'name': u'source-3', 'targets': [1, 2, 3]} + ] + self.assertEquals(serializer.data, expected) + + def test_reverse_many_to_many_retrieve(self): + serializer = TargetSerializer(instance=Target.objects.all()) + expected = [ + {'id': 1, 'name': u'target-1', 'sources': [1, 2, 3]}, + {'id': 2, 'name': u'target-2', 'sources': [2, 3]}, + {'id': 3, 'name': u'target-3', 'sources': [3]} + ] + self.assertEquals(serializer.data, expected) + + def test_many_to_many_update(self): + data = {'id': 1, 'name': u'source-1', 'targets': [1, 2, 3]} + serializer = SourceSerializer(data, instance=Source.objects.get(pk=1)) + self.assertTrue(serializer.is_valid()) + self.assertEquals(serializer.data, data) + + # Ensure source 1 is updated, and everything else is as expected + serializer = SourceSerializer(instance=Source.objects.all()) + expected = [ + {'id': 1, 'name': u'source-1', 'targets': [1, 2, 3]}, + {'id': 2, 'name': u'source-2', 'targets': [1, 2]}, + {'id': 3, 'name': u'source-3', 'targets': [1, 2, 3]} + ] + self.assertEquals(serializer.data, expected) + + def test_reverse_many_to_many_update(self): + data = {'id': 1, 'name': u'target-0', 'sources': [1]} + serializer = TargetSerializer(data, instance=Target.objects.get(pk=1)) + self.assertTrue(serializer.is_valid()) + self.assertEquals(serializer.data, data) + + # Ensure target 1 is updated, and everything else is as expected + serializer = TargetSerializer(instance=Target.objects.all()) + expected = [ + {'id': 1, 'name': u'target-1', 'sources': [1]}, + {'id': 2, 'name': u'target-2', 'sources': [2, 3]}, + {'id': 3, 'name': u'target-3', 'sources': [3]} + ] + self.assertEquals(serializer.data, expected) |
