test_thread_model.py 12 KB

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