test_thread_model.py 11 KB

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