From 518f6ebb572ec8a8cb7487e34d94ae7b9aa3427f Mon Sep 17 00:00:00 2001 From: Christofer Bertonha Date: Thu, 5 Mar 2015 20:12:31 -0300 Subject: [PATCH] Add test to MultipleSlugRelatedField --- rest_framework/relations.py | 2 +- tests/test_relations.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index aeec89de7..86a65636e 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -331,7 +331,7 @@ class MultipleSlugRelatedField(SlugRelatedField): return self.get_queryset().get(**dict(zip(self.slug_field, data.split(self.separator, len(self.slug_field))))) except ObjectDoesNotExist: self.fail('does_not_exist', slug_name=self.slug_field, value=smart_text(data)) - except (TypeError, ValueError): + except (TypeError, ValueError, AttributeError): self.fail('invalid') def to_representation(self, obj): diff --git a/tests/test_relations.py b/tests/test_relations.py index fbe176e24..c87d38f50 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,3 +1,4 @@ +import six from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset from django.core.exceptions import ImproperlyConfigured from django.utils.datastructures import MultiValueDict @@ -138,6 +139,40 @@ class TestSlugRelatedField(APISimpleTestCase): assert representation == self.instance.name +class TestMultipleSlugRelatedField(APISimpleTestCase): + def setUp(self): + self.queryset = MockQueryset([ + MockObject(pk=1, name='foo', code='hamster'), + MockObject(pk=2, name='bar', code='bazinga'), + MockObject(pk=3, name='bar', code='cheeseshop') + ]) + self.instance = self.queryset.items[2] + self.field = serializers.MultipleSlugRelatedField( + slug_field=('name', 'code'), queryset=self.queryset, separator='-' + ) + + def test_slug_related_lookup_exists(self): + data = '{}-{}'.format(self.instance.name, self.instance.code) + instance = self.field.to_internal_value(data) + 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 (\'name\', \'code\')=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 == six.text_type(self.instance) + + class TestManyRelatedField(APISimpleTestCase): def setUp(self): self.instance = MockObject(pk=1, name='foo')