mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-23 22:49:50 +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,
|
instance, but still want to return an object with a .pk attribute,
|
||||||
in order to keep the same interface as a regular model instance.
|
in order to keep the same interface as a regular model instance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, pk):
|
def __init__(self, pk):
|
||||||
self.pk = pk
|
self.pk = pk
|
||||||
|
|
||||||
|
@ -469,7 +470,7 @@ class SlugRelatedField(RelatedField):
|
||||||
if "__" in slug:
|
if "__" in slug:
|
||||||
# handling nested relationship defined by double underscore
|
# handling nested relationship defined by double underscore
|
||||||
slug = slug.replace('__', '.')
|
slug = slug.replace('__', '.')
|
||||||
return attrgetter(obj, slug)
|
return attrgetter(slug)(obj)
|
||||||
|
|
||||||
|
|
||||||
class ManyRelatedField(Field):
|
class ManyRelatedField(Field):
|
||||||
|
|
|
@ -304,7 +304,7 @@ class TestSlugRelatedField(APISimpleTestCase):
|
||||||
self.queryset = MockQueryset([
|
self.queryset = MockQueryset([
|
||||||
MockObject(pk=1, name='foo'),
|
MockObject(pk=1, name='foo'),
|
||||||
MockObject(pk=2, name='bar'),
|
MockObject(pk=2, name='bar'),
|
||||||
MockObject(pk=3, name='baz')
|
MockObject(pk=3, name='baz'),
|
||||||
])
|
])
|
||||||
self.instance = self.queryset.items[2]
|
self.instance = self.queryset.items[2]
|
||||||
self.field = serializers.SlugRelatedField(
|
self.field = serializers.SlugRelatedField(
|
||||||
|
@ -342,6 +342,49 @@ class TestSlugRelatedField(APISimpleTestCase):
|
||||||
field.to_internal_value(self.instance.name)
|
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):
|
class TestManyRelatedField(APISimpleTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.instance = MockObject(pk=1, name='foo')
|
self.instance = MockObject(pk=1, name='foo')
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from operator import attrgetter
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.urls import NoReverseMatch
|
from django.urls import NoReverseMatch
|
||||||
|
|
||||||
|
@ -26,7 +27,7 @@ class MockQueryset:
|
||||||
def get(self, **lookup):
|
def get(self, **lookup):
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
if all([
|
if all([
|
||||||
getattr(item, key, None) == value
|
attrgetter(key.replace('__', '.'))(item) == value
|
||||||
for key, value in lookup.items()
|
for key, value in lookup.items()
|
||||||
]):
|
]):
|
||||||
return item
|
return item
|
||||||
|
@ -39,6 +40,7 @@ class BadType:
|
||||||
will raise a `TypeError`, as occurs in Django when making
|
will raise a `TypeError`, as occurs in Django when making
|
||||||
queryset lookups with an incorrect type for the lookup value.
|
queryset lookups with an incorrect type for the lookup value.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __eq__(self):
|
def __eq__(self):
|
||||||
raise TypeError()
|
raise TypeError()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user