test_permissions_admin_views.py 11 KB

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