test_decorators.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from django.conf import settings
  2. from django.contrib.auth import models
  3. from django.contrib.auth.decorators import login_required, permission_required
  4. from django.core.exceptions import PermissionDenied
  5. from django.http import HttpResponse
  6. from django.test import TestCase, override_settings
  7. from django.test.client import RequestFactory
  8. from .test_views import AuthViewsTestCase
  9. @override_settings(ROOT_URLCONF='auth_tests.urls')
  10. class LoginRequiredTestCase(AuthViewsTestCase):
  11. """
  12. Tests the login_required decorators
  13. """
  14. def testCallable(self):
  15. """
  16. Check that login_required is assignable to callable objects.
  17. """
  18. class CallableView(object):
  19. def __call__(self, *args, **kwargs):
  20. pass
  21. login_required(CallableView())
  22. def testView(self):
  23. """
  24. Check that login_required is assignable to normal views.
  25. """
  26. def normal_view(request):
  27. pass
  28. login_required(normal_view)
  29. def testLoginRequired(self, view_url='/login_required/', login_url=None):
  30. """
  31. Check that login_required works on a simple view wrapped in a
  32. login_required decorator.
  33. """
  34. if login_url is None:
  35. login_url = settings.LOGIN_URL
  36. response = self.client.get(view_url)
  37. self.assertEqual(response.status_code, 302)
  38. self.assertIn(login_url, response.url)
  39. self.login()
  40. response = self.client.get(view_url)
  41. self.assertEqual(response.status_code, 200)
  42. def testLoginRequiredNextUrl(self):
  43. """
  44. Check that login_required works on a simple view wrapped in a
  45. login_required decorator with a login_url set.
  46. """
  47. self.testLoginRequired(view_url='/login_required_login_url/',
  48. login_url='/somewhere/')
  49. class PermissionsRequiredDecoratorTest(TestCase):
  50. """
  51. Tests for the permission_required decorator
  52. """
  53. def setUp(self):
  54. self.user = models.User.objects.create(username='joe', password='qwerty')
  55. self.factory = RequestFactory()
  56. # Add permissions auth.add_customuser and auth.change_customuser
  57. perms = models.Permission.objects.filter(codename__in=('add_customuser', 'change_customuser'))
  58. self.user.user_permissions.add(*perms)
  59. def test_many_permissions_pass(self):
  60. @permission_required(['auth.add_customuser', 'auth.change_customuser'])
  61. def a_view(request):
  62. return HttpResponse()
  63. request = self.factory.get('/rand')
  64. request.user = self.user
  65. resp = a_view(request)
  66. self.assertEqual(resp.status_code, 200)
  67. def test_many_permissions_in_set_pass(self):
  68. @permission_required({'auth.add_customuser', 'auth.change_customuser'})
  69. def a_view(request):
  70. return HttpResponse()
  71. request = self.factory.get('/rand')
  72. request.user = self.user
  73. resp = a_view(request)
  74. self.assertEqual(resp.status_code, 200)
  75. def test_single_permission_pass(self):
  76. @permission_required('auth.add_customuser')
  77. def a_view(request):
  78. return HttpResponse()
  79. request = self.factory.get('/rand')
  80. request.user = self.user
  81. resp = a_view(request)
  82. self.assertEqual(resp.status_code, 200)
  83. def test_permissioned_denied_redirect(self):
  84. @permission_required(['auth.add_customuser', 'auth.change_customuser', 'non-existent-permission'])
  85. def a_view(request):
  86. return HttpResponse()
  87. request = self.factory.get('/rand')
  88. request.user = self.user
  89. resp = a_view(request)
  90. self.assertEqual(resp.status_code, 302)
  91. def test_permissioned_denied_exception_raised(self):
  92. @permission_required([
  93. 'auth.add_customuser', 'auth.change_customuser', 'non-existent-permission'
  94. ], raise_exception=True)
  95. def a_view(request):
  96. return HttpResponse()
  97. request = self.factory.get('/rand')
  98. request.user = self.user
  99. self.assertRaises(PermissionDenied, a_view, request)