Merge branch 'feature/788-separate-email-addresses' into 'develop'
[akkoma] / test / web / common_api / common_api_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.Web.CommonAPITest do
6 use Pleroma.DataCase
7 alias Pleroma.Activity
8 alias Pleroma.User
9 alias Pleroma.Web.CommonAPI
10
11 import Pleroma.Factory
12
13 test "with the safe_dm_mention option set, it does not mention people beyond the initial tags" do
14 har = insert(:user)
15 jafnhar = insert(:user)
16 tridi = insert(:user)
17 option = Pleroma.Config.get([:instance, :safe_dm_mentions])
18 Pleroma.Config.put([:instance, :safe_dm_mentions], true)
19
20 {:ok, activity} =
21 CommonAPI.post(har, %{
22 "status" => "@#{jafnhar.nickname} hey, i never want to see @#{tridi.nickname} again",
23 "visibility" => "direct"
24 })
25
26 refute tridi.ap_id in activity.recipients
27 assert jafnhar.ap_id in activity.recipients
28 Pleroma.Config.put([:instance, :safe_dm_mentions], option)
29 end
30
31 test "it de-duplicates tags" do
32 user = insert(:user)
33 {:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu #2HU"})
34
35 assert activity.data["object"]["tag"] == ["2hu"]
36 end
37
38 test "it adds emoji in the object" do
39 user = insert(:user)
40 {:ok, activity} = CommonAPI.post(user, %{"status" => ":moominmamma:"})
41
42 assert activity.data["object"]["emoji"]["moominmamma"]
43 end
44
45 test "it adds emoji when updating profiles" do
46 user = insert(:user, %{name: ":karjalanpiirakka:"})
47
48 CommonAPI.update(user)
49 user = User.get_cached_by_ap_id(user.ap_id)
50 [karjalanpiirakka] = user.info.source_data["tag"]
51
52 assert karjalanpiirakka["name"] == ":karjalanpiirakka:"
53 end
54
55 describe "posting" do
56 test "it filters out obviously bad tags when accepting a post as HTML" do
57 user = insert(:user)
58
59 post = "<p><b>2hu</b></p><script>alert('xss')</script>"
60
61 {:ok, activity} =
62 CommonAPI.post(user, %{
63 "status" => post,
64 "content_type" => "text/html"
65 })
66
67 content = activity.data["object"]["content"]
68 assert content == "<p><b>2hu</b></p>alert('xss')"
69 end
70
71 test "it filters out obviously bad tags when accepting a post as Markdown" do
72 user = insert(:user)
73
74 post = "<p><b>2hu</b></p><script>alert('xss')</script>"
75
76 {:ok, activity} =
77 CommonAPI.post(user, %{
78 "status" => post,
79 "content_type" => "text/markdown"
80 })
81
82 content = activity.data["object"]["content"]
83 assert content == "<p><b>2hu</b></p>alert('xss')"
84 end
85 end
86
87 describe "reactions" do
88 test "repeating a status" do
89 user = insert(:user)
90 other_user = insert(:user)
91
92 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
93
94 {:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, user)
95 end
96
97 test "favoriting a status" do
98 user = insert(:user)
99 other_user = insert(:user)
100
101 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
102
103 {:ok, %Activity{}, _} = CommonAPI.favorite(activity.id, user)
104 end
105
106 test "retweeting a status twice returns an error" do
107 user = insert(:user)
108 other_user = insert(:user)
109
110 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
111 {:ok, %Activity{}, _object} = CommonAPI.repeat(activity.id, user)
112 {:error, _} = CommonAPI.repeat(activity.id, user)
113 end
114
115 test "favoriting a status twice returns an error" do
116 user = insert(:user)
117 other_user = insert(:user)
118
119 {:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
120 {:ok, %Activity{}, _object} = CommonAPI.favorite(activity.id, user)
121 {:error, _} = CommonAPI.favorite(activity.id, user)
122 end
123 end
124
125 describe "pinned statuses" do
126 setup do
127 Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
128
129 user = insert(:user)
130 {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"})
131
132 [user: user, activity: activity]
133 end
134
135 test "pin status", %{user: user, activity: activity} do
136 assert {:ok, ^activity} = CommonAPI.pin(activity.id, user)
137
138 id = activity.id
139 user = refresh_record(user)
140
141 assert %User{info: %{pinned_activities: [^id]}} = user
142 end
143
144 test "only self-authored can be pinned", %{activity: activity} do
145 user = insert(:user)
146
147 assert {:error, "Could not pin"} = CommonAPI.pin(activity.id, user)
148 end
149
150 test "max pinned statuses", %{user: user, activity: activity_one} do
151 {:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"})
152
153 assert {:ok, ^activity_one} = CommonAPI.pin(activity_one.id, user)
154
155 user = refresh_record(user)
156
157 assert {:error, "You have already pinned the maximum number of statuses"} =
158 CommonAPI.pin(activity_two.id, user)
159 end
160
161 test "unpin status", %{user: user, activity: activity} do
162 {:ok, activity} = CommonAPI.pin(activity.id, user)
163
164 user = refresh_record(user)
165
166 assert {:ok, ^activity} = CommonAPI.unpin(activity.id, user)
167
168 user = refresh_record(user)
169
170 assert %User{info: %{pinned_activities: []}} = user
171 end
172
173 test "should unpin when deleting a status", %{user: user, activity: activity} do
174 {:ok, activity} = CommonAPI.pin(activity.id, user)
175
176 user = refresh_record(user)
177
178 assert {:ok, _} = CommonAPI.delete(activity.id, user)
179
180 user = refresh_record(user)
181
182 assert %User{info: %{pinned_activities: []}} = user
183 end
184 end
185
186 describe "mute tests" do
187 setup do
188 user = insert(:user)
189
190 activity = insert(:note_activity)
191
192 [user: user, activity: activity]
193 end
194
195 test "add mute", %{user: user, activity: activity} do
196 {:ok, _} = CommonAPI.add_mute(user, activity)
197 assert CommonAPI.thread_muted?(user, activity)
198 end
199
200 test "remove mute", %{user: user, activity: activity} do
201 CommonAPI.add_mute(user, activity)
202 {:ok, _} = CommonAPI.remove_mute(user, activity)
203 refute CommonAPI.thread_muted?(user, activity)
204 end
205
206 test "check that mutes can't be duplicate", %{user: user, activity: activity} do
207 CommonAPI.add_mute(user, activity)
208 {:error, _} = CommonAPI.add_mute(user, activity)
209 end
210 end
211
212 describe "reports" do
213 test "creates a report" do
214 reporter = insert(:user)
215 target_user = insert(:user)
216
217 {:ok, activity} = CommonAPI.post(target_user, %{"status" => "foobar"})
218
219 reporter_ap_id = reporter.ap_id
220 target_ap_id = target_user.ap_id
221 activity_ap_id = activity.data["id"]
222 comment = "foobar"
223
224 report_data = %{
225 "account_id" => target_user.id,
226 "comment" => comment,
227 "status_ids" => [activity.id]
228 }
229
230 assert {:ok, flag_activity} = CommonAPI.report(reporter, report_data)
231
232 assert %Activity{
233 actor: ^reporter_ap_id,
234 data: %{
235 "type" => "Flag",
236 "content" => ^comment,
237 "object" => [^target_ap_id, ^activity_ap_id]
238 }
239 } = flag_activity
240 end
241 end
242
243 describe "reblog muting" do
244 setup do
245 muter = insert(:user)
246
247 muted = insert(:user)
248
249 [muter: muter, muted: muted]
250 end
251
252 test "add a reblog mute", %{muter: muter, muted: muted} do
253 {:ok, muter} = CommonAPI.hide_reblogs(muter, muted)
254
255 assert Pleroma.User.showing_reblogs?(muter, muted) == false
256 end
257
258 test "remove a reblog mute", %{muter: muter, muted: muted} do
259 {:ok, muter} = CommonAPI.hide_reblogs(muter, muted)
260 {:ok, muter} = CommonAPI.show_reblogs(muter, muted)
261
262 assert Pleroma.User.showing_reblogs?(muter, muted) == true
263 end
264 end
265 end