b55aa1cdb8475bed2eb13239b1afa5246ddcd377
[akkoma] / test / tasks / user_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 Mix.Tasks.Pleroma.UserTest do
6 alias Pleroma.Activity
7 alias Pleroma.Object
8 alias Pleroma.Repo
9 alias Pleroma.Tests.ObanHelpers
10 alias Pleroma.User
11 alias Pleroma.Web.CommonAPI
12 alias Pleroma.Web.OAuth.Authorization
13 alias Pleroma.Web.OAuth.Token
14
15 use Pleroma.DataCase
16 use Oban.Testing, repo: Pleroma.Repo
17
18 import ExUnit.CaptureIO
19 import Mock
20 import Pleroma.Factory
21
22 setup_all do
23 Mix.shell(Mix.Shell.Process)
24
25 on_exit(fn ->
26 Mix.shell(Mix.Shell.IO)
27 end)
28
29 :ok
30 end
31
32 describe "running new" do
33 test "user is created" do
34 # just get random data
35 unsaved = build(:user)
36
37 # prepare to answer yes
38 send(self(), {:mix_shell_input, :yes?, true})
39
40 Mix.Tasks.Pleroma.User.run([
41 "new",
42 unsaved.nickname,
43 unsaved.email,
44 "--name",
45 unsaved.name,
46 "--bio",
47 unsaved.bio,
48 "--password",
49 "test",
50 "--moderator",
51 "--admin"
52 ])
53
54 assert_received {:mix_shell, :info, [message]}
55 assert message =~ "user will be created"
56
57 assert_received {:mix_shell, :yes?, [message]}
58 assert message =~ "Continue"
59
60 assert_received {:mix_shell, :info, [message]}
61 assert message =~ "created"
62
63 user = User.get_cached_by_nickname(unsaved.nickname)
64 assert user.name == unsaved.name
65 assert user.email == unsaved.email
66 assert user.bio == unsaved.bio
67 assert user.is_moderator
68 assert user.is_admin
69 end
70
71 test "user is not created" do
72 unsaved = build(:user)
73
74 # prepare to answer no
75 send(self(), {:mix_shell_input, :yes?, false})
76
77 Mix.Tasks.Pleroma.User.run(["new", unsaved.nickname, unsaved.email])
78
79 assert_received {:mix_shell, :info, [message]}
80 assert message =~ "user will be created"
81
82 assert_received {:mix_shell, :yes?, [message]}
83 assert message =~ "Continue"
84
85 assert_received {:mix_shell, :info, [message]}
86 assert message =~ "will not be created"
87
88 refute User.get_cached_by_nickname(unsaved.nickname)
89 end
90 end
91
92 describe "running rm" do
93 test "user is deleted" do
94 clear_config([:instance, :federating], true)
95 user = insert(:user)
96
97 with_mock Pleroma.Web.Federator,
98 publish: fn _ -> nil end do
99 Mix.Tasks.Pleroma.User.run(["rm", user.nickname])
100 ObanHelpers.perform_all()
101
102 assert_received {:mix_shell, :info, [message]}
103 assert message =~ " deleted"
104 assert %{deactivated: true} = User.get_by_nickname(user.nickname)
105
106 assert called(Pleroma.Web.Federator.publish(:_))
107 end
108 end
109
110 test "a remote user's create activity is deleted when the object has been pruned" do
111 user = insert(:user)
112 {:ok, post} = CommonAPI.post(user, %{status: "uguu"})
113
114 clear_config([:instance, :federating], true)
115
116 object = Object.normalize(post)
117 Object.prune(object)
118
119 with_mock Pleroma.Web.Federator,
120 publish: fn _ -> nil end do
121 Mix.Tasks.Pleroma.User.run(["rm", user.nickname])
122 ObanHelpers.perform_all()
123
124 assert_received {:mix_shell, :info, [message]}
125 assert message =~ " deleted"
126 assert %{deactivated: true} = User.get_by_nickname(user.nickname)
127
128 assert called(Pleroma.Web.Federator.publish(:_))
129 end
130
131 refute Activity.get_by_id(post.id)
132 end
133
134 test "no user to delete" do
135 Mix.Tasks.Pleroma.User.run(["rm", "nonexistent"])
136
137 assert_received {:mix_shell, :error, [message]}
138 assert message =~ "No local user"
139 end
140 end
141
142 describe "running toggle_activated" do
143 test "user is deactivated" do
144 user = insert(:user)
145
146 Mix.Tasks.Pleroma.User.run(["toggle_activated", user.nickname])
147
148 assert_received {:mix_shell, :info, [message]}
149 assert message =~ " deactivated"
150
151 user = User.get_cached_by_nickname(user.nickname)
152 assert user.deactivated
153 end
154
155 test "user is activated" do
156 user = insert(:user, deactivated: true)
157
158 Mix.Tasks.Pleroma.User.run(["toggle_activated", user.nickname])
159
160 assert_received {:mix_shell, :info, [message]}
161 assert message =~ " activated"
162
163 user = User.get_cached_by_nickname(user.nickname)
164 refute user.deactivated
165 end
166
167 test "no user to toggle" do
168 Mix.Tasks.Pleroma.User.run(["toggle_activated", "nonexistent"])
169
170 assert_received {:mix_shell, :error, [message]}
171 assert message =~ "No user"
172 end
173 end
174
175 describe "running deactivate" do
176 test "user is unsubscribed" do
177 followed = insert(:user)
178 remote_followed = insert(:user, local: false)
179 user = insert(:user)
180
181 User.follow(user, followed, :follow_accept)
182 User.follow(user, remote_followed, :follow_accept)
183
184 Mix.Tasks.Pleroma.User.run(["deactivate", user.nickname])
185
186 assert_received {:mix_shell, :info, [message]}
187 assert message =~ "Deactivating"
188
189 # Note that the task has delay :timer.sleep(500)
190 assert_received {:mix_shell, :info, [message]}
191 assert message =~ "Successfully unsubscribed"
192
193 user = User.get_cached_by_nickname(user.nickname)
194 assert Enum.empty?(Enum.filter(User.get_friends(user), & &1.local))
195 assert user.deactivated
196 end
197
198 test "no user to deactivate" do
199 Mix.Tasks.Pleroma.User.run(["deactivate", "nonexistent"])
200
201 assert_received {:mix_shell, :error, [message]}
202 assert message =~ "No user"
203 end
204 end
205
206 describe "running set" do
207 test "All statuses set" do
208 user = insert(:user)
209
210 Mix.Tasks.Pleroma.User.run(["set", user.nickname, "--moderator", "--admin", "--locked"])
211
212 assert_received {:mix_shell, :info, [message]}
213 assert message =~ ~r/Moderator status .* true/
214
215 assert_received {:mix_shell, :info, [message]}
216 assert message =~ ~r/Locked status .* true/
217
218 assert_received {:mix_shell, :info, [message]}
219 assert message =~ ~r/Admin status .* true/
220
221 user = User.get_cached_by_nickname(user.nickname)
222 assert user.is_moderator
223 assert user.locked
224 assert user.is_admin
225 end
226
227 test "All statuses unset" do
228 user = insert(:user, locked: true, is_moderator: true, is_admin: true)
229
230 Mix.Tasks.Pleroma.User.run([
231 "set",
232 user.nickname,
233 "--no-moderator",
234 "--no-admin",
235 "--no-locked"
236 ])
237
238 assert_received {:mix_shell, :info, [message]}
239 assert message =~ ~r/Moderator status .* false/
240
241 assert_received {:mix_shell, :info, [message]}
242 assert message =~ ~r/Locked status .* false/
243
244 assert_received {:mix_shell, :info, [message]}
245 assert message =~ ~r/Admin status .* false/
246
247 user = User.get_cached_by_nickname(user.nickname)
248 refute user.is_moderator
249 refute user.locked
250 refute user.is_admin
251 end
252
253 test "no user to set status" do
254 Mix.Tasks.Pleroma.User.run(["set", "nonexistent", "--moderator"])
255
256 assert_received {:mix_shell, :error, [message]}
257 assert message =~ "No local user"
258 end
259 end
260
261 describe "running reset_password" do
262 test "password reset token is generated" do
263 user = insert(:user)
264
265 assert capture_io(fn ->
266 Mix.Tasks.Pleroma.User.run(["reset_password", user.nickname])
267 end) =~ "URL:"
268
269 assert_received {:mix_shell, :info, [message]}
270 assert message =~ "Generated"
271 end
272
273 test "no user to reset password" do
274 Mix.Tasks.Pleroma.User.run(["reset_password", "nonexistent"])
275
276 assert_received {:mix_shell, :error, [message]}
277 assert message =~ "No local user"
278 end
279 end
280
281 describe "running invite" do
282 test "invite token is generated" do
283 assert capture_io(fn ->
284 Mix.Tasks.Pleroma.User.run(["invite"])
285 end) =~ "http"
286
287 assert_received {:mix_shell, :info, [message]}
288 assert message =~ "Generated user invite token one time"
289 end
290
291 test "token is generated with expires_at" do
292 assert capture_io(fn ->
293 Mix.Tasks.Pleroma.User.run([
294 "invite",
295 "--expires-at",
296 Date.to_string(Date.utc_today())
297 ])
298 end)
299
300 assert_received {:mix_shell, :info, [message]}
301 assert message =~ "Generated user invite token date limited"
302 end
303
304 test "token is generated with max use" do
305 assert capture_io(fn ->
306 Mix.Tasks.Pleroma.User.run([
307 "invite",
308 "--max-use",
309 "5"
310 ])
311 end)
312
313 assert_received {:mix_shell, :info, [message]}
314 assert message =~ "Generated user invite token reusable"
315 end
316
317 test "token is generated with max use and expires date" do
318 assert capture_io(fn ->
319 Mix.Tasks.Pleroma.User.run([
320 "invite",
321 "--max-use",
322 "5",
323 "--expires-at",
324 Date.to_string(Date.utc_today())
325 ])
326 end)
327
328 assert_received {:mix_shell, :info, [message]}
329 assert message =~ "Generated user invite token reusable date limited"
330 end
331 end
332
333 describe "running invites" do
334 test "invites are listed" do
335 {:ok, invite} = Pleroma.UserInviteToken.create_invite()
336
337 {:ok, invite2} =
338 Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 15})
339
340 # assert capture_io(fn ->
341 Mix.Tasks.Pleroma.User.run([
342 "invites"
343 ])
344
345 # end)
346
347 assert_received {:mix_shell, :info, [message]}
348 assert_received {:mix_shell, :info, [message2]}
349 assert_received {:mix_shell, :info, [message3]}
350 assert message =~ "Invites list:"
351 assert message2 =~ invite.invite_type
352 assert message3 =~ invite2.invite_type
353 end
354 end
355
356 describe "running revoke_invite" do
357 test "invite is revoked" do
358 {:ok, invite} = Pleroma.UserInviteToken.create_invite(%{expires_at: Date.utc_today()})
359
360 assert capture_io(fn ->
361 Mix.Tasks.Pleroma.User.run([
362 "revoke_invite",
363 invite.token
364 ])
365 end)
366
367 assert_received {:mix_shell, :info, [message]}
368 assert message =~ "Invite for token #{invite.token} was revoked."
369 end
370
371 test "it prints an error message when invite is not exist" do
372 Mix.Tasks.Pleroma.User.run(["revoke_invite", "foo"])
373
374 assert_received {:mix_shell, :error, [message]}
375 assert message =~ "No invite found"
376 end
377 end
378
379 describe "running delete_activities" do
380 test "activities are deleted" do
381 %{nickname: nickname} = insert(:user)
382
383 assert :ok == Mix.Tasks.Pleroma.User.run(["delete_activities", nickname])
384 assert_received {:mix_shell, :info, [message]}
385 assert message == "User #{nickname} statuses deleted."
386 end
387
388 test "it prints an error message when user is not exist" do
389 Mix.Tasks.Pleroma.User.run(["delete_activities", "foo"])
390
391 assert_received {:mix_shell, :error, [message]}
392 assert message =~ "No local user"
393 end
394 end
395
396 describe "running toggle_confirmed" do
397 test "user is confirmed" do
398 %{id: id, nickname: nickname} = insert(:user, confirmation_pending: false)
399
400 assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname])
401 assert_received {:mix_shell, :info, [message]}
402 assert message == "#{nickname} needs confirmation."
403
404 user = Repo.get(User, id)
405 assert user.confirmation_pending
406 assert user.confirmation_token
407 end
408
409 test "user is not confirmed" do
410 %{id: id, nickname: nickname} =
411 insert(:user, confirmation_pending: true, confirmation_token: "some token")
412
413 assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname])
414 assert_received {:mix_shell, :info, [message]}
415 assert message == "#{nickname} doesn't need confirmation."
416
417 user = Repo.get(User, id)
418 refute user.confirmation_pending
419 refute user.confirmation_token
420 end
421
422 test "it prints an error message when user is not exist" do
423 Mix.Tasks.Pleroma.User.run(["toggle_confirmed", "foo"])
424
425 assert_received {:mix_shell, :error, [message]}
426 assert message =~ "No local user"
427 end
428 end
429
430 describe "search" do
431 test "it returns users matching" do
432 user = insert(:user)
433 moon = insert(:user, nickname: "moon", name: "fediverse expert moon")
434 moot = insert(:user, nickname: "moot")
435 kawen = insert(:user, nickname: "kawen", name: "fediverse expert moon")
436
437 {:ok, user} = User.follow(user, kawen)
438
439 assert [moon.id, kawen.id] == User.Search.search("moon") |> Enum.map(& &1.id)
440 res = User.search("moo") |> Enum.map(& &1.id)
441 assert moon.id in res
442 assert moot.id in res
443 assert kawen.id in res
444 assert [moon.id, kawen.id] == User.Search.search("moon fediverse") |> Enum.map(& &1.id)
445
446 assert [kawen.id, moon.id] ==
447 User.Search.search("moon fediverse", for_user: user) |> Enum.map(& &1.id)
448 end
449 end
450
451 describe "signing out" do
452 test "it deletes all user's tokens and authorizations" do
453 user = insert(:user)
454 insert(:oauth_token, user: user)
455 insert(:oauth_authorization, user: user)
456
457 assert Repo.get_by(Token, user_id: user.id)
458 assert Repo.get_by(Authorization, user_id: user.id)
459
460 :ok = Mix.Tasks.Pleroma.User.run(["sign_out", user.nickname])
461
462 refute Repo.get_by(Token, user_id: user.id)
463 refute Repo.get_by(Authorization, user_id: user.id)
464 end
465
466 test "it prints an error message when user is not exist" do
467 Mix.Tasks.Pleroma.User.run(["sign_out", "foo"])
468
469 assert_received {:mix_shell, :error, [message]}
470 assert message =~ "No local user"
471 end
472 end
473
474 describe "tagging" do
475 test "it add tags to a user" do
476 user = insert(:user)
477
478 :ok = Mix.Tasks.Pleroma.User.run(["tag", user.nickname, "pleroma"])
479
480 user = User.get_cached_by_nickname(user.nickname)
481 assert "pleroma" in user.tags
482 end
483
484 test "it prints an error message when user is not exist" do
485 Mix.Tasks.Pleroma.User.run(["tag", "foo"])
486
487 assert_received {:mix_shell, :error, [message]}
488 assert message =~ "Could not change user tags"
489 end
490 end
491
492 describe "untagging" do
493 test "it deletes tags from a user" do
494 user = insert(:user, tags: ["pleroma"])
495 assert "pleroma" in user.tags
496
497 :ok = Mix.Tasks.Pleroma.User.run(["untag", user.nickname, "pleroma"])
498
499 user = User.get_cached_by_nickname(user.nickname)
500 assert Enum.empty?(user.tags)
501 end
502
503 test "it prints an error message when user is not exist" do
504 Mix.Tasks.Pleroma.User.run(["untag", "foo"])
505
506 assert_received {:mix_shell, :error, [message]}
507 assert message =~ "Could not change user tags"
508 end
509 end
510 end