1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Conversation.ParticipationTest do
8 alias Pleroma.Conversation.Participation
10 alias Pleroma.Web.CommonAPI
12 test "getting a participation will also preload things" do
14 other_user = insert(:user)
17 CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
19 [participation] = Participation.for_user(user)
21 participation = Participation.get(participation.id, preload: [:conversation])
23 assert %Pleroma.Conversation{} = participation.conversation
26 test "for a new conversation or a reply, it doesn't mark the author's participation as unread" do
28 other_user = insert(:user)
31 CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
33 user = User.get_cached_by_id(user.id)
34 other_user = User.get_cached_by_id(other_user.id)
36 [%{read: true}] = Participation.for_user(user)
37 [%{read: false} = participation] = Participation.for_user(other_user)
39 assert User.get_cached_by_id(user.id).info.unread_conversation_count == 0
40 assert User.get_cached_by_id(other_user.id).info.unread_conversation_count == 1
43 CommonAPI.post(other_user, %{
44 "status" => "Hey @#{user.nickname}.",
45 "visibility" => "direct",
46 "in_reply_to_conversation_id" => participation.id
49 user = User.get_cached_by_id(user.id)
50 other_user = User.get_cached_by_id(other_user.id)
52 [%{read: false}] = Participation.for_user(user)
53 [%{read: true}] = Participation.for_user(other_user)
55 assert User.get_cached_by_id(user.id).info.unread_conversation_count == 1
56 assert User.get_cached_by_id(other_user.id).info.unread_conversation_count == 0
59 test "for a new conversation, it sets the recipents of the participation" do
61 other_user = insert(:user)
62 third_user = insert(:user)
65 CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
67 user = User.get_cached_by_id(user.id)
68 other_user = User.get_cached_by_id(other_user.id)
69 [participation] = Participation.for_user(user)
70 participation = Pleroma.Repo.preload(participation, :recipients)
72 assert length(participation.recipients) == 2
73 assert user in participation.recipients
74 assert other_user in participation.recipients
76 # Mentioning another user in the same conversation will not add a new recipients.
79 CommonAPI.post(user, %{
80 "in_reply_to_status_id" => activity.id,
81 "status" => "Hey @#{third_user.nickname}.",
82 "visibility" => "direct"
85 [participation] = Participation.for_user(user)
86 participation = Pleroma.Repo.preload(participation, :recipients)
88 assert length(participation.recipients) == 2
91 test "it creates a participation for a conversation and a user" do
93 conversation = insert(:conversation)
95 {:ok, %Participation{} = participation} =
96 Participation.create_for_user_and_conversation(user, conversation)
98 assert participation.user_id == user.id
99 assert participation.conversation_id == conversation.id
102 # Creating again returns the same participation
103 {:ok, %Participation{} = participation_two} =
104 Participation.create_for_user_and_conversation(user, conversation)
106 assert participation.id == participation_two.id
107 refute participation.updated_at == participation_two.updated_at
110 test "recreating an existing participations sets it to unread" do
111 participation = insert(:participation, %{read: true})
113 {:ok, participation} =
114 Participation.create_for_user_and_conversation(
116 participation.conversation
119 refute participation.read
122 test "it marks a participation as read" do
123 participation = insert(:participation, %{read: false})
124 {:ok, participation} = Participation.mark_as_read(participation)
126 assert participation.read
129 test "it marks a participation as unread" do
130 participation = insert(:participation, %{read: true})
131 {:ok, participation} = Participation.mark_as_unread(participation)
133 refute participation.read
136 test "gets all the participations for a user, ordered by updated at descending" do
138 {:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
140 {:ok, activity_two} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
143 {:ok, activity_three} =
144 CommonAPI.post(user, %{
146 "visibility" => "direct",
147 "in_reply_to_status_id" => activity_one.id
150 assert [participation_one, participation_two] = Participation.for_user(user)
152 object2 = Pleroma.Object.normalize(activity_two)
153 object3 = Pleroma.Object.normalize(activity_three)
155 user = Repo.get(Pleroma.User, user.id)
157 assert participation_one.conversation.ap_id == object3.data["context"]
158 assert participation_two.conversation.ap_id == object2.data["context"]
159 assert participation_one.conversation.users == [user]
162 assert [participation_one] = Participation.for_user(user, %{"limit" => 1})
164 assert participation_one.conversation.ap_id == object3.data["context"]
166 # With last_activity_id
167 assert [participation_one] =
168 Participation.for_user_with_last_activity_id(user, %{"limit" => 1})
170 assert participation_one.last_activity_id == activity_three.id
173 test "Doesn't die when the conversation gets empty" do
176 {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
177 [participation] = Participation.for_user_with_last_activity_id(user)
179 assert participation.last_activity_id == activity.id
181 {:ok, _} = CommonAPI.delete(activity.id, user)
183 [] = Participation.for_user_with_last_activity_id(user)
186 test "it sets recipients, always keeping the owner of the participation even when not explicitly set" do
188 other_user = insert(:user)
190 {:ok, _activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
191 [participation] = Participation.for_user_with_last_activity_id(user)
193 participation = Repo.preload(participation, :recipients)
194 user = User.get_cached_by_id(user.id)
196 assert participation.recipients |> length() == 1
197 assert user in participation.recipients
199 {:ok, participation} = Participation.set_recipients(participation, [other_user.id])
201 assert participation.recipients |> length() == 2
202 assert user in participation.recipients
203 assert other_user in participation.recipients