test_threads_moderation.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. from misago.categories.models import Category
  2. from misago.users.testutils import AuthenticatedUserTestCase
  3. from misago.threads import moderation, testutils
  4. from misago.threads.models import Thread, Post, Event
  5. class ThreadsModerationTests(AuthenticatedUserTestCase):
  6. def setUp(self):
  7. super(ThreadsModerationTests, self).setUp()
  8. self.category = Category.objects.all_categories()[:1][0]
  9. self.thread = testutils.post_thread(self.category)
  10. def tearDown(self):
  11. super(ThreadsModerationTests, self).tearDown()
  12. def reload_thread(self):
  13. self.thread = Thread.objects.get(pk=self.thread.pk)
  14. def test_pin_globally_thread(self):
  15. """pin_thread_globally makes thread pinned globally"""
  16. self.assertEqual(self.thread.weight, 0)
  17. self.assertTrue(moderation.pin_thread_globally(self.user, self.thread))
  18. self.reload_thread()
  19. self.assertEqual(self.thread.weight, 2)
  20. self.assertTrue(self.thread.has_events)
  21. event = self.thread.event_set.last()
  22. self.assertEqual(event.icon, "bookmark")
  23. self.assertIn("pinned thread globally.", event.message)
  24. def test_pin_globally_invalid_thread(self):
  25. """
  26. pin_thread_globally returns false for already globally pinned thread
  27. """
  28. self.thread.weight = 2
  29. self.assertFalse(moderation.pin_thread_globally(self.user, self.thread))
  30. self.assertEqual(self.thread.weight, 2)
  31. def test_pin_thread_locally(self):
  32. """pin_thread_locally makes thread pinned locally"""
  33. self.assertEqual(self.thread.weight, 0)
  34. self.assertTrue(moderation.pin_thread_locally(self.user, self.thread))
  35. self.reload_thread()
  36. self.assertEqual(self.thread.weight, 1)
  37. self.assertTrue(self.thread.has_events)
  38. event = self.thread.event_set.last()
  39. self.assertEqual(event.icon, "bookmark")
  40. self.assertIn("pinned thread locally.", event.message)
  41. def test_pin_invalid_thread(self):
  42. """
  43. pin_thread_locally returns false for already locally pinned thread
  44. """
  45. self.thread.weight = 1
  46. self.assertFalse(moderation.pin_thread_locally(self.user, self.thread))
  47. self.assertEqual(self.thread.weight, 1)
  48. def test_unpin_globally_pinned_thread(self):
  49. """unpin_thread unpins globally pinned thread"""
  50. moderation.pin_thread_globally(self.user, self.thread)
  51. self.assertEqual(self.thread.weight, 2)
  52. self.assertTrue(moderation.unpin_thread(self.user, self.thread))
  53. self.reload_thread()
  54. self.assertEqual(self.thread.weight, 0)
  55. self.assertTrue(self.thread.has_events)
  56. event = self.thread.event_set.last()
  57. self.assertIn("unpinned thread.", event.message)
  58. self.assertEqual(event.icon, "circle")
  59. def test_unpin_locally_pinned_thread(self):
  60. """unpin_thread unpins locally pinned thread"""
  61. moderation.pin_thread_locally(self.user, self.thread)
  62. self.assertEqual(self.thread.weight, 1)
  63. self.assertTrue(moderation.unpin_thread(self.user, self.thread))
  64. self.reload_thread()
  65. self.assertEqual(self.thread.weight, 0)
  66. self.assertTrue(self.thread.has_events)
  67. event = self.thread.event_set.last()
  68. self.assertIn("unpinned thread.", event.message)
  69. self.assertEqual(event.icon, "circle")
  70. def test_unpin_weightless_thread(self):
  71. """unpin_thread returns false for already weightless thread"""
  72. self.assertFalse(moderation.unpin_thread(self.user, self.thread))
  73. self.assertEqual(self.thread.weight, 0)
  74. def test_approve_thread(self):
  75. """approve_thread approves unapproved thread"""
  76. thread = testutils.post_thread(self.category, is_unapproved=True)
  77. self.assertTrue(thread.is_unapproved)
  78. self.assertTrue(thread.first_post.is_unapproved)
  79. self.assertTrue(moderation.approve_thread(self.user, thread))
  80. self.reload_thread()
  81. self.assertFalse(thread.is_unapproved)
  82. self.assertFalse(thread.first_post.is_unapproved)
  83. self.assertTrue(thread.has_events)
  84. event = thread.event_set.last()
  85. self.assertIn("approved thread.", event.message)
  86. self.assertEqual(event.icon, "check")
  87. def test_move_thread(self):
  88. """moves_thread moves unapproved thread to other category"""
  89. root_category = Category.objects.root_category()
  90. Category(
  91. name='New Category',
  92. slug='new-category',
  93. ).insert_at(root_category, position='last-child', save=True)
  94. new_category = Category.objects.get(slug='new-category')
  95. self.assertEqual(self.thread.category, self.category)
  96. self.assertTrue(
  97. moderation.move_thread(self.user, self.thread, new_category))
  98. self.reload_thread()
  99. self.assertEqual(self.thread.category, new_category)
  100. self.assertTrue(self.thread.has_events)
  101. event = self.thread.event_set.last()
  102. self.assertIn("moved thread", event.message)
  103. self.assertEqual(event.icon, "arrow-right")
  104. def test_move_thread_to_same_category(self):
  105. """moves_thread does not move thread to same category it is in"""
  106. self.assertEqual(self.thread.category, self.category)
  107. self.assertFalse(
  108. moderation.move_thread(self.user, self.thread, self.category))
  109. self.reload_thread()
  110. self.assertEqual(self.thread.category, self.category)
  111. self.assertFalse(self.thread.has_events)
  112. def test_close_thread(self):
  113. """close_thread closes thread"""
  114. self.assertFalse(self.thread.is_closed)
  115. self.assertTrue(moderation.close_thread(self.user, self.thread))
  116. self.reload_thread()
  117. self.assertTrue(self.thread.is_closed)
  118. self.assertTrue(self.thread.has_events)
  119. event = self.thread.event_set.last()
  120. self.assertIn("closed thread.", event.message)
  121. self.assertEqual(event.icon, "lock")
  122. def test_close_invalid_thread(self):
  123. """close_thread fails gracefully for opened thread"""
  124. moderation.close_thread(self.user, self.thread)
  125. self.reload_thread()
  126. self.assertTrue(self.thread.is_closed)
  127. self.assertFalse(moderation.close_thread(self.user, self.thread))
  128. def test_open_thread(self):
  129. """open_thread closes thread"""
  130. moderation.close_thread(self.user, self.thread)
  131. self.reload_thread()
  132. self.assertTrue(self.thread.is_closed)
  133. self.assertTrue(moderation.open_thread(self.user, self.thread))
  134. self.reload_thread()
  135. self.assertFalse(self.thread.is_closed)
  136. self.assertTrue(self.thread.has_events)
  137. event = self.thread.event_set.last()
  138. self.assertIn("opened thread.", event.message)
  139. self.assertEqual(event.icon, "unlock-alt")
  140. def test_open_invalid_thread(self):
  141. """open_thread fails gracefully for opened thread"""
  142. self.assertFalse(self.thread.is_closed)
  143. self.assertFalse(moderation.open_thread(self.user, self.thread))
  144. def test_hide_thread(self):
  145. """hide_thread hides thread"""
  146. self.assertFalse(self.thread.is_hidden)
  147. self.assertTrue(moderation.hide_thread(self.user, self.thread))
  148. self.reload_thread()
  149. self.assertTrue(self.thread.is_hidden)
  150. self.assertTrue(self.thread.has_events)
  151. event = self.thread.event_set.last()
  152. self.assertIn("hidden thread.", event.message)
  153. self.assertEqual(event.icon, "eye-slash")
  154. def test_hide_hidden_thread(self):
  155. """hide_thread fails gracefully for hidden thread"""
  156. self.thread.is_hidden = True
  157. self.assertFalse(moderation.hide_thread(self.user, self.thread))
  158. def test_unhide_thread(self):
  159. """unhide_thread unhides thread"""
  160. moderation.hide_thread(self.user, self.thread)
  161. self.reload_thread()
  162. self.assertTrue(self.thread.is_hidden)
  163. self.assertTrue(moderation.unhide_thread(self.user, self.thread))
  164. self.reload_thread()
  165. self.assertFalse(self.thread.is_hidden)
  166. self.assertTrue(self.thread.has_events)
  167. event = self.thread.event_set.last()
  168. self.assertIn("made thread visible.", event.message)
  169. self.assertEqual(event.icon, "eye")
  170. def test_unhide_visible_thread(self):
  171. """unhide_thread fails gracefully for visible thread"""
  172. self.assertFalse(moderation.unhide_thread(self.user, self.thread))
  173. def test_delete_thread(self):
  174. """delete_thread deletes thread"""
  175. self.assertTrue(moderation.delete_thread(self.user, self.thread))
  176. with self.assertRaises(Thread.DoesNotExist):
  177. self.reload_thread()