diff options
Diffstat (limited to 'tests')
30 files changed, 389 insertions, 195 deletions
| diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..fa5184dd --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,88 @@ +def pytest_configure(): +    from django.conf import settings + +    settings.configure( +        DEBUG_PROPAGATE_EXCEPTIONS=True, +        DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', +                               'NAME': ':memory:'}}, +        SECRET_KEY='not very secret in tests', +        USE_I18N=True, +        USE_L10N=True, +        STATIC_URL='/static/', +        ROOT_URLCONF='tests.urls', +        TEMPLATE_LOADERS=( +            'django.template.loaders.filesystem.Loader', +            'django.template.loaders.app_directories.Loader', +        ), +        MIDDLEWARE_CLASSES=( +            'django.middleware.common.CommonMiddleware', +            'django.contrib.sessions.middleware.SessionMiddleware', +            'django.middleware.csrf.CsrfViewMiddleware', +            'django.contrib.auth.middleware.AuthenticationMiddleware', +            'django.contrib.messages.middleware.MessageMiddleware', +        ), +        INSTALLED_APPS=( +            'django.contrib.auth', +            'django.contrib.contenttypes', +            'django.contrib.sessions', +            'django.contrib.sites', +            'django.contrib.messages', +            'django.contrib.staticfiles', + +            'rest_framework', +            'rest_framework.authtoken', +            'tests', +            'tests.accounts', +            'tests.records', +            'tests.users', +        ), +        PASSWORD_HASHERS=( +            'django.contrib.auth.hashers.SHA1PasswordHasher', +            'django.contrib.auth.hashers.PBKDF2PasswordHasher', +            'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', +            'django.contrib.auth.hashers.BCryptPasswordHasher', +            'django.contrib.auth.hashers.MD5PasswordHasher', +            'django.contrib.auth.hashers.CryptPasswordHasher', +        ), +    ) + +    try: +        import oauth_provider +        import oauth2 +    except ImportError: +        pass +    else: +        settings.INSTALLED_APPS += ( +            'oauth_provider', +        ) + +    try: +        import provider +    except ImportError: +        pass +    else: +        settings.INSTALLED_APPS += ( +            'provider', +            'provider.oauth2', +        ) + +    # guardian is optional +    try: +        import guardian +    except ImportError: +        pass +    else: +        settings.ANONYMOUS_USER_ID = -1 +        settings.AUTHENTICATION_BACKENDS = ( +            'django.contrib.auth.backends.ModelBackend', # default +            'guardian.backends.ObjectPermissionBackend', +        ) +        settings.INSTALLED_APPS += ( +            'guardian', +        ) + +    try: +        import django +        django.setup() +    except AttributeError: +        pass diff --git a/tests/serializers.py b/tests/serializers.py index f2f85b6e..be7b3772 100644 --- a/tests/serializers.py +++ b/tests/serializers.py @@ -1,5 +1,4 @@  from rest_framework import serializers -  from tests.models import NullableForeignKeySource diff --git a/tests/settings.py b/tests/settings.py index de41dc66..91c9ed09 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -68,7 +68,6 @@ SECRET_KEY = 'u@x-aj9(hoh#rb-^ymf#g2jx_hp0vj7u5#b@ag1n^seu9e!%cy'  TEMPLATE_LOADERS = (      'django.template.loaders.filesystem.Loader',      'django.template.loaders.app_directories.Loader', -#     'django.template.loaders.eggs.Loader',  )  MIDDLEWARE_CLASSES = ( @@ -104,8 +103,8 @@ INSTALLED_APPS = (  # OAuth is optional and won't work if there is no oauth_provider & oauth2  try: -    import oauth_provider -    import oauth2 +    import oauth_provider  # NOQA +    import oauth2  # NOQA  except ImportError:      pass  else: @@ -114,7 +113,7 @@ else:      )  try: -    import provider +    import provider  # NOQA  except ImportError:      pass  else: @@ -125,13 +124,13 @@ else:  # guardian is optional  try: -    import guardian +    import guardian  # NOQA  except ImportError:      pass  else:      ANONYMOUS_USER_ID = -1      AUTHENTICATION_BACKENDS = ( -        'django.contrib.auth.backends.ModelBackend', # default +        'django.contrib.auth.backends.ModelBackend',  # default          'guardian.backends.ObjectPermissionBackend',      )      INSTALLED_APPS += ( diff --git a/tests/test_authentication.py b/tests/test_authentication.py index f5bfc5e6..9db4f62d 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -45,26 +45,39 @@ class MockView(APIView):          return HttpResponse({'a': 1, 'b': 2, 'c': 3}) -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      (r'^session/$', MockView.as_view(authentication_classes=[SessionAuthentication])),      (r'^basic/$', MockView.as_view(authentication_classes=[BasicAuthentication])),      (r'^token/$', MockView.as_view(authentication_classes=[TokenAuthentication])),      (r'^auth-token/$', 'rest_framework.authtoken.views.obtain_auth_token'),      (r'^oauth/$', MockView.as_view(authentication_classes=[OAuthAuthentication])), -    (r'^oauth-with-scope/$', MockView.as_view(authentication_classes=[OAuthAuthentication], -        permission_classes=[permissions.TokenHasReadWriteScope])) +    ( +        r'^oauth-with-scope/$', +        MockView.as_view( +            authentication_classes=[OAuthAuthentication], +            permission_classes=[permissions.TokenHasReadWriteScope] +        ) +    )  ) +  class OAuth2AuthenticationDebug(OAuth2Authentication):      allow_query_params_token = True  if oauth2_provider is not None: -    urlpatterns += patterns('', +    urlpatterns += patterns( +        '',          url(r'^oauth2/', include('provider.oauth2.urls', namespace='oauth2')),          url(r'^oauth2-test/$', MockView.as_view(authentication_classes=[OAuth2Authentication])),          url(r'^oauth2-test-debug/$', MockView.as_view(authentication_classes=[OAuth2AuthenticationDebug])), -        url(r'^oauth2-with-scope-test/$', MockView.as_view(authentication_classes=[OAuth2Authentication], -            permission_classes=[permissions.TokenHasReadWriteScope])), +        url( +            r'^oauth2-with-scope-test/$', +            MockView.as_view( +                authentication_classes=[OAuth2Authentication], +                permission_classes=[permissions.TokenHasReadWriteScope] +            ) +        )      ) @@ -278,12 +291,16 @@ class OAuthTests(TestCase):          self.TOKEN_KEY = "token_key"          self.TOKEN_SECRET = "token_secret" -        self.consumer = Consumer.objects.create(key=self.CONSUMER_KEY, secret=self.CONSUMER_SECRET, -            name='example', user=self.user, status=self.consts.ACCEPTED) +        self.consumer = Consumer.objects.create( +            key=self.CONSUMER_KEY, secret=self.CONSUMER_SECRET, +            name='example', user=self.user, status=self.consts.ACCEPTED +        )          self.scope = Scope.objects.create(name="resource name", url="api/") -        self.token = OAuthToken.objects.create(user=self.user, consumer=self.consumer, scope=self.scope, -            token_type=OAuthToken.ACCESS, key=self.TOKEN_KEY, secret=self.TOKEN_SECRET, is_approved=True +        self.token = OAuthToken.objects.create( +            user=self.user, consumer=self.consumer, scope=self.scope, +            token_type=OAuthToken.ACCESS, key=self.TOKEN_KEY, secret=self.TOKEN_SECRET, +            is_approved=True          )      def _create_authorization_header(self): @@ -501,24 +518,24 @@ class OAuth2Tests(TestCase):          self.REFRESH_TOKEN = "refresh_token"          self.oauth2_client = oauth2_provider.oauth2.models.Client.objects.create( -                client_id=self.CLIENT_ID, -                client_secret=self.CLIENT_SECRET, -                redirect_uri='', -                client_type=0, -                name='example', -                user=None, -            ) +            client_id=self.CLIENT_ID, +            client_secret=self.CLIENT_SECRET, +            redirect_uri='', +            client_type=0, +            name='example', +            user=None, +        )          self.access_token = oauth2_provider.oauth2.models.AccessToken.objects.create( -                token=self.ACCESS_TOKEN, -                client=self.oauth2_client, -                user=self.user, -            ) +            token=self.ACCESS_TOKEN, +            client=self.oauth2_client, +            user=self.user, +        )          self.refresh_token = oauth2_provider.oauth2.models.RefreshToken.objects.create( -                user=self.user, -                access_token=self.access_token, -                client=self.oauth2_client -            ) +            user=self.user, +            access_token=self.access_token, +            client=self.oauth2_client +        )      def _create_authorization_header(self, token=None):          return "Bearer {0}".format(token or self.access_token.token) @@ -569,8 +586,10 @@ class OAuth2Tests(TestCase):      @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed')      def test_post_form_passing_auth_url_transport(self):          """Ensure GETing form over OAuth with correct client credentials in form data succeed""" -        response = self.csrf_client.post('/oauth2-test/', -                data={'access_token': self.access_token.token}) +        response = self.csrf_client.post( +            '/oauth2-test/', +            data={'access_token': self.access_token.token} +        )          self.assertEqual(response.status_code, 200)      @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') diff --git a/tests/test_breadcrumbs.py b/tests/test_breadcrumbs.py index f26c3eaf..780fd5c4 100644 --- a/tests/test_breadcrumbs.py +++ b/tests/test_breadcrumbs.py @@ -24,7 +24,8 @@ class NestedResourceRoot(APIView):  class NestedResourceInstance(APIView):      pass -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^$', Root.as_view()),      url(r'^resource/$', ResourceRoot.as_view()),      url(r'^resource/(?P<key>[0-9]+)$', ResourceInstance.as_view()), @@ -40,34 +41,60 @@ class BreadcrumbTests(TestCase):      def test_root_breadcrumbs(self):          url = '/' -        self.assertEqual(get_breadcrumbs(url), [('Root', '/')]) +        self.assertEqual( +            get_breadcrumbs(url), +            [('Root', '/')] +        )      def test_resource_root_breadcrumbs(self):          url = '/resource/' -        self.assertEqual(get_breadcrumbs(url), [('Root', '/'), -                                            ('Resource Root', '/resource/')]) +        self.assertEqual( +            get_breadcrumbs(url), +            [ +                ('Root', '/'), +                ('Resource Root', '/resource/') +            ] +        )      def test_resource_instance_breadcrumbs(self):          url = '/resource/123' -        self.assertEqual(get_breadcrumbs(url), [('Root', '/'), -                                            ('Resource Root', '/resource/'), -                                            ('Resource Instance', '/resource/123')]) +        self.assertEqual( +            get_breadcrumbs(url), +            [ +                ('Root', '/'), +                ('Resource Root', '/resource/'), +                ('Resource Instance', '/resource/123') +            ] +        )      def test_nested_resource_breadcrumbs(self):          url = '/resource/123/' -        self.assertEqual(get_breadcrumbs(url), [('Root', '/'), -                                            ('Resource Root', '/resource/'), -                                            ('Resource Instance', '/resource/123'), -                                            ('Nested Resource Root', '/resource/123/')]) +        self.assertEqual( +            get_breadcrumbs(url), +            [ +                ('Root', '/'), +                ('Resource Root', '/resource/'), +                ('Resource Instance', '/resource/123'), +                ('Nested Resource Root', '/resource/123/') +            ] +        )      def test_nested_resource_instance_breadcrumbs(self):          url = '/resource/123/abc' -        self.assertEqual(get_breadcrumbs(url), [('Root', '/'), -                                            ('Resource Root', '/resource/'), -                                            ('Resource Instance', '/resource/123'), -                                            ('Nested Resource Root', '/resource/123/'), -                                            ('Nested Resource Instance', '/resource/123/abc')]) +        self.assertEqual( +            get_breadcrumbs(url), +            [ +                ('Root', '/'), +                ('Resource Root', '/resource/'), +                ('Resource Instance', '/resource/123'), +                ('Nested Resource Root', '/resource/123/'), +                ('Nested Resource Instance', '/resource/123/abc') +            ] +        )      def test_broken_url_breadcrumbs_handled_gracefully(self):          url = '/foobar' -        self.assertEqual(get_breadcrumbs(url), [('Root', '/')]) +        self.assertEqual( +            get_breadcrumbs(url), +            [('Root', '/')] +        ) diff --git a/tests/test_fields.py b/tests/test_fields.py index 97ef016f..094ac1eb 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -648,7 +648,7 @@ class DecimalFieldTest(TestCase):          s = DecimalSerializer(data={'decimal_field': '123'})          self.assertFalse(s.is_valid()) -        self.assertEqual(s.errors,  {'decimal_field': ['Ensure this value is less than or equal to 100.']}) +        self.assertEqual(s.errors, {'decimal_field': ['Ensure this value is less than or equal to 100.']})      def test_raise_min_value(self):          """ @@ -660,7 +660,7 @@ class DecimalFieldTest(TestCase):          s = DecimalSerializer(data={'decimal_field': '99'})          self.assertFalse(s.is_valid()) -        self.assertEqual(s.errors,  {'decimal_field': ['Ensure this value is greater than or equal to 100.']}) +        self.assertEqual(s.errors, {'decimal_field': ['Ensure this value is greater than or equal to 100.']})      def test_raise_max_digits(self):          """ @@ -672,7 +672,7 @@ class DecimalFieldTest(TestCase):          s = DecimalSerializer(data={'decimal_field': '123.456'})          self.assertFalse(s.is_valid()) -        self.assertEqual(s.errors,  {'decimal_field': ['Ensure that there are no more than 5 digits in total.']}) +        self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 5 digits in total.']})      def test_raise_max_decimal_places(self):          """ @@ -684,7 +684,7 @@ class DecimalFieldTest(TestCase):          s = DecimalSerializer(data={'decimal_field': '123.4567'})          self.assertFalse(s.is_valid()) -        self.assertEqual(s.errors,  {'decimal_field': ['Ensure that there are no more than 3 decimal places.']}) +        self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 3 decimal places.']})      def test_raise_max_whole_digits(self):          """ @@ -696,7 +696,7 @@ class DecimalFieldTest(TestCase):          s = DecimalSerializer(data={'decimal_field': '12345.6'})          self.assertFalse(s.is_valid()) -        self.assertEqual(s.errors,  {'decimal_field': ['Ensure that there are no more than 4 digits in total.']}) +        self.assertEqual(s.errors, {'decimal_field': ['Ensure that there are no more than 4 digits in total.']})  class ChoiceFieldTests(TestCase): @@ -729,7 +729,7 @@ class ChoiceFieldTests(TestCase):      def test_invalid_choice_model(self):          s = ChoiceFieldModelSerializer(data={'choice': 'wrong_value'})          self.assertFalse(s.is_valid()) -        self.assertEqual(s.errors,  {'choice': ['Select a valid choice. wrong_value is not one of the available choices.']}) +        self.assertEqual(s.errors, {'choice': ['Select a valid choice. wrong_value is not one of the available choices.']})          self.assertEqual(s.data['choice'], '')      def test_empty_choice_model(self): @@ -875,7 +875,7 @@ class SlugFieldTests(TestCase):          s = SlugFieldSerializer(data={'slug_field': 'a b'})          self.assertEqual(s.is_valid(), False) -        self.assertEqual(s.errors,  {'slug_field': ["Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."]}) +        self.assertEqual(s.errors, {'slug_field': ["Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."]})  class URLFieldTests(TestCase): diff --git a/tests/test_files.py b/tests/test_files.py index 78f4cf42..af110df9 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -85,11 +85,8 @@ class FileSerializerTests(TestCase):          """          Validation should still function when no data dictionary is provided.          """ -        now = datetime.datetime.now() -        file = BytesIO(six.b('stuff')) -        file.name = 'stuff.txt' -        file.size = len(file.getvalue()) -        uploaded_file = UploadedFile(file=file, created=now) - -        serializer = UploadedFileSerializer(files={'file': file}) +        uploaded_file = BytesIO(six.b('stuff')) +        uploaded_file.name = 'stuff.txt' +        uploaded_file.size = len(uploaded_file.getvalue()) +        serializer = UploadedFileSerializer(files={'file': uploaded_file})          self.assertFalse(serializer.is_valid()) diff --git a/tests/test_filters.py b/tests/test_filters.py index 85840e01..b29760fa 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -74,7 +74,8 @@ if django_filters:          def get_queryset(self):              return FilterableItem.objects.all() -    urlpatterns = patterns('', +    urlpatterns = patterns( +        '',          url(r'^(?P<pk>\d+)/$', FilterClassDetailView.as_view(), name='detail-view'),          url(r'^$', FilterClassRootView.as_view(), name='root-view'),          url(r'^get-queryset/$', GetQuerysetView.as_view(), @@ -653,8 +654,8 @@ class SensitiveOrderingFilterTests(TestCase):              self.assertEqual(                  response.data,                  [ -                    {'id': 1, username_field: 'userA'}, # PassB -                    {'id': 2, username_field: 'userB'}, # PassC -                    {'id': 3, username_field: 'userC'}, # PassA +                    {'id': 1, username_field: 'userA'},  # PassB +                    {'id': 2, username_field: 'userB'},  # PassC +                    {'id': 3, username_field: 'userC'},  # PassA                  ]              ) diff --git a/tests/test_genericrelations.py b/tests/test_genericrelations.py index 3a8f3c7f..95295eaa 100644 --- a/tests/test_genericrelations.py +++ b/tests/test_genericrelations.py @@ -117,18 +117,18 @@ class TestGenericRelations(TestCase):          serializer = TagSerializer(Tag.objects.all(), many=True)          expected = [ -        { -            'tag': 'django', -            'tagged_item': 'Bookmark: https://www.djangoproject.com/' -        }, -        { -            'tag': 'python', -            'tagged_item': 'Bookmark: https://www.djangoproject.com/' -        }, -        { -            'tag': 'reminder', -            'tagged_item': 'Note: Remember the milk' -        } +            { +                'tag': 'django', +                'tagged_item': 'Bookmark: https://www.djangoproject.com/' +            }, +            { +                'tag': 'python', +                'tagged_item': 'Bookmark: https://www.djangoproject.com/' +            }, +            { +                'tag': 'reminder', +                'tagged_item': 'Note: Remember the milk' +            }          ]          self.assertEqual(serializer.data, expected) diff --git a/tests/test_htmlrenderer.py b/tests/test_htmlrenderer.py index 88d11c46..5a680f99 100644 --- a/tests/test_htmlrenderer.py +++ b/tests/test_htmlrenderer.py @@ -34,7 +34,8 @@ def not_found(request):      raise Http404() -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^$', example),      url(r'^permission_denied$', permission_denied),      url(r'^not_found$', not_found), diff --git a/tests/test_hyperlinkedserializers.py b/tests/test_hyperlinkedserializers.py index d478ea73..d4548539 100644 --- a/tests/test_hyperlinkedserializers.py +++ b/tests/test_hyperlinkedserializers.py @@ -94,7 +94,8 @@ class OptionalRelationDetail(generics.RetrieveUpdateDestroyAPIView):      model_serializer_class = serializers.HyperlinkedModelSerializer -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^basic/$', BasicList.as_view(), name='basicmodel-list'),      url(r'^basic/(?P<pk>\d+)/$', BasicDetail.as_view(), name='basicmodel-detail'),      url(r'^anchor/(?P<pk>\d+)/$', AnchorDetail.as_view(), name='anchor-detail'), diff --git a/tests/test_pagination.py b/tests/test_pagination.py index 293146c0..d5b9244d 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -1,7 +1,6 @@  from __future__ import unicode_literals  import datetime  from decimal import Decimal -from django.db import models  from django.core.paginator import Paginator  from django.test import TestCase  from django.utils import unittest @@ -12,6 +11,7 @@ from .models import BasicModel, FilterableItem  factory = APIRequestFactory() +  # Helper function to split arguments out of an url  def split_arguments_from_url(url):      if '?' not in url: @@ -274,8 +274,8 @@ class TestUnpaginated(TestCase):              BasicModel(text=i).save()          self.objects = BasicModel.objects          self.data = [ -        {'id': obj.id, 'text': obj.text} -        for obj in self.objects.all() +            {'id': obj.id, 'text': obj.text} +            for obj in self.objects.all()          ]          self.view = DefaultPageSizeKwargView.as_view() @@ -302,8 +302,8 @@ class TestCustomPaginateByParam(TestCase):              BasicModel(text=i).save()          self.objects = BasicModel.objects          self.data = [ -        {'id': obj.id, 'text': obj.text} -        for obj in self.objects.all() +            {'id': obj.id, 'text': obj.text} +            for obj in self.objects.all()          ]          self.view = PaginateByParamView.as_view() @@ -483,8 +483,6 @@ class NonIntegerPaginator(object):  class TestNonIntegerPagination(TestCase): - -      def test_custom_pagination_serializer(self):          objects = ['john', 'paul', 'george', 'ringo']          paginator = NonIntegerPaginator(objects, 2) diff --git a/tests/test_permissions.py b/tests/test_permissions.py index a2cb0c36..93f8020f 100644 --- a/tests/test_permissions.py +++ b/tests/test_permissions.py @@ -12,6 +12,7 @@ import base64  factory = APIRequestFactory() +  class RootView(generics.ListCreateAPIView):      model = BasicModel      authentication_classes = [authentication.BasicAuthentication] @@ -101,42 +102,54 @@ class ModelPermissionsIntegrationTests(TestCase):          self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)      def test_options_permitted(self): -        request = factory.options('/', -                               HTTP_AUTHORIZATION=self.permitted_credentials) +        request = factory.options( +            '/', +            HTTP_AUTHORIZATION=self.permitted_credentials +        )          response = root_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertIn('actions', response.data)          self.assertEqual(list(response.data['actions'].keys()), ['POST']) -        request = factory.options('/1', -                               HTTP_AUTHORIZATION=self.permitted_credentials) +        request = factory.options( +            '/1', +            HTTP_AUTHORIZATION=self.permitted_credentials +        )          response = instance_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertIn('actions', response.data)          self.assertEqual(list(response.data['actions'].keys()), ['PUT'])      def test_options_disallowed(self): -        request = factory.options('/', -                               HTTP_AUTHORIZATION=self.disallowed_credentials) +        request = factory.options( +            '/', +            HTTP_AUTHORIZATION=self.disallowed_credentials +        )          response = root_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertNotIn('actions', response.data) -        request = factory.options('/1', -                               HTTP_AUTHORIZATION=self.disallowed_credentials) +        request = factory.options( +            '/1', +            HTTP_AUTHORIZATION=self.disallowed_credentials +        )          response = instance_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertNotIn('actions', response.data)      def test_options_updateonly(self): -        request = factory.options('/', -                               HTTP_AUTHORIZATION=self.updateonly_credentials) +        request = factory.options( +            '/', +            HTTP_AUTHORIZATION=self.updateonly_credentials +        )          response = root_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertNotIn('actions', response.data) -        request = factory.options('/1', -                               HTTP_AUTHORIZATION=self.updateonly_credentials) +        request = factory.options( +            '/1', +            HTTP_AUTHORIZATION=self.updateonly_credentials +        )          response = instance_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertIn('actions', response.data) @@ -153,6 +166,7 @@ class BasicPermModel(models.Model):              # add, change, delete built in to django          ) +  # Custom object-level permission, that includes 'view' permissions  class ViewObjectPermissions(permissions.DjangoObjectPermissions):      perms_map = { @@ -205,7 +219,7 @@ class ObjectPermissionsIntegrationTests(TestCase):          app_label = BasicPermModel._meta.app_label          f = '{0}_{1}'.format          perms = { -            'view':   f('view', model_name), +            'view': f('view', model_name),              'change': f('change', model_name),              'delete': f('delete', model_name)          } @@ -246,21 +260,27 @@ class ObjectPermissionsIntegrationTests(TestCase):      # Update      def test_can_update_permissions(self): -        request = factory.patch('/1', {'text': 'foobar'}, format='json', -            HTTP_AUTHORIZATION=self.credentials['writeonly']) +        request = factory.patch( +            '/1', {'text': 'foobar'}, format='json', +            HTTP_AUTHORIZATION=self.credentials['writeonly'] +        )          response = object_permissions_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_200_OK)          self.assertEqual(response.data.get('text'), 'foobar')      def test_cannot_update_permissions(self): -        request = factory.patch('/1', {'text': 'foobar'}, format='json', -            HTTP_AUTHORIZATION=self.credentials['deleteonly']) +        request = factory.patch( +            '/1', {'text': 'foobar'}, format='json', +            HTTP_AUTHORIZATION=self.credentials['deleteonly'] +        )          response = object_permissions_view(request, pk='1')          self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)      def test_cannot_update_permissions_non_existing(self): -        request = factory.patch('/999', {'text': 'foobar'}, format='json', -            HTTP_AUTHORIZATION=self.credentials['deleteonly']) +        request = factory.patch( +            '/999', {'text': 'foobar'}, format='json', +            HTTP_AUTHORIZATION=self.credentials['deleteonly'] +        )          response = object_permissions_view(request, pk='999')          self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) diff --git a/tests/test_relations.py b/tests/test_relations.py index cd276d30..bc1db69f 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -108,19 +108,25 @@ class RelatedFieldSourceTests(TestCase):          doesn't exist.          """          from tests.models import ManyToManySource +          class Meta:              model = ManyToManySource +          attrs = {              'name': serializers.SlugRelatedField(                  slug_field='name', source='banzai'),              'Meta': Meta,          } -        TestSerializer = type(str('TestSerializer'), -            (serializers.ModelSerializer,), attrs) +        TestSerializer = type( +            str('TestSerializer'), +            (serializers.ModelSerializer,), +            attrs +        )          with self.assertRaises(AttributeError):              TestSerializer(data={'name': 'foo'}) +  @unittest.skipIf(get_version() < '1.6.0', 'Upstream behaviour changed in v1.6')  class RelatedFieldChoicesTests(TestCase):      """ @@ -141,4 +147,3 @@ class RelatedFieldChoicesTests(TestCase):          widget_count = len(field.widget.choices)          self.assertEqual(widget_count, choice_count + 1, 'BLANK_CHOICE_DASH option should have been added') - diff --git a/tests/test_relations_hyperlink.py b/tests/test_relations_hyperlink.py index ab1c6664..0c8eb254 100644 --- a/tests/test_relations_hyperlink.py +++ b/tests/test_relations_hyperlink.py @@ -16,7 +16,8 @@ request = factory.get('/')  # Just to ensure we have a request in the serializer  def dummy_view(request, pk):      pass -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^dummyurl/(?P<pk>[0-9]+)/$', dummy_view, name='dummy-url'),      url(r'^manytomanysource/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanysource-detail'),      url(r'^manytomanytarget/(?P<pk>[0-9]+)/$', dummy_view, name='manytomanytarget-detail'), @@ -86,9 +87,9 @@ class HyperlinkedManyToManyTests(TestCase):          queryset = ManyToManySource.objects.all()          serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request})          expected = [ -                {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, -                {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, -                {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} +            {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/']}, +            {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, +            {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}          ]          self.assertEqual(serializer.data, expected) @@ -114,9 +115,9 @@ class HyperlinkedManyToManyTests(TestCase):          queryset = ManyToManySource.objects.all()          serializer = ManyToManySourceSerializer(queryset, many=True, context={'request': request})          expected = [ -                {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, -                {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, -                {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']} +            {'url': 'http://testserver/manytomanysource/1/', 'name': 'source-1', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}, +            {'url': 'http://testserver/manytomanysource/2/', 'name': 'source-2', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/']}, +            {'url': 'http://testserver/manytomanysource/3/', 'name': 'source-3', 'targets': ['http://testserver/manytomanytarget/1/', 'http://testserver/manytomanytarget/2/', 'http://testserver/manytomanytarget/3/']}          ]          self.assertEqual(serializer.data, expected) diff --git a/tests/test_relations_pk.py b/tests/test_relations_pk.py index ff59b250..c051b076 100644 --- a/tests/test_relations_pk.py +++ b/tests/test_relations_pk.py @@ -65,9 +65,9 @@ class PKManyToManyTests(TestCase):          queryset = ManyToManySource.objects.all()          serializer = ManyToManySourceSerializer(queryset, many=True)          expected = [ -                {'id': 1, 'name': 'source-1', 'targets': [1]}, -                {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, -                {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]} +            {'id': 1, 'name': 'source-1', 'targets': [1]}, +            {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, +            {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]}          ]          self.assertEqual(serializer.data, expected) @@ -93,9 +93,9 @@ class PKManyToManyTests(TestCase):          queryset = ManyToManySource.objects.all()          serializer = ManyToManySourceSerializer(queryset, many=True)          expected = [ -                {'id': 1, 'name': 'source-1', 'targets': [1, 2, 3]}, -                {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, -                {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]} +            {'id': 1, 'name': 'source-1', 'targets': [1, 2, 3]}, +            {'id': 2, 'name': 'source-2', 'targets': [1, 2]}, +            {'id': 3, 'name': 'source-3', 'targets': [1, 2, 3]}          ]          self.assertEqual(serializer.data, expected) diff --git a/tests/test_renderers.py b/tests/test_renderers.py index 1d8adfa7..0403cde2 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -76,7 +76,6 @@ class MockGETView(APIView):          return Response({'foo': ['bar', 'baz']}) -  class MockPOSTView(APIView):      def post(self, request, **kwargs):          return Response({'foo': request.DATA}) @@ -102,7 +101,8 @@ class HTMLView1(APIView):      def get(self, request, **kwargs):          return Response('text') -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB])),      url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB])),      url(r'^cache$', MockGETView.as_view()), @@ -312,16 +312,22 @@ class JSONRendererTests(TestCase):          class Dict(MutableMapping):              def __init__(self):                  self._dict = dict() +              def __getitem__(self, key):                  return self._dict.__getitem__(key) +              def __setitem__(self, key, value):                  return self._dict.__setitem__(key, value) +              def __delitem__(self, key):                  return self._dict.__delitem__(key) +              def __iter__(self):                  return self._dict.__iter__() +              def __len__(self):                  return self._dict.__len__() +              def keys(self):                  return self._dict.keys() @@ -330,22 +336,24 @@ class JSONRendererTests(TestCase):          x[2] = 3          ret = JSONRenderer().render(x)          data = json.loads(ret.decode('utf-8')) -        self.assertEquals(data, {'key': 'string value', '2': 3})     +        self.assertEquals(data, {'key': 'string value', '2': 3})      def test_render_obj_with_getitem(self):          class DictLike(object):              def __init__(self):                  self._dict = {} +              def set(self, value):                  self._dict = dict(value) +              def __getitem__(self, key):                  return self._dict[key] -             +          x = DictLike()          x.set({'a': 1, 'b': 'string'})          with self.assertRaises(TypeError):              JSONRenderer().render(x) -         +      def test_without_content_type_args(self):          """          Test basic JSON rendering. @@ -394,35 +402,47 @@ class JSONPRendererTests(TestCase):          """          Test JSONP rendering with View JSON Renderer.          """ -        resp = self.client.get('/jsonp/jsonrenderer', -                               HTTP_ACCEPT='application/javascript') +        resp = self.client.get( +            '/jsonp/jsonrenderer', +            HTTP_ACCEPT='application/javascript' +        )          self.assertEqual(resp.status_code, status.HTTP_200_OK)          self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') -        self.assertEqual(resp.content, -            ('callback(%s);' % _flat_repr).encode('ascii')) +        self.assertEqual( +            resp.content, +            ('callback(%s);' % _flat_repr).encode('ascii') +        )      def test_without_callback_without_json_renderer(self):          """          Test JSONP rendering without View JSON Renderer.          """ -        resp = self.client.get('/jsonp/nojsonrenderer', -                               HTTP_ACCEPT='application/javascript') +        resp = self.client.get( +            '/jsonp/nojsonrenderer', +            HTTP_ACCEPT='application/javascript' +        )          self.assertEqual(resp.status_code, status.HTTP_200_OK)          self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') -        self.assertEqual(resp.content, -            ('callback(%s);' % _flat_repr).encode('ascii')) +        self.assertEqual( +            resp.content, +            ('callback(%s);' % _flat_repr).encode('ascii') +        )      def test_with_callback(self):          """          Test JSONP rendering with callback function name.          """          callback_func = 'myjsonpcallback' -        resp = self.client.get('/jsonp/nojsonrenderer?callback=' + callback_func, -                               HTTP_ACCEPT='application/javascript') +        resp = self.client.get( +            '/jsonp/nojsonrenderer?callback=' + callback_func, +            HTTP_ACCEPT='application/javascript' +        )          self.assertEqual(resp.status_code, status.HTTP_200_OK)          self.assertEqual(resp['Content-Type'], 'application/javascript; charset=utf-8') -        self.assertEqual(resp.content, -            ('%s(%s);' % (callback_func, _flat_repr)).encode('ascii')) +        self.assertEqual( +            resp.content, +            ('%s(%s);' % (callback_func, _flat_repr)).encode('ascii') +        )  if yaml: @@ -467,7 +487,6 @@ if yaml:          def assertYAMLContains(self, content, string):              self.assertTrue(string in content, '%r not in %r' % (string, content)) -      class UnicodeYAMLRendererTests(TestCase):          """          Tests specific for the Unicode YAML Renderer @@ -592,13 +611,13 @@ class CacheRenderTest(TestCase):          """ Return any errors that would be raised if `obj' is pickled          Courtesy of koffie @ http://stackoverflow.com/a/7218986/109897          """ -        if seen == None: +        if seen is None:              seen = []          try:              state = obj.__getstate__()          except AttributeError:              return -        if state == None: +        if state is None:              return          if isinstance(state, tuple):              if not isinstance(state[0], dict): diff --git a/tests/test_request.py b/tests/test_request.py index 0cde0fb4..8b048b5c 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -272,7 +272,8 @@ class MockView(APIView):          return Response(status=status.INTERNAL_SERVER_ERROR) -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      (r'^$', MockView.as_view()),  ) diff --git a/tests/test_response.py b/tests/test_response.py index 0551f4a8..c28f186e 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -100,7 +100,8 @@ new_model_viewset_router = routers.DefaultRouter()  new_model_viewset_router.register(r'', HTMLNewModelViewSet) -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^setbyview$', MockViewSettingContentType.as_view(renderer_classes=[RendererA, RendererB, RendererC])),      url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])),      url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])), diff --git a/tests/test_reverse.py b/tests/test_reverse.py index 0d3fddf0..675a9d5a 100644 --- a/tests/test_reverse.py +++ b/tests/test_reverse.py @@ -10,7 +10,8 @@ factory = APIRequestFactory()  def null_view(request):      pass -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^view$', null_view, name='view'),  ) diff --git a/tests/test_routers.py b/tests/test_routers.py index 381569bd..b076f134 100644 --- a/tests/test_routers.py +++ b/tests/test_routers.py @@ -93,7 +93,8 @@ class TestCustomLookupFields(TestCase):          from tests import test_routers          urls = getattr(test_routers, 'urlpatterns') -        urls += patterns('', +        urls += patterns( +            '',              url(r'^', include(self.router.urls)),          ) @@ -104,7 +105,8 @@ class TestCustomLookupFields(TestCase):      def test_retrieve_lookup_field_list_view(self):          response = self.client.get('/notes/') -        self.assertEqual(response.data, +        self.assertEqual( +            response.data,              [{                  "url": "http://testserver/notes/123/",                  "uuid": "123", "text": "foo bar" @@ -113,7 +115,8 @@ class TestCustomLookupFields(TestCase):      def test_retrieve_lookup_field_detail_view(self):          response = self.client.get('/notes/123/') -        self.assertEqual(response.data, +        self.assertEqual( +            response.data,              {                  "url": "http://testserver/notes/123/",                  "uuid": "123", "text": "foo bar" diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 7d57fcf0..d27bdcf1 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -7,10 +7,12 @@ from django.utils import unittest  from django.utils.datastructures import MultiValueDict  from django.utils.translation import ugettext_lazy as _  from rest_framework import serializers, fields, relations -from tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, -    BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, DefaultValueModel, -    ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel, -    ForeignKeySource, ManyToManySource) +from tests.models import ( +    HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, +    BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, +    DefaultValueModel, ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, +    RESTFrameworkModel, ForeignKeySource +)  from tests.models import BasicModelSerializer  import datetime  import pickle @@ -99,6 +101,7 @@ class ActionItemSerializer(serializers.ModelSerializer):      class Meta:          model = ActionItem +  class ActionItemSerializerOptionalFields(serializers.ModelSerializer):      """      Intended to test that fields with `required=False` are excluded from validation. @@ -109,6 +112,7 @@ class ActionItemSerializerOptionalFields(serializers.ModelSerializer):          model = ActionItem          fields = ('title',) +  class ActionItemSerializerCustomRestore(serializers.ModelSerializer):      class Meta: @@ -295,8 +299,10 @@ class BasicTests(TestCase):          in the Meta data          """          serializer = PersonSerializer(self.person) -        self.assertEqual(set(serializer.data.keys()), -                          set(['name', 'age', 'info'])) +        self.assertEqual( +            set(serializer.data.keys()), +            set(['name', 'age', 'info']) +        )      def test_field_with_dictionary(self):          """ @@ -331,9 +337,9 @@ class BasicTests(TestCase):              — id field is not populated if `data` is accessed prior to `save()`          """          serializer = ActionItemSerializer(self.actionitem) -        self.assertIsNone(serializer.data.get('id',None), 'New instance. `id` should not be set.') +        self.assertIsNone(serializer.data.get('id', None), 'New instance. `id` should not be set.')          serializer.save() -        self.assertIsNotNone(serializer.data.get('id',None), 'Model is saved. `id` should be set.') +        self.assertIsNotNone(serializer.data.get('id', None), 'Model is saved. `id` should be set.')      def test_fields_marked_as_not_required_are_excluded_from_validation(self):          """ @@ -660,10 +666,10 @@ class ModelValidationTests(TestCase):          serializer.save()          second_serializer = AlbumsSerializer(data={'title': 'a'})          self.assertFalse(second_serializer.is_valid()) -        self.assertEqual(second_serializer.errors,  {'title': ['Album with this Title already exists.'],}) +        self.assertEqual(second_serializer.errors, {'title': ['Album with this Title already exists.']})          third_serializer = AlbumsSerializer(data=[{'title': 'b', 'ref': '1'}, {'title': 'c'}], many=True)          self.assertFalse(third_serializer.is_valid()) -        self.assertEqual(third_serializer.errors,  [{'ref': ['Album with this Ref already exists.']}, {}]) +        self.assertEqual(third_serializer.errors, [{'ref': ['Album with this Ref already exists.']}, {}])      def test_foreign_key_is_null_with_partial(self):          """ @@ -959,7 +965,7 @@ class WritableFieldDefaultValueTests(TestCase):          self.assertEqual(got, self.expected)      def test_get_default_value_with_callable(self): -        field = self.create_field(default=lambda : self.expected) +        field = self.create_field(default=lambda: self.expected)          got = field.get_default_value()          self.assertEqual(got, self.expected) @@ -974,7 +980,7 @@ class WritableFieldDefaultValueTests(TestCase):          self.assertIsNone(got)      def test_get_default_value_returns_non_True_values(self): -        values = [None, '', False, 0, [], (), {}] # values that assumed as 'False' in the 'if' clause +        values = [None, '', False, 0, [], (), {}]  # values that assumed as 'False' in the 'if' clause          for expected in values:              field = self.create_field(default=expected)              got = field.get_default_value() diff --git a/tests/test_serializer_bulk_update.py b/tests/test_serializer_bulk_update.py index 8b0ded1a..67a8ed0d 100644 --- a/tests/test_serializer_bulk_update.py +++ b/tests/test_serializer_bulk_update.py @@ -83,9 +83,9 @@ class BulkCreateSerializerTests(TestCase):          self.assertEqual(serializer.is_valid(), False)          expected_errors = [ -                {'non_field_errors': ['Invalid data']}, -                {'non_field_errors': ['Invalid data']}, -                {'non_field_errors': ['Invalid data']} +            {'non_field_errors': ['Invalid data']}, +            {'non_field_errors': ['Invalid data']}, +            {'non_field_errors': ['Invalid data']}          ]          self.assertEqual(serializer.errors, expected_errors) diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index 6d69ffbd..c09c24db 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -328,12 +328,14 @@ class NestedModelSerializerUpdateTests(TestCase):          class BlogPostSerializer(serializers.ModelSerializer):              comments = BlogPostCommentSerializer(many=True, source='blogpostcomment_set') +              class Meta:                  model = models.BlogPost                  fields = ('id', 'title', 'comments')          class PersonSerializer(serializers.ModelSerializer):              posts = BlogPostSerializer(many=True, source='blogpost_set') +              class Meta:                  model = models.Person                  fields = ('id', 'name', 'age', 'posts') diff --git a/tests/test_serializers.py b/tests/test_serializers.py index 2e276f15..09de9f4c 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -1,9 +1,7 @@ -from django.db import models  from django.test import TestCase - +from rest_framework.compat import six  from rest_framework.serializers import _resolve_model  from tests.models import BasicModel -from rest_framework.compat import six  class ResolveModelTests(TestCase): diff --git a/tests/test_status.py b/tests/test_status.py index 7b1bdae3..721a6e30 100644 --- a/tests/test_status.py +++ b/tests/test_status.py @@ -30,4 +30,4 @@ class TestStatus(TestCase):          self.assertFalse(is_server_error(499))          self.assertTrue(is_server_error(500))          self.assertTrue(is_server_error(599)) -        self.assertFalse(is_server_error(600))
\ No newline at end of file +        self.assertFalse(is_server_error(600)) diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index d4da0c23..b96bc0ca 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -48,4 +48,4 @@ class Issue1386Tests(TestCase):              self.assertEqual(i, res)          # example from issue #1386, this shouldn't raise an exception -        _ = urlize_quoted_links("asdf:[/p]zxcv.com") +        urlize_quoted_links("asdf:[/p]zxcv.com") diff --git a/tests/test_testing.py b/tests/test_testing.py index 1b126e00..9c472026 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -28,7 +28,8 @@ def session_view(request):      }) -urlpatterns = patterns('', +urlpatterns = patterns( +    '',      url(r'^view/$', view),      url(r'^session-view/$', session_view),  ) @@ -142,7 +143,8 @@ class TestAPIRequestFactory(TestCase):          assertion error.          """          factory = APIRequestFactory() -        self.assertRaises(AssertionError, factory.post, +        self.assertRaises( +            AssertionError, factory.post,              path='/view/', data={'example': 1}, format='xml'          ) diff --git a/tests/test_throttling.py b/tests/test_throttling.py index 8c5eefe9..b0cb2fe7 100644 --- a/tests/test_throttling.py +++ b/tests/test_throttling.py @@ -27,7 +27,7 @@ class NonTimeThrottle(BaseThrottle):          if not hasattr(self.__class__, 'called'):              self.__class__.called = True              return True -        return False  +        return False  class MockView(APIView): @@ -125,36 +125,42 @@ class ThrottlingTests(TestCase):          """          Ensure for second based throttles.          """ -        self.ensure_response_header_contains_proper_throttle_field(MockView, -         ((0, None), -          (0, None), -          (0, None), -          (0, '1') -         )) +        self.ensure_response_header_contains_proper_throttle_field( +            MockView, ( +                (0, None), +                (0, None), +                (0, None), +                (0, '1') +            ) +        )      def test_minutes_fields(self):          """          Ensure for minute based throttles.          """ -        self.ensure_response_header_contains_proper_throttle_field(MockView_MinuteThrottling, -         ((0, None), -          (0, None), -          (0, None), -          (0, '60') -         )) +        self.ensure_response_header_contains_proper_throttle_field( +            MockView_MinuteThrottling, ( +                (0, None), +                (0, None), +                (0, None), +                (0, '60') +            ) +        )      def test_next_rate_remains_constant_if_followed(self):          """          If a client follows the recommended next request rate,          the throttling rate should stay constant.          """ -        self.ensure_response_header_contains_proper_throttle_field(MockView_MinuteThrottling, -         ((0, None), -          (20, None), -          (40, None), -          (60, None), -          (80, None) -         )) +        self.ensure_response_header_contains_proper_throttle_field( +            MockView_MinuteThrottling, ( +                (0, None), +                (20, None), +                (40, None), +                (60, None), +                (80, None) +            ) +        )      def test_non_time_throttle(self):          """ @@ -170,7 +176,7 @@ class ThrottlingTests(TestCase):          self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called)          response = MockView_NonTimeThrottling.as_view()(request) -        self.assertFalse('X-Throttle-Wait-Seconds' in response)  +        self.assertFalse('X-Throttle-Wait-Seconds' in response)  class ScopedRateThrottleTests(TestCase): diff --git a/tests/test_urlizer.py b/tests/test_urlizer.py index 3dc8e8fe..a77aa22a 100644 --- a/tests/test_urlizer.py +++ b/tests/test_urlizer.py @@ -1,7 +1,6 @@  from __future__ import unicode_literals  from django.test import TestCase  from rest_framework.templatetags.rest_framework import urlize_quoted_links -import sys  class URLizerTests(TestCase): | 
