test_permissions_admin_views.py 11 KB

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