test_permissions_admin_views.py 11 KB

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