1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.AdminAPI.UserControllerTest do
6 use Pleroma.Web.ConnCase, async: false
7 use Oban.Testing, repo: Pleroma.Repo
10 import Pleroma.Factory
13 alias Pleroma.ModerationLog
15 alias Pleroma.Tests.ObanHelpers
17 alias Pleroma.Web.ActivityPub.Relay
18 alias Pleroma.Web.CommonAPI
19 alias Pleroma.Web.Endpoint
20 alias Pleroma.Web.MediaProxy
23 Mox.stub_with(Pleroma.UnstubbedConfigMock, Pleroma.Config)
28 Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
34 admin = insert(:user, is_admin: true)
35 token = insert(:oauth_admin_token, user: admin)
39 |> assign(:user, admin)
40 |> assign(:token, token)
42 {:ok, %{admin: admin, token: token, conn: conn}}
45 test "with valid `admin_token` query parameter, skips OAuth scopes check" do
46 clear_config([:instance, :admin_privileges], [:users_read])
47 clear_config([:admin_token], "password123")
51 conn = get(build_conn(), "/api/pleroma/admin/users/#{user.nickname}?admin_token=password123")
53 assert json_response_and_validate_schema(conn, 200)
56 describe "DELETE /api/pleroma/admin/users" do
57 test "single user", %{admin: admin, conn: conn} do
58 clear_config([:instance, :federating], true)
59 clear_config([:instance, :admin_privileges], [:users_delete])
63 avatar: %{"url" => [%{"href" => "https://someurl"}]},
64 banner: %{"url" => [%{"href" => "https://somebanner"}]},
69 # Create some activities to check they got deleted later
70 follower = insert(:user)
71 {:ok, _} = CommonAPI.post(user, %{status: "test"})
72 {:ok, _, _, _} = CommonAPI.follow(user, follower)
73 {:ok, _, _, _} = CommonAPI.follow(follower, user)
74 user = Repo.get(User, user.id)
75 assert user.note_count == 1
76 assert user.follower_count == 1
77 assert user.following_count == 1
80 with_mock Pleroma.Web.Federator,
81 publish: fn _ -> nil end,
82 perform: fn _, _ -> nil end do
85 |> put_req_header("accept", "application/json")
86 |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}")
88 ObanHelpers.perform_all()
90 refute User.get_by_nickname(user.nickname).is_active
92 log_entry = Repo.one(ModerationLog)
94 assert ModerationLog.get_log_entry_message(log_entry) ==
95 "@#{admin.nickname} deleted users: @#{user.nickname}"
97 assert json_response_and_validate_schema(conn, 200) == [user.nickname]
99 user = Repo.get(User, user.id)
100 refute user.is_active
102 assert user.avatar == %{}
103 assert user.banner == %{}
104 assert user.note_count == 0
105 assert user.follower_count == 0
106 assert user.following_count == 0
107 assert user.bio == ""
108 assert user.name == nil
110 assert called(Pleroma.Web.Federator.publish(:_))
114 test "multiple users", %{admin: admin, conn: conn} do
115 clear_config([:instance, :admin_privileges], [:users_delete])
117 user_one = insert(:user)
118 user_two = insert(:user)
122 |> put_req_header("accept", "application/json")
123 |> put_req_header("content-type", "application/json")
124 |> delete("/api/pleroma/admin/users", %{
125 nicknames: [user_one.nickname, user_two.nickname]
127 |> json_response_and_validate_schema(200)
129 log_entry = Repo.one(ModerationLog)
131 assert ModerationLog.get_log_entry_message(log_entry) ==
132 "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}"
134 assert response -- [user_one.nickname, user_two.nickname] == []
137 test "Needs privileged role", %{conn: conn} do
138 clear_config([:instance, :admin_privileges], [])
142 |> put_req_header("accept", "application/json")
143 |> delete("/api/pleroma/admin/users?nickname=nickname")
145 assert json_response(response, :forbidden)
149 describe "/api/pleroma/admin/users" do
150 test "Create", %{conn: conn} do
153 |> put_req_header("accept", "application/json")
154 |> put_req_header("content-type", "application/json")
155 |> post("/api/pleroma/admin/users", %{
158 "nickname" => "lain",
159 "email" => "lain@example.org",
163 "nickname" => "lain2",
164 "email" => "lain2@example.org",
169 |> json_response_and_validate_schema(200)
170 |> Enum.map(&Map.get(&1, "type"))
172 assert response == ["success", "success"]
174 log_entry = Repo.one(ModerationLog)
176 assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == []
179 test "Cannot create user with existing email", %{conn: conn} do
184 |> put_req_header("accept", "application/json")
185 |> put_req_header("content-type", "application/json")
186 |> post("/api/pleroma/admin/users", %{
189 "nickname" => "lain",
190 "email" => user.email,
196 assert json_response_and_validate_schema(conn, 409) == [
200 "email" => user.email,
203 "error" => "email has already been taken",
209 test "Cannot create user with existing nickname", %{conn: conn} do
214 |> put_req_header("accept", "application/json")
215 |> put_req_header("content-type", "application/json")
216 |> post("/api/pleroma/admin/users", %{
219 "nickname" => user.nickname,
220 "email" => "someuser@plerama.social",
226 assert json_response_and_validate_schema(conn, 409) == [
230 "email" => "someuser@plerama.social",
231 "nickname" => user.nickname
233 "error" => "nickname has already been taken",
239 test "Multiple user creation works in transaction", %{conn: conn} do
244 |> put_req_header("accept", "application/json")
245 |> put_req_header("content-type", "application/json")
246 |> post("/api/pleroma/admin/users", %{
249 "nickname" => "newuser",
250 "email" => "newuser@pleroma.social",
254 "nickname" => "lain",
255 "email" => user.email,
261 assert json_response_and_validate_schema(conn, 409) == [
265 "email" => user.email,
268 "error" => "email has already been taken",
274 "email" => "newuser@pleroma.social",
275 "nickname" => "newuser"
282 assert User.get_by_nickname("newuser") === nil
286 describe "GET /api/pleroma/admin/users/:nickname" do
288 clear_config([:instance, :admin_privileges], [:users_read])
291 test "returns 403 if not privileged with :users_read", %{conn: conn} do
292 clear_config([:instance, :admin_privileges], [])
294 conn = get(conn, "/api/pleroma/admin/users/user.nickname")
296 assert json_response(conn, :forbidden)
299 test "Show", %{conn: conn} do
302 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}")
304 assert user_response(user) == json_response_and_validate_schema(conn, 200)
307 test "when the user doesn't exist", %{conn: conn} do
310 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}")
312 assert %{"error" => "Not found"} == json_response_and_validate_schema(conn, 404)
315 test "requires admin:read:accounts or broader scope",
318 url = "/api/pleroma/admin/users/#{user.nickname}"
320 good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"])
321 good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"])
322 good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"])
324 bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"])
325 bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"])
328 for good_token <- [good_token1, good_token2, good_token3] do
331 |> assign(:user, admin)
332 |> assign(:token, good_token)
335 assert json_response_and_validate_schema(conn, 200)
338 for good_token <- [good_token1, good_token2, good_token3] do
341 |> assign(:user, nil)
342 |> assign(:token, good_token)
345 assert json_response(conn, :forbidden)
348 for bad_token <- [bad_token1, bad_token2, bad_token3] do
351 |> assign(:user, admin)
352 |> assign(:token, bad_token)
355 assert json_response_and_validate_schema(conn, :forbidden)
360 describe "/api/pleroma/admin/users/follow" do
361 test "allows to force-follow another user", %{admin: admin, conn: conn} do
363 follower = insert(:user)
366 |> put_req_header("accept", "application/json")
367 |> put_req_header("content-type", "application/json")
368 |> post("/api/pleroma/admin/users/follow", %{
369 "follower" => follower.nickname,
370 "followed" => user.nickname
373 user = User.get_cached_by_id(user.id)
374 follower = User.get_cached_by_id(follower.id)
376 assert User.following?(follower, user)
378 log_entry = Repo.one(ModerationLog)
380 assert ModerationLog.get_log_entry_message(log_entry) ==
381 "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}"
385 describe "/api/pleroma/admin/users/unfollow" do
386 test "allows to force-unfollow another user", %{admin: admin, conn: conn} do
388 follower = insert(:user)
390 User.follow(follower, user)
393 |> put_req_header("accept", "application/json")
394 |> put_req_header("content-type", "application/json")
395 |> post("/api/pleroma/admin/users/unfollow", %{
396 "follower" => follower.nickname,
397 "followed" => user.nickname
400 user = User.get_cached_by_id(user.id)
401 follower = User.get_cached_by_id(follower.id)
403 refute User.following?(follower, user)
405 log_entry = Repo.one(ModerationLog)
407 assert ModerationLog.get_log_entry_message(log_entry) ==
408 "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}"
412 describe "GET /api/pleroma/admin/users" do
414 clear_config([:instance, :admin_privileges], [:users_read])
417 test "returns 403 if not privileged with :users_read", %{conn: conn} do
418 clear_config([:instance, :admin_privileges], [])
420 conn = get(conn, "/api/pleroma/admin/users?page=1")
422 assert json_response(conn, :forbidden)
425 test "renders users array for the first page", %{conn: conn, admin: admin} do
426 user = insert(:user, local: false, tags: ["foo", "bar"])
427 user2 = insert(:user, is_approved: false, registration_reason: "I'm a chill dude")
429 conn = get(conn, "/api/pleroma/admin/users?page=1")
436 "is_approved" => false,
437 "registration_reason" => "I'm a chill dude",
438 "actor_type" => "Person"
441 user_response(user, %{"local" => false, "tags" => ["foo", "bar"]}),
444 %{"roles" => %{"admin" => true, "moderator" => false}}
448 assert json_response_and_validate_schema(conn, 200) == %{
455 test "pagination works correctly with service users", %{conn: conn} do
456 service1 = User.get_or_create_service_actor_by_ap_id(Endpoint.url() <> "/meido", "meido")
458 insert_list(25, :user)
460 assert %{"count" => 26, "page_size" => 10, "users" => users1} =
462 |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"})
463 |> json_response_and_validate_schema(200)
465 assert Enum.count(users1) == 10
466 assert service1 not in users1
468 assert %{"count" => 26, "page_size" => 10, "users" => users2} =
470 |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"})
471 |> json_response_and_validate_schema(200)
473 assert Enum.count(users2) == 10
474 assert service1 not in users2
476 assert %{"count" => 26, "page_size" => 10, "users" => users3} =
478 |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"})
479 |> json_response_and_validate_schema(200)
481 assert Enum.count(users3) == 6
482 assert service1 not in users3
485 test "renders empty array for the second page", %{conn: conn} do
488 conn = get(conn, "/api/pleroma/admin/users?page=2")
490 assert json_response_and_validate_schema(conn, 200) == %{
497 test "regular search", %{conn: conn} do
498 user = insert(:user, nickname: "bob")
500 conn = get(conn, "/api/pleroma/admin/users?query=bo")
502 assert json_response_and_validate_schema(conn, 200) == %{
505 "users" => [user_response(user, %{"local" => true})]
509 test "search by domain", %{conn: conn} do
510 user = insert(:user, nickname: "nickname@domain.com")
513 conn = get(conn, "/api/pleroma/admin/users?query=domain.com")
515 assert json_response_and_validate_schema(conn, 200) == %{
518 "users" => [user_response(user)]
522 test "search by full nickname", %{conn: conn} do
523 user = insert(:user, nickname: "nickname@domain.com")
526 conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com")
528 assert json_response_and_validate_schema(conn, 200) == %{
531 "users" => [user_response(user)]
535 test "search by display name", %{conn: conn} do
536 user = insert(:user, name: "Display name")
539 conn = get(conn, "/api/pleroma/admin/users?name=display")
541 assert json_response_and_validate_schema(conn, 200) == %{
544 "users" => [user_response(user)]
548 test "search by email", %{conn: conn} do
549 user = insert(:user, email: "email@example.com")
552 conn = get(conn, "/api/pleroma/admin/users?email=email@example.com")
554 assert json_response_and_validate_schema(conn, 200) == %{
557 "users" => [user_response(user)]
561 test "regular search with page size", %{conn: conn} do
562 user = insert(:user, nickname: "aalice")
563 user2 = insert(:user, nickname: "alice")
565 conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1")
567 assert json_response_and_validate_schema(conn1, 200) == %{
570 "users" => [user_response(user2)]
573 conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2")
575 assert json_response_and_validate_schema(conn2, 200) == %{
578 "users" => [user_response(user)]
582 test "only local users" do
583 admin = insert(:user, is_admin: true, nickname: "john")
584 token = insert(:oauth_admin_token, user: admin)
585 user = insert(:user, nickname: "bob")
587 insert(:user, nickname: "bobb", local: false)
591 |> assign(:user, admin)
592 |> assign(:token, token)
593 |> get("/api/pleroma/admin/users?query=bo&filters=local")
595 assert json_response_and_validate_schema(conn, 200) == %{
598 "users" => [user_response(user)]
602 test "only local users with no query", %{conn: conn, admin: old_admin} do
603 admin = insert(:user, is_admin: true, nickname: "john")
604 user = insert(:user, nickname: "bob")
606 insert(:user, nickname: "bobb", local: false)
608 conn = get(conn, "/api/pleroma/admin/users?filters=local")
612 user_response(admin, %{
613 "roles" => %{"admin" => true, "moderator" => false}
615 user_response(old_admin, %{
617 "roles" => %{"admin" => true, "moderator" => false}
621 assert json_response_and_validate_schema(conn, 200) == %{
628 test "only unconfirmed users", %{conn: conn} do
629 sad_user = insert(:user, nickname: "sadboy", is_confirmed: false)
630 old_user = insert(:user, nickname: "oldboy", is_confirmed: false)
632 insert(:user, nickname: "happyboy", is_approved: true)
633 insert(:user, is_confirmed: true)
637 |> get("/api/pleroma/admin/users?filters=unconfirmed")
638 |> json_response_and_validate_schema(200)
641 Enum.map([old_user, sad_user], fn user ->
642 user_response(user, %{
643 "is_confirmed" => false,
644 "is_approved" => true
648 assert result == %{"count" => 2, "page_size" => 50, "users" => users}
651 test "only unapproved users", %{conn: conn} do
656 registration_reason: "Plz let me in!"
659 insert(:user, nickname: "happyboy", is_approved: true)
661 conn = get(conn, "/api/pleroma/admin/users?filters=need_approval")
666 %{"is_approved" => false, "registration_reason" => "Plz let me in!"}
670 assert json_response_and_validate_schema(conn, 200) == %{
677 test "load only admins", %{conn: conn, admin: admin} do
678 second_admin = insert(:user, is_admin: true)
682 conn = get(conn, "/api/pleroma/admin/users?filters=is_admin")
685 user_response(second_admin, %{
687 "roles" => %{"admin" => true, "moderator" => false}
689 user_response(admin, %{
691 "roles" => %{"admin" => true, "moderator" => false}
695 assert json_response_and_validate_schema(conn, 200) == %{
702 test "load only moderators", %{conn: conn} do
703 moderator = insert(:user, is_moderator: true)
707 conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator")
709 assert json_response_and_validate_schema(conn, 200) == %{
713 user_response(moderator, %{
715 "roles" => %{"admin" => false, "moderator" => true}
721 test "load users with actor_type is Person", %{admin: admin, conn: conn} do
722 insert(:user, actor_type: "Service")
723 insert(:user, actor_type: "Application")
725 user1 = insert(:user)
726 user2 = insert(:user)
730 |> get(user_path(conn, :index), %{actor_types: ["Person"]})
731 |> json_response_and_validate_schema(200)
734 user_response(user2),
735 user_response(user1),
736 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
739 assert response == %{"count" => 3, "page_size" => 50, "users" => users}
742 test "load users with actor_type is Person and Service", %{admin: admin, conn: conn} do
743 user_service = insert(:user, actor_type: "Service")
744 insert(:user, actor_type: "Application")
746 user1 = insert(:user)
747 user2 = insert(:user)
751 |> get(user_path(conn, :index), %{actor_types: ["Person", "Service"]})
752 |> json_response_and_validate_schema(200)
755 user_response(user2),
756 user_response(user1),
757 user_response(user_service, %{"actor_type" => "Service"}),
758 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
761 assert response == %{"count" => 4, "page_size" => 50, "users" => users}
764 test "load users with actor_type is Service", %{conn: conn} do
765 user_service = insert(:user, actor_type: "Service")
766 insert(:user, actor_type: "Application")
772 |> get(user_path(conn, :index), %{actor_types: ["Service"]})
773 |> json_response_and_validate_schema(200)
775 users = [user_response(user_service, %{"actor_type" => "Service"})]
777 assert response == %{"count" => 1, "page_size" => 50, "users" => users}
780 test "load users with tags list", %{conn: conn} do
781 user1 = insert(:user, tags: ["first"])
782 user2 = insert(:user, tags: ["second"])
786 conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second")
789 user_response(user2, %{"tags" => ["second"]}),
790 user_response(user1, %{"tags" => ["first"]})
793 assert json_response_and_validate_schema(conn, 200) == %{
800 test "`active` filters out users pending approval", %{token: token} do
801 insert(:user, is_approved: false)
802 %{id: user_id} = insert(:user, is_approved: true)
803 %{id: admin_id} = token.user
807 |> assign(:user, token.user)
808 |> assign(:token, token)
809 |> get("/api/pleroma/admin/users?filters=active")
818 } = json_response_and_validate_schema(conn, 200)
821 test "it works with multiple filters" do
822 admin = insert(:user, nickname: "john", is_admin: true)
823 token = insert(:oauth_admin_token, user: admin)
824 user = insert(:user, nickname: "bob", local: false, is_active: false)
826 insert(:user, nickname: "ken", local: true, is_active: false)
827 insert(:user, nickname: "bobb", local: false, is_active: true)
831 |> assign(:user, admin)
832 |> assign(:token, token)
833 |> get("/api/pleroma/admin/users?filters=deactivated,external")
835 assert json_response_and_validate_schema(conn, 200) == %{
838 "users" => [user_response(user)]
842 test "it omits relay user", %{admin: admin, conn: conn} do
843 assert %User{} = Relay.get_actor()
845 conn = get(conn, "/api/pleroma/admin/users")
847 assert json_response_and_validate_schema(conn, 200) == %{
851 user_response(admin, %{"roles" => %{"admin" => true, "moderator" => false}})
857 test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do
858 clear_config([:instance, :admin_privileges], [:users_manage_invites])
860 user_one = insert(:user, is_approved: false)
861 user_two = insert(:user, is_approved: false)
865 |> put_req_header("content-type", "application/json")
867 "/api/pleroma/admin/users/approve",
868 %{nicknames: [user_one.nickname, user_two.nickname]}
871 response = json_response_and_validate_schema(conn, 200)
872 assert Enum.map(response["users"], & &1["is_approved"]) == [true, true]
874 log_entry = Repo.one(ModerationLog)
876 assert ModerationLog.get_log_entry_message(log_entry) ==
877 "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}"
880 test "PATCH /api/pleroma/admin/users/approve returns 403 if not privileged with :users_manage_invites",
882 clear_config([:instance, :admin_privileges], [])
886 |> put_req_header("content-type", "application/json")
888 "/api/pleroma/admin/users/approve",
889 %{nicknames: ["user_one.nickname", "user_two.nickname"]}
892 assert json_response(conn, :forbidden)
895 test "PATCH /api/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do
896 user1 = insert(:user, is_suggested: false)
897 user2 = insert(:user, is_suggested: false)
901 |> put_req_header("content-type", "application/json")
903 "/api/pleroma/admin/users/suggest",
904 %{nicknames: [user1.nickname, user2.nickname]}
906 |> json_response_and_validate_schema(200)
908 assert Enum.map(response["users"], & &1["is_suggested"]) == [true, true]
909 [user1, user2] = Repo.reload!([user1, user2])
911 assert user1.is_suggested
912 assert user2.is_suggested
914 log_entry = Repo.one(ModerationLog)
916 assert ModerationLog.get_log_entry_message(log_entry) ==
917 "@#{admin.nickname} added suggested users: @#{user1.nickname}, @#{user2.nickname}"
920 test "PATCH /api/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do
921 user1 = insert(:user, is_suggested: true)
922 user2 = insert(:user, is_suggested: true)
926 |> put_req_header("content-type", "application/json")
928 "/api/pleroma/admin/users/unsuggest",
929 %{nicknames: [user1.nickname, user2.nickname]}
931 |> json_response_and_validate_schema(200)
933 assert Enum.map(response["users"], & &1["is_suggested"]) == [false, false]
934 [user1, user2] = Repo.reload!([user1, user2])
936 refute user1.is_suggested
937 refute user2.is_suggested
939 log_entry = Repo.one(ModerationLog)
941 assert ModerationLog.get_log_entry_message(log_entry) ==
942 "@#{admin.nickname} removed suggested users: @#{user1.nickname}, @#{user2.nickname}"
945 describe "user activation" do
946 test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do
947 clear_config([:instance, :admin_privileges], [:users_manage_activation_state])
949 user_one = insert(:user, is_active: false)
950 user_two = insert(:user, is_active: false)
954 |> put_req_header("content-type", "application/json")
956 "/api/pleroma/admin/users/activate",
957 %{nicknames: [user_one.nickname, user_two.nickname]}
960 response = json_response_and_validate_schema(conn, 200)
961 assert Enum.map(response["users"], & &1["is_active"]) == [true, true]
963 log_entry = Repo.one(ModerationLog)
965 assert ModerationLog.get_log_entry_message(log_entry) ==
966 "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}"
969 test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do
970 clear_config([:instance, :admin_privileges], [:users_manage_activation_state])
972 user_one = insert(:user, is_active: true)
973 user_two = insert(:user, is_active: true)
977 |> put_req_header("content-type", "application/json")
979 "/api/pleroma/admin/users/deactivate",
980 %{nicknames: [user_one.nickname, user_two.nickname]}
983 response = json_response_and_validate_schema(conn, 200)
984 assert Enum.map(response["users"], & &1["is_active"]) == [false, false]
986 log_entry = Repo.one(ModerationLog)
988 assert ModerationLog.get_log_entry_message(log_entry) ==
989 "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}"
992 test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do
993 clear_config([:instance, :admin_privileges], [:users_manage_activation_state])
999 |> put_req_header("content-type", "application/json")
1000 |> patch("/api/pleroma/admin/users/#{user.nickname}/toggle_activation")
1002 assert json_response_and_validate_schema(conn, 200) ==
1005 %{"is_active" => !user.is_active}
1008 log_entry = Repo.one(ModerationLog)
1010 assert ModerationLog.get_log_entry_message(log_entry) ==
1011 "@#{admin.nickname} deactivated users: @#{user.nickname}"
1014 test "it requires privileged role :statuses_activation to activate", %{conn: conn} do
1015 clear_config([:instance, :admin_privileges], [])
1019 |> put_req_header("content-type", "application/json")
1021 "/api/pleroma/admin/users/activate",
1022 %{nicknames: ["user_one.nickname", "user_two.nickname"]}
1025 assert json_response(conn, :forbidden)
1028 test "it requires privileged role :statuses_activation to deactivate", %{conn: conn} do
1029 clear_config([:instance, :admin_privileges], [])
1033 |> put_req_header("content-type", "application/json")
1035 "/api/pleroma/admin/users/deactivate",
1036 %{nicknames: ["user_one.nickname", "user_two.nickname"]}
1039 assert json_response(conn, :forbidden)
1042 test "it requires privileged role :statuses_activation to toggle activation", %{conn: conn} do
1043 clear_config([:instance, :admin_privileges], [])
1047 |> put_req_header("content-type", "application/json")
1048 |> patch("/api/pleroma/admin/users/user.nickname/toggle_activation")
1050 assert json_response(conn, :forbidden)
1054 defp user_response(user, attrs \\ %{}) do
1056 "is_active" => user.is_active,
1058 "email" => user.email,
1059 "nickname" => user.nickname,
1060 "roles" => %{"admin" => false, "moderator" => false},
1061 "local" => user.local,
1063 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
1064 "display_name" => HTML.strip_tags(user.name || user.nickname),
1065 "is_confirmed" => true,
1066 "is_approved" => true,
1067 "is_suggested" => false,
1068 "url" => user.ap_id,
1069 "registration_reason" => nil,
1070 "actor_type" => "Person",
1071 "created_at" => CommonAPI.Utils.to_masto_date(user.inserted_at)