test_post_mentions.py 5.5 KB

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