Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
5.6KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Conversation.ParticipationTest do
  5. use Pleroma.DataCase
  6. import Pleroma.Factory
  7. alias Pleroma.Conversation.Participation
  8. alias Pleroma.Web.CommonAPI
  9. test "getting a participation will also preload things" do
  10. user = insert(:user)
  11. other_user = insert(:user)
  12. {:ok, _activity} =
  13. CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
  14. [participation] = Participation.for_user(user)
  15. participation = Participation.get(participation.id, preload: [:conversation])
  16. assert %Pleroma.Conversation{} = participation.conversation
  17. end
  18. test "for a new conversation, it sets the recipents of the participation" do
  19. user = insert(:user)
  20. other_user = insert(:user)
  21. third_user = insert(:user)
  22. {:ok, activity} =
  23. CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
  24. [participation] = Participation.for_user(user)
  25. participation = Pleroma.Repo.preload(participation, :recipients)
  26. assert length(participation.recipients) == 2
  27. assert user in participation.recipients
  28. assert other_user in participation.recipients
  29. # Mentioning another user in the same conversation will not add a new recipients.
  30. {:ok, _activity} =
  31. CommonAPI.post(user, %{
  32. "in_reply_to_status_id" => activity.id,
  33. "status" => "Hey @#{third_user.nickname}.",
  34. "visibility" => "direct"
  35. })
  36. [participation] = Participation.for_user(user)
  37. participation = Pleroma.Repo.preload(participation, :recipients)
  38. assert length(participation.recipients) == 2
  39. end
  40. test "it creates a participation for a conversation and a user" do
  41. user = insert(:user)
  42. conversation = insert(:conversation)
  43. {:ok, %Participation{} = participation} =
  44. Participation.create_for_user_and_conversation(user, conversation)
  45. assert participation.user_id == user.id
  46. assert participation.conversation_id == conversation.id
  47. :timer.sleep(1000)
  48. # Creating again returns the same participation
  49. {:ok, %Participation{} = participation_two} =
  50. Participation.create_for_user_and_conversation(user, conversation)
  51. assert participation.id == participation_two.id
  52. refute participation.updated_at == participation_two.updated_at
  53. end
  54. test "recreating an existing participations sets it to unread" do
  55. participation = insert(:participation, %{read: true})
  56. {:ok, participation} =
  57. Participation.create_for_user_and_conversation(
  58. participation.user,
  59. participation.conversation
  60. )
  61. refute participation.read
  62. end
  63. test "it marks a participation as read" do
  64. participation = insert(:participation, %{read: false})
  65. {:ok, participation} = Participation.mark_as_read(participation)
  66. assert participation.read
  67. end
  68. test "it marks a participation as unread" do
  69. participation = insert(:participation, %{read: true})
  70. {:ok, participation} = Participation.mark_as_unread(participation)
  71. refute participation.read
  72. end
  73. test "gets all the participations for a user, ordered by updated at descending" do
  74. user = insert(:user)
  75. {:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
  76. :timer.sleep(1000)
  77. {:ok, activity_two} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
  78. :timer.sleep(1000)
  79. {:ok, activity_three} =
  80. CommonAPI.post(user, %{
  81. "status" => "x",
  82. "visibility" => "direct",
  83. "in_reply_to_status_id" => activity_one.id
  84. })
  85. assert [participation_one, participation_two] = Participation.for_user(user)
  86. object2 = Pleroma.Object.normalize(activity_two)
  87. object3 = Pleroma.Object.normalize(activity_three)
  88. user = Repo.get(Pleroma.User, user.id)
  89. assert participation_one.conversation.ap_id == object3.data["context"]
  90. assert participation_two.conversation.ap_id == object2.data["context"]
  91. assert participation_one.conversation.users == [user]
  92. # Pagination
  93. assert [participation_one] = Participation.for_user(user, %{"limit" => 1})
  94. assert participation_one.conversation.ap_id == object3.data["context"]
  95. # With last_activity_id
  96. assert [participation_one] =
  97. Participation.for_user_with_last_activity_id(user, %{"limit" => 1})
  98. assert participation_one.last_activity_id == activity_three.id
  99. end
  100. test "Doesn't die when the conversation gets empty" do
  101. user = insert(:user)
  102. {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
  103. [participation] = Participation.for_user_with_last_activity_id(user)
  104. assert participation.last_activity_id == activity.id
  105. {:ok, _} = CommonAPI.delete(activity.id, user)
  106. [] = Participation.for_user_with_last_activity_id(user)
  107. end
  108. test "it sets recipients, always keeping the owner of the participation even when not explicitly set" do
  109. user = insert(:user)
  110. other_user = insert(:user)
  111. {:ok, _activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
  112. [participation] = Participation.for_user_with_last_activity_id(user)
  113. participation = Repo.preload(participation, :recipients)
  114. assert participation.recipients |> length() == 1
  115. assert user in participation.recipients
  116. {:ok, participation} = Participation.set_recipients(participation, [other_user.id])
  117. assert participation.recipients |> length() == 2
  118. assert user in participation.recipients
  119. assert other_user in participation.recipients
  120. end
  121. end