test_threads_moderation.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. from misago.categories.models import Category
  2. from misago.threads import moderation, testutils
  3. from misago.threads.models import Post, 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(ThreadsModerationTests, self).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(ThreadsModerationTests, self).tearDown()
  17. def reload_thread(self):
  18. self.thread = Thread.objects.get(pk=self.thread.pk)
  19. def test_pin_globally_thread(self):
  20. """pin_thread_globally makes thread pinned globally"""
  21. self.assertEqual(self.thread.weight, 0)
  22. self.assertTrue(moderation.pin_thread_globally(self.request, self.thread))
  23. self.reload_thread()
  24. self.assertEqual(self.thread.weight, 2)
  25. event = self.thread.last_post
  26. self.assertTrue(event.is_event)
  27. self.assertEqual(event.event_type, 'pinned_globally')
  28. def test_pin_globally_invalid_thread(self):
  29. """
  30. pin_thread_globally returns false for already globally pinned thread
  31. """
  32. self.thread.weight = 2
  33. self.assertFalse(moderation.pin_thread_globally(self.request, self.thread))
  34. self.assertEqual(self.thread.weight, 2)
  35. def test_pin_thread_locally(self):
  36. """pin_thread_locally makes thread pinned locally"""
  37. self.assertEqual(self.thread.weight, 0)
  38. self.assertTrue(moderation.pin_thread_locally(self.request, self.thread))
  39. self.reload_thread()
  40. self.assertEqual(self.thread.weight, 1)
  41. event = self.thread.last_post
  42. self.assertTrue(event.is_event)
  43. self.assertEqual(event.event_type, 'pinned_locally')
  44. def test_pin_invalid_thread(self):
  45. """
  46. pin_thread_locally returns false for already locally pinned thread
  47. """
  48. self.thread.weight = 1
  49. self.assertFalse(moderation.pin_thread_locally(self.request, self.thread))
  50. self.assertEqual(self.thread.weight, 1)
  51. def test_unpin_globally_pinned_thread(self):
  52. """unpin_thread unpins globally pinned thread"""
  53. moderation.pin_thread_globally(self.request, self.thread)
  54. self.assertEqual(self.thread.weight, 2)
  55. self.assertTrue(moderation.unpin_thread(self.request, self.thread))
  56. self.reload_thread()
  57. self.assertEqual(self.thread.weight, 0)
  58. event = self.thread.last_post
  59. self.assertTrue(event.is_event)
  60. self.assertEqual(event.event_type, 'unpinned')
  61. def test_unpin_locally_pinned_thread(self):
  62. """unpin_thread unpins locally pinned thread"""
  63. moderation.pin_thread_locally(self.request, self.thread)
  64. self.assertEqual(self.thread.weight, 1)
  65. self.assertTrue(moderation.unpin_thread(self.request, self.thread))
  66. self.reload_thread()
  67. self.assertEqual(self.thread.weight, 0)
  68. event = self.thread.last_post
  69. self.assertTrue(event.is_event)
  70. self.assertEqual(event.event_type, 'unpinned')
  71. def test_unpin_weightless_thread(self):
  72. """unpin_thread returns false for already weightless thread"""
  73. self.assertFalse(moderation.unpin_thread(self.request, self.thread))
  74. self.assertEqual(self.thread.weight, 0)
  75. def test_approve_thread(self):
  76. """approve_thread approves unapproved thread"""
  77. self.thread = testutils.post_thread(self.category, is_unapproved=True)
  78. self.assertTrue(self.thread.is_unapproved)
  79. self.assertTrue(self.thread.first_post.is_unapproved)
  80. self.assertTrue(moderation.approve_thread(self.request, self.thread))
  81. self.reload_thread()
  82. self.assertFalse(self.thread.is_unapproved)
  83. self.assertFalse(self.thread.first_post.is_unapproved)
  84. event = self.thread.last_post
  85. self.assertTrue(event.is_event)
  86. self.assertEqual(event.event_type, 'approved')
  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.request, self.thread, new_category))
  98. self.reload_thread()
  99. self.assertEqual(self.thread.category, new_category)
  100. event = self.thread.last_post
  101. self.assertTrue(event.is_event)
  102. self.assertEqual(event.event_type, 'moved')
  103. def test_move_thread_to_same_category(self):
  104. """moves_thread does not move thread to same category it is in"""
  105. self.assertEqual(self.thread.category, self.category)
  106. self.assertFalse(
  107. moderation.move_thread(self.request, self.thread, self.category))
  108. self.reload_thread()
  109. self.assertEqual(self.thread.category, self.category)
  110. def test_close_thread(self):
  111. """close_thread closes thread"""
  112. self.assertFalse(self.thread.is_closed)
  113. self.assertTrue(moderation.close_thread(self.request, self.thread))
  114. self.reload_thread()
  115. self.assertTrue(self.thread.is_closed)
  116. event = self.thread.last_post
  117. self.assertTrue(event.is_event)
  118. self.assertEqual(event.event_type, 'closed')
  119. def test_close_invalid_thread(self):
  120. """close_thread fails gracefully for opened thread"""
  121. moderation.close_thread(self.request, self.thread)
  122. self.reload_thread()
  123. self.assertTrue(self.thread.is_closed)
  124. self.assertFalse(moderation.close_thread(self.request, self.thread))
  125. def test_open_thread(self):
  126. """open_thread closes thread"""
  127. moderation.close_thread(self.request, self.thread)
  128. self.reload_thread()
  129. self.assertTrue(self.thread.is_closed)
  130. self.assertTrue(moderation.open_thread(self.request, self.thread))
  131. self.reload_thread()
  132. self.assertFalse(self.thread.is_closed)
  133. event = self.thread.last_post
  134. self.assertTrue(event.is_event)
  135. self.assertEqual(event.event_type, 'opened')
  136. def test_open_invalid_thread(self):
  137. """open_thread fails gracefully for opened thread"""
  138. self.assertFalse(self.thread.is_closed)
  139. self.assertFalse(moderation.open_thread(self.request, self.thread))
  140. def test_hide_thread(self):
  141. """hide_thread hides thread"""
  142. self.assertFalse(self.thread.is_hidden)
  143. self.assertTrue(moderation.hide_thread(self.request, self.thread))
  144. self.reload_thread()
  145. self.assertTrue(self.thread.is_hidden)
  146. event = self.thread.last_post
  147. self.assertTrue(event.is_event)
  148. self.assertEqual(event.event_type, 'hid')
  149. def test_hide_hidden_thread(self):
  150. """hide_thread fails gracefully for hidden thread"""
  151. self.thread.is_hidden = True
  152. self.assertFalse(moderation.hide_thread(self.request, self.thread))
  153. def test_unhide_thread(self):
  154. """unhide_thread unhides thread"""
  155. moderation.hide_thread(self.request, self.thread)
  156. self.reload_thread()
  157. self.assertTrue(self.thread.is_hidden)
  158. self.assertTrue(moderation.unhide_thread(self.request, self.thread))
  159. self.reload_thread()
  160. self.assertFalse(self.thread.is_hidden)
  161. event = self.thread.last_post
  162. self.assertTrue(event.is_event)
  163. self.assertEqual(event.event_type, 'unhid')
  164. def test_unhide_visible_thread(self):
  165. """unhide_thread fails gracefully for visible thread"""
  166. self.assertFalse(moderation.unhide_thread(self.request, self.thread))
  167. def test_delete_thread(self):
  168. """delete_thread deletes thread"""
  169. self.assertTrue(moderation.delete_thread(self.request, self.thread))
  170. with self.assertRaises(Thread.DoesNotExist):
  171. self.reload_thread()