test_admin_views.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.contrib.auth import get_user_model
  4. from django.test import TestCase
  5. from django.urls import reverse
  6. from misago.admin.testutils import AdminTestCase
  7. from misago.admin.views import get_protected_namespace
  8. UserModel = get_user_model()
  9. class FakeRequest(object):
  10. def __init__(self, path):
  11. self.path = path
  12. self.path_info = path
  13. class AdminProtectedNamespaceTests(TestCase):
  14. def test_valid_cases(self):
  15. """get_protected_namespace returns true for protected links"""
  16. links_prefix = reverse('misago:admin:index')
  17. TEST_CASES = (
  18. '',
  19. 'somewhere/',
  20. 'ejksajdlksajldjskajdlksajlkdas',
  21. )
  22. for case in TEST_CASES:
  23. request = FakeRequest(links_prefix + case)
  24. self.assertEqual(get_protected_namespace(request), 'misago:admin')
  25. def test_invalid_cases(self):
  26. """get_protected_namespace returns none for other links"""
  27. TEST_CASES = (
  28. '/',
  29. '/somewhere/',
  30. '/ejksajdlksajldjskajdlksajlkdas',
  31. )
  32. for case in TEST_CASES:
  33. request = FakeRequest(case)
  34. self.assertEqual(get_protected_namespace(request), None)
  35. class AdminLoginViewTests(TestCase):
  36. def test_login_returns_200_on_get(self):
  37. """unauthenticated request to admin index produces login form"""
  38. response = self.client.get(reverse('misago:admin:index'))
  39. self.assertContains(response, 'Sign in')
  40. self.assertContains(response, 'Username or e-mail')
  41. self.assertContains(response, 'Password')
  42. def test_login_returns_200_on_invalid_post(self):
  43. """form handles invalid data gracefully"""
  44. response = self.client.post(
  45. reverse('misago:admin:index'),
  46. data={'username': 'Nope', 'password': 'Nope'})
  47. self.assertContains(response, "Login or password is incorrect.")
  48. self.assertContains(response, "Sign in")
  49. self.assertContains(response, "Username or e-mail")
  50. self.assertContains(response, "Password")
  51. def test_login_denies_non_staff_non_superuser(self):
  52. """login rejects user thats non staff and non superuser"""
  53. user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
  54. user.is_staff = False
  55. user.is_superuser = False
  56. user.save()
  57. response = self.client.post(
  58. reverse('misago:admin:index'),
  59. data={'username': 'Bob', 'password': 'Pass.123'})
  60. self.assertContains(response, "Your account does not have admin privileges.")
  61. def test_login_denies_non_staff_superuser(self):
  62. """login rejects user thats non staff and superuser"""
  63. user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
  64. user.is_staff = False
  65. user.is_superuser = True
  66. user.save()
  67. response = self.client.post(
  68. reverse('misago:admin:index'),
  69. data={'username': 'Bob', 'password': 'Pass.123'})
  70. self.assertContains(response, "Your account does not have admin privileges.")
  71. def test_login_signs_in_staff_non_superuser(self):
  72. """login passess user thats staff and non superuser"""
  73. user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
  74. user.is_staff = True
  75. user.is_superuser = False
  76. user.save()
  77. response = self.client.post(
  78. reverse('misago:admin:index'),
  79. data={'username': 'Bob', 'password': 'Pass.123'})
  80. self.assertEqual(response.status_code, 302)
  81. def test_login_signs_in_staff_superuser(self):
  82. """login passess user thats staff and superuser"""
  83. user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
  84. user.is_staff = True
  85. user.is_superuser = True
  86. user.save()
  87. response = self.client.post(
  88. reverse('misago:admin:index'),
  89. data={'username': 'Bob', 'password': 'Pass.123'})
  90. self.assertEqual(response.status_code, 302)
  91. class AdminLogoutTests(AdminTestCase):
  92. def test_admin_logout(self):
  93. """admin logout logged from admin only"""
  94. response = self.client.post(reverse('misago:admin:logout'))
  95. self.assertEqual(response.status_code, 302)
  96. response = self.client.get(reverse('misago:admin:index'))
  97. self.assertContains(response, "Your admin session has been closed.")
  98. response = self.client.get(reverse('misago:index'))
  99. self.assertContains(response, self.user.username)
  100. def test_complete_logout(self):
  101. """complete logout logged from both admin and site"""
  102. response = self.client.post(reverse('misago:logout'))
  103. self.assertEqual(response.status_code, 302)
  104. response = self.client.get(reverse('misago:admin:index'))
  105. self.assertContains(response, "Sign in")
  106. response = self.client.get(reverse('misago:index'))
  107. self.assertContains(response, "Sign in")
  108. class AdminViewAccessTests(AdminTestCase):
  109. def test_admin_denies_non_staff_non_superuser(self):
  110. """admin middleware rejects user thats non staff and non superuser"""
  111. self.user.is_staff = False
  112. self.user.is_superuser = False
  113. self.user.save()
  114. response = self.client.get(reverse('misago:admin:index'))
  115. self.assertContains(response, "Sign in")
  116. def test_admin_denies_non_staff_superuser(self):
  117. """admin middleware rejects user thats non staff and superuser"""
  118. self.user.is_staff = False
  119. self.user.is_superuser = True
  120. self.user.save()
  121. response = self.client.get(reverse('misago:admin:index'))
  122. self.assertContains(response, "Sign in")
  123. def test_admin_passess_in_staff_non_superuser(self):
  124. """admin middleware passess user thats staff and non superuser"""
  125. self.user.is_staff = True
  126. self.user.is_superuser = False
  127. self.user.save()
  128. response = self.client.get(reverse('misago:admin:index'))
  129. self.assertContains(response, self.user.username)
  130. def test_admin_passess_in_staff_superuser(self):
  131. """admin middleware passess user thats staff and superuser"""
  132. self.user.is_staff = True
  133. self.user.is_superuser = True
  134. self.user.save()
  135. response = self.client.get(reverse('misago:admin:index'))
  136. self.assertContains(response, self.user.username)
  137. class AdminIndexViewTests(AdminTestCase):
  138. def test_view_returns_200(self):
  139. """admin index view returns 200"""
  140. response = self.client.get(reverse('misago:admin:index'))
  141. self.assertContains(response, self.user.username)
  142. class Admin404ErrorTests(AdminTestCase):
  143. def test_list_search_unicode_handling(self):
  144. """querystring creation handles unicode strings"""
  145. test_link = '%stotally-errored/' % reverse('misago:admin:index')
  146. response = self.client.get(test_link)
  147. self.assertContains(
  148. response, "Requested page could not be found.", status_code=404)
  149. class AdminGenericViewsTests(AdminTestCase):
  150. def test_view_redirected_queryvar(self):
  151. """querystring redirected value is handled"""
  152. test_link = reverse('misago:admin:users:accounts:index')
  153. # request resulted in redirect with redirected=1 bit
  154. response = self.client.get('%s?username=lorem' % test_link)
  155. self.assertEqual(response.status_code, 302)
  156. self.assertIn('redirected=1', response['location'])
  157. # request with flag muted redirect
  158. response = self.client.get(
  159. '%s?redirected=1&username=lorem' % test_link)
  160. self.assertEqual(response.status_code, 200)
  161. def test_list_search_unicode_handling(self):
  162. """querystring creation handles unicode strings"""
  163. test_link = reverse('misago:admin:users:accounts:index')
  164. response = self.client.get(
  165. '%s?redirected=1&username=%s' % (test_link, 'łut'))
  166. self.assertEqual(response.status_code, 200)