test_post_mentions.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from django.contrib.auth import get_user_model
  2. from django.test.client import BOUNDARY, MULTIPART_CONTENT, encode_multipart
  3. from django.urls import reverse
  4. from misago.categories.models import Category
  5. from misago.markup.mentions import MENTIONS_LIMIT
  6. from misago.threads import testutils
  7. from misago.users.testutils import AuthenticatedUserTestCase
  8. UserModel = get_user_model()
  9. class PostMentionsTests(AuthenticatedUserTestCase):
  10. def setUp(self):
  11. super().setUp()
  12. self.category = Category.objects.get(slug="first-category")
  13. self.thread = testutils.post_thread(category=self.category)
  14. self.post_link = reverse(
  15. "misago:api:thread-post-list", kwargs={"thread_pk": self.thread.pk}
  16. )
  17. def put(self, url, data=None):
  18. content = encode_multipart(BOUNDARY, data or {})
  19. return self.client.put(url, content, content_type=MULTIPART_CONTENT)
  20. def test_mention_noone(self):
  21. """endpoint handles no mentions in post"""
  22. response = self.client.post(
  23. self.post_link, data={"post": "This is test response!"}
  24. )
  25. self.assertEqual(response.status_code, 200)
  26. post = self.user.post_set.order_by("id").last()
  27. self.assertEqual(post.mentions.count(), 0)
  28. def test_mention_nonexistant(self):
  29. """endpoint handles nonexistant mention"""
  30. response = self.client.post(
  31. self.post_link, data={"post": "This is test response, @InvalidUser!"}
  32. )
  33. self.assertEqual(response.status_code, 200)
  34. post = self.user.post_set.order_by("id").last()
  35. self.assertEqual(post.mentions.count(), 0)
  36. def test_mention_self(self):
  37. """endpoint mentions author"""
  38. response = self.client.post(
  39. self.post_link, data={"post": "This is test response, @%s!" % self.user}
  40. )
  41. self.assertEqual(response.status_code, 200)
  42. post = self.user.post_set.order_by("id").last()
  43. self.assertEqual(post.mentions.count(), 1)
  44. self.assertEqual(post.mentions.all()[0], self.user)
  45. def test_mention_limit(self):
  46. """endpoint mentions limits mentions to 24 users"""
  47. users = []
  48. for i in range(MENTIONS_LIMIT + 5):
  49. users.append(
  50. UserModel.objects.create_user(
  51. "Mention%s" % i, "mention%s@bob.com" % i, "pass123"
  52. )
  53. )
  54. mentions = ["@%s" % u for u in users]
  55. response = self.client.post(
  56. self.post_link,
  57. data={"post": "This is test response, %s!" % (", ".join(mentions))},
  58. )
  59. self.assertEqual(response.status_code, 200)
  60. post = self.user.post_set.order_by("id").last()
  61. self.assertEqual(post.mentions.count(), 24)
  62. self.assertEqual(list(post.mentions.order_by("id")), users[:24])
  63. def test_mention_update(self):
  64. """edit post endpoint updates mentions"""
  65. user_a = UserModel.objects.create_user("Mention", "mention@test.com", "pass123")
  66. user_b = UserModel.objects.create_user(
  67. "MentionB", "mentionb@test.com", "pass123"
  68. )
  69. response = self.client.post(
  70. self.post_link, data={"post": "This is test response, @%s!" % user_a}
  71. )
  72. self.assertEqual(response.status_code, 200)
  73. post = self.user.post_set.order_by("id").last()
  74. self.assertEqual(post.mentions.count(), 1)
  75. self.assertEqual(post.mentions.order_by("id")[0], user_a)
  76. # add mention to post
  77. edit_link = reverse(
  78. "misago:api:thread-post-detail",
  79. kwargs={"thread_pk": self.thread.pk, "pk": post.pk},
  80. )
  81. response = self.put(
  82. edit_link,
  83. data={"post": "This is test response, @%s and @%s!" % (user_a, user_b)},
  84. )
  85. self.assertEqual(response.status_code, 200)
  86. self.assertEqual(post.mentions.count(), 2)
  87. self.assertEqual(list(post.mentions.order_by("id")), [user_a, user_b])
  88. # remove first mention from post - should preserve mentions
  89. response = self.put(
  90. edit_link, data={"post": "This is test response, @%s!" % user_b}
  91. )
  92. self.assertEqual(response.status_code, 200)
  93. self.assertEqual(post.mentions.count(), 2)
  94. self.assertEqual(list(post.mentions.order_by("id")), [user_a, user_b])
  95. # remove mentions from post - should preserve mentions
  96. response = self.put(edit_link, data={"post": "This is test response!"})
  97. self.assertEqual(response.status_code, 200)
  98. self.assertEqual(post.mentions.count(), 2)
  99. self.assertEqual(list(post.mentions.order_by("id")), [user_a, user_b])
  100. def test_mentions_merge(self):
  101. """posts merge sums mentions"""
  102. user_a = UserModel.objects.create_user("Mention", "mention@test.com", "pass123")
  103. user_b = UserModel.objects.create_user(
  104. "MentionB", "mentionb@test.com", "pass123"
  105. )
  106. response = self.client.post(
  107. self.post_link, data={"post": "This is test response, @%s!" % user_a}
  108. )
  109. self.assertEqual(response.status_code, 200)
  110. post_a = self.user.post_set.order_by("id").last()
  111. self.assertEqual(post_a.mentions.count(), 1)
  112. self.assertEqual(list(post_a.mentions.all()), [user_a])
  113. # post second reply
  114. self.user.last_post_on = None
  115. self.user.save()
  116. response = self.client.post(
  117. self.post_link,
  118. data={"post": "This is test response, @%s and @%s!" % (user_a, user_b)},
  119. )
  120. self.assertEqual(response.status_code, 200)
  121. post_b = self.user.post_set.order_by("id").last()
  122. # merge posts and validate that post A has all mentions
  123. post_b.merge(post_a)
  124. self.assertEqual(post_a.mentions.count(), 2)
  125. self.assertEqual(list(post_a.mentions.order_by("id")), [user_a, user_b])