diff options
| author | Tom Christie | 2015-01-30 14:00:25 +0000 | 
|---|---|---|
| committer | Tom Christie | 2015-01-30 14:00:25 +0000 | 
| commit | 4ee4b4f2dc3cffd8246772bdf829a2a720493377 (patch) | |
| tree | 95b514483e901c10bdeee0d66e60430002d5101a /tests | |
| parent | 8f33e39f62c59d06783dd3e6e7cf8d464ff08c5f (diff) | |
| parent | 7cf9dea7f905ea6869148a68b4fa96cad0a347e8 (diff) | |
| download | django-rest-framework-4ee4b4f2dc3cffd8246772bdf829a2a720493377.tar.bz2 | |
Merge master
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_fields.py | 69 | ||||
| -rw-r--r-- | tests/test_filters.py | 16 | ||||
| -rw-r--r-- | tests/test_relations.py | 33 | ||||
| -rw-r--r-- | tests/test_routers.py | 7 | ||||
| -rw-r--r-- | tests/utils.py | 25 | 
5 files changed, 118 insertions, 32 deletions
| diff --git a/tests/test_fields.py b/tests/test_fields.py index dc21c234..48ada780 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -4,6 +4,7 @@ from rest_framework import serializers  import datetime  import django  import pytest +import uuid  # Tests for field keyword arguments and core functionality. @@ -467,6 +468,23 @@ class TestURLField(FieldValues):      field = serializers.URLField() +class TestUUIDField(FieldValues): +    """ +    Valid and invalid values for `UUIDField`. +    """ +    valid_inputs = { +        '825d7aeb-05a9-45b5-a5b7-05df87923cda': uuid.UUID('825d7aeb-05a9-45b5-a5b7-05df87923cda'), +        '825d7aeb05a945b5a5b705df87923cda': uuid.UUID('825d7aeb-05a9-45b5-a5b7-05df87923cda') +    } +    invalid_inputs = { +        '825d7aeb-05a9-45b5-a5b7': ['"825d7aeb-05a9-45b5-a5b7" is not a valid UUID.'] +    } +    outputs = { +        uuid.UUID('825d7aeb-05a9-45b5-a5b7-05df87923cda'): '825d7aeb-05a9-45b5-a5b7-05df87923cda' +    } +    field = serializers.UUIDField() + +  # Number types...  class TestIntegerField(FieldValues): @@ -1029,7 +1047,7 @@ class TestValidImageField(FieldValues):  class TestListField(FieldValues):      """ -    Values for `ListField`. +    Values for `ListField` with IntegerField as child.      """      valid_inputs = [          ([1, 2, 3], [1, 2, 3]), @@ -1046,6 +1064,55 @@ class TestListField(FieldValues):      field = serializers.ListField(child=serializers.IntegerField()) +class TestUnvalidatedListField(FieldValues): +    """ +    Values for `ListField` with no `child` argument. +    """ +    valid_inputs = [ +        ([1, '2', True, [4, 5, 6]], [1, '2', True, [4, 5, 6]]), +    ] +    invalid_inputs = [ +        ('not a list', ['Expected a list of items but got type "str".']), +    ] +    outputs = [ +        ([1, '2', True, [4, 5, 6]], [1, '2', True, [4, 5, 6]]), +    ] +    field = serializers.ListField() + + +class TestDictField(FieldValues): +    """ +    Values for `ListField` with CharField as child. +    """ +    valid_inputs = [ +        ({'a': 1, 'b': '2', 3: 3}, {'a': '1', 'b': '2', '3': '3'}), +    ] +    invalid_inputs = [ +        ({'a': 1, 'b': None}, ['This field may not be null.']), +        ('not a dict', ['Expected a dictionary of items but got type "str".']), +    ] +    outputs = [ +        ({'a': 1, 'b': '2', 3: 3}, {'a': '1', 'b': '2', '3': '3'}), +    ] +    field = serializers.DictField(child=serializers.CharField()) + + +class TestUnvalidatedDictField(FieldValues): +    """ +    Values for `ListField` with no `child` argument. +    """ +    valid_inputs = [ +        ({'a': 1, 'b': [4, 5, 6], 1: 123}, {'a': 1, 'b': [4, 5, 6], '1': 123}), +    ] +    invalid_inputs = [ +        ('not a dict', ['Expected a dictionary of items but got type "str".']), +    ] +    outputs = [ +        ({'a': 1, 'b': [4, 5, 6]}, {'a': 1, 'b': [4, 5, 6]}), +    ] +    field = serializers.DictField() + +  # Tests for FieldField.  # --------------------- diff --git a/tests/test_filters.py b/tests/test_filters.py index 5b1b6ca5..355f02ce 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -5,13 +5,15 @@ from django.db import models  from django.conf.urls import patterns, url  from django.core.urlresolvers import reverse  from django.test import TestCase +from django.test.utils import override_settings  from django.utils import unittest  from django.utils.dateparse import parse_date +from django.utils.six.moves import reload_module  from rest_framework import generics, serializers, status, filters  from rest_framework.compat import django_filters  from rest_framework.test import APIRequestFactory  from .models import BaseFilterableItem, FilterableItem, BasicModel -from .utils import temporary_setting +  factory = APIRequestFactory() @@ -404,7 +406,9 @@ class SearchFilterTests(TestCase):          )      def test_search_with_nonstandard_search_param(self): -        with temporary_setting('SEARCH_PARAM', 'query', module=filters): +        with override_settings(REST_FRAMEWORK={'SEARCH_PARAM': 'query'}): +            reload_module(filters) +              class SearchListView(generics.ListAPIView):                  queryset = SearchFilterModel.objects.all()                  serializer_class = SearchFilterSerializer @@ -422,6 +426,8 @@ class SearchFilterTests(TestCase):                  ]              ) +        reload_module(filters) +  class OrderingFilterModel(models.Model):      title = models.CharField(max_length=20) @@ -642,7 +648,9 @@ class OrderingFilterTests(TestCase):          )      def test_ordering_with_nonstandard_ordering_param(self): -        with temporary_setting('ORDERING_PARAM', 'order', filters): +        with override_settings(REST_FRAMEWORK={'ORDERING_PARAM': 'order'}): +            reload_module(filters) +              class OrderingListView(generics.ListAPIView):                  queryset = OrderingFilterModel.objects.all()                  serializer_class = OrderingFilterSerializer @@ -662,6 +670,8 @@ class OrderingFilterTests(TestCase):                  ]              ) +        reload_module(filters) +  class SensitiveOrderingFilterModel(models.Model):      username = models.CharField(max_length=20) diff --git a/tests/test_relations.py b/tests/test_relations.py index 08c92242..fbe176e2 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,6 +1,8 @@  from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset  from django.core.exceptions import ImproperlyConfigured +from django.utils.datastructures import MultiValueDict  from rest_framework import serializers +from rest_framework.fields import empty  from rest_framework.test import APISimpleTestCase  import pytest @@ -134,3 +136,34 @@ class TestSlugRelatedField(APISimpleTestCase):      def test_representation(self):          representation = self.field.to_representation(self.instance)          assert representation == self.instance.name + + +class TestManyRelatedField(APISimpleTestCase): +    def setUp(self): +        self.instance = MockObject(pk=1, name='foo') +        self.field = serializers.StringRelatedField(many=True) +        self.field.field_name = 'foo' + +    def test_get_value_regular_dictionary_full(self): +        assert 'bar' == self.field.get_value({'foo': 'bar'}) +        assert empty == self.field.get_value({'baz': 'bar'}) + +    def test_get_value_regular_dictionary_partial(self): +        setattr(self.field.root, 'partial', True) +        assert 'bar' == self.field.get_value({'foo': 'bar'}) +        assert empty == self.field.get_value({'baz': 'bar'}) + +    def test_get_value_multi_dictionary_full(self): +        mvd = MultiValueDict({'foo': ['bar1', 'bar2']}) +        assert ['bar1', 'bar2'] == self.field.get_value(mvd) + +        mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) +        assert [] == self.field.get_value(mvd) + +    def test_get_value_multi_dictionary_partial(self): +        setattr(self.field.root, 'partial', True) +        mvd = MultiValueDict({'foo': ['bar1', 'bar2']}) +        assert ['bar1', 'bar2'] == self.field.get_value(mvd) + +        mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) +        assert empty == self.field.get_value(mvd) diff --git a/tests/test_routers.py b/tests/test_routers.py index 86113f5d..948c69bb 100644 --- a/tests/test_routers.py +++ b/tests/test_routers.py @@ -180,7 +180,7 @@ class TestLookupValueRegex(TestCase):  class TestTrailingSlashIncluded(TestCase):      def setUp(self):          class NoteViewSet(viewsets.ModelViewSet): -            model = RouterTestModel +            queryset = RouterTestModel.objects.all()          self.router = SimpleRouter()          self.router.register(r'notes', NoteViewSet) @@ -195,7 +195,7 @@ class TestTrailingSlashIncluded(TestCase):  class TestTrailingSlashRemoved(TestCase):      def setUp(self):          class NoteViewSet(viewsets.ModelViewSet): -            model = RouterTestModel +            queryset = RouterTestModel.objects.all()          self.router = SimpleRouter(trailing_slash=False)          self.router.register(r'notes', NoteViewSet) @@ -210,7 +210,8 @@ class TestTrailingSlashRemoved(TestCase):  class TestNameableRoot(TestCase):      def setUp(self):          class NoteViewSet(viewsets.ModelViewSet): -            model = RouterTestModel +            queryset = RouterTestModel.objects.all() +          self.router = DefaultRouter()          self.router.root_view_name = 'nameable-root'          self.router.register(r'notes', NoteViewSet) diff --git a/tests/utils.py b/tests/utils.py index 5e902ba9..5b2d7586 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,30 +1,5 @@ -from contextlib import contextmanager  from django.core.exceptions import ObjectDoesNotExist  from django.core.urlresolvers import NoReverseMatch -from django.utils import six -from rest_framework.settings import api_settings - - -@contextmanager -def temporary_setting(setting, value, module=None): -    """ -    Temporarily change value of setting for test. - -    Optionally reload given module, useful when module uses value of setting on -    import. -    """ -    original_value = getattr(api_settings, setting) -    setattr(api_settings, setting, value) - -    if module is not None: -        six.moves.reload_module(module) - -    yield - -    setattr(api_settings, setting, original_value) - -    if module is not None: -        six.moves.reload_module(module)  class MockObject(object): | 
