diff options
| author | Tom Christie | 2014-09-02 17:41:23 +0100 | 
|---|---|---|
| committer | Tom Christie | 2014-09-02 17:41:23 +0100 | 
| commit | f2852811f93863f2eed04d51eeb7ef27716b2409 (patch) | |
| tree | 45799932849f81d45d77edc53cb00269465ba0f1 /tests/test_relations_hyperlink.py | |
| parent | ec096a1caceff6a4f5c75a152dd1c7bea9ed281d (diff) | |
| download | django-rest-framework-f2852811f93863f2eed04d51eeb7ef27716b2409.tar.bz2 | |
Getting tests passing
Diffstat (limited to 'tests/test_relations_hyperlink.py')
| -rw-r--r-- | tests/test_relations_hyperlink.py | 1050 | 
1 files changed, 525 insertions, 525 deletions
| diff --git a/tests/test_relations_hyperlink.py b/tests/test_relations_hyperlink.py index 0c8eb254..315d1abf 100644 --- a/tests/test_relations_hyperlink.py +++ b/tests/test_relations_hyperlink.py @@ -1,525 +1,525 @@ -from __future__ import unicode_literals -from django.conf.urls import patterns, url -from django.test import TestCase -from rest_framework import serializers -from rest_framework.test import APIRequestFactory -from tests.models import ( -    BlogPost, -    ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, -    NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource -) - -factory = APIRequestFactory() -request = factory.get('/')  # Just to ensure we have a request in the serializer context - - -def dummy_view(request, pk): -    pass - -urlpatterns = patterns( -    '', -    url(r'^dummyurl/(?P<pk>[0-9]+)/$', dummy_view, name='dummy-url'), -    url(r'^manytomanysource/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanysource-detail'), -    url(r'^manytomanytarget/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanytarget-detail'), -    url(r'^foreignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeysource-detail'), -    url(r'^foreignkeytarget/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeytarget-detail'), -    url(r'^nullableforeignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableforeignkeysource-detail'), -    url(r'^onetoonetarget/(?P<pk>[0-9]+)/$', dummy_view, name='onetoonetarget-detail'), -    url(r'^nullableonetoonesource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableonetoonesource-detail'), -) - - -# ManyToMany -class ManyToManyTargetSerializer(serializers.HyperlinkedModelSerializer): -    class Meta: -        model = ManyToManyTarget -        fields = ('url', 'name', 'sources') - - -class ManyToManySourceSerializer(serializers.HyperlinkedModelSerializer): -    class Meta: -        model = ManyToManySource -        fields = ('url', 'name', 'targets') - - -# ForeignKey -class ForeignKeyTargetSerializer(serializers.HyperlinkedModelSerializer): -    class Meta: -        model = ForeignKeyTarget -        fields = ('url', 'name', 'sources') - - -class ForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): -    class Meta: -        model = ForeignKeySource -        fields = ('url', 'name', 'target') - - -# Nullable ForeignKey -class NullableForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): -    class Meta: -        model = NullableForeignKeySource -        fields = ('url', 'name', 'target') - - -# Nullable OneToOne -class NullableOneToOneTargetSerializer(serializers.HyperlinkedModelSerializer): -    class Meta: -        model = OneToOneTarget -        fields = ('url', 'name', 'nullable_source') - - -# TODO: Add test that .data cannot be accessed prior to .is_valid - -class HyperlinkedManyToManyTests(TestCase): -    urls = 'tests.test_relations_hyperlink' - -    def setUp(self): -        for idx in range(1, 4): -            target = ManyToManyTarget(name='target-%d' % idx) -            target.save() -            source = ManyToManySource(name='source-%d' % idx) -            source.save() -            for target in ManyToManyTarget.objects.all(): -                source.targets.add(target) - -    def test_many_to_many_retrieve(self): -        queryset = ManyToManySource.objects.all() -        serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, -            {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, -            {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_reverse_many_to_many_retrieve(self): -        queryset = ManyToManyTarget.objects.all() -        serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, -            {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, -            {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_many_to_many_update(self): -        data = {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} -        instance = ManyToManySource.objects.get(pk=1) -        serializer = ManyToManySourceSerializer(instance, data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        serializer.save() -        self.assertEqual(serializer.data, data) - -        # Ensure source 1 is updated, and everything else is as expected -        queryset = ManyToManySource.objects.all() -        serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, -            {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, -            {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_reverse_many_to_many_update(self): -        data = {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']} -        instance = ManyToManyTarget.objects.get(pk=1) -        serializer = ManyToManyTargetSerializer(instance, data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        serializer.save() -        self.assertEqual(serializer.data, data) - -        # Ensure target 1 is updated, and everything else is as expected -        queryset = ManyToManyTarget.objects.all() -        serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']}, -            {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, -            {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} - -        ] -        self.assertEqual(serializer.data, expected) - -    def test_many_to_many_create(self): -        data = {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} -        serializer = ManyToManySourceSerializer(data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        obj = serializer.save() -        self.assertEqual(serializer.data, data) -        self.assertEqual(obj.name, 'source-4') - -        # Ensure source 4 is added, and everything else is as expected -        queryset = ManyToManySource.objects.all() -        serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, -            {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, -            {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, -            {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_reverse_many_to_many_create(self): -        data = {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} -        serializer = ManyToManyTargetSerializer(data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        obj = serializer.save() -        self.assertEqual(serializer.data, data) -        self.assertEqual(obj.name, 'target-4') - -        # Ensure target 4 is added, and everything else is as expected -        queryset = ManyToManyTarget.objects.all() -        serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, -            {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, -            {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']}, -            {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} -        ] -        self.assertEqual(serializer.data, expected) - - -class HyperlinkedForeignKeyTests(TestCase): -    urls = 'tests.test_relations_hyperlink' - -    def setUp(self): -        target = ForeignKeyTarget(name='target-1') -        target.save() -        new_target = ForeignKeyTarget(name='target-2') -        new_target.save() -        for idx in range(1, 4): -            source = ForeignKeySource(name='source-%d' % idx, target=target) -            source.save() - -    def test_foreign_key_retrieve(self): -        queryset = ForeignKeySource.objects.all() -        serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_reverse_foreign_key_retrieve(self): -        queryset = ForeignKeyTarget.objects.all() -        serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, -            {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_update(self): -        data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'} -        instance = ForeignKeySource.objects.get(pk=1) -        serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        self.assertEqual(serializer.data, data) -        serializer.save() - -        # Ensure source 1 is updated, and everything else is as expected -        queryset = ForeignKeySource.objects.all() -        serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'}, -            {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_update_incorrect_type(self): -        data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 2} -        instance = ForeignKeySource.objects.get(pk=1) -        serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) -        self.assertFalse(serializer.is_valid()) -        self.assertEqual(serializer.errors, {'target': ['Incorrect type.  Expected url string, received int.']}) - -    def test_reverse_foreign_key_update(self): -        data = {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} -        instance = ForeignKeyTarget.objects.get(pk=2) -        serializer = ForeignKeyTargetSerializer(instance, data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        # We shouldn't have saved anything to the db yet since save -        # hasn't been called. -        queryset = ForeignKeyTarget.objects.all() -        new_serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, -            {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, -        ] -        self.assertEqual(new_serializer.data, expected) - -        serializer.save() -        self.assertEqual(serializer.data, data) - -        # Ensure target 2 is update, and everything else is as expected -        queryset = ForeignKeyTarget.objects.all() -        serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, -            {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_create(self): -        data = {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'} -        serializer = ForeignKeySourceSerializer(data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        obj = serializer.save() -        self.assertEqual(serializer.data, data) -        self.assertEqual(obj.name, 'source-4') - -        # Ensure source 1 is updated, and everything else is as expected -        queryset = ForeignKeySource.objects.all() -        serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'}, -        ] -        self.assertEqual(serializer.data, expected) - -    def test_reverse_foreign_key_create(self): -        data = {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} -        serializer = ForeignKeyTargetSerializer(data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        obj = serializer.save() -        self.assertEqual(serializer.data, data) -        self.assertEqual(obj.name, 'target-3') - -        # Ensure target 4 is added, and everything else is as expected -        queryset = ForeignKeyTarget.objects.all() -        serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, -            {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, -            {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_update_with_invalid_null(self): -        data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': None} -        instance = ForeignKeySource.objects.get(pk=1) -        serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) -        self.assertFalse(serializer.is_valid()) -        self.assertEqual(serializer.errors, {'target': ['This field is required.']}) - - -class HyperlinkedNullableForeignKeyTests(TestCase): -    urls = 'tests.test_relations_hyperlink' - -    def setUp(self): -        target = ForeignKeyTarget(name='target-1') -        target.save() -        for idx in range(1, 4): -            if idx == 3: -                target = None -            source = NullableForeignKeySource(name='source-%d' % idx, target=target) -            source.save() - -    def test_foreign_key_retrieve_with_null(self): -        queryset = NullableForeignKeySource.objects.all() -        serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_create_with_valid_null(self): -        data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} -        serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        obj = serializer.save() -        self.assertEqual(serializer.data, data) -        self.assertEqual(obj.name, 'source-4') - -        # Ensure source 4 is created, and everything else is as expected -        queryset = NullableForeignKeySource.objects.all() -        serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, -            {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_create_with_valid_emptystring(self): -        """ -        The emptystring should be interpreted as null in the context -        of relationships. -        """ -        data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': ''} -        expected_data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} -        serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        obj = serializer.save() -        self.assertEqual(serializer.data, expected_data) -        self.assertEqual(obj.name, 'source-4') - -        # Ensure source 4 is created, and everything else is as expected -        queryset = NullableForeignKeySource.objects.all() -        serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, -            {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_update_with_valid_null(self): -        data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} -        instance = NullableForeignKeySource.objects.get(pk=1) -        serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        self.assertEqual(serializer.data, data) -        serializer.save() - -        # Ensure source 1 is updated, and everything else is as expected -        queryset = NullableForeignKeySource.objects.all() -        serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, -            {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, -        ] -        self.assertEqual(serializer.data, expected) - -    def test_foreign_key_update_with_valid_emptystring(self): -        """ -        The emptystring should be interpreted as null in the context -        of relationships. -        """ -        data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': ''} -        expected_data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} -        instance = NullableForeignKeySource.objects.get(pk=1) -        serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) -        self.assertTrue(serializer.is_valid()) -        self.assertEqual(serializer.data, expected_data) -        serializer.save() - -        # Ensure source 1 is updated, and everything else is as expected -        queryset = NullableForeignKeySource.objects.all() -        serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, -            {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, -            {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, -        ] -        self.assertEqual(serializer.data, expected) - -    # reverse foreign keys MUST be read_only -    # In the general case they do not provide .remove() or .clear() -    # and cannot be arbitrarily set. - -    # def test_reverse_foreign_key_update(self): -    #     data = {'id': 1, 'name': 'target-1', 'sources': [1]} -    #     instance = ForeignKeyTarget.objects.get(pk=1) -    #     serializer = ForeignKeyTargetSerializer(instance, data=data) -    #     self.assertTrue(serializer.is_valid()) -    #     self.assertEqual(serializer.data, data) -    #     serializer.save() - -    #     # Ensure target 1 is updated, and everything else is as expected -    #     queryset = ForeignKeyTarget.objects.all() -    #     serializer = ForeignKeyTargetSerializer(queryset, many=True) -    #     expected = [ -    #         {'id': 1, 'name': 'target-1', 'sources': [1]}, -    #         {'id': 2, 'name': 'target-2', 'sources': []}, -    #     ] -    #     self.assertEqual(serializer.data, expected) - - -class HyperlinkedNullableOneToOneTests(TestCase): -    urls = 'tests.test_relations_hyperlink' - -    def setUp(self): -        target = OneToOneTarget(name='target-1') -        target.save() -        new_target = OneToOneTarget(name='target-2') -        new_target.save() -        source = NullableOneToOneSource(name='source-1', target=target) -        source.save() - -    def test_reverse_foreign_key_retrieve_with_null(self): -        queryset = OneToOneTarget.objects.all() -        serializer = NullableOneToOneTargetSerializer(queryset, many=True, context={'request': request}) -        expected = [ -            {'url': 'http://testserver/onetoonetarget/1/', 'name': 'target-1', 'nullable_source': 'http://testserver/nullableonetoonesource/1/'}, -            {'url': 'http://testserver/onetoonetarget/2/', 'name': 'target-2', 'nullable_source': None}, -        ] -        self.assertEqual(serializer.data, expected) - - -# Regression tests for #694 (`source` attribute on related fields) - -class HyperlinkedRelatedFieldSourceTests(TestCase): -    urls = 'tests.test_relations_hyperlink' - -    def test_related_manager_source(self): -        """ -        Relational fields should be able to use manager-returning methods as their source. -        """ -        BlogPost.objects.create(title='blah') -        field = serializers.HyperlinkedRelatedField( -            many=True, -            source='get_blogposts_manager', -            view_name='dummy-url', -        ) -        field.context = {'request': request} - -        class ClassWithManagerMethod(object): -            def get_blogposts_manager(self): -                return BlogPost.objects - -        obj = ClassWithManagerMethod() -        value = field.field_to_native(obj, 'field_name') -        self.assertEqual(value, ['http://testserver/dummyurl/1/']) - -    def test_related_queryset_source(self): -        """ -        Relational fields should be able to use queryset-returning methods as their source. -        """ -        BlogPost.objects.create(title='blah') -        field = serializers.HyperlinkedRelatedField( -            many=True, -            source='get_blogposts_queryset', -            view_name='dummy-url', -        ) -        field.context = {'request': request} - -        class ClassWithQuerysetMethod(object): -            def get_blogposts_queryset(self): -                return BlogPost.objects.all() - -        obj = ClassWithQuerysetMethod() -        value = field.field_to_native(obj, 'field_name') -        self.assertEqual(value, ['http://testserver/dummyurl/1/']) - -    def test_dotted_source(self): -        """ -        Source argument should support dotted.source notation. -        """ -        BlogPost.objects.create(title='blah') -        field = serializers.HyperlinkedRelatedField( -            many=True, -            source='a.b.c', -            view_name='dummy-url', -        ) -        field.context = {'request': request} - -        class ClassWithQuerysetMethod(object): -            a = { -                'b': { -                    'c': BlogPost.objects.all() -                } -            } - -        obj = ClassWithQuerysetMethod() -        value = field.field_to_native(obj, 'field_name') -        self.assertEqual(value, ['http://testserver/dummyurl/1/']) +# from __future__ import unicode_literals +# from django.conf.urls import patterns, url +# from django.test import TestCase +# from rest_framework import serializers +# from rest_framework.test import APIRequestFactory +# from tests.models import ( +#     BlogPost, +#     ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, +#     NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource +# ) + +# factory = APIRequestFactory() +# request = factory.get('/')  # Just to ensure we have a request in the serializer context + + +# def dummy_view(request, pk): +#     pass + +# urlpatterns = patterns( +#     '', +#     url(r'^dummyurl/(?P<pk>[0-9]+)/$', dummy_view, name='dummy-url'), +#     url(r'^manytomanysource/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanysource-detail'), +#     url(r'^manytomanytarget/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanytarget-detail'), +#     url(r'^foreignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeysource-detail'), +#     url(r'^foreignkeytarget/(?P<pk>[0-9]+)/$', dummy_view, name='foreignkeytarget-detail'), +#     url(r'^nullableforeignkeysource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableforeignkeysource-detail'), +#     url(r'^onetoonetarget/(?P<pk>[0-9]+)/$', dummy_view, name='onetoonetarget-detail'), +#     url(r'^nullableonetoonesource/(?P<pk>[0-9]+)/$', dummy_view, name='nullableonetoonesource-detail'), +# ) + + +# # ManyToMany +# class ManyToManyTargetSerializer(serializers.HyperlinkedModelSerializer): +#     class Meta: +#         model = ManyToManyTarget +#         fields = ('url', 'name', 'sources') + + +# class ManyToManySourceSerializer(serializers.HyperlinkedModelSerializer): +#     class Meta: +#         model = ManyToManySource +#         fields = ('url', 'name', 'targets') + + +# # ForeignKey +# class ForeignKeyTargetSerializer(serializers.HyperlinkedModelSerializer): +#     class Meta: +#         model = ForeignKeyTarget +#         fields = ('url', 'name', 'sources') + + +# class ForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): +#     class Meta: +#         model = ForeignKeySource +#         fields = ('url', 'name', 'target') + + +# # Nullable ForeignKey +# class NullableForeignKeySourceSerializer(serializers.HyperlinkedModelSerializer): +#     class Meta: +#         model = NullableForeignKeySource +#         fields = ('url', 'name', 'target') + + +# # Nullable OneToOne +# class NullableOneToOneTargetSerializer(serializers.HyperlinkedModelSerializer): +#     class Meta: +#         model = OneToOneTarget +#         fields = ('url', 'name', 'nullable_source') + + +# # TODO: Add test that .data cannot be accessed prior to .is_valid + +# class HyperlinkedManyToManyTests(TestCase): +#     urls = 'tests.test_relations_hyperlink' + +#     def setUp(self): +#         for idx in range(1, 4): +#             target = ManyToManyTarget(name='target-%d' % idx) +#             target.save() +#             source = ManyToManySource(name='source-%d' % idx) +#             source.save() +#             for target in ManyToManyTarget.objects.all(): +#                 source.targets.add(target) + +#     def test_many_to_many_retrieve(self): +#         queryset = ManyToManySource.objects.all() +#         serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, +#             {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, +#             {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_reverse_many_to_many_retrieve(self): +#         queryset = ManyToManyTarget.objects.all() +#         serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, +#             {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, +#             {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_many_to_many_update(self): +#         data = {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} +#         instance = ManyToManySource.objects.get(pk=1) +#         serializer = ManyToManySourceSerializer(instance, data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         serializer.save() +#         self.assertEqual(serializer.data, data) + +#         # Ensure source 1 is updated, and everything else is as expected +#         queryset = ManyToManySource.objects.all() +#         serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, +#             {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, +#             {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_reverse_many_to_many_update(self): +#         data = {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']} +#         instance = ManyToManyTarget.objects.get(pk=1) +#         serializer = ManyToManyTargetSerializer(instance, data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         serializer.save() +#         self.assertEqual(serializer.data, data) + +#         # Ensure target 1 is updated, and everything else is as expected +#         queryset = ManyToManyTarget.objects.all() +#         serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/']}, +#             {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, +#             {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']} + +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_many_to_many_create(self): +#         data = {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} +#         serializer = ManyToManySourceSerializer(data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         obj = serializer.save() +#         self.assertEqual(serializer.data, data) +#         self.assertEqual(obj.name, 'source-4') + +#         # Ensure source 4 is added, and everything else is as expected +#         queryset = ManyToManySource.objects.all() +#         serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, +#             {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, +#             {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, +#             {'url': 'http://testserver/manytomanysource/4/', 'name': 'source-4', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/3/']} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_reverse_many_to_many_create(self): +#         data = {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} +#         serializer = ManyToManyTargetSerializer(data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         obj = serializer.save() +#         self.assertEqual(serializer.data, data) +#         self.assertEqual(obj.name, 'target-4') + +#         # Ensure target 4 is added, and everything else is as expected +#         queryset = ManyToManyTarget.objects.all() +#         serializer = ManyToManyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/manytomanytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, +#             {'url': 'http://testserver/manytomanytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/manytomanysource/2/', 'http://testserver/manytomanysource/3/']}, +#             {'url': 'http://testserver/manytomanytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/manytomanysource/3/']}, +#             {'url': 'http://testserver/manytomanytarget/4/', 'name': 'target-4', 'sources': ['http://testserver/manytomanysource/1/', 'http://testserver/manytomanysource/3/']} +#         ] +#         self.assertEqual(serializer.data, expected) + + +# class HyperlinkedForeignKeyTests(TestCase): +#     urls = 'tests.test_relations_hyperlink' + +#     def setUp(self): +#         target = ForeignKeyTarget(name='target-1') +#         target.save() +#         new_target = ForeignKeyTarget(name='target-2') +#         new_target.save() +#         for idx in range(1, 4): +#             source = ForeignKeySource(name='source-%d' % idx, target=target) +#             source.save() + +#     def test_foreign_key_retrieve(self): +#         queryset = ForeignKeySource.objects.all() +#         serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_reverse_foreign_key_retrieve(self): +#         queryset = ForeignKeyTarget.objects.all() +#         serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, +#             {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_update(self): +#         data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'} +#         instance = ForeignKeySource.objects.get(pk=1) +#         serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         self.assertEqual(serializer.data, data) +#         serializer.save() + +#         # Ensure source 1 is updated, and everything else is as expected +#         queryset = ForeignKeySource.objects.all() +#         serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/2/'}, +#             {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_update_incorrect_type(self): +#         data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 2} +#         instance = ForeignKeySource.objects.get(pk=1) +#         serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) +#         self.assertFalse(serializer.is_valid()) +#         self.assertEqual(serializer.errors, {'target': ['Incorrect type.  Expected url string, received int.']}) + +#     def test_reverse_foreign_key_update(self): +#         data = {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} +#         instance = ForeignKeyTarget.objects.get(pk=2) +#         serializer = ForeignKeyTargetSerializer(instance, data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         # We shouldn't have saved anything to the db yet since save +#         # hasn't been called. +#         queryset = ForeignKeyTarget.objects.all() +#         new_serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/2/', 'http://testserver/foreignkeysource/3/']}, +#             {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, +#         ] +#         self.assertEqual(new_serializer.data, expected) + +#         serializer.save() +#         self.assertEqual(serializer.data, data) + +#         # Ensure target 2 is update, and everything else is as expected +#         queryset = ForeignKeyTarget.objects.all() +#         serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, +#             {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_create(self): +#         data = {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'} +#         serializer = ForeignKeySourceSerializer(data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         obj = serializer.save() +#         self.assertEqual(serializer.data, data) +#         self.assertEqual(obj.name, 'source-4') + +#         # Ensure source 1 is updated, and everything else is as expected +#         queryset = ForeignKeySource.objects.all() +#         serializer = ForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/foreignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/foreignkeysource/3/', 'name': 'source-3', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/foreignkeysource/4/', 'name': 'source-4', 'target': 'http://testserver/foreignkeytarget/2/'}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_reverse_foreign_key_create(self): +#         data = {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']} +#         serializer = ForeignKeyTargetSerializer(data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         obj = serializer.save() +#         self.assertEqual(serializer.data, data) +#         self.assertEqual(obj.name, 'target-3') + +#         # Ensure target 4 is added, and everything else is as expected +#         queryset = ForeignKeyTarget.objects.all() +#         serializer = ForeignKeyTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/foreignkeytarget/1/', 'name': 'target-1', 'sources': ['http://testserver/foreignkeysource/2/']}, +#             {'url': 'http://testserver/foreignkeytarget/2/', 'name': 'target-2', 'sources': []}, +#             {'url': 'http://testserver/foreignkeytarget/3/', 'name': 'target-3', 'sources': ['http://testserver/foreignkeysource/1/', 'http://testserver/foreignkeysource/3/']}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_update_with_invalid_null(self): +#         data = {'url': 'http://testserver/foreignkeysource/1/', 'name': 'source-1', 'target': None} +#         instance = ForeignKeySource.objects.get(pk=1) +#         serializer = ForeignKeySourceSerializer(instance, data=data, context={'request': request}) +#         self.assertFalse(serializer.is_valid()) +#         self.assertEqual(serializer.errors, {'target': ['This field is required.']}) + + +# class HyperlinkedNullableForeignKeyTests(TestCase): +#     urls = 'tests.test_relations_hyperlink' + +#     def setUp(self): +#         target = ForeignKeyTarget(name='target-1') +#         target.save() +#         for idx in range(1, 4): +#             if idx == 3: +#                 target = None +#             source = NullableForeignKeySource(name='source-%d' % idx, target=target) +#             source.save() + +#     def test_foreign_key_retrieve_with_null(self): +#         queryset = NullableForeignKeySource.objects.all() +#         serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_create_with_valid_null(self): +#         data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} +#         serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         obj = serializer.save() +#         self.assertEqual(serializer.data, data) +#         self.assertEqual(obj.name, 'source-4') + +#         # Ensure source 4 is created, and everything else is as expected +#         queryset = NullableForeignKeySource.objects.all() +#         serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, +#             {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_create_with_valid_emptystring(self): +#         """ +#         The emptystring should be interpreted as null in the context +#         of relationships. +#         """ +#         data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': ''} +#         expected_data = {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} +#         serializer = NullableForeignKeySourceSerializer(data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         obj = serializer.save() +#         self.assertEqual(serializer.data, expected_data) +#         self.assertEqual(obj.name, 'source-4') + +#         # Ensure source 4 is created, and everything else is as expected +#         queryset = NullableForeignKeySource.objects.all() +#         serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, +#             {'url': 'http://testserver/nullableforeignkeysource/4/', 'name': 'source-4', 'target': None} +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_update_with_valid_null(self): +#         data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} +#         instance = NullableForeignKeySource.objects.get(pk=1) +#         serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         self.assertEqual(serializer.data, data) +#         serializer.save() + +#         # Ensure source 1 is updated, and everything else is as expected +#         queryset = NullableForeignKeySource.objects.all() +#         serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, +#             {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     def test_foreign_key_update_with_valid_emptystring(self): +#         """ +#         The emptystring should be interpreted as null in the context +#         of relationships. +#         """ +#         data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': ''} +#         expected_data = {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None} +#         instance = NullableForeignKeySource.objects.get(pk=1) +#         serializer = NullableForeignKeySourceSerializer(instance, data=data, context={'request': request}) +#         self.assertTrue(serializer.is_valid()) +#         self.assertEqual(serializer.data, expected_data) +#         serializer.save() + +#         # Ensure source 1 is updated, and everything else is as expected +#         queryset = NullableForeignKeySource.objects.all() +#         serializer = NullableForeignKeySourceSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/nullableforeignkeysource/1/', 'name': 'source-1', 'target': None}, +#             {'url': 'http://testserver/nullableforeignkeysource/2/', 'name': 'source-2', 'target': 'http://testserver/foreignkeytarget/1/'}, +#             {'url': 'http://testserver/nullableforeignkeysource/3/', 'name': 'source-3', 'target': None}, +#         ] +#         self.assertEqual(serializer.data, expected) + +#     # reverse foreign keys MUST be read_only +#     # In the general case they do not provide .remove() or .clear() +#     # and cannot be arbitrarily set. + +#     # def test_reverse_foreign_key_update(self): +#     #     data = {'id': 1, 'name': 'target-1', 'sources': [1]} +#     #     instance = ForeignKeyTarget.objects.get(pk=1) +#     #     serializer = ForeignKeyTargetSerializer(instance, data=data) +#     #     self.assertTrue(serializer.is_valid()) +#     #     self.assertEqual(serializer.data, data) +#     #     serializer.save() + +#     #     # Ensure target 1 is updated, and everything else is as expected +#     #     queryset = ForeignKeyTarget.objects.all() +#     #     serializer = ForeignKeyTargetSerializer(queryset, many=True) +#     #     expected = [ +#     #         {'id': 1, 'name': 'target-1', 'sources': [1]}, +#     #         {'id': 2, 'name': 'target-2', 'sources': []}, +#     #     ] +#     #     self.assertEqual(serializer.data, expected) + + +# class HyperlinkedNullableOneToOneTests(TestCase): +#     urls = 'tests.test_relations_hyperlink' + +#     def setUp(self): +#         target = OneToOneTarget(name='target-1') +#         target.save() +#         new_target = OneToOneTarget(name='target-2') +#         new_target.save() +#         source = NullableOneToOneSource(name='source-1', target=target) +#         source.save() + +#     def test_reverse_foreign_key_retrieve_with_null(self): +#         queryset = OneToOneTarget.objects.all() +#         serializer = NullableOneToOneTargetSerializer(queryset, many=True, context={'request': request}) +#         expected = [ +#             {'url': 'http://testserver/onetoonetarget/1/', 'name': 'target-1', 'nullable_source': 'http://testserver/nullableonetoonesource/1/'}, +#             {'url': 'http://testserver/onetoonetarget/2/', 'name': 'target-2', 'nullable_source': None}, +#         ] +#         self.assertEqual(serializer.data, expected) + + +# # Regression tests for #694 (`source` attribute on related fields) + +# class HyperlinkedRelatedFieldSourceTests(TestCase): +#     urls = 'tests.test_relations_hyperlink' + +#     def test_related_manager_source(self): +#         """ +#         Relational fields should be able to use manager-returning methods as their source. +#         """ +#         BlogPost.objects.create(title='blah') +#         field = serializers.HyperlinkedRelatedField( +#             many=True, +#             source='get_blogposts_manager', +#             view_name='dummy-url', +#         ) +#         field.context = {'request': request} + +#         class ClassWithManagerMethod(object): +#             def get_blogposts_manager(self): +#                 return BlogPost.objects + +#         obj = ClassWithManagerMethod() +#         value = field.field_to_native(obj, 'field_name') +#         self.assertEqual(value, ['http://testserver/dummyurl/1/']) + +#     def test_related_queryset_source(self): +#         """ +#         Relational fields should be able to use queryset-returning methods as their source. +#         """ +#         BlogPost.objects.create(title='blah') +#         field = serializers.HyperlinkedRelatedField( +#             many=True, +#             source='get_blogposts_queryset', +#             view_name='dummy-url', +#         ) +#         field.context = {'request': request} + +#         class ClassWithQuerysetMethod(object): +#             def get_blogposts_queryset(self): +#                 return BlogPost.objects.all() + +#         obj = ClassWithQuerysetMethod() +#         value = field.field_to_native(obj, 'field_name') +#         self.assertEqual(value, ['http://testserver/dummyurl/1/']) + +#     def test_dotted_source(self): +#         """ +#         Source argument should support dotted.source notation. +#         """ +#         BlogPost.objects.create(title='blah') +#         field = serializers.HyperlinkedRelatedField( +#             many=True, +#             source='a.b.c', +#             view_name='dummy-url', +#         ) +#         field.context = {'request': request} + +#         class ClassWithQuerysetMethod(object): +#             a = { +#                 'b': { +#                     'c': BlogPost.objects.all() +#                 } +#             } + +#         obj = ClassWithQuerysetMethod() +#         value = field.field_to_native(obj, 'field_name') +#         self.assertEqual(value, ['http://testserver/dummyurl/1/']) | 
