testutils.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.utils import timezone
  4. from misago.core.utils import slugify
  5. from misago.users.testutils import create_test_user
  6. from .checksums import update_post_checksum
  7. from .models import Poll, Post, Thread
  8. User = get_user_model()
  9. def post_thread(
  10. category,
  11. title="Test thread",
  12. poster="Tester",
  13. is_global=False,
  14. is_pinned=False,
  15. is_unapproved=False,
  16. is_hidden=False,
  17. is_closed=False,
  18. started_on=None,
  19. ):
  20. started_on = started_on or timezone.now()
  21. kwargs = {
  22. "category": category,
  23. "title": title,
  24. "slug": slugify(title),
  25. "started_on": started_on,
  26. "last_post_on": started_on,
  27. "is_unapproved": is_unapproved,
  28. "is_hidden": is_hidden,
  29. "is_closed": is_closed,
  30. }
  31. if is_global:
  32. kwargs["weight"] = 2
  33. elif is_pinned:
  34. kwargs["weight"] = 1
  35. try:
  36. kwargs.update(
  37. {
  38. "starter": poster,
  39. "starter_name": poster.username,
  40. "starter_slug": poster.slug,
  41. "last_poster": poster,
  42. "last_poster_name": poster.username,
  43. "last_poster_slug": poster.slug,
  44. }
  45. )
  46. except AttributeError:
  47. kwargs.update(
  48. {
  49. "starter_name": poster,
  50. "starter_slug": slugify(poster),
  51. "last_poster_name": poster,
  52. "last_poster_slug": slugify(poster),
  53. }
  54. )
  55. thread = Thread.objects.create(**kwargs)
  56. reply_thread(
  57. thread,
  58. poster=poster,
  59. posted_on=started_on,
  60. is_hidden=is_hidden,
  61. is_unapproved=is_unapproved,
  62. )
  63. return thread
  64. def reply_thread(
  65. thread,
  66. poster="Tester",
  67. message="I am test message",
  68. is_unapproved=False,
  69. is_hidden=False,
  70. is_event=False,
  71. is_protected=False,
  72. has_reports=False,
  73. has_open_reports=False,
  74. posted_on=None,
  75. ):
  76. posted_on = posted_on or thread.last_post_on + timedelta(minutes=5)
  77. kwargs = {
  78. "category": thread.category,
  79. "thread": thread,
  80. "original": message,
  81. "parsed": message,
  82. "checksum": "nope",
  83. "posted_on": posted_on,
  84. "updated_on": posted_on,
  85. "is_event": is_event,
  86. "is_unapproved": is_unapproved,
  87. "is_hidden": is_hidden,
  88. "is_protected": is_protected,
  89. "has_reports": has_reports,
  90. "has_open_reports": has_open_reports,
  91. }
  92. try:
  93. kwargs.update({"poster": poster, "poster_name": poster.username})
  94. except AttributeError:
  95. kwargs.update({"poster_name": poster})
  96. post = Post.objects.create(**kwargs)
  97. update_post_checksum(post)
  98. post.save()
  99. thread.synchronize()
  100. thread.save()
  101. thread.category.synchronize()
  102. thread.category.save()
  103. return post
  104. def post_poll(thread, poster):
  105. poll = Poll.objects.create(
  106. category=thread.category,
  107. thread=thread,
  108. poster=poster,
  109. poster_name=poster.username,
  110. poster_slug=poster.slug,
  111. question="Lorem ipsum dolor met?",
  112. choices=[
  113. {"hash": "aaaaaaaaaaaa", "label": "Alpha", "votes": 1},
  114. {"hash": "bbbbbbbbbbbb", "label": "Beta", "votes": 0},
  115. {"hash": "gggggggggggg", "label": "Gamma", "votes": 2},
  116. {"hash": "dddddddddddd", "label": "Delta", "votes": 1},
  117. ],
  118. allowed_choices=2,
  119. votes=4,
  120. )
  121. # one user voted for Alpha choice
  122. try:
  123. user = User.objects.get(slug="user")
  124. except User.DoesNotExist:
  125. user = create_test_user("User", "user@example.com")
  126. poll.pollvote_set.create(
  127. category=thread.category,
  128. thread=thread,
  129. voter=user,
  130. voter_name=user.username,
  131. voter_slug=user.slug,
  132. choice_hash="aaaaaaaaaaaa",
  133. )
  134. # test user voted on third and last choices
  135. poll.pollvote_set.create(
  136. category=thread.category,
  137. thread=thread,
  138. voter=poster,
  139. voter_name=poster.username,
  140. voter_slug=poster.slug,
  141. choice_hash="gggggggggggg",
  142. )
  143. poll.pollvote_set.create(
  144. category=thread.category,
  145. thread=thread,
  146. voter=poster,
  147. voter_name=poster.username,
  148. voter_slug=poster.slug,
  149. choice_hash="dddddddddddd",
  150. )
  151. # somebody else voted on third option before being deleted
  152. poll.pollvote_set.create(
  153. category=thread.category,
  154. thread=thread,
  155. voter_name="deleted",
  156. voter_slug="deleted",
  157. choice_hash="gggggggggggg",
  158. )
  159. return poll
  160. def like_post(post, liker=None, username=None):
  161. if not post.last_likes:
  162. post.last_likes = []
  163. if liker:
  164. like = post.postlike_set.create(
  165. category=post.category,
  166. thread=post.thread,
  167. liker=liker,
  168. liker_name=liker.username,
  169. liker_slug=liker.slug,
  170. )
  171. post.last_likes = [
  172. {"id": liker.id, "username": liker.username}
  173. ] + post.last_likes
  174. else:
  175. like = post.postlike_set.create(
  176. category=post.category,
  177. thread=post.thread,
  178. liker_name=username,
  179. liker_slug=slugify(username),
  180. )
  181. post.last_likes = [{"id": None, "username": username}] + post.last_likes
  182. post.likes += 1
  183. post.save()
  184. return like