test_threads_moderation.py 8.6 KB

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