test_rankadmin_views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. from django.urls import reverse
  2. from misago.acl import ACL_CACHE
  3. from misago.acl.models import Role
  4. from misago.admin.testutils import AdminTestCase
  5. from misago.cache.test import assert_invalidates_cache
  6. from misago.users.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(
  64. 'misago:admin:users:ranks:edit',
  65. kwargs={
  66. 'pk': test_rank.pk,
  67. },
  68. )
  69. )
  70. self.assertEqual(response.status_code, 200)
  71. self.assertContains(response, test_rank.name)
  72. self.assertContains(response, test_rank.title)
  73. response = self.client.post(
  74. reverse(
  75. 'misago:admin:users:ranks:edit',
  76. kwargs={
  77. 'pk': test_rank.pk,
  78. },
  79. ),
  80. data={
  81. 'name': 'Top Lel',
  82. 'roles': [test_role_b.pk],
  83. },
  84. )
  85. self.assertEqual(response.status_code, 302)
  86. test_rank = Rank.objects.get(slug='top-lel')
  87. response = self.client.get(reverse('misago:admin:users:ranks:index'))
  88. self.assertEqual(response.status_code, 200)
  89. self.assertContains(response, test_rank.name)
  90. self.assertTrue('Test Rank' not in test_rank.roles.all())
  91. self.assertTrue('Test Title' not in test_rank.roles.all())
  92. self.assertIn(test_role_b, test_rank.roles.all())
  93. self.assertTrue(test_role_a not in test_rank.roles.all())
  94. self.assertTrue(test_role_c not in test_rank.roles.all())
  95. def test_editing_rank_invalidates_acl_cache(self):
  96. self.client.post(
  97. reverse('misago:admin:users:ranks:new'),
  98. data={
  99. 'name': 'Test Rank',
  100. 'description': 'Lorem ipsum dolor met',
  101. 'title': 'Test Title',
  102. 'style': 'test',
  103. 'is_tab': '1',
  104. },
  105. )
  106. test_rank = Rank.objects.get(slug='test-rank')
  107. test_role_b = Role.objects.create(name='Test Role B')
  108. with assert_invalidates_cache(ACL_CACHE):
  109. self.client.post(
  110. reverse(
  111. 'misago:admin:users:ranks:edit',
  112. kwargs={
  113. 'pk': test_rank.pk,
  114. },
  115. ),
  116. data={
  117. 'name': 'Top Lel',
  118. 'roles': [test_role_b.pk],
  119. },
  120. )
  121. def test_default_view(self):
  122. """default rank view has no showstoppers"""
  123. self.client.post(
  124. reverse('misago:admin:users:ranks:new'),
  125. data={
  126. 'name': 'Test Rank',
  127. 'description': 'Lorem ipsum dolor met',
  128. 'title': 'Test Title',
  129. 'style': 'test',
  130. 'is_tab': '1',
  131. },
  132. )
  133. test_rank = Rank.objects.get(slug='test-rank')
  134. response = self.client.post(
  135. reverse(
  136. 'misago:admin:users:ranks:default',
  137. kwargs={
  138. 'pk': test_rank.pk,
  139. },
  140. )
  141. )
  142. self.assertEqual(response.status_code, 302)
  143. test_rank = Rank.objects.get(slug='test-rank')
  144. self.assertTrue(test_rank.is_default)
  145. def test_move_up_view(self):
  146. """move rank up view has no showstoppers"""
  147. self.client.post(
  148. reverse('misago:admin:users:ranks:new'),
  149. data={
  150. 'name': 'Test Rank',
  151. 'description': 'Lorem ipsum dolor met',
  152. 'title': 'Test Title',
  153. 'style': 'test',
  154. 'is_tab': '1',
  155. },
  156. )
  157. test_rank = Rank.objects.get(slug='test-rank')
  158. response = self.client.post(
  159. reverse(
  160. 'misago:admin:users:ranks:up',
  161. kwargs={
  162. 'pk': test_rank.pk,
  163. },
  164. )
  165. )
  166. self.assertEqual(response.status_code, 302)
  167. changed_rank = Rank.objects.get(slug='test-rank')
  168. self.assertEqual(changed_rank.order + 1, test_rank.order)
  169. def test_move_down_view(self):
  170. """move rank down view has no showstoppers"""
  171. self.client.post(
  172. reverse('misago:admin:users:ranks:new'),
  173. data={
  174. 'name': 'Test Rank',
  175. 'description': 'Lorem ipsum dolor met',
  176. 'title': 'Test Title',
  177. 'style': 'test',
  178. 'is_tab': '1',
  179. },
  180. )
  181. test_rank = Rank.objects.get(slug='test-rank')
  182. # Move rank up
  183. response = self.client.post(
  184. reverse(
  185. 'misago:admin:users:ranks:up',
  186. kwargs={
  187. 'pk': test_rank.pk,
  188. },
  189. )
  190. )
  191. response = self.client.post(
  192. reverse(
  193. 'misago:admin:users:ranks:down',
  194. kwargs={
  195. 'pk': test_rank.pk,
  196. },
  197. )
  198. )
  199. self.assertEqual(response.status_code, 302)
  200. # Test move down
  201. changed_rank = Rank.objects.get(slug='test-rank')
  202. self.assertEqual(changed_rank.order, test_rank.order)
  203. def test_users_view(self):
  204. """users with this rank view has no showstoppers"""
  205. self.client.post(
  206. reverse('misago:admin:users:ranks:new'),
  207. data={
  208. 'name': 'Test Rank',
  209. 'description': 'Lorem ipsum dolor met',
  210. 'title': 'Test Title',
  211. 'style': 'test',
  212. 'is_tab': '1',
  213. },
  214. )
  215. test_rank = Rank.objects.get(slug='test-rank')
  216. response = self.client.get(
  217. reverse(
  218. 'misago:admin:users:ranks:users',
  219. kwargs={
  220. 'pk': test_rank.pk,
  221. },
  222. )
  223. )
  224. self.assertEqual(response.status_code, 302)
  225. def test_delete_view(self):
  226. """delete rank view has no showstoppers"""
  227. self.client.post(
  228. reverse('misago:admin:users:ranks:new'),
  229. data={
  230. 'name': 'Test Rank',
  231. 'description': 'Lorem ipsum dolor met',
  232. 'title': 'Test Title',
  233. 'style': 'test',
  234. 'is_tab': '1',
  235. },
  236. )
  237. test_rank = Rank.objects.get(slug='test-rank')
  238. response = self.client.post(
  239. reverse(
  240. 'misago:admin:users:ranks:delete',
  241. kwargs={
  242. 'pk': test_rank.pk,
  243. },
  244. )
  245. )
  246. self.assertEqual(response.status_code, 302)
  247. self.client.get(reverse('misago:admin:users:ranks:index'))
  248. response = self.client.get(reverse('misago:admin:users:ranks:index'))
  249. self.assertEqual(response.status_code, 200)
  250. self.assertNotContains(response, test_rank.name)
  251. self.assertNotContains(response, test_rank.title)
  252. def test_deleting_rank_invalidates_acl_cache(self):
  253. self.client.post(
  254. reverse('misago:admin:users:ranks:new'),
  255. data={
  256. 'name': 'Test Rank',
  257. 'description': 'Lorem ipsum dolor met',
  258. 'title': 'Test Title',
  259. 'style': 'test',
  260. 'is_tab': '1',
  261. },
  262. )
  263. test_rank = Rank.objects.get(slug='test-rank')
  264. with assert_invalidates_cache(ACL_CACHE):
  265. self.client.post(
  266. reverse(
  267. 'misago:admin:users:ranks:delete',
  268. kwargs={
  269. 'pk': test_rank.pk,
  270. },
  271. )
  272. )
  273. def test_uniquess(self):
  274. """rank slug uniqueness is enforced by admin forms"""
  275. test_role_a = Role.objects.create(name='Test Role A')
  276. response = self.client.post(
  277. reverse('misago:admin:users:ranks:new'),
  278. data={
  279. 'name': 'Members',
  280. 'description': 'Colliding rank',
  281. 'title': 'Test Title',
  282. 'style': 'test',
  283. 'is_tab': '1',
  284. 'roles': [test_role_a.pk],
  285. }
  286. )
  287. self.assertEqual(response.status_code, 200)
  288. self.assertContains(response, "This name collides with other rank.")
  289. self.client.post(
  290. reverse('misago:admin:users:ranks:new'),
  291. data={
  292. 'name': 'Test rank',
  293. 'description': 'Colliding rank',
  294. 'title': 'Test Title',
  295. 'style': 'test',
  296. 'is_tab': '1',
  297. 'roles': [test_role_a.pk],
  298. }
  299. )
  300. test_rank = Rank.objects.get(slug='test-rank')
  301. response = self.client.post(
  302. reverse(
  303. 'misago:admin:users:ranks:edit',
  304. kwargs={
  305. 'pk': test_rank.pk,
  306. },
  307. ),
  308. data={
  309. 'name': 'Members',
  310. 'roles': [test_role_a.pk],
  311. },
  312. )
  313. self.assertEqual(response.status_code, 200)
  314. self.assertContains(response, "This name collides with other rank.")