diff options
| -rw-r--r-- | rest_framework/serializers.py | 10 | ||||
| -rw-r--r-- | tests/test_model_serializer.py | 50 | ||||
| -rw-r--r-- | tests/test_serializer_metaclass.py | 62 | 
3 files changed, 58 insertions, 64 deletions
| diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8784b303..d8e544d4 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -795,10 +795,16 @@ class ModelSerializer(Serializer):          extra_kwargs = getattr(self.Meta, 'extra_kwargs', {})          if fields and not isinstance(fields, (list, tuple)): -            raise TypeError('`fields` must be a list or tuple') +            raise TypeError( +                'The `fields` option must be a list or tuple. Got %s.' % +                type(fields).__name__ +            )          if exclude and not isinstance(exclude, (list, tuple)): -            raise TypeError('`exclude` must be a list or tuple') +            raise TypeError( +                'The `exclude` option must be a list or tuple. Got %s.' % +                type(exclude).__name__ +            )          assert not (fields and exclude), "Cannot set both 'fields' and 'exclude'." diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 1bcd58e0..da79164a 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -559,3 +559,53 @@ class TestBulkCreate(TestCase):          # Serializer returns correct data.          assert serializer.data == data + + +class TestMetaClassModel(models.Model): +    text = models.CharField(max_length=100) + + +class TestSerializerMetaClass(TestCase): +    def test_meta_class_fields_option(self): +        class ExampleSerializer(serializers.ModelSerializer): +            class Meta: +                model = TestMetaClassModel +                fields = 'text' + +        with self.assertRaises(TypeError) as result: +            ExampleSerializer().fields + +        exception = result.exception +        assert str(exception).startswith( +            "The `fields` option must be a list or tuple" +        ) + +    def test_meta_class_exclude_option(self): +        class ExampleSerializer(serializers.ModelSerializer): +            class Meta: +                model = TestMetaClassModel +                exclude = 'text' + +        with self.assertRaises(TypeError) as result: +            ExampleSerializer().fields + +        exception = result.exception +        assert str(exception).startswith( +            "The `exclude` option must be a list or tuple" +        ) + +    def test_meta_class_fields_and_exclude_options(self): +        class ExampleSerializer(serializers.ModelSerializer): +            class Meta: +                model = TestMetaClassModel +                fields = ('text',) +                exclude = ('text',) + +        with self.assertRaises(AssertionError) as result: +            ExampleSerializer().fields + +        exception = result.exception +        self.assertEqual( +            str(exception), +            "Cannot set both 'fields' and 'exclude'." +        ) diff --git a/tests/test_serializer_metaclass.py b/tests/test_serializer_metaclass.py deleted file mode 100644 index bd2fbed7..00000000 --- a/tests/test_serializer_metaclass.py +++ /dev/null @@ -1,62 +0,0 @@ -from django.test import TestCase -from rest_framework import serializers -from .models import BasicModel - - -class TestSerializerMetaClass(TestCase): -    def setUp(self): -        class FieldsSerializer(serializers.ModelSerializer): -            text = serializers.CharField() - -            class Meta: -                model = BasicModel -                fields = ('text') - -        class ExcludeSerializer(serializers.ModelSerializer): -            text = serializers.CharField() - -            class Meta: -                model = BasicModel -                exclude = ('text') - -        class FieldsAndExcludeSerializer(serializers.ModelSerializer): -            text = serializers.CharField() - -            class Meta: -                model = BasicModel -                fields = ('text',) -                exclude = ('text',) - -        self.fields_serializer = FieldsSerializer -        self.exclude_serializer = ExcludeSerializer -        self.faeSerializer = FieldsAndExcludeSerializer - -    def test_meta_class_fields(self): -        object = BasicModel(text="Hello World.") -        serializer = self.fields_serializer(instance=object) - -        with self.assertRaises(TypeError) as result: -            serializer.data - -        exception = result.exception -        self.assertEqual(str(exception), "`fields` must be a list or tuple") - -    def test_meta_class_exclude(self): -        object = BasicModel(text="Hello World.") -        serializer = self.exclude_serializer(instance=object) - -        with self.assertRaises(TypeError) as result: -            serializer.data - -        exception = result.exception -        self.assertEqual(str(exception), "`exclude` must be a list or tuple") - -    def test_meta_class_fields_and_exclude(self): -        object = BasicModel(text="Hello World.") -        serializer = self.faeSerializer(instance=object) - -        with self.assertRaises(AssertionError) as result: -            serializer.data - -        exception = result.exception -        self.assertEqual(str(exception), "Cannot set both 'fields' and 'exclude'.") | 
