test_permissions_admin_views.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. from django.urls import reverse
  2. from misago.acl import ACL_CACHE
  3. from misago.acl.models import Role
  4. from misago.acl.test import mock_role_form_data
  5. from misago.admin.testutils import AdminTestCase
  6. from misago.cache.test import assert_invalidates_cache
  7. from misago.categories.models import Category, CategoryRole
  8. def create_data(data_dict):
  9. return mock_role_form_data(CategoryRole(), data_dict)
  10. class CategoryRoleAdminViewsTests(AdminTestCase):
  11. def test_link_registered(self):
  12. """admin nav contains category roles link"""
  13. response = self.client.get(reverse('misago:admin:permissions:categories:index'))
  14. self.assertContains(response, reverse('misago:admin:permissions:categories:index'))
  15. def test_list_view(self):
  16. """roles list view returns 200"""
  17. response = self.client.get(reverse('misago:admin:permissions:categories:index'))
  18. self.assertEqual(response.status_code, 200)
  19. def test_new_view(self):
  20. """new role view has no showstoppers"""
  21. response = self.client.get(reverse('misago:admin:permissions:categories:new'))
  22. self.assertEqual(response.status_code, 200)
  23. response = self.client.post(
  24. reverse('misago:admin:permissions:categories:new'),
  25. data=create_data({
  26. 'name': 'Test CategoryRole',
  27. }),
  28. )
  29. self.assertEqual(response.status_code, 302)
  30. test_role = CategoryRole.objects.get(name='Test CategoryRole')
  31. response = self.client.get(reverse('misago:admin:permissions:categories:index'))
  32. self.assertContains(response, test_role.name)
  33. def test_edit_view(self):
  34. """edit role view has no showstoppers"""
  35. self.client.post(
  36. reverse('misago:admin:permissions:categories:new'),
  37. data=create_data({
  38. 'name': 'Test CategoryRole',
  39. }),
  40. )
  41. test_role = CategoryRole.objects.get(name='Test CategoryRole')
  42. response = self.client.get(
  43. reverse('misago:admin:permissions:categories:edit', kwargs={
  44. 'pk': test_role.pk,
  45. })
  46. )
  47. self.assertContains(response, 'Test CategoryRole')
  48. response = self.client.post(
  49. reverse('misago:admin:permissions:categories:edit', kwargs={
  50. 'pk': test_role.pk,
  51. }),
  52. data=create_data({
  53. 'name': 'Top Lel',
  54. }),
  55. )
  56. self.assertEqual(response.status_code, 302)
  57. test_role = CategoryRole.objects.get(name='Top Lel')
  58. response = self.client.get(reverse('misago:admin:permissions:categories:index'))
  59. self.assertContains(response, test_role.name)
  60. def test_editing_role_invalidates_acl_cache(self):
  61. self.client.post(
  62. reverse('misago:admin:permissions:categories:new'),
  63. data=create_data({
  64. 'name': 'Test CategoryRole',
  65. }),
  66. )
  67. test_role = CategoryRole.objects.get(name='Test CategoryRole')
  68. with assert_invalidates_cache(ACL_CACHE):
  69. self.client.post(
  70. reverse('misago:admin:permissions:categories:edit', kwargs={
  71. 'pk': test_role.pk,
  72. }),
  73. data=create_data({
  74. 'name': 'Top Lel',
  75. }),
  76. )
  77. def test_delete_view(self):
  78. """delete role view has no showstoppers"""
  79. self.client.post(
  80. reverse('misago:admin:permissions:categories:new'),
  81. data=create_data({
  82. 'name': 'Test CategoryRole',
  83. }),
  84. )
  85. test_role = CategoryRole.objects.get(name='Test CategoryRole')
  86. response = self.client.post(
  87. reverse('misago:admin:permissions:categories:delete', kwargs={
  88. 'pk': test_role.pk,
  89. })
  90. )
  91. self.assertEqual(response.status_code, 302)
  92. self.client.get(reverse('misago:admin:permissions:categories:index'))
  93. response = self.client.get(reverse('misago:admin:permissions:categories:index'))
  94. self.assertNotContains(response, test_role.name)
  95. def test_deleting_role_invalidates_acl_cache(self):
  96. self.client.post(
  97. reverse('misago:admin:permissions:categories:new'),
  98. data=create_data({
  99. 'name': 'Test CategoryRole',
  100. }),
  101. )
  102. test_role = CategoryRole.objects.get(name='Test CategoryRole')
  103. with assert_invalidates_cache(ACL_CACHE):
  104. self.client.post(
  105. reverse('misago:admin:permissions:categories:delete', kwargs={
  106. 'pk': test_role.pk,
  107. })
  108. )
  109. def test_change_category_roles_view(self):
  110. """change category roles perms view works"""
  111. root = Category.objects.root_category()
  112. for descendant in root.get_descendants():
  113. descendant.delete()
  114. """
  115. Create categories tree for test cases:
  116. Category A
  117. + Category B
  118. Category C
  119. + Category D
  120. """
  121. root = Category.objects.root_category()
  122. self.client.post(
  123. reverse('misago:admin:categories:nodes:new'),
  124. data={
  125. 'name': 'Category A',
  126. 'new_parent': root.pk,
  127. 'prune_started_after': 0,
  128. 'prune_replied_after': 0,
  129. },
  130. )
  131. test_category = Category.objects.get(slug='category-a')
  132. self.assertEqual(Category.objects.count(), 3)
  133. """
  134. Create test roles
  135. """
  136. self.client.post(
  137. reverse('misago:admin:permissions:users:new'),
  138. data=mock_role_form_data(Role(), {'name': 'Test Role A'})
  139. )
  140. self.client.post(
  141. reverse('misago:admin:permissions:users:new'),
  142. data=mock_role_form_data(Role(), {'name': 'Test Role B'})
  143. )
  144. test_role_a = Role.objects.get(name='Test Role A')
  145. test_role_b = Role.objects.get(name='Test Role B')
  146. self.client.post(
  147. reverse('misago:admin:permissions:categories:new'),
  148. data=create_data({
  149. 'name': 'Test Comments',
  150. }),
  151. )
  152. self.client.post(
  153. reverse('misago:admin:permissions:categories:new'),
  154. data=create_data({
  155. 'name': 'Test Full',
  156. }),
  157. )
  158. role_comments = CategoryRole.objects.get(name='Test Comments')
  159. role_full = CategoryRole.objects.get(name='Test Full')
  160. """
  161. Test view itself
  162. """
  163. # See if form page is rendered
  164. response = self.client.get(
  165. reverse(
  166. 'misago:admin:categories:nodes:permissions', kwargs={
  167. 'pk': test_category.pk,
  168. }
  169. )
  170. )
  171. self.assertContains(response, test_category.name)
  172. self.assertContains(response, test_role_a.name)
  173. self.assertContains(response, test_role_b.name)
  174. self.assertContains(response, role_comments.name)
  175. self.assertContains(response, role_full.name)
  176. # Assign roles to categories
  177. response = self.client.post(
  178. reverse(
  179. 'misago:admin:categories:nodes:permissions', kwargs={
  180. 'pk': test_category.pk,
  181. }
  182. ),
  183. data={
  184. ('%s-category_role' % test_role_a.pk): role_full.pk,
  185. ('%s-category_role' % test_role_b.pk): role_comments.pk,
  186. },
  187. )
  188. self.assertEqual(response.status_code, 302)
  189. # Check that roles were assigned
  190. category_role_set = test_category.category_role_set
  191. self.assertEqual(category_role_set.get(role=test_role_a).category_role_id, role_full.pk)
  192. self.assertEqual(
  193. category_role_set.get(role=test_role_b).category_role_id, role_comments.pk
  194. )
  195. # Check that ACL was invalidated
  196. with assert_invalidates_cache(ACL_CACHE):
  197. self.client.post(
  198. reverse(
  199. 'misago:admin:categories:nodes:permissions', kwargs={
  200. 'pk': test_category.pk,
  201. }
  202. ),
  203. data={
  204. ('%s-category_role' % test_role_a.pk): role_full.pk,
  205. ('%s-category_role' % test_role_b.pk): role_comments.pk,
  206. },
  207. )
  208. def test_change_role_categories_permissions_view(self):
  209. """change role categories perms view works"""
  210. self.client.post(
  211. reverse('misago:admin:permissions:users:new'),
  212. data=mock_role_form_data(Role(), {'name': 'Test CategoryRole'})
  213. )
  214. test_role = Role.objects.get(name='Test CategoryRole')
  215. root = Category.objects.root_category()
  216. for descendant in root.get_descendants():
  217. descendant.delete()
  218. self.assertEqual(Category.objects.count(), 2)
  219. response = self.client.get(
  220. reverse('misago:admin:permissions:users:categories', kwargs={
  221. 'pk': test_role.pk,
  222. })
  223. )
  224. self.assertEqual(response.status_code, 302)
  225. """
  226. Create categories tree for test cases:
  227. Category A
  228. + Category B
  229. Category C
  230. + Category D
  231. """
  232. root = Category.objects.root_category()
  233. self.client.post(
  234. reverse('misago:admin:categories:nodes:new'),
  235. data={
  236. 'name': 'Category A',
  237. 'new_parent': root.pk,
  238. 'prune_started_after': 0,
  239. 'prune_replied_after': 0,
  240. },
  241. )
  242. self.client.post(
  243. reverse('misago:admin:categories:nodes:new'),
  244. data={
  245. 'name': 'Category C',
  246. 'new_parent': root.pk,
  247. 'prune_started_after': 0,
  248. 'prune_replied_after': 0,
  249. },
  250. )
  251. category_a = Category.objects.get(slug='category-a')
  252. category_c = Category.objects.get(slug='category-c')
  253. self.client.post(
  254. reverse('misago:admin:categories:nodes:new'),
  255. data={
  256. 'name': 'Category B',
  257. 'new_parent': category_a.pk,
  258. 'prune_started_after': 0,
  259. 'prune_replied_after': 0,
  260. },
  261. )
  262. category_b = Category.objects.get(slug='category-b')
  263. self.client.post(
  264. reverse('misago:admin:categories:nodes:new'),
  265. data={
  266. 'name': 'Category D',
  267. 'new_parent': category_c.pk,
  268. 'prune_started_after': 0,
  269. 'prune_replied_after': 0,
  270. },
  271. )
  272. category_d = Category.objects.get(slug='category-d')
  273. self.assertEqual(Category.objects.count(), 6)
  274. # See if form page is rendered
  275. response = self.client.get(
  276. reverse('misago:admin:permissions:users:categories', kwargs={
  277. 'pk': test_role.pk,
  278. })
  279. )
  280. self.assertContains(response, category_a.name)
  281. self.assertContains(response, category_b.name)
  282. self.assertContains(response, category_c.name)
  283. self.assertContains(response, category_d.name)
  284. # Set test roles
  285. self.client.post(
  286. reverse('misago:admin:permissions:categories:new'),
  287. data=create_data({
  288. 'name': 'Test Comments',
  289. }),
  290. )
  291. role_comments = CategoryRole.objects.get(name='Test Comments')
  292. self.client.post(
  293. reverse('misago:admin:permissions:categories:new'),
  294. data=create_data({
  295. 'name': 'Test Full',
  296. }),
  297. )
  298. role_full = CategoryRole.objects.get(name='Test Full')
  299. # See if form contains those roles
  300. response = self.client.get(
  301. reverse('misago:admin:permissions:users:categories', kwargs={
  302. 'pk': test_role.pk,
  303. })
  304. )
  305. self.assertContains(response, role_comments.name)
  306. self.assertContains(response, role_full.name)
  307. # Assign roles to categories
  308. response = self.client.post(
  309. reverse('misago:admin:permissions:users:categories', kwargs={
  310. 'pk': test_role.pk,
  311. }),
  312. data={
  313. ('%s-role' % category_a.pk): role_comments.pk,
  314. ('%s-role' % category_b.pk): role_comments.pk,
  315. ('%s-role' % category_c.pk): role_full.pk,
  316. ('%s-role' % category_d.pk): role_full.pk,
  317. },
  318. )
  319. self.assertEqual(response.status_code, 302)
  320. # Check that roles were assigned
  321. categories_acls = test_role.categories_acls
  322. self.assertEqual(
  323. categories_acls.get(category=category_a).category_role_id, role_comments.pk
  324. )
  325. self.assertEqual(
  326. categories_acls.get(category=category_b).category_role_id, role_comments.pk
  327. )
  328. self.assertEqual(categories_acls.get(category=category_c).category_role_id, role_full.pk)
  329. self.assertEqual(categories_acls.get(category=category_d).category_role_id, role_full.pk)
  330. # Check that ACL was invalidated
  331. with assert_invalidates_cache(ACL_CACHE):
  332. self.client.post(
  333. reverse('misago:admin:permissions:users:categories', kwargs={
  334. 'pk': test_role.pk,
  335. }),
  336. data={
  337. ('%s-role' % category_a.pk): role_comments.pk,
  338. ('%s-role' % category_b.pk): role_comments.pk,
  339. ('%s-role' % category_c.pk): role_full.pk,
  340. ('%s-role' % category_d.pk): role_full.pk,
  341. },
  342. )