fe705def17c648a20b7a0d4b100dbb4971bbca2e
[akkoma] / test / pleroma / moderation_log_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.ModerationLogTest do
6 alias Pleroma.Activity
7 alias Pleroma.ModerationLog
8
9 use Pleroma.DataCase
10
11 import Pleroma.Factory
12
13 describe "user moderation" do
14 setup do
15 admin = insert(:user, is_admin: true)
16 moderator = insert(:user, is_moderator: true)
17 subject1 = insert(:user)
18 subject2 = insert(:user)
19
20 [admin: admin, moderator: moderator, subject1: subject1, subject2: subject2]
21 end
22
23 test "logging user deletion by moderator", %{moderator: moderator, subject1: subject1} do
24 {:ok, _} =
25 ModerationLog.insert_log(%{
26 actor: moderator,
27 subject: [subject1],
28 action: "delete"
29 })
30
31 log = Repo.one(ModerationLog)
32
33 assert log.data["message"] == "@#{moderator.nickname} deleted users: @#{subject1.nickname}"
34 end
35
36 test "logging user creation by moderator", %{
37 moderator: moderator,
38 subject1: subject1,
39 subject2: subject2
40 } do
41 {:ok, _} =
42 ModerationLog.insert_log(%{
43 actor: moderator,
44 subjects: [subject1, subject2],
45 action: "create"
46 })
47
48 log = Repo.one(ModerationLog)
49
50 assert log.data["message"] ==
51 "@#{moderator.nickname} created users: @#{subject1.nickname}, @#{subject2.nickname}"
52 end
53
54 test "logging user follow by admin", %{admin: admin, subject1: subject1, subject2: subject2} do
55 {:ok, _} =
56 ModerationLog.insert_log(%{
57 actor: admin,
58 followed: subject1,
59 follower: subject2,
60 action: "follow"
61 })
62
63 log = Repo.one(ModerationLog)
64
65 assert log.data["message"] ==
66 "@#{admin.nickname} made @#{subject2.nickname} follow @#{subject1.nickname}"
67 end
68
69 test "logging user unfollow by admin", %{admin: admin, subject1: subject1, subject2: subject2} do
70 {:ok, _} =
71 ModerationLog.insert_log(%{
72 actor: admin,
73 followed: subject1,
74 follower: subject2,
75 action: "unfollow"
76 })
77
78 log = Repo.one(ModerationLog)
79
80 assert log.data["message"] ==
81 "@#{admin.nickname} made @#{subject2.nickname} unfollow @#{subject1.nickname}"
82 end
83
84 test "logging user tagged by admin", %{admin: admin, subject1: subject1, subject2: subject2} do
85 {:ok, _} =
86 ModerationLog.insert_log(%{
87 actor: admin,
88 nicknames: [subject1.nickname, subject2.nickname],
89 tags: ["foo", "bar"],
90 action: "tag"
91 })
92
93 log = Repo.one(ModerationLog)
94
95 users =
96 [subject1.nickname, subject2.nickname]
97 |> Enum.map(&"@#{&1}")
98 |> Enum.join(", ")
99
100 tags = ["foo", "bar"] |> Enum.join(", ")
101
102 assert log.data["message"] == "@#{admin.nickname} added tags: #{tags} to users: #{users}"
103 end
104
105 test "logging user untagged by admin", %{admin: admin, subject1: subject1, subject2: subject2} do
106 {:ok, _} =
107 ModerationLog.insert_log(%{
108 actor: admin,
109 nicknames: [subject1.nickname, subject2.nickname],
110 tags: ["foo", "bar"],
111 action: "untag"
112 })
113
114 log = Repo.one(ModerationLog)
115
116 users =
117 [subject1.nickname, subject2.nickname]
118 |> Enum.map(&"@#{&1}")
119 |> Enum.join(", ")
120
121 tags = ["foo", "bar"] |> Enum.join(", ")
122
123 assert log.data["message"] ==
124 "@#{admin.nickname} removed tags: #{tags} from users: #{users}"
125 end
126
127 test "logging user grant by moderator", %{moderator: moderator, subject1: subject1} do
128 {:ok, _} =
129 ModerationLog.insert_log(%{
130 actor: moderator,
131 subject: [subject1],
132 action: "grant",
133 permission: "moderator"
134 })
135
136 log = Repo.one(ModerationLog)
137
138 assert log.data["message"] == "@#{moderator.nickname} made @#{subject1.nickname} moderator"
139 end
140
141 test "logging user revoke by moderator", %{moderator: moderator, subject1: subject1} do
142 {:ok, _} =
143 ModerationLog.insert_log(%{
144 actor: moderator,
145 subject: [subject1],
146 action: "revoke",
147 permission: "moderator"
148 })
149
150 log = Repo.one(ModerationLog)
151
152 assert log.data["message"] ==
153 "@#{moderator.nickname} revoked moderator role from @#{subject1.nickname}"
154 end
155
156 test "logging relay follow", %{moderator: moderator} do
157 {:ok, _} =
158 ModerationLog.insert_log(%{
159 actor: moderator,
160 action: "relay_follow",
161 target: "https://example.org/relay"
162 })
163
164 log = Repo.one(ModerationLog)
165
166 assert log.data["message"] ==
167 "@#{moderator.nickname} followed relay: https://example.org/relay"
168 end
169
170 test "logging relay unfollow", %{moderator: moderator} do
171 {:ok, _} =
172 ModerationLog.insert_log(%{
173 actor: moderator,
174 action: "relay_unfollow",
175 target: "https://example.org/relay"
176 })
177
178 log = Repo.one(ModerationLog)
179
180 assert log.data["message"] ==
181 "@#{moderator.nickname} unfollowed relay: https://example.org/relay"
182 end
183
184 test "logging report update", %{moderator: moderator} do
185 report = %Activity{
186 id: "9m9I1F4p8ftrTP6QTI",
187 data: %{
188 "type" => "Flag",
189 "state" => "resolved",
190 "actor" => "http://localhost:4000/users/max"
191 }
192 }
193
194 {:ok, _} =
195 ModerationLog.insert_log(%{
196 actor: moderator,
197 action: "report_update",
198 subject: report
199 })
200
201 log = Repo.one(ModerationLog)
202
203 assert log.data["message"] ==
204 "@#{moderator.nickname} updated report ##{report.id} with 'resolved' state"
205 end
206
207 test "logging report response", %{moderator: moderator} do
208 user = insert(:user)
209
210 report = %Activity{
211 id: "9m9I1F4p8ftrTP6QTI",
212 data: %{
213 "type" => "Note",
214 "actor" => user.ap_id
215 }
216 }
217
218 attrs = %{
219 actor: moderator,
220 action: "report_note",
221 subject: report,
222 text: "look at this"
223 }
224
225 {:ok, log1} = ModerationLog.insert_log(attrs)
226 log = Repo.get(ModerationLog, log1.id)
227
228 assert log.data["message"] ==
229 "@#{moderator.nickname} added note 'look at this' to report ##{report.id}"
230
231 {:ok, log2} = ModerationLog.insert_log(Map.merge(attrs, %{subject_actor: user}))
232
233 log = Repo.get(ModerationLog, log2.id)
234
235 assert log.data["message"] ==
236 "@#{moderator.nickname} added note 'look at this' to report ##{report.id} on user @#{
237 user.nickname
238 }"
239 end
240
241 test "logging status sensitivity update", %{moderator: moderator} do
242 note = insert(:note_activity)
243
244 {:ok, _} =
245 ModerationLog.insert_log(%{
246 actor: moderator,
247 action: "status_update",
248 subject: note,
249 sensitive: "true",
250 visibility: nil
251 })
252
253 log = Repo.one(ModerationLog)
254
255 assert log.data["message"] ==
256 "@#{moderator.nickname} updated status ##{note.id}, set sensitive: 'true'"
257 end
258
259 test "logging status visibility update", %{moderator: moderator} do
260 note = insert(:note_activity)
261
262 {:ok, _} =
263 ModerationLog.insert_log(%{
264 actor: moderator,
265 action: "status_update",
266 subject: note,
267 sensitive: nil,
268 visibility: "private"
269 })
270
271 log = Repo.one(ModerationLog)
272
273 assert log.data["message"] ==
274 "@#{moderator.nickname} updated status ##{note.id}, set visibility: 'private'"
275 end
276
277 test "logging status sensitivity & visibility update", %{moderator: moderator} do
278 note = insert(:note_activity)
279
280 {:ok, _} =
281 ModerationLog.insert_log(%{
282 actor: moderator,
283 action: "status_update",
284 subject: note,
285 sensitive: "true",
286 visibility: "private"
287 })
288
289 log = Repo.one(ModerationLog)
290
291 assert log.data["message"] ==
292 "@#{moderator.nickname} updated status ##{note.id}, set sensitive: 'true', visibility: 'private'"
293 end
294
295 test "logging status deletion", %{moderator: moderator} do
296 note = insert(:note_activity)
297
298 {:ok, _} =
299 ModerationLog.insert_log(%{
300 actor: moderator,
301 action: "status_delete",
302 subject_id: note.id
303 })
304
305 log = Repo.one(ModerationLog)
306
307 assert log.data["message"] == "@#{moderator.nickname} deleted status ##{note.id}"
308 end
309 end
310 end