Fixed test cases

This commit is contained in:
Shil 2023-03-30 01:59:04 +02:00
parent f07ba5f528
commit fc08007df4
3 changed files with 49 additions and 3 deletions

View File

@ -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):

View File

@ -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')

View File

@ -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()