b199fa70450a7446e40cef7cb52913827db790f2
[akkoma] / test / pleroma / web / admin_api / controllers / user_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.UserControllerTest do
6 use Pleroma.Web.ConnCase
7 use Oban.Testing, repo: Pleroma.Repo
8
9 import Mock
10 import Pleroma.Factory
11
12 alias Pleroma.HTML
13 alias Pleroma.ModerationLog
14 alias Pleroma.Repo
15 alias Pleroma.Tests.ObanHelpers
16 alias Pleroma.User
17 alias Pleroma.Web.ActivityPub.Relay
18 alias Pleroma.Web.CommonAPI
19 alias Pleroma.Web.Endpoint
20 alias Pleroma.Web.MediaProxy
21
22 setup_all do
23 Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
24
25 :ok
26 end
27
28 setup do
29 admin = insert(:user, is_admin: true)
30 token = insert(:oauth_admin_token, user: admin)
31
32 conn =
33 build_conn()
34 |> assign(:user, admin)
35 |> assign(:token, token)
36
37 {:ok, %{admin: admin, token: token, conn: conn}}
38 end
39
40 test "with valid `admin_token` query parameter, skips OAuth scopes check" do
41 clear_config([:admin_token], "password123")
42
43 user = insert(:user)
44
45 conn = get(build_conn(), "/api/pleroma/admin/users/#{user.nickname}?admin_token=password123")
46
47 assert json_response_and_validate_schema(conn, 200)
48 end
49
50 test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope",
51 %{admin: admin} do
52 user = insert(:user)
53 url = "/api/pleroma/admin/users/#{user.nickname}"
54
55 good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"])
56 good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"])
57 good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"])
58
59 bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"])
60 bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"])
61 bad_token3 = nil
62
63 for good_token <- [good_token1, good_token2, good_token3] do
64 conn =
65 build_conn()
66 |> assign(:user, admin)
67 |> assign(:token, good_token)
68 |> get(url)
69
70 assert json_response_and_validate_schema(conn, 200)
71 end
72
73 for good_token <- [good_token1, good_token2, good_token3] do
74 conn =
75 build_conn()
76 |> assign(:user, nil)
77 |> assign(:token, good_token)
78 |> get(url)
79
80 assert json_response(conn, :forbidden)
81 end
82
83 for bad_token <- [bad_token1, bad_token2, bad_token3] do
84 conn =
85 build_conn()
86 |> assign(:user, admin)
87 |> assign(:token, bad_token)
88 |> get(url)
89
90 assert json_response_and_validate_schema(conn, :forbidden)
91 end
92 end
93
94 describe "DELETE /api/pleroma/admin/users" do
95 test "single user", %{admin: admin, conn: conn} do
96 clear_config([:instance, :federating], true)
97
98 user =
99 insert(:user,
100 avatar: %{"url" => [%{"href" => "https://someurl"}]},
101 banner: %{"url" => [%{"href" => "https://somebanner"}]},
102 bio: "Hello world!",
103 name: "A guy"
104 )
105
106 # Create some activities to check they got deleted later
107 follower = insert(:user)
108 {:ok, _} = CommonAPI.post(user, %{status: "test"})
109 {:ok, _, _, _} = CommonAPI.follow(user, follower)
110 {:ok, _, _, _} = CommonAPI.follow(follower, user)
111 user = Repo.get(User, user.id)
112 assert user.note_count == 1
113 assert user.follower_count == 1
114 assert user.following_count == 1
115 assert user.is_active
116
117 with_mock Pleroma.Web.Federator,
118 publish: fn _ -> nil end,
119 perform: fn _, _ -> nil end do
120 conn =
121 conn
122 |> put_req_header("accept", "application/json")
123 |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}")
124
125 ObanHelpers.perform_all()
126
127 refute User.get_by_nickname(user.nickname).is_active
128
129 log_entry = Repo.one(ModerationLog)
130
131 assert ModerationLog.get_log_entry_message(log_entry) ==
132 "@#{admin.nickname} deleted users: @#{user.nickname}"
133
134 assert json_response_and_validate_schema(conn, 200) == [user.nickname]
135
136 user = Repo.get(User, user.id)
137 refute user.is_active
138
139 assert user.avatar == %{}
140 assert user.banner == %{}
141 assert user.note_count == 0
142 assert user.follower_count == 0
143 assert user.following_count == 0
144 assert user.bio == ""
145 assert user.name == nil
146
147 assert called(Pleroma.Web.Federator.publish(:_))
148 end
149 end
150
151 test "multiple users", %{admin: admin, conn: conn} do
152 user_one = insert(:user)
153 user_two = insert(:user)
154
155 response =
156 conn
157 |> put_req_header("accept", "application/json")
158 |> put_req_header("content-type", "application/json")
159 |> delete("/api/pleroma/admin/users", %{
160 nicknames: [user_one.nickname, user_two.nickname]
161 })
162 |> json_response_and_validate_schema(200)
163
164 log_entry = Repo.one(ModerationLog)
165
166 assert ModerationLog.get_log_entry_message(log_entry) ==
167 "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}"
168
169 assert response -- [user_one.nickname, user_two.nickname] == []
170 end
171 end
172
173 describe "/api/pleroma/admin/users" do
174 test "Create", %{conn: conn} do
175 response =
176 conn
177 |> put_req_header("accept", "application/json")
178 |> put_req_header("content-type", "application/json")
179 |> post("/api/pleroma/admin/users", %{
180 "users" => [
181 %{
182 "nickname" => "lain",
183 "email" => "lain@example.org",
184 "password" => "test"
185 },
186 %{
187 "nickname" => "lain2",
188 "email" => "lain2@example.org",
189 "password" => "test"
190 }
191 ]
192 })
193 |> json_response_and_validate_schema(200)
194 |> Enum.map(&Map.get(&1, "type"))
195
196 assert response == ["success", "success"]
197
198 log_entry = Repo.one(ModerationLog)
199
200 assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == []
201 end
202
203 test "Cannot create user with existing email", %{conn: conn} do
204 user = insert(:user)
205
206 conn =
207 conn
208 |> put_req_header("accept", "application/json")
209 |> put_req_header("content-type", "application/json")
210 |> post("/api/pleroma/admin/users", %{
211 "users" => [
212 %{
213 "nickname" => "lain",
214 "email" => user.email,
215 "password" => "test"
216 }
217 ]
218 })
219
220 assert json_response_and_validate_schema(conn, 409) == [
221 %{
222 "code" => 409,
223 "data" => %{
224 "email" => user.email,
225 "nickname" => "lain"
226 },
227 "error" => "email has already been taken",
228 "type" => "error"
229 }
230 ]
231 end
232
233 test "Cannot create user with existing nickname", %{conn: conn} do
234 user = insert(:user)
235
236 conn =
237 conn
238 |> put_req_header("accept", "application/json")
239 |> put_req_header("content-type", "application/json")
240 |> post("/api/pleroma/admin/users", %{
241 "users" => [
242 %{
243 "nickname" => user.nickname,
244 "email" => "someuser@plerama.social",
245 "password" => "test"
246 }
247 ]
248 })
249
250 assert json_response_and_validate_schema(conn, 409) == [
251 %{
252 "code" => 409,
253 "data" => %{
254 "email" => "someuser@plerama.social",
255 "nickname" => user.nickname
256 },
257 "error" => "nickname has already been taken",
258 "type" => "error"
259 }
260 ]
261 end
262
263 test "Multiple user creation works in transaction", %{conn: conn} do
264 user = insert(:user)
265
266 conn =
267 conn
268 |> put_req_header("accept", "application/json")
269 |> put_req_header("content-type", "application/json")
270 |> post("/api/pleroma/admin/users", %{
271 "users" => [
272 %{
273 "nickname" => "newuser",
274 "email" => "newuser@pleroma.social",
275 "password" => "test"
276 },
277 %{
278 "nickname" => "lain",
279 "email" => user.email,
280 "password" => "test"
281 }
282 ]
283 })
284
285 assert json_response_and_validate_schema(conn, 409) == [
286 %{
287 "code" => 409,
288 "data" => %{
289 "email" => user.email,
290 "nickname" => "lain"
291 },
292 "error" => "email has already been taken",
293 "type" => "error"
294 },
295 %{
296 "code" => 409,
297 "data" => %{
298 "email" => "newuser@pleroma.social",
299 "nickname" => "newuser"
300 },
301 "error" => "",
302 "type" => "error"
303 }
304 ]
305
306 assert User.get_by_nickname("newuser") === nil
307 end
308 end
309
310 describe "/api/pleroma/admin/users/:nickname" do
311 test "Show", %{conn: conn} do
312 user = insert(:user)
313
314 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}")
315
316 assert user_response(user) == json_response_and_validate_schema(conn, 200)
317 end
318
319 test "when the user doesn't exist", %{conn: conn} do
320 user = build(:user)
321
322 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}")
323
324 assert %{"error" => "Not found"} == json_response_and_validate_schema(conn, 404)
325 end
326 end
327
328 describe "/api/pleroma/admin/users/follow" do
329 test "allows to force-follow another user", %{admin: admin, conn: conn} do
330 user = insert(:user)
331 follower = insert(:user)
332
333 conn
334 |> put_req_header("accept", "application/json")
335 |> put_req_header("content-type", "application/json")
336 |> post("/api/pleroma/admin/users/follow", %{
337 "follower" => follower.nickname,
338 "followed" => user.nickname
339 })
340
341 user = User.get_cached_by_id(user.id)
342 follower = User.get_cached_by_id(follower.id)
343
344 assert User.following?(follower, user)
345
346 log_entry = Repo.one(ModerationLog)
347
348 assert ModerationLog.get_log_entry_message(log_entry) ==
349 "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}"
350 end
351 end
352
353 describe "/api/pleroma/admin/users/unfollow" do
354 test "allows to force-unfollow another user", %{admin: admin, conn: conn} do
355 user = insert(:user)
356 follower = insert(:user)
357
358 User.follow(follower, user)
359
360 conn
361 |> put_req_header("accept", "application/json")
362 |> put_req_header("content-type", "application/json")
363 |> post("/api/pleroma/admin/users/unfollow", %{
364 "follower" => follower.nickname,
365 "followed" => user.nickname
366 })
367
368 user = User.get_cached_by_id(user.id)
369 follower = User.get_cached_by_id(follower.id)
370
371 refute User.following?(follower, user)
372
373 log_entry = Repo.one(ModerationLog)
374
375 assert ModerationLog.get_log_entry_message(log_entry) ==
376 "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}"
377 end
378 end
379
380 describe "GET /api/pleroma/admin/users" do
381 test "renders users array for the first page", %{conn: conn, admin: admin} do
382 user = insert(:user, local: false, tags: ["foo", "bar"])
383 user2 = insert(:user, is_approved: false, registration_reason: "I'm a chill dude")
384
385 conn = get(conn, "/api/pleroma/admin/users?page=1")
386
387 users = [
388 user_response(
389 user2,
390 %{
391 "local" => true,
392 "is_approved" => false,
393 "registration_reason" => "I'm a chill dude",
394 "actor_type" => "Person"
395 }
396 ),
397 user_response(user, %{"local" => false, "tags" => ["foo", "bar"]}),
398 user_response(
399 admin,
400 %{"roles" => %{"admin" => true, "moderator" => false}}
401 )
402 ]
403
404 assert json_response_and_validate_schema(conn, 200) == %{
405 "count" => 3,
406 "page_size" => 50,
407 "users" => users
408 }
409 end
410
411 test "pagination works correctly with service users", %{conn: conn} do
412 service1 = User.get_or_create_service_actor_by_ap_id(Endpoint.url() <> "/meido", "meido")
413
414 insert_list(25, :user)
415
416 assert %{"count" => 26, "page_size" => 10, "users" => users1} =
417 conn
418 |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"})
419 |> json_response_and_validate_schema(200)
420
421 assert Enum.count(users1) == 10
422 assert service1 not in users1
423
424 assert %{"count" => 26, "page_size" => 10, "users" => users2} =
425 conn
426 |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"})
427 |> json_response_and_validate_schema(200)
428
429 assert Enum.count(users2) == 10
430 assert service1 not in users2
431
432 assert %{"count" => 26, "page_size" => 10, "users" => users3} =
433 conn
434 |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"})
435 |> json_response_and_validate_schema(200)
436
437 assert Enum.count(users3) == 6
438 assert service1 not in users3
439 end
440
441 test "renders empty array for the second page", %{conn: conn} do
442 insert(:user)
443
444 conn = get(conn, "/api/pleroma/admin/users?page=2")
445
446 assert json_response_and_validate_schema(conn, 200) == %{
447 "count" => 2,
448 "page_size" => 50,
449 "users" => []
450 }
451 end
452
453 test "regular search", %{conn: conn} do
454 user = insert(:user, nickname: "bob")
455
456 conn = get(conn, "/api/pleroma/admin/users?query=bo")
457
458 assert json_response_and_validate_schema(conn, 200) == %{
459 "count" => 1,
460 "page_size" => 50,
461 "users" => [user_response(user, %{"local" => true})]
462 }
463 end
464
465 test "search by domain", %{conn: conn} do
466 user = insert(:user, nickname: "nickname@domain.com")
467 insert(:user)
468
469 conn = get(conn, "/api/pleroma/admin/users?query=domain.com")
470
471 assert json_response_and_validate_schema(conn, 200) == %{
472 "count" => 1,
473 "page_size" => 50,
474 "users" => [user_response(user)]
475 }
476 end
477
478 test "search by full nickname", %{conn: conn} do
479 user = insert(:user, nickname: "nickname@domain.com")
480 insert(:user)
481
482 conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com")
483
484 assert json_response_and_validate_schema(conn, 200) == %{
485 "count" => 1,
486 "page_size" => 50,
487 "users" => [user_response(user)]
488 }
489 end
490
491 test "search by display name", %{conn: conn} do
492 user = insert(:user, name: "Display name")
493 insert(:user)
494
495 conn = get(conn, "/api/pleroma/admin/users?name=display")
496
497 assert json_response_and_validate_schema(conn, 200) == %{
498 "count" => 1,
499 "page_size" => 50,
500 "users" => [user_response(user)]
501 }
502 end
503
504 test "search by email", %{conn: conn} do
505 user = insert(:user, email: "email@example.com")
506 insert(:user)
507
508 conn = get(conn, "/api/pleroma/admin/users?email=email@example.com")
509
510 assert json_response_and_validate_schema(conn, 200) == %{
511 "count" => 1,
512 "page_size" => 50,
513 "users" => [user_response(user)]
514 }
515 end
516
517 test "regular search with page size", %{conn: conn} do
518 user = insert(:user, nickname: "aalice")
519 user2 = insert(:user, nickname: "alice")
520
521 conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1")
522
523 assert json_response_and_validate_schema(conn1, 200) == %{
524 "count" => 2,
525 "page_size" => 1,
526 "users" => [user_response(user2)]
527 }
528
529 conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2")
530
531 assert json_response_and_validate_schema(conn2, 200) == %{
532 "count" => 2,
533 "page_size" => 1,
534 "users" => [user_response(user)]
535 }
536 end
537
538 test "only local users" do
539 admin = insert(:user, is_admin: true, nickname: "john")
540 token = insert(:oauth_admin_token, user: admin)
541 user = insert(:user, nickname: "bob")
542
543 insert(:user, nickname: "bobb", local: false)
544
545 conn =
546 build_conn()
547 |> assign(:user, admin)
548 |> assign(:token, token)
549 |> get("/api/pleroma/admin/users?query=bo&filters=local")
550
551 assert json_response_and_validate_schema(conn, 200) == %{
552 "count" => 1,
553 "page_size" => 50,
554 "users" => [user_response(user)]
555 }
556 end
557
558 test "only local users with no query", %{conn: conn, admin: old_admin} do
559 admin = insert(:user, is_admin: true, nickname: "john")
560 user = insert(:user, nickname: "bob")
561
562 insert(:user, nickname: "bobb", local: false)
563
564 conn = get(conn, "/api/pleroma/admin/users?filters=local")
565
566 users = [
567 user_response(user),
568 user_response(admin, %{
569 "roles" => %{"admin" => true, "moderator" => false}
570 }),
571 user_response(old_admin, %{
572 "is_active" => true,
573 "roles" => %{"admin" => true, "moderator" => false}
574 })
575 ]
576
577 assert json_response_and_validate_schema(conn, 200) == %{
578 "count" => 3,
579 "page_size" => 50,
580 "users" => users
581 }
582 end
583
584 test "only unconfirmed users", %{conn: conn} do
585 sad_user = insert(:user, nickname: "sadboy", is_confirmed: false)
586 old_user = insert(:user, nickname: "oldboy", is_confirmed: false)
587
588 insert(:user, nickname: "happyboy", is_approved: true)
589 insert(:user, is_confirmed: true)
590
591 result =
592 conn
593 |> get("/api/pleroma/admin/users?filters=unconfirmed")
594 |> json_response_and_validate_schema(200)
595
596 users =
597 Enum.map([old_user, sad_user], fn user ->
598 user_response(user, %{
599 "is_confirmed" => false,
600 "is_approved" => true
601 })
602 end)
603
604 assert result == %{"count" => 2, "page_size" => 50, "users" => users}
605 end
606
607 test "only unapproved users", %{conn: conn} do
608 user =
609 insert(:user,
610 nickname: "sadboy",
611 is_approved: false,
612 registration_reason: "Plz let me in!"
613 )
614
615 insert(:user, nickname: "happyboy", is_approved: true)
616
617 conn = get(conn, "/api/pleroma/admin/users?filters=need_approval")
618
619 users = [
620 user_response(
621 user,
622 %{"is_approved" => false, "registration_reason" => "Plz let me in!"}
623 )
624 ]
625
626 assert json_response_and_validate_schema(conn, 200) == %{
627 "count" => 1,
628 "page_size" => 50,
629 "users" => users
630 }
631 end
632
633 test "load only admins", %{conn: conn, admin: admin} do
634 second_admin = insert(:user, is_admin: true)
635 insert(:user)
636 insert(:user)
637
638 conn = get(conn, "/api/pleroma/admin/users?filters=is_admin")
639
640 users = [
641 user_response(second_admin, %{
642 "is_active" => true,
643 "roles" => %{"admin" => true, "moderator" => false}
644 }),
645 user_response(admin, %{
646 "is_active" => true,
647 "roles" => %{"admin" => true, "moderator" => false}
648 })
649 ]
650
651 assert json_response_and_validate_schema(conn, 200) == %{
652 "count" => 2,
653 "page_size" => 50,
654 "users" => users
655 }
656 end
657
658 test "load only moderators", %{conn: conn} do
659 moderator = insert(:user, is_moderator: true)
660 insert(:user)
661 insert(:user)
662
663 conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator")
664
665 assert json_response_and_validate_schema(conn, 200) == %{
666 "count" => 1,
667 "page_size" => 50,
668 "users" => [
669 user_response(moderator, %{
670 "is_active" => true,
671 "roles" => %{"admin" => false, "moderator" => true}
672 })
673 ]
674 }
675 end
676
677 test "load users with actor_type is Person", %{admin: admin, conn: conn} do
678 insert(:user, actor_type: "Service")
679 insert(:user, actor_type: "Application")
680
681 user1 = insert(:user)
682 user2 = insert(:user)
683
684 response =
685 conn
686 |> get(user_path(conn, :index), %{actor_types: ["Person"]})
687 |> json_response_and_validate_schema(200)
688
689 users = [
690 user_response(user2),
691 user_response(user1),
692 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
693 ]
694
695 assert response == %{"count" => 3, "page_size" => 50, "users" => users}
696 end
697
698 test "load users with actor_type is Person and Service", %{admin: admin, conn: conn} do
699 user_service = insert(:user, actor_type: "Service")
700 insert(:user, actor_type: "Application")
701
702 user1 = insert(:user)
703 user2 = insert(:user)
704
705 response =
706 conn
707 |> get(user_path(conn, :index), %{actor_types: ["Person", "Service"]})
708 |> json_response_and_validate_schema(200)
709
710 users = [
711 user_response(user2),
712 user_response(user1),
713 user_response(user_service, %{"actor_type" => "Service"}),
714 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
715 ]
716
717 assert response == %{"count" => 4, "page_size" => 50, "users" => users}
718 end
719
720 test "load users with actor_type is Service", %{conn: conn} do
721 user_service = insert(:user, actor_type: "Service")
722 insert(:user, actor_type: "Application")
723 insert(:user)
724 insert(:user)
725
726 response =
727 conn
728 |> get(user_path(conn, :index), %{actor_types: ["Service"]})
729 |> json_response_and_validate_schema(200)
730
731 users = [user_response(user_service, %{"actor_type" => "Service"})]
732
733 assert response == %{"count" => 1, "page_size" => 50, "users" => users}
734 end
735
736 test "load users with tags list", %{conn: conn} do
737 user1 = insert(:user, tags: ["first"])
738 user2 = insert(:user, tags: ["second"])
739 insert(:user)
740 insert(:user)
741
742 conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second")
743
744 users = [
745 user_response(user2, %{"tags" => ["second"]}),
746 user_response(user1, %{"tags" => ["first"]})
747 ]
748
749 assert json_response_and_validate_schema(conn, 200) == %{
750 "count" => 2,
751 "page_size" => 50,
752 "users" => users
753 }
754 end
755
756 test "`active` filters out users pending approval", %{token: token} do
757 insert(:user, is_approved: false)
758 %{id: user_id} = insert(:user, is_approved: true)
759 %{id: admin_id} = token.user
760
761 conn =
762 build_conn()
763 |> assign(:user, token.user)
764 |> assign(:token, token)
765 |> get("/api/pleroma/admin/users?filters=active")
766
767 assert %{
768 "count" => 2,
769 "page_size" => 50,
770 "users" => [
771 %{"id" => ^user_id},
772 %{"id" => ^admin_id}
773 ]
774 } = json_response_and_validate_schema(conn, 200)
775 end
776
777 test "it works with multiple filters" do
778 admin = insert(:user, nickname: "john", is_admin: true)
779 token = insert(:oauth_admin_token, user: admin)
780 user = insert(:user, nickname: "bob", local: false, is_active: false)
781
782 insert(:user, nickname: "ken", local: true, is_active: false)
783 insert(:user, nickname: "bobb", local: false, is_active: true)
784
785 conn =
786 build_conn()
787 |> assign(:user, admin)
788 |> assign(:token, token)
789 |> get("/api/pleroma/admin/users?filters=deactivated,external")
790
791 assert json_response_and_validate_schema(conn, 200) == %{
792 "count" => 1,
793 "page_size" => 50,
794 "users" => [user_response(user)]
795 }
796 end
797
798 test "it omits relay user", %{admin: admin, conn: conn} do
799 assert %User{} = Relay.get_actor()
800
801 conn = get(conn, "/api/pleroma/admin/users")
802
803 assert json_response_and_validate_schema(conn, 200) == %{
804 "count" => 1,
805 "page_size" => 50,
806 "users" => [
807 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
808 ]
809 }
810 end
811 end
812
813 test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do
814 user_one = insert(:user, is_active: false)
815 user_two = insert(:user, is_active: false)
816
817 conn =
818 conn
819 |> put_req_header("content-type", "application/json")
820 |> patch(
821 "/api/pleroma/admin/users/activate",
822 %{nicknames: [user_one.nickname, user_two.nickname]}
823 )
824
825 response = json_response_and_validate_schema(conn, 200)
826 assert Enum.map(response["users"], & &1["is_active"]) == [true, true]
827
828 log_entry = Repo.one(ModerationLog)
829
830 assert ModerationLog.get_log_entry_message(log_entry) ==
831 "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}"
832 end
833
834 test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do
835 user_one = insert(:user, is_active: true)
836 user_two = insert(:user, is_active: true)
837
838 conn =
839 conn
840 |> put_req_header("content-type", "application/json")
841 |> patch(
842 "/api/pleroma/admin/users/deactivate",
843 %{nicknames: [user_one.nickname, user_two.nickname]}
844 )
845
846 response = json_response_and_validate_schema(conn, 200)
847 assert Enum.map(response["users"], & &1["is_active"]) == [false, false]
848
849 log_entry = Repo.one(ModerationLog)
850
851 assert ModerationLog.get_log_entry_message(log_entry) ==
852 "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}"
853 end
854
855 test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do
856 user_one = insert(:user, is_approved: false)
857 user_two = insert(:user, is_approved: false)
858
859 conn =
860 conn
861 |> put_req_header("content-type", "application/json")
862 |> patch(
863 "/api/pleroma/admin/users/approve",
864 %{nicknames: [user_one.nickname, user_two.nickname]}
865 )
866
867 response = json_response_and_validate_schema(conn, 200)
868 assert Enum.map(response["users"], & &1["is_approved"]) == [true, true]
869
870 log_entry = Repo.one(ModerationLog)
871
872 assert ModerationLog.get_log_entry_message(log_entry) ==
873 "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}"
874 end
875
876 test "PATCH /api/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do
877 user1 = insert(:user, is_suggested: false)
878 user2 = insert(:user, is_suggested: false)
879
880 response =
881 conn
882 |> put_req_header("content-type", "application/json")
883 |> patch(
884 "/api/pleroma/admin/users/suggest",
885 %{nicknames: [user1.nickname, user2.nickname]}
886 )
887 |> json_response_and_validate_schema(200)
888
889 assert Enum.map(response["users"], & &1["is_suggested"]) == [true, true]
890 [user1, user2] = Repo.reload!([user1, user2])
891
892 assert user1.is_suggested
893 assert user2.is_suggested
894
895 log_entry = Repo.one(ModerationLog)
896
897 assert ModerationLog.get_log_entry_message(log_entry) ==
898 "@#{admin.nickname} added suggested users: @#{user1.nickname}, @#{user2.nickname}"
899 end
900
901 test "PATCH /api/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do
902 user1 = insert(:user, is_suggested: true)
903 user2 = insert(:user, is_suggested: true)
904
905 response =
906 conn
907 |> put_req_header("content-type", "application/json")
908 |> patch(
909 "/api/pleroma/admin/users/unsuggest",
910 %{nicknames: [user1.nickname, user2.nickname]}
911 )
912 |> json_response_and_validate_schema(200)
913
914 assert Enum.map(response["users"], & &1["is_suggested"]) == [false, false]
915 [user1, user2] = Repo.reload!([user1, user2])
916
917 refute user1.is_suggested
918 refute user2.is_suggested
919
920 log_entry = Repo.one(ModerationLog)
921
922 assert ModerationLog.get_log_entry_message(log_entry) ==
923 "@#{admin.nickname} removed suggested users: @#{user1.nickname}, @#{user2.nickname}"
924 end
925
926 test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do
927 user = insert(:user)
928
929 conn =
930 conn
931 |> put_req_header("content-type", "application/json")
932 |> patch("/api/pleroma/admin/users/#{user.nickname}/toggle_activation")
933
934 assert json_response_and_validate_schema(conn, 200) ==
935 user_response(
936 user,
937 %{"is_active" => !user.is_active}
938 )
939
940 log_entry = Repo.one(ModerationLog)
941
942 assert ModerationLog.get_log_entry_message(log_entry) ==
943 "@#{admin.nickname} deactivated users: @#{user.nickname}"
944 end
945
946 defp user_response(user, attrs \\ %{}) do
947 %{
948 "is_active" => user.is_active,
949 "id" => user.id,
950 "email" => user.email,
951 "nickname" => user.nickname,
952 "roles" => %{"admin" => false, "moderator" => false},
953 "local" => user.local,
954 "tags" => [],
955 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
956 "display_name" => HTML.strip_tags(user.name || user.nickname),
957 "is_confirmed" => true,
958 "is_approved" => true,
959 "is_suggested" => false,
960 "url" => user.ap_id,
961 "registration_reason" => nil,
962 "actor_type" => "Person",
963 "created_at" => CommonAPI.Utils.to_masto_date(user.inserted_at)
964 }
965 |> Map.merge(attrs)
966 end
967 end