mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-27 16:40:03 +03:00
Added tests for OneToOne slugfield to demonstrate #5996
This commit is contained in:
parent
e17779c47b
commit
8990db91f1
|
@ -2,7 +2,8 @@ from django.test import TestCase
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from tests.models import (
|
from tests.models import (
|
||||||
ForeignKeySource, ForeignKeyTarget, NullableForeignKeySource
|
ForeignKeySource, ForeignKeyTarget, NullableForeignKeySource,
|
||||||
|
NullableOneToOneSource, OneToOneTarget
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,6 +42,30 @@ class NullableForeignKeySourceSerializer(serializers.ModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
class NullableOneToOneSourceSerializer(serializers.ModelSerializer):
|
||||||
|
target = serializers.SlugRelatedField(
|
||||||
|
slug_field='name',
|
||||||
|
queryset=OneToOneTarget.objects.all(),
|
||||||
|
allow_null=True
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = NullableOneToOneSource
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
class OneToOneTargetSerializer(serializers.ModelSerializer):
|
||||||
|
nullable_source = serializers.SlugRelatedField(
|
||||||
|
slug_field='name',
|
||||||
|
queryset=NullableOneToOneSource.objects.all(),
|
||||||
|
allow_null=True
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = OneToOneTarget
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
# TODO: M2M Tests, FKTests (Non-nullable), One2One
|
# TODO: M2M Tests, FKTests (Non-nullable), One2One
|
||||||
class SlugForeignKeyTests(TestCase):
|
class SlugForeignKeyTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -285,3 +310,49 @@ class SlugNullableForeignKeyTests(TestCase):
|
||||||
{'id': 3, 'name': 'source-3', 'target': None}
|
{'id': 3, 'name': 'source-3', 'target': None}
|
||||||
]
|
]
|
||||||
assert serializer.data == expected
|
assert serializer.data == expected
|
||||||
|
|
||||||
|
|
||||||
|
class SlugNullableOneToOneTests(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
target = OneToOneTarget(name='target-1')
|
||||||
|
target.save()
|
||||||
|
source = NullableOneToOneSource(name='source-1', target=None)
|
||||||
|
source.save()
|
||||||
|
|
||||||
|
def test_one_to_one_correctly_updated(self):
|
||||||
|
data = {'id': 1, 'name': 'source-1', 'target': 'target-1'}
|
||||||
|
instance = NullableOneToOneSource.objects.get(pk=1)
|
||||||
|
|
||||||
|
serializer = NullableOneToOneSourceSerializer(instance, data=data)
|
||||||
|
assert serializer.is_valid()
|
||||||
|
serializer.save()
|
||||||
|
|
||||||
|
assert serializer.data == data
|
||||||
|
|
||||||
|
# also check if the data has been saved to the database
|
||||||
|
instance.refresh_from_db()
|
||||||
|
assert instance.target.name == "target-1"
|
||||||
|
|
||||||
|
# see if the reverse relation was updated
|
||||||
|
instance = OneToOneTarget.objects.get(pk=1)
|
||||||
|
serializer = OneToOneTargetSerializer(instance)
|
||||||
|
assert serializer.data['nullable_source'] == 'source-1'
|
||||||
|
|
||||||
|
def test_one_to_one_reverse_correctly_updated(self):
|
||||||
|
data = {'id': 1, 'name': 'target-1', 'nullable_source': 'source-1'}
|
||||||
|
instance = OneToOneTarget.objects.get(pk=1)
|
||||||
|
|
||||||
|
serializer = OneToOneTargetSerializer(instance, data=data)
|
||||||
|
assert serializer.is_valid()
|
||||||
|
serializer.save()
|
||||||
|
|
||||||
|
# the serializer says it updated the nullable_source field
|
||||||
|
assert serializer.data == data
|
||||||
|
assert serializer.data['nullable_source'] == 'source-1'
|
||||||
|
|
||||||
|
# and it even says the instance is there:
|
||||||
|
assert serializer.instance.nullable_source
|
||||||
|
|
||||||
|
# but it was not saved in the database
|
||||||
|
instance.refresh_from_db()
|
||||||
|
assert instance.nullable_source
|
||||||
|
|
Loading…
Reference in New Issue
Block a user