mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-23 14:40:06 +03:00
Fixed test cases
This commit is contained in:
parent
f07ba5f528
commit
fc08007df4
|
@ -72,6 +72,7 @@ class PKOnlyObject:
|
|||
instance, but still want to return an object with a .pk attribute,
|
||||
in order to keep the same interface as a regular model instance.
|
||||
"""
|
||||
|
||||
def __init__(self, pk):
|
||||
self.pk = pk
|
||||
|
||||
|
@ -469,7 +470,7 @@ class SlugRelatedField(RelatedField):
|
|||
if "__" in slug:
|
||||
# handling nested relationship defined by double underscore
|
||||
slug = slug.replace('__', '.')
|
||||
return attrgetter(obj, slug)
|
||||
return attrgetter(slug)(obj)
|
||||
|
||||
|
||||
class ManyRelatedField(Field):
|
||||
|
|
|
@ -304,7 +304,7 @@ class TestSlugRelatedField(APISimpleTestCase):
|
|||
self.queryset = MockQueryset([
|
||||
MockObject(pk=1, name='foo'),
|
||||
MockObject(pk=2, name='bar'),
|
||||
MockObject(pk=3, name='baz')
|
||||
MockObject(pk=3, name='baz'),
|
||||
])
|
||||
self.instance = self.queryset.items[2]
|
||||
self.field = serializers.SlugRelatedField(
|
||||
|
@ -342,6 +342,49 @@ class TestSlugRelatedField(APISimpleTestCase):
|
|||
field.to_internal_value(self.instance.name)
|
||||
|
||||
|
||||
class TestNestedSlugRelatedField(APISimpleTestCase):
|
||||
def setUp(self):
|
||||
self.queryset = MockQueryset([
|
||||
MockObject(pk=1, name='foo', nested=MockObject(pk=2, name='bar')),
|
||||
MockObject(pk=3, name='hello', nested=MockObject(pk=4, name='world')),
|
||||
MockObject(pk=3, name='harry', nested=MockObject(pk=4, name='potter'))
|
||||
])
|
||||
self.instance = self.queryset.items[2]
|
||||
self.field = serializers.SlugRelatedField(
|
||||
slug_field='nested__name', queryset=self.queryset
|
||||
)
|
||||
|
||||
def test_slug_related_lookup_exists(self):
|
||||
instance = self.field.to_internal_value(self.instance.nested.name)
|
||||
assert instance is self.instance
|
||||
|
||||
def test_slug_related_lookup_does_not_exist(self):
|
||||
with pytest.raises(serializers.ValidationError) as excinfo:
|
||||
self.field.to_internal_value('doesnotexist')
|
||||
msg = excinfo.value.detail[0]
|
||||
assert msg == 'Object with nested__name=doesnotexist does not exist.'
|
||||
|
||||
def test_slug_related_lookup_invalid_type(self):
|
||||
with pytest.raises(serializers.ValidationError) as excinfo:
|
||||
self.field.to_internal_value(BadType())
|
||||
msg = excinfo.value.detail[0]
|
||||
assert msg == 'Invalid value.'
|
||||
|
||||
def test_representation(self):
|
||||
representation = self.field.to_representation(self.instance)
|
||||
assert representation == self.instance.nested.name
|
||||
|
||||
def test_overriding_get_queryset(self):
|
||||
qs = self.queryset
|
||||
|
||||
class NoQuerySetSlugRelatedField(serializers.SlugRelatedField):
|
||||
def get_queryset(self):
|
||||
return qs
|
||||
|
||||
field = NoQuerySetSlugRelatedField(slug_field='nested__name')
|
||||
field.to_internal_value(self.instance.nested.name)
|
||||
|
||||
|
||||
class TestManyRelatedField(APISimpleTestCase):
|
||||
def setUp(self):
|
||||
self.instance = MockObject(pk=1, name='foo')
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from operator import attrgetter
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.urls import NoReverseMatch
|
||||
|
||||
|
@ -26,7 +27,7 @@ class MockQueryset:
|
|||
def get(self, **lookup):
|
||||
for item in self.items:
|
||||
if all([
|
||||
getattr(item, key, None) == value
|
||||
attrgetter(key.replace('__', '.'))(item) == value
|
||||
for key, value in lookup.items()
|
||||
]):
|
||||
return item
|
||||
|
@ -39,6 +40,7 @@ class BadType:
|
|||
will raise a `TypeError`, as occurs in Django when making
|
||||
queryset lookups with an incorrect type for the lookup value.
|
||||
"""
|
||||
|
||||
def __eq__(self):
|
||||
raise TypeError()
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user