Update shortdoc description
[akkoma] / test / conversation_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.ConversationTest do
6 use Pleroma.DataCase
7 alias Pleroma.Conversation
8 alias Pleroma.Web.CommonAPI
9
10 import Pleroma.Factory
11
12 test "it goes through old direct conversations" do
13 user = insert(:user)
14 other_user = insert(:user)
15
16 {:ok, _activity} =
17 CommonAPI.post(user, %{"visibility" => "direct", "status" => "hey @#{other_user.nickname}"})
18
19 Repo.delete_all(Conversation)
20 Repo.delete_all(Conversation.Participation)
21
22 refute Repo.one(Conversation)
23
24 Conversation.bump_for_all_activities()
25
26 assert Repo.one(Conversation)
27 [participation, _p2] = Repo.all(Conversation.Participation)
28
29 assert participation.read
30 end
31
32 test "it creates a conversation for given ap_id" do
33 assert {:ok, %Conversation{} = conversation} =
34 Conversation.create_for_ap_id("https://some_ap_id")
35
36 # Inserting again returns the same
37 assert {:ok, conversation_two} = Conversation.create_for_ap_id("https://some_ap_id")
38 assert conversation_two.id == conversation.id
39 end
40
41 test "public posts don't create conversations" do
42 user = insert(:user)
43 {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey"})
44
45 object = Pleroma.Object.normalize(activity)
46 context = object.data["context"]
47
48 conversation = Conversation.get_for_ap_id(context)
49
50 refute conversation
51 end
52
53 test "it creates or updates a conversation and participations for a given DM" do
54 har = insert(:user)
55 jafnhar = insert(:user, local: false)
56 tridi = insert(:user)
57
58 {:ok, activity} =
59 CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"})
60
61 object = Pleroma.Object.normalize(activity)
62 context = object.data["context"]
63
64 conversation =
65 Conversation.get_for_ap_id(context)
66 |> Repo.preload(:participations)
67
68 assert conversation
69
70 assert Enum.find(conversation.participations, fn %{user_id: user_id} -> har.id == user_id end)
71
72 assert Enum.find(conversation.participations, fn %{user_id: user_id} ->
73 jafnhar.id == user_id
74 end)
75
76 {:ok, activity} =
77 CommonAPI.post(jafnhar, %{
78 "status" => "Hey @#{har.nickname}",
79 "visibility" => "direct",
80 "in_reply_to_status_id" => activity.id
81 })
82
83 object = Pleroma.Object.normalize(activity)
84 context = object.data["context"]
85
86 conversation_two =
87 Conversation.get_for_ap_id(context)
88 |> Repo.preload(:participations)
89
90 assert conversation_two.id == conversation.id
91
92 assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
93 har.id == user_id
94 end)
95
96 assert Enum.find(conversation_two.participations, fn %{user_id: user_id} ->
97 jafnhar.id == user_id
98 end)
99
100 {:ok, activity} =
101 CommonAPI.post(tridi, %{
102 "status" => "Hey @#{har.nickname}",
103 "visibility" => "direct",
104 "in_reply_to_status_id" => activity.id
105 })
106
107 object = Pleroma.Object.normalize(activity)
108 context = object.data["context"]
109
110 conversation_three =
111 Conversation.get_for_ap_id(context)
112 |> Repo.preload([:participations, :users])
113
114 assert conversation_three.id == conversation.id
115
116 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
117 har.id == user_id
118 end)
119
120 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
121 jafnhar.id == user_id
122 end)
123
124 assert Enum.find(conversation_three.participations, fn %{user_id: user_id} ->
125 tridi.id == user_id
126 end)
127
128 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
129 har.id == user_id
130 end)
131
132 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
133 jafnhar.id == user_id
134 end)
135
136 assert Enum.find(conversation_three.users, fn %{id: user_id} ->
137 tridi.id == user_id
138 end)
139 end
140
141 test "create_or_bump_for returns the conversation with participations" do
142 har = insert(:user)
143 jafnhar = insert(:user, local: false)
144
145 {:ok, activity} =
146 CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "direct"})
147
148 {:ok, conversation} = Conversation.create_or_bump_for(activity)
149
150 assert length(conversation.participations) == 2
151
152 {:ok, activity} =
153 CommonAPI.post(har, %{"status" => "Hey @#{jafnhar.nickname}", "visibility" => "public"})
154
155 assert {:error, _} = Conversation.create_or_bump_for(activity)
156 end
157 end