|
5 | 5 | from django.utils import unittest
|
6 | 6 | from rest_framework import generics, serializers, status, permissions, authentication, HTTP_HEADER_ENCODING
|
7 | 7 | from rest_framework.compat import guardian, get_model_name
|
| 8 | +from django.core.urlresolvers import ResolverMatch |
8 | 9 | from rest_framework.filters import DjangoObjectPermissionsFilter
|
| 10 | +from rest_framework.routers import DefaultRouter |
9 | 11 | from rest_framework.test import APIRequestFactory
|
10 | 12 | from tests.models import BasicModel
|
11 | 13 | import base64
|
@@ -49,6 +51,7 @@ class EmptyListView(generics.ListCreateAPIView):
|
49 | 51 |
|
50 | 52 |
|
51 | 53 | root_view = RootView.as_view()
|
| 54 | +api_root_view = DefaultRouter().get_api_root_view() |
52 | 55 | instance_view = InstanceView.as_view()
|
53 | 56 | get_queryset_list_view = GetQuerySetListView.as_view()
|
54 | 57 | empty_list_view = EmptyListView.as_view()
|
@@ -86,6 +89,18 @@ def test_has_create_permissions(self):
|
86 | 89 | response = root_view(request, pk=1)
|
87 | 90 | self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
88 | 91 |
|
| 92 | + def test_api_root_view_discard_default_django_model_permission(self): |
| 93 | + """ |
| 94 | + We check that DEFAULT_PERMISSION_CLASSES can |
| 95 | + apply to APIRoot view. More specifically we check expected behavior of |
| 96 | + ``_ignore_model_permissions`` attribute support. |
| 97 | + """ |
| 98 | + request = factory.get('/', format='json', |
| 99 | + HTTP_AUTHORIZATION=self.permitted_credentials) |
| 100 | + request.resolver_match = ResolverMatch('get', (), {}) |
| 101 | + response = api_root_view(request) |
| 102 | + self.assertEqual(response.status_code, status.HTTP_200_OK) |
| 103 | + |
89 | 104 | def test_get_queryset_has_create_permissions(self):
|
90 | 105 | request = factory.post('/', {'text': 'foobar'}, format='json',
|
91 | 106 | HTTP_AUTHORIZATION=self.permitted_credentials)
|
@@ -227,6 +242,18 @@ class ObjectPermissionListView(generics.ListAPIView):
|
227 | 242 | object_permissions_list_view = ObjectPermissionListView.as_view()
|
228 | 243 |
|
229 | 244 |
|
| 245 | +class GetQuerysetObjectPermissionInstanceView(generics.RetrieveUpdateDestroyAPIView): |
| 246 | + serializer_class = BasicPermSerializer |
| 247 | + authentication_classes = [authentication.BasicAuthentication] |
| 248 | + permission_classes = [ViewObjectPermissions] |
| 249 | + |
| 250 | + def get_queryset(self): |
| 251 | + return BasicPermModel.objects.all() |
| 252 | + |
| 253 | + |
| 254 | +get_queryset_object_permissions_view = GetQuerysetObjectPermissionInstanceView.as_view() |
| 255 | + |
| 256 | + |
230 | 257 | @unittest.skipUnless(guardian, 'django-guardian not installed')
|
231 | 258 | class ObjectPermissionsIntegrationTests(TestCase):
|
232 | 259 | """
|
@@ -326,6 +353,15 @@ def test_cannot_read_permissions(self):
|
326 | 353 | response = object_permissions_view(request, pk='1')
|
327 | 354 | self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
|
328 | 355 |
|
| 356 | + def test_can_read_get_queryset_permissions(self): |
| 357 | + """ |
| 358 | + same as ``test_can_read_permissions`` but with a view |
| 359 | + that rely on ``.get_queryset()`` instead of ``.queryset``. |
| 360 | + """ |
| 361 | + request = factory.get('/1', HTTP_AUTHORIZATION=self.credentials['readonly']) |
| 362 | + response = get_queryset_object_permissions_view(request, pk='1') |
| 363 | + self.assertEqual(response.status_code, status.HTTP_200_OK) |
| 364 | + |
329 | 365 | # Read list
|
330 | 366 | def test_can_read_list_permissions(self):
|
331 | 367 | request = factory.get('/', HTTP_AUTHORIZATION=self.credentials['readonly'])
|
|
0 commit comments