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. login_required is assignable to callable objects.
  17. """
  18. class CallableView:
  19. def __call__(self, *args, **kwargs):
  20. pass
  21. login_required(CallableView())
  22. def testView(self):
  23. """
  24. 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. login_required works on a simple view wrapped in a login_required
  32. 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. login_required works on a simple view wrapped in a login_required
  45. decorator with a login_url set.
  46. """
  47. self.testLoginRequired(view_url='/login_required_login_url/', login_url='/somewhere/')
  48. class PermissionsRequiredDecoratorTest(TestCase):
  49. """
  50. Tests for the permission_required decorator
  51. """
  52. def setUp(self):
  53. self.user = models.User.objects.create(username='joe', password='qwerty')
  54. self.factory = RequestFactory()
  55. # Add permissions auth.add_customuser and auth.change_customuser
  56. perms = models.Permission.objects.filter(codename__in=('add_customuser', 'change_customuser'))
  57. self.user.user_permissions.add(*perms)
  58. def test_many_permissions_pass(self):
  59. @permission_required(['auth_tests.add_customuser', 'auth_tests.change_customuser'])
  60. def a_view(request):
  61. return HttpResponse()
  62. request = self.factory.get('/rand')
  63. request.user = self.user
  64. resp = a_view(request)
  65. self.assertEqual(resp.status_code, 200)
  66. def test_many_permissions_in_set_pass(self):
  67. @permission_required({'auth_tests.add_customuser', 'auth_tests.change_customuser'})
  68. def a_view(request):
  69. return HttpResponse()
  70. request = self.factory.get('/rand')
  71. request.user = self.user
  72. resp = a_view(request)
  73. self.assertEqual(resp.status_code, 200)
  74. def test_single_permission_pass(self):
  75. @permission_required('auth_tests.add_customuser')
  76. def a_view(request):
  77. return HttpResponse()
  78. request = self.factory.get('/rand')
  79. request.user = self.user
  80. resp = a_view(request)
  81. self.assertEqual(resp.status_code, 200)
  82. def test_permissioned_denied_redirect(self):
  83. @permission_required(['auth_tests.add_customuser', 'auth_tests.change_customuser', 'nonexistent-permission'])
  84. def a_view(request):
  85. return HttpResponse()
  86. request = self.factory.get('/rand')
  87. request.user = self.user
  88. resp = a_view(request)
  89. self.assertEqual(resp.status_code, 302)
  90. def test_permissioned_denied_exception_raised(self):
  91. @permission_required([
  92. 'auth_tests.add_customuser', 'auth_tests.change_customuser', 'nonexistent-permission'
  93. ], raise_exception=True)
  94. def a_view(request):
  95. return HttpResponse()
  96. request = self.factory.get('/rand')
  97. request.user = self.user
  98. with self.assertRaises(PermissionDenied):
  99. a_view(request)