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