test_thread_model.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.test import TestCase
  4. from django.utils import timezone
  5. from misago.categories.models import Category
  6. from misago.threads.models import Thread, ThreadParticipant, Post, Event
  7. class ThreadModelTests(TestCase):
  8. def setUp(self):
  9. datetime = timezone.now()
  10. self.category = Category.objects.filter(role='forum')[:1][0]
  11. self.thread = Thread(
  12. category=self.category,
  13. started_on=datetime,
  14. starter_name='Tester',
  15. starter_slug='tester',
  16. last_post_on=datetime,
  17. last_poster_name='Tester',
  18. last_poster_slug='tester')
  19. self.thread.set_title("Test thread")
  20. self.thread.save()
  21. post = Post.objects.create(
  22. category=self.category,
  23. thread=self.thread,
  24. poster_name='Tester',
  25. poster_ip='127.0.0.1',
  26. original="Hello! I am test message!",
  27. parsed="<p>Hello! I am test message!</p>",
  28. checksum="nope",
  29. posted_on=datetime,
  30. updated_on=datetime)
  31. self.thread.first_post = post
  32. self.thread.last_post = post
  33. self.thread.save()
  34. def test_synchronize(self):
  35. """synchronize method updates thread data to reflect its contents"""
  36. User = get_user_model()
  37. user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
  38. self.assertEqual(self.thread.replies, 0)
  39. datetime = timezone.now() + timedelta(5)
  40. post = Post.objects.create(
  41. category=self.category,
  42. thread=self.thread,
  43. poster=user,
  44. poster_name=user.username,
  45. poster_ip='127.0.0.1',
  46. original="Hello! I am test message!",
  47. parsed="<p>Hello! I am test message!</p>",
  48. checksum="nope",
  49. posted_on=datetime,
  50. updated_on=datetime)
  51. # first sync call, updates last thread
  52. self.thread.synchronize()
  53. self.assertEqual(self.thread.last_post, post)
  54. self.assertEqual(self.thread.last_post_on, post.posted_on)
  55. self.assertEqual(self.thread.last_poster, user)
  56. self.assertEqual(self.thread.last_poster_name, user.username)
  57. self.assertEqual(self.thread.last_poster_slug, user.slug)
  58. self.assertFalse(self.thread.has_reported_posts)
  59. self.assertFalse(self.thread.has_moderated_posts)
  60. self.assertFalse(self.thread.has_hidden_posts)
  61. self.assertFalse(self.thread.has_events)
  62. self.assertEqual(self.thread.replies, 1)
  63. # add moderated post
  64. moderated_post = Post.objects.create(
  65. category=self.category,
  66. thread=self.thread,
  67. poster=user,
  68. poster_name=user.username,
  69. poster_ip='127.0.0.1',
  70. original="Hello! I am test message!",
  71. parsed="<p>Hello! I am test message!</p>",
  72. checksum="nope",
  73. posted_on=datetime + timedelta(5),
  74. updated_on=datetime + timedelta(5),
  75. is_moderated=True)
  76. self.thread.synchronize()
  77. self.assertEqual(self.thread.last_post, post)
  78. self.assertEqual(self.thread.last_post_on, post.posted_on)
  79. self.assertEqual(self.thread.last_poster, user)
  80. self.assertEqual(self.thread.last_poster_name, user.username)
  81. self.assertEqual(self.thread.last_poster_slug, user.slug)
  82. self.assertFalse(self.thread.has_reported_posts)
  83. self.assertTrue(self.thread.has_moderated_posts)
  84. self.assertFalse(self.thread.has_hidden_posts)
  85. self.assertFalse(self.thread.has_events)
  86. self.assertEqual(self.thread.replies, 1)
  87. # add hidden post
  88. hidden_post = Post.objects.create(
  89. category=self.category,
  90. thread=self.thread,
  91. poster=user,
  92. poster_name=user.username,
  93. poster_ip='127.0.0.1',
  94. original="Hello! I am test message!",
  95. parsed="<p>Hello! I am test message!</p>",
  96. checksum="nope",
  97. posted_on=datetime + timedelta(10),
  98. updated_on=datetime + timedelta(10),
  99. is_hidden=True)
  100. self.thread.synchronize()
  101. self.assertEqual(self.thread.last_post, hidden_post)
  102. self.assertEqual(self.thread.last_post_on, hidden_post.posted_on)
  103. self.assertEqual(self.thread.last_poster, user)
  104. self.assertEqual(self.thread.last_poster_name, user.username)
  105. self.assertEqual(self.thread.last_poster_slug, user.slug)
  106. self.assertFalse(self.thread.has_reported_posts)
  107. self.assertTrue(self.thread.has_moderated_posts)
  108. self.assertTrue(self.thread.has_hidden_posts)
  109. self.assertFalse(self.thread.has_events)
  110. self.assertEqual(self.thread.replies, 2)
  111. # unhide post
  112. hidden_post.is_hidden = False
  113. hidden_post.save()
  114. # last post changed to unhidden one
  115. self.thread.synchronize()
  116. self.assertEqual(self.thread.last_post, hidden_post)
  117. self.assertEqual(self.thread.last_post_on, hidden_post.posted_on)
  118. self.assertEqual(self.thread.last_poster, user)
  119. self.assertEqual(self.thread.last_poster_name, user.username)
  120. self.assertEqual(self.thread.last_poster_slug, user.slug)
  121. self.assertFalse(self.thread.has_reported_posts)
  122. self.assertTrue(self.thread.has_moderated_posts)
  123. self.assertFalse(self.thread.has_hidden_posts)
  124. self.assertFalse(self.thread.has_events)
  125. self.assertEqual(self.thread.replies, 2)
  126. # unmoderate post
  127. moderated_post.is_moderated = False
  128. moderated_post.save()
  129. # last post not changed, but flags and count did
  130. self.thread.synchronize()
  131. self.assertEqual(self.thread.last_post, hidden_post)
  132. self.assertEqual(self.thread.last_post_on, hidden_post.posted_on)
  133. self.assertEqual(self.thread.last_poster, user)
  134. self.assertEqual(self.thread.last_poster_name, user.username)
  135. self.assertEqual(self.thread.last_poster_slug, user.slug)
  136. self.assertFalse(self.thread.has_reported_posts)
  137. self.assertFalse(self.thread.has_moderated_posts)
  138. self.assertFalse(self.thread.has_hidden_posts)
  139. self.assertFalse(self.thread.has_events)
  140. self.assertEqual(self.thread.replies, 3)
  141. # add event
  142. event = Event.objects.create(
  143. category=self.category,
  144. thread=self.thread,
  145. author_name=user.username,
  146. author_slug=user.slug,
  147. message="How bout nope?")
  148. # sync set has_events flag
  149. self.thread.synchronize()
  150. self.assertTrue(self.thread.has_events)
  151. # sync unsetset has_events flag after only event was deleted
  152. event.delete()
  153. self.thread.synchronize()
  154. self.assertFalse(self.thread.has_events)
  155. def test_set_first_post(self):
  156. """set_first_post sets first post and poster data on thread"""
  157. User = get_user_model()
  158. user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
  159. datetime = timezone.now() + timedelta(5)
  160. post = Post.objects.create(
  161. category=self.category,
  162. thread=self.thread,
  163. poster=user,
  164. poster_name=user.username,
  165. poster_ip='127.0.0.1',
  166. original="Hello! I am test message!",
  167. parsed="<p>Hello! I am test message!</p>",
  168. checksum="nope",
  169. posted_on=datetime,
  170. updated_on=datetime)
  171. self.thread.set_first_post(post)
  172. self.assertEqual(self.thread.first_post, post)
  173. self.assertEqual(self.thread.started_on, post.posted_on)
  174. self.assertEqual(self.thread.starter, user)
  175. self.assertEqual(self.thread.starter_name, user.username)
  176. self.assertEqual(self.thread.starter_slug, user.slug)
  177. def test_set_last_post(self):
  178. """set_last_post sets first post and poster data on thread"""
  179. User = get_user_model()
  180. user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
  181. datetime = timezone.now() + timedelta(5)
  182. post = Post.objects.create(
  183. category=self.category,
  184. thread=self.thread,
  185. poster=user,
  186. poster_name=user.username,
  187. poster_ip='127.0.0.1',
  188. original="Hello! I am test message!",
  189. parsed="<p>Hello! I am test message!</p>",
  190. checksum="nope",
  191. posted_on=datetime,
  192. updated_on=datetime)
  193. self.thread.set_last_post(post)
  194. self.assertEqual(self.thread.last_post, post)
  195. self.assertEqual(self.thread.last_post_on, post.posted_on)
  196. self.assertEqual(self.thread.last_poster, user)
  197. self.assertEqual(self.thread.last_poster_name, user.username)
  198. self.assertEqual(self.thread.last_poster_slug, user.slug)
  199. def test_move(self):
  200. """move(new_category) moves thread to other category"""
  201. # pick category instead of category (so we don't have to create one)
  202. new_category = Category.objects.filter(role='forum')[:1][0]
  203. self.thread.move(new_category)
  204. self.assertEqual(self.thread.category, new_category)
  205. for post in self.thread.post_set.all():
  206. self.assertEqual(post.category_id, new_category.id)
  207. def test_merge(self):
  208. """merge(other_thread) moves other thread content to this thread"""
  209. with self.assertRaises(ValueError):
  210. self.thread.merge(self.thread)
  211. datetime = timezone.now() + timedelta(5)
  212. other_thread = Thread(
  213. category=self.category,
  214. started_on=datetime,
  215. starter_name='Tester',
  216. starter_slug='tester',
  217. last_post_on=datetime,
  218. last_poster_name='Tester',
  219. last_poster_slug='tester')
  220. other_thread.set_title("Other thread")
  221. other_thread.save()
  222. post = Post.objects.create(
  223. category=self.category,
  224. thread=other_thread,
  225. poster_name='Admin',
  226. poster_ip='127.0.0.1',
  227. original="Hello! I am other message!",
  228. parsed="<p>Hello! I am other message!</p>",
  229. checksum="nope",
  230. posted_on=datetime,
  231. updated_on=datetime)
  232. other_thread.first_post = post
  233. other_thread.last_post = post
  234. other_thread.save()
  235. self.thread.merge(other_thread)
  236. self.thread.synchronize()
  237. self.assertEqual(self.thread.replies, 1)
  238. self.assertEqual(self.thread.last_post, post)
  239. self.assertEqual(self.thread.last_post_on, post.posted_on)
  240. self.assertEqual(self.thread.last_poster_name, "Admin")
  241. self.assertEqual(self.thread.last_poster_slug, "admin")
  242. def test_delete_private_thread(self):
  243. """
  244. private thread gets deleted automatically
  245. when there are no participants left in it
  246. """
  247. User = get_user_model()
  248. user_a = User.objects.create_user(
  249. "Bob", "bob@boberson.com", "Pass.123")
  250. user_b = User.objects.create_user(
  251. "Weebl", "weebl@weeblson.com", "Pass.123")
  252. ThreadParticipant.objects.add_participant(self.thread, user_a)
  253. ThreadParticipant.objects.add_participant(self.thread, user_b)
  254. self.assertEqual(self.thread.participants.count(), 2)
  255. user_a.delete()
  256. Thread.objects.get(id=self.thread.id)
  257. user_b.delete()
  258. with self.assertRaises(Thread.DoesNotExist):
  259. Thread.objects.get(id=self.thread.id)