test_rankadmin_views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. from django.urls import reverse
  2. from ...acl import ACL_CACHE
  3. from ...acl.models import Role
  4. from ...admin.test import AdminTestCase
  5. from ...cache.test import assert_invalidates_cache
  6. from ..models import Rank
  7. class RankAdminViewsTests(AdminTestCase):
  8. def test_link_registered(self):
  9. """admin nav contains ranks link"""
  10. response = self.client.get(reverse("misago:admin:users:accounts:index"))
  11. response = self.client.get(response["location"])
  12. self.assertContains(response, reverse("misago:admin:users:ranks:index"))
  13. def test_list_view(self):
  14. """ranks list view returns 200"""
  15. response = self.client.get(reverse("misago:admin:users:ranks:index"))
  16. self.assertEqual(response.status_code, 200)
  17. self.assertContains(response, "Team")
  18. def test_new_view(self):
  19. """new rank view has no showstoppers"""
  20. test_role_a = Role.objects.create(name="Test Role A")
  21. test_role_b = Role.objects.create(name="Test Role B")
  22. test_role_c = Role.objects.create(name="Test Role C")
  23. response = self.client.get(reverse("misago:admin:users:ranks:new"))
  24. self.assertEqual(response.status_code, 200)
  25. response = self.client.post(
  26. reverse("misago:admin:users:ranks:new"),
  27. data={
  28. "name": "Test Rank",
  29. "description": "Lorem ipsum dolor met",
  30. "title": "Test Title",
  31. "style": "test",
  32. "is_tab": "1",
  33. "roles": [test_role_a.pk, test_role_c.pk],
  34. },
  35. )
  36. self.assertEqual(response.status_code, 302)
  37. response = self.client.get(reverse("misago:admin:users:ranks:index"))
  38. self.assertEqual(response.status_code, 200)
  39. self.assertContains(response, "Test Rank")
  40. self.assertContains(response, "Test Title")
  41. test_rank = Rank.objects.get(slug="test-rank")
  42. self.assertIn(test_role_a, test_rank.roles.all())
  43. self.assertIn(test_role_c, test_rank.roles.all())
  44. self.assertTrue(test_role_b not in test_rank.roles.all())
  45. def test_edit_view(self):
  46. """edit rank view has no showstoppers"""
  47. test_role_a = Role.objects.create(name="Test Role A")
  48. test_role_b = Role.objects.create(name="Test Role B")
  49. test_role_c = Role.objects.create(name="Test Role C")
  50. self.client.post(
  51. reverse("misago:admin:users:ranks:new"),
  52. data={
  53. "name": "Test Rank",
  54. "description": "Lorem ipsum dolor met",
  55. "title": "Test Title",
  56. "style": "test",
  57. "is_tab": "1",
  58. "roles": [test_role_a.pk, test_role_c.pk],
  59. },
  60. )
  61. test_rank = Rank.objects.get(slug="test-rank")
  62. response = self.client.get(
  63. reverse("misago:admin:users:ranks:edit", kwargs={"pk": test_rank.pk})
  64. )
  65. self.assertEqual(response.status_code, 200)
  66. self.assertContains(response, test_rank.name)
  67. self.assertContains(response, test_rank.title)
  68. response = self.client.post(
  69. reverse("misago:admin:users:ranks:edit", kwargs={"pk": test_rank.pk}),
  70. data={"name": "Top Lel", "roles": [test_role_b.pk]},
  71. )
  72. self.assertEqual(response.status_code, 302)
  73. test_rank = Rank.objects.get(slug="top-lel")
  74. response = self.client.get(reverse("misago:admin:users:ranks:index"))
  75. self.assertEqual(response.status_code, 200)
  76. self.assertContains(response, test_rank.name)
  77. self.assertTrue("Test Rank" not in test_rank.roles.all())
  78. self.assertTrue("Test Title" not in test_rank.roles.all())
  79. self.assertIn(test_role_b, test_rank.roles.all())
  80. self.assertTrue(test_role_a not in test_rank.roles.all())
  81. self.assertTrue(test_role_c not in test_rank.roles.all())
  82. def test_editing_rank_invalidates_acl_cache(self):
  83. self.client.post(
  84. reverse("misago:admin:users:ranks:new"),
  85. data={
  86. "name": "Test Rank",
  87. "description": "Lorem ipsum dolor met",
  88. "title": "Test Title",
  89. "style": "test",
  90. "is_tab": "1",
  91. },
  92. )
  93. test_rank = Rank.objects.get(slug="test-rank")
  94. test_role_b = Role.objects.create(name="Test Role B")
  95. with assert_invalidates_cache(ACL_CACHE):
  96. self.client.post(
  97. reverse("misago:admin:users:ranks:edit", kwargs={"pk": test_rank.pk}),
  98. data={"name": "Top Lel", "roles": [test_role_b.pk]},
  99. )
  100. def test_default_view(self):
  101. """default rank view has no showstoppers"""
  102. self.client.post(
  103. reverse("misago:admin:users:ranks:new"),
  104. data={
  105. "name": "Test Rank",
  106. "description": "Lorem ipsum dolor met",
  107. "title": "Test Title",
  108. "style": "test",
  109. "is_tab": "1",
  110. },
  111. )
  112. test_rank = Rank.objects.get(slug="test-rank")
  113. response = self.client.post(
  114. reverse("misago:admin:users:ranks:default", kwargs={"pk": test_rank.pk})
  115. )
  116. self.assertEqual(response.status_code, 302)
  117. test_rank = Rank.objects.get(slug="test-rank")
  118. self.assertTrue(test_rank.is_default)
  119. def test_move_up_view(self):
  120. """move rank up view has no showstoppers"""
  121. self.client.post(
  122. reverse("misago:admin:users:ranks:new"),
  123. data={
  124. "name": "Test Rank",
  125. "description": "Lorem ipsum dolor met",
  126. "title": "Test Title",
  127. "style": "test",
  128. "is_tab": "1",
  129. },
  130. )
  131. test_rank = Rank.objects.get(slug="test-rank")
  132. response = self.client.post(
  133. reverse("misago:admin:users:ranks:up", kwargs={"pk": test_rank.pk})
  134. )
  135. self.assertEqual(response.status_code, 302)
  136. changed_rank = Rank.objects.get(slug="test-rank")
  137. self.assertEqual(changed_rank.order + 1, test_rank.order)
  138. def test_move_down_view(self):
  139. """move rank down view has no showstoppers"""
  140. self.client.post(
  141. reverse("misago:admin:users:ranks:new"),
  142. data={
  143. "name": "Test Rank",
  144. "description": "Lorem ipsum dolor met",
  145. "title": "Test Title",
  146. "style": "test",
  147. "is_tab": "1",
  148. },
  149. )
  150. test_rank = Rank.objects.get(slug="test-rank")
  151. # Move rank up
  152. response = self.client.post(
  153. reverse("misago:admin:users:ranks:up", kwargs={"pk": test_rank.pk})
  154. )
  155. response = self.client.post(
  156. reverse("misago:admin:users:ranks:down", kwargs={"pk": test_rank.pk})
  157. )
  158. self.assertEqual(response.status_code, 302)
  159. # Test move down
  160. changed_rank = Rank.objects.get(slug="test-rank")
  161. self.assertEqual(changed_rank.order, test_rank.order)
  162. def test_users_view(self):
  163. """users with this rank view has no showstoppers"""
  164. self.client.post(
  165. reverse("misago:admin:users:ranks:new"),
  166. data={
  167. "name": "Test Rank",
  168. "description": "Lorem ipsum dolor met",
  169. "title": "Test Title",
  170. "style": "test",
  171. "is_tab": "1",
  172. },
  173. )
  174. test_rank = Rank.objects.get(slug="test-rank")
  175. response = self.client.get(
  176. reverse("misago:admin:users:ranks:users", kwargs={"pk": test_rank.pk})
  177. )
  178. self.assertEqual(response.status_code, 302)
  179. def test_delete_view(self):
  180. """delete rank view has no showstoppers"""
  181. self.client.post(
  182. reverse("misago:admin:users:ranks:new"),
  183. data={
  184. "name": "Test Rank",
  185. "description": "Lorem ipsum dolor met",
  186. "title": "Test Title",
  187. "style": "test",
  188. "is_tab": "1",
  189. },
  190. )
  191. test_rank = Rank.objects.get(slug="test-rank")
  192. response = self.client.post(
  193. reverse("misago:admin:users:ranks:delete", kwargs={"pk": test_rank.pk})
  194. )
  195. self.assertEqual(response.status_code, 302)
  196. self.client.get(reverse("misago:admin:users:ranks:index"))
  197. response = self.client.get(reverse("misago:admin:users:ranks:index"))
  198. self.assertEqual(response.status_code, 200)
  199. self.assertNotContains(response, test_rank.name)
  200. self.assertNotContains(response, test_rank.title)
  201. def test_deleting_rank_invalidates_acl_cache(self):
  202. self.client.post(
  203. reverse("misago:admin:users:ranks:new"),
  204. data={
  205. "name": "Test Rank",
  206. "description": "Lorem ipsum dolor met",
  207. "title": "Test Title",
  208. "style": "test",
  209. "is_tab": "1",
  210. },
  211. )
  212. test_rank = Rank.objects.get(slug="test-rank")
  213. with assert_invalidates_cache(ACL_CACHE):
  214. self.client.post(
  215. reverse("misago:admin:users:ranks:delete", kwargs={"pk": test_rank.pk})
  216. )
  217. def test_uniquess(self):
  218. """rank slug uniqueness is enforced by admin forms"""
  219. test_role_a = Role.objects.create(name="Test Role A")
  220. response = self.client.post(
  221. reverse("misago:admin:users:ranks:new"),
  222. data={
  223. "name": "Members",
  224. "description": "Colliding rank",
  225. "title": "Test Title",
  226. "style": "test",
  227. "is_tab": "1",
  228. "roles": [test_role_a.pk],
  229. },
  230. )
  231. self.assertEqual(response.status_code, 200)
  232. self.assertContains(response, "This name collides with other rank.")
  233. self.client.post(
  234. reverse("misago:admin:users:ranks:new"),
  235. data={
  236. "name": "Test rank",
  237. "description": "Colliding rank",
  238. "title": "Test Title",
  239. "style": "test",
  240. "is_tab": "1",
  241. "roles": [test_role_a.pk],
  242. },
  243. )
  244. test_rank = Rank.objects.get(slug="test-rank")
  245. response = self.client.post(
  246. reverse("misago:admin:users:ranks:edit", kwargs={"pk": test_rank.pk}),
  247. data={"name": "Members", "roles": [test_role_a.pk]},
  248. )
  249. self.assertEqual(response.status_code, 200)
  250. self.assertContains(response, "This name collides with other rank.")