test_thread_view.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. from django.core.urlresolvers import reverse
  2. from misago.acl import add_acl
  3. from misago.acl.testutils import override_acl
  4. from misago.forums.models import Forum
  5. from misago.users.testutils import AuthenticatedUserTestCase
  6. from misago.threads.models import Thread, Label
  7. from misago.threads.testutils import post_thread, reply_thread
  8. class ThreadViewTestCase(AuthenticatedUserTestCase):
  9. def setUp(self):
  10. super(ThreadViewTestCase, self).setUp()
  11. self.forum = Forum.objects.all_forums().filter(role="forum")[:1][0]
  12. self.forum.labels = []
  13. self.thread = post_thread(self.forum)
  14. def override_acl(self, new_acl, forum=None):
  15. forum = forum or self.forum
  16. new_acl.update({'can_see': True, 'can_browse': True})
  17. forums_acl = self.user.acl
  18. forums_acl['visible_forums'].append(forum.pk)
  19. forums_acl['forums'][forum.pk] = new_acl
  20. override_acl(self.user, forums_acl)
  21. def reload_thread(self):
  22. self.thread = Thread.objects.get(id=self.thread.id)
  23. return self.thread
  24. class ThreadViewTests(ThreadViewTestCase):
  25. def test_can_see_all_threads_false(self):
  26. """its impossible to see thread made by other user"""
  27. self.override_acl({
  28. 'can_see_all_threads': False,
  29. 'can_see_own_threads': True
  30. })
  31. response = self.client.get(self.thread.get_absolute_url())
  32. self.assertEqual(response.status_code, 404)
  33. def test_can_see_all_threads_false_owned_thread(self):
  34. """user can see thread he started in private forum"""
  35. self.override_acl({
  36. 'can_see_all_threads': False,
  37. 'can_see_own_threads': True
  38. })
  39. self.thread.starter = self.user
  40. self.thread.save()
  41. response = self.client.get(self.thread.get_absolute_url())
  42. self.assertEqual(response.status_code, 200)
  43. self.assertIn(self.thread.title, response.content)
  44. def test_can_see_all_threads_true(self):
  45. """its possible to see thread made by other user"""
  46. self.override_acl({
  47. 'can_see_all_threads': True,
  48. 'can_see_own_threads': False
  49. })
  50. response = self.client.get(self.thread.get_absolute_url())
  51. self.assertEqual(response.status_code, 200)
  52. self.assertIn(self.thread.title, response.content)
  53. class ThreadViewModerationTests(ThreadViewTestCase):
  54. def setUp(self):
  55. super(ThreadViewModerationTests, self).setUp()
  56. Label.objects.clear_cache()
  57. def tearDown(self):
  58. super(ThreadViewModerationTests, self).tearDown()
  59. Label.objects.clear_cache()
  60. def override_acl(self, new_acl, forum=None):
  61. new_acl.update({
  62. 'can_see_all_threads': True,
  63. 'can_see_own_threads': False
  64. })
  65. super(ThreadViewModerationTests, self).override_acl(new_acl, forum)
  66. def test_label_thread(self):
  67. """its possible to set thread label"""
  68. self.override_acl({'can_change_threads_labels': 0})
  69. response = self.client.get(self.thread.get_absolute_url())
  70. self.assertEqual(response.status_code, 200)
  71. self.assertNotIn("Moderate thread", response.content)
  72. self.override_acl({'can_change_threads_labels': 2})
  73. response = self.client.get(self.thread.get_absolute_url())
  74. self.assertEqual(response.status_code, 200)
  75. self.assertNotIn("Moderate thread", response.content)
  76. test_label = Label.objects.create(name="Foxtrot", slug="foxtrot")
  77. test_label.forums.add(self.forum)
  78. Label.objects.clear_cache()
  79. self.override_acl({'can_change_threads_labels': 0})
  80. response = self.client.get(self.thread.get_absolute_url())
  81. self.assertEqual(response.status_code, 200)
  82. self.assertNotIn("Moderate thread", response.content)
  83. self.override_acl({'can_change_threads_labels': 2})
  84. response = self.client.get(self.thread.get_absolute_url())
  85. self.assertEqual(response.status_code, 200)
  86. self.assertIn(test_label.name, response.content)
  87. self.assertIn(test_label.slug, response.content)
  88. self.override_acl({'can_change_threads_labels': 2})
  89. response = self.client.post(self.thread.get_absolute_url(), data={
  90. 'thread_action': 'label:%s' % test_label.slug
  91. })
  92. self.assertEqual(response.status_code, 302)
  93. self.assertEqual(self.reload_thread().label_id, test_label.id)
  94. def test_change_thread_label(self):
  95. """its possible to change thread label"""
  96. test_label = Label.objects.create(name="Foxtrot", slug="foxtrot")
  97. test_label.forums.add(self.forum)
  98. other_label = Label.objects.create(name="Uniform", slug="uniform")
  99. other_label.forums.add(self.forum)
  100. Label.objects.clear_cache()
  101. self.thread.label = test_label
  102. self.thread.save()
  103. self.override_acl({'can_change_threads_labels': 2})
  104. response = self.client.get(self.thread.get_absolute_url())
  105. self.assertEqual(response.status_code, 200)
  106. self.assertNotIn(test_label.name, response.content)
  107. self.assertNotIn(test_label.slug, response.content)
  108. self.assertIn(other_label.name, response.content)
  109. self.assertIn(other_label.slug, response.content)
  110. self.override_acl({'can_change_threads_labels': 2})
  111. response = self.client.post(self.thread.get_absolute_url(), data={
  112. 'thread_action': 'label:%s' % test_label.slug
  113. })
  114. self.assertEqual(response.status_code, 200)
  115. self.override_acl({'can_change_threads_labels': 2})
  116. response = self.client.post(self.thread.get_absolute_url(), data={
  117. 'thread_action': 'label:%s' % other_label.slug
  118. })
  119. self.assertEqual(response.status_code, 302)
  120. self.assertEqual(self.reload_thread().label_id, other_label.id)
  121. def test_unlabel_thread(self):
  122. """its possible to unset thread label"""
  123. test_label = Label.objects.create(name="Foxtrot", slug="foxtrot")
  124. test_label.forums.add(self.forum)
  125. Label.objects.clear_cache()
  126. self.thread.label = test_label
  127. self.thread.save()
  128. self.override_acl({'can_change_threads_labels': 2})
  129. response = self.client.get(self.thread.get_absolute_url())
  130. self.assertEqual(response.status_code, 200)
  131. self.assertIn('unlabel', response.content)
  132. self.override_acl({'can_change_threads_labels': 2})
  133. response = self.client.post(self.thread.get_absolute_url(), data={
  134. 'thread_action': 'unlabel'
  135. })
  136. self.assertEqual(response.status_code, 302)
  137. self.assertIsNone(self.reload_thread().label)
  138. def test_pin_thread(self):
  139. """its possible to pin thread"""
  140. self.override_acl({'can_pin_threads': 0})
  141. response = self.client.post(self.thread.get_absolute_url(),
  142. data={'thread_action': 'pin'})
  143. self.assertEqual(response.status_code, 200)
  144. # allow for pinning threads
  145. self.override_acl({'can_pin_threads': 1})
  146. response = self.client.post(self.thread.get_absolute_url(),
  147. data={'thread_action': 'pin'})
  148. self.assertEqual(response.status_code, 302)
  149. self.assertTrue(self.reload_thread().is_pinned)
  150. def test_unpin_thread(self):
  151. """its possible to unpin thread"""
  152. self.thread.is_pinned = True
  153. self.thread.save()
  154. self.override_acl({'can_pin_threads': 0})
  155. response = self.client.post(self.thread.get_absolute_url(),
  156. data={'thread_action': 'unpin'})
  157. self.assertEqual(response.status_code, 200)
  158. # allow for pinning threads
  159. self.override_acl({'can_pin_threads': 1})
  160. response = self.client.post(self.thread.get_absolute_url(),
  161. data={'thread_action': 'unpin'})
  162. self.assertEqual(response.status_code, 302)
  163. self.assertFalse(self.reload_thread().is_pinned)
  164. def test_close_thread(self):
  165. """its possible to close thread"""
  166. self.override_acl({'can_close_threads': 0})
  167. response = self.client.post(self.thread.get_absolute_url(),
  168. data={'thread_action': 'close'})
  169. self.assertEqual(response.status_code, 200)
  170. self.override_acl({'can_close_threads': 2})
  171. response = self.client.post(self.thread.get_absolute_url(),
  172. data={'thread_action': 'close'})
  173. self.assertEqual(response.status_code, 302)
  174. self.assertTrue(self.reload_thread().is_closed)
  175. def test_open_thread(self):
  176. """its possible to close thread"""
  177. self.thread.is_closed = True
  178. self.thread.save()
  179. self.override_acl({'can_close_threads': 0})
  180. response = self.client.post(self.thread.get_absolute_url(),
  181. data={'thread_action': 'open'})
  182. self.assertEqual(response.status_code, 200)
  183. self.override_acl({'can_close_threads': 2})
  184. response = self.client.post(self.thread.get_absolute_url(),
  185. data={'thread_action': 'open'})
  186. self.assertEqual(response.status_code, 302)
  187. self.assertFalse(self.reload_thread().is_closed)
  188. def test_move_thread(self):
  189. """its possible to move thread"""
  190. self.override_acl({'can_move_threads': 0})
  191. response = self.client.post(self.thread.get_absolute_url(),
  192. data={'thread_action': 'move'})
  193. self.assertEqual(response.status_code, 200)
  194. self.override_acl({'can_move_threads': 1})
  195. response = self.client.post(self.thread.get_absolute_url(),
  196. data={'thread_action': 'move'})
  197. self.assertEqual(response.status_code, 200)
  198. self.assertIn("Move thread to forum:", response.content)
  199. new_forum = Forum(name="New Forum",
  200. slug="new-forum",
  201. role="forum")
  202. new_forum.insert_at(self.forum.parent, save=True)
  203. self.override_acl({'can_move_threads': 1})
  204. self.override_acl({'can_move_threads': 1}, new_forum)
  205. response = self.client.post(self.thread.get_absolute_url(), data={
  206. 'thread_action': 'move',
  207. 'new_forum': unicode(new_forum.id),
  208. 'submit': '1'
  209. })
  210. self.assertEqual(response.status_code, 302)
  211. self.assertEqual(self.reload_thread().forum, new_forum)
  212. # we made forum "empty", assert that board index renders
  213. response = self.client.get(reverse('misago:index'))
  214. self.assertEqual(response.status_code, 200)
  215. def test_hide_thread(self):
  216. """its possible to hide thread"""
  217. self.override_acl({'can_hide_threads': 0})
  218. response = self.client.post(self.thread.get_absolute_url(),
  219. data={'thread_action': 'hide'})
  220. self.assertEqual(response.status_code, 200)
  221. self.override_acl({'can_hide_threads': 2})
  222. response = self.client.post(self.thread.get_absolute_url(),
  223. data={'thread_action': 'hide'})
  224. self.assertEqual(response.status_code, 302)
  225. self.assertTrue(self.reload_thread().is_hidden)
  226. # we made forum "empty", assert that board index renders
  227. response = self.client.get(reverse('misago:index'))
  228. self.assertEqual(response.status_code, 200)
  229. def test_unhide_thread(self):
  230. """its possible to hide thread"""
  231. self.thread.is_hidden = True
  232. self.thread.save()
  233. self.override_acl({'can_hide_threads': 0})
  234. response = self.client.post(self.thread.get_absolute_url(),
  235. data={'thread_action': 'unhide'})
  236. self.assertEqual(response.status_code, 200)
  237. self.override_acl({'can_hide_threads': 2})
  238. response = self.client.post(self.thread.get_absolute_url(),
  239. data={'thread_action': 'unhide'})
  240. self.assertEqual(response.status_code, 302)
  241. self.assertFalse(self.reload_thread().is_hidden)
  242. def test_delete_thread(self):
  243. """its possible to delete thread"""
  244. self.override_acl({'can_hide_threads': 0})
  245. response = self.client.post(self.thread.get_absolute_url(),
  246. data={'thread_action': 'delete'})
  247. self.assertEqual(response.status_code, 200)
  248. self.override_acl({'can_hide_threads': 2})
  249. response = self.client.post(self.thread.get_absolute_url(),
  250. data={'thread_action': 'delete'})
  251. self.assertEqual(response.status_code, 302)
  252. # we made forum empty, assert that board index renders
  253. response = self.client.get(reverse('misago:index'))
  254. self.assertEqual(response.status_code, 200)