1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
6 use Pleroma.Web.ConnCase
10 alias Pleroma.UserInviteToken
11 alias Pleroma.Web.CommonAPI
12 import Pleroma.Factory
14 describe "/api/pleroma/admin/users" do
16 admin = insert(:user, info: %{is_admin: true})
21 |> assign(:user, admin)
22 |> put_req_header("accept", "application/json")
23 |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}")
25 assert json_response(conn, 200) == user.nickname
29 admin = insert(:user, info: %{is_admin: true})
33 |> assign(:user, admin)
34 |> put_req_header("accept", "application/json")
35 |> post("/api/pleroma/admin/users", %{
39 "email" => "lain@example.org",
43 "nickname" => "lain2",
44 "email" => "lain2@example.org",
50 response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type"))
51 assert response == ["success", "success"]
54 test "Cannot create user with exisiting email" do
55 admin = insert(:user, info: %{is_admin: true})
60 |> assign(:user, admin)
61 |> put_req_header("accept", "application/json")
62 |> post("/api/pleroma/admin/users", %{
66 "email" => user.email,
72 assert json_response(conn, 409) == [
76 "email" => user.email,
79 "error" => "email has already been taken",
85 test "Cannot create user with exisiting nickname" do
86 admin = insert(:user, info: %{is_admin: true})
91 |> assign(:user, admin)
92 |> put_req_header("accept", "application/json")
93 |> post("/api/pleroma/admin/users", %{
96 "nickname" => user.nickname,
97 "email" => "someuser@plerama.social",
103 assert json_response(conn, 409) == [
107 "email" => "someuser@plerama.social",
108 "nickname" => user.nickname
110 "error" => "nickname has already been taken",
116 test "Multiple user creation works in transaction" do
117 admin = insert(:user, info: %{is_admin: true})
122 |> assign(:user, admin)
123 |> put_req_header("accept", "application/json")
124 |> post("/api/pleroma/admin/users", %{
127 "nickname" => "newuser",
128 "email" => "newuser@pleroma.social",
132 "nickname" => "lain",
133 "email" => user.email,
139 assert json_response(conn, 409) == [
143 "email" => user.email,
146 "error" => "email has already been taken",
152 "email" => "newuser@pleroma.social",
153 "nickname" => "newuser"
160 assert User.get_by_nickname("newuser") === nil
164 describe "/api/pleroma/admin/users/:nickname" do
165 test "Show", %{conn: conn} do
166 admin = insert(:user, info: %{is_admin: true})
171 |> assign(:user, admin)
172 |> get("/api/pleroma/admin/users/#{user.nickname}")
175 "deactivated" => false,
176 "id" => to_string(user.id),
178 "nickname" => user.nickname,
179 "roles" => %{"admin" => false, "moderator" => false},
183 assert expected == json_response(conn, 200)
186 test "when the user doesn't exist", %{conn: conn} do
187 admin = insert(:user, info: %{is_admin: true})
192 |> assign(:user, admin)
193 |> get("/api/pleroma/admin/users/#{user.nickname}")
195 assert "Not found" == json_response(conn, 404)
199 describe "/api/pleroma/admin/users/follow" do
200 test "allows to force-follow another user" do
201 admin = insert(:user, info: %{is_admin: true})
203 follower = insert(:user)
206 |> assign(:user, admin)
207 |> put_req_header("accept", "application/json")
208 |> post("/api/pleroma/admin/users/follow", %{
209 "follower" => follower.nickname,
210 "followed" => user.nickname
213 user = User.get_cached_by_id(user.id)
214 follower = User.get_cached_by_id(follower.id)
216 assert User.following?(follower, user)
220 describe "/api/pleroma/admin/users/unfollow" do
221 test "allows to force-unfollow another user" do
222 admin = insert(:user, info: %{is_admin: true})
224 follower = insert(:user)
226 User.follow(follower, user)
229 |> assign(:user, admin)
230 |> put_req_header("accept", "application/json")
231 |> post("/api/pleroma/admin/users/unfollow", %{
232 "follower" => follower.nickname,
233 "followed" => user.nickname
236 user = User.get_cached_by_id(user.id)
237 follower = User.get_cached_by_id(follower.id)
239 refute User.following?(follower, user)
243 describe "PUT /api/pleroma/admin/users/tag" do
245 admin = insert(:user, info: %{is_admin: true})
246 user1 = insert(:user, %{tags: ["x"]})
247 user2 = insert(:user, %{tags: ["y"]})
248 user3 = insert(:user, %{tags: ["unchanged"]})
252 |> assign(:user, admin)
253 |> put_req_header("accept", "application/json")
255 "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=#{
257 }&tags[]=foo&tags[]=bar"
260 %{conn: conn, user1: user1, user2: user2, user3: user3}
263 test "it appends specified tags to users with specified nicknames", %{
268 assert json_response(conn, :no_content)
269 assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"]
270 assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"]
273 test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
274 assert json_response(conn, :no_content)
275 assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
279 describe "DELETE /api/pleroma/admin/users/tag" do
281 admin = insert(:user, info: %{is_admin: true})
282 user1 = insert(:user, %{tags: ["x"]})
283 user2 = insert(:user, %{tags: ["y", "z"]})
284 user3 = insert(:user, %{tags: ["unchanged"]})
288 |> assign(:user, admin)
289 |> put_req_header("accept", "application/json")
291 "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=#{
296 %{conn: conn, user1: user1, user2: user2, user3: user3}
299 test "it removes specified tags from users with specified nicknames", %{
304 assert json_response(conn, :no_content)
305 assert User.get_cached_by_id(user1.id).tags == []
306 assert User.get_cached_by_id(user2.id).tags == ["y"]
309 test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
310 assert json_response(conn, :no_content)
311 assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
315 describe "/api/pleroma/admin/users/:nickname/permission_group" do
316 test "GET is giving user_info" do
317 admin = insert(:user, info: %{is_admin: true})
321 |> assign(:user, admin)
322 |> put_req_header("accept", "application/json")
323 |> get("/api/pleroma/admin/users/#{admin.nickname}/permission_group/")
325 assert json_response(conn, 200) == %{
327 "is_moderator" => false
331 test "/:right POST, can add to a permission group" do
332 admin = insert(:user, info: %{is_admin: true})
337 |> assign(:user, admin)
338 |> put_req_header("accept", "application/json")
339 |> post("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin")
341 assert json_response(conn, 200) == %{
346 test "/:right DELETE, can remove from a permission group" do
347 admin = insert(:user, info: %{is_admin: true})
348 user = insert(:user, info: %{is_admin: true})
352 |> assign(:user, admin)
353 |> put_req_header("accept", "application/json")
354 |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin")
356 assert json_response(conn, 200) == %{
362 describe "PUT /api/pleroma/admin/users/:nickname/activation_status" do
363 setup %{conn: conn} do
364 admin = insert(:user, info: %{is_admin: true})
368 |> assign(:user, admin)
369 |> put_req_header("accept", "application/json")
374 test "deactivates the user", %{conn: conn} do
379 |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false})
381 user = User.get_cached_by_id(user.id)
382 assert user.info.deactivated == true
383 assert json_response(conn, :no_content)
386 test "activates the user", %{conn: conn} do
387 user = insert(:user, info: %{deactivated: true})
391 |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: true})
393 user = User.get_cached_by_id(user.id)
394 assert user.info.deactivated == false
395 assert json_response(conn, :no_content)
398 test "returns 403 when requested by a non-admin", %{conn: conn} do
403 |> assign(:user, user)
404 |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false})
406 assert json_response(conn, :forbidden)
410 describe "POST /api/pleroma/admin/email_invite, with valid config" do
412 registrations_open = Pleroma.Config.get([:instance, :registrations_open])
413 invites_enabled = Pleroma.Config.get([:instance, :invites_enabled])
414 Pleroma.Config.put([:instance, :registrations_open], false)
415 Pleroma.Config.put([:instance, :invites_enabled], true)
418 Pleroma.Config.put([:instance, :registrations_open], registrations_open)
419 Pleroma.Config.put([:instance, :invites_enabled], invites_enabled)
423 [user: insert(:user, info: %{is_admin: true})]
426 test "sends invitation and returns 204", %{conn: conn, user: user} do
427 recipient_email = "foo@bar.com"
428 recipient_name = "J. D."
432 |> assign(:user, user)
434 "/api/pleroma/admin/users/email_invite?email=#{recipient_email}&name=#{recipient_name}"
437 assert json_response(conn, :no_content)
439 token_record = List.last(Pleroma.Repo.all(Pleroma.UserInviteToken))
441 refute token_record.used
443 notify_email = Pleroma.Config.get([:instance, :notify_email])
444 instance_name = Pleroma.Config.get([:instance, :name])
447 Pleroma.Emails.UserEmail.user_invitation_email(
454 Swoosh.TestAssertions.assert_email_sent(
455 from: {instance_name, notify_email},
456 to: {recipient_name, recipient_email},
457 html_body: email.html_body
461 test "it returns 403 if requested by a non-admin", %{conn: conn} do
462 non_admin_user = insert(:user)
466 |> assign(:user, non_admin_user)
467 |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
469 assert json_response(conn, :forbidden)
473 describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do
475 [user: insert(:user, info: %{is_admin: true})]
478 test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn, user: user} do
479 registrations_open = Pleroma.Config.get([:instance, :registrations_open])
480 invites_enabled = Pleroma.Config.get([:instance, :invites_enabled])
481 Pleroma.Config.put([:instance, :registrations_open], false)
482 Pleroma.Config.put([:instance, :invites_enabled], false)
485 Pleroma.Config.put([:instance, :registrations_open], registrations_open)
486 Pleroma.Config.put([:instance, :invites_enabled], invites_enabled)
492 |> assign(:user, user)
493 |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
495 assert json_response(conn, :internal_server_error)
498 test "it returns 500 if `registrations_open` is enabled", %{conn: conn, user: user} do
499 registrations_open = Pleroma.Config.get([:instance, :registrations_open])
500 invites_enabled = Pleroma.Config.get([:instance, :invites_enabled])
501 Pleroma.Config.put([:instance, :registrations_open], true)
502 Pleroma.Config.put([:instance, :invites_enabled], true)
505 Pleroma.Config.put([:instance, :registrations_open], registrations_open)
506 Pleroma.Config.put([:instance, :invites_enabled], invites_enabled)
512 |> assign(:user, user)
513 |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
515 assert json_response(conn, :internal_server_error)
519 test "/api/pleroma/admin/users/invite_token" do
520 admin = insert(:user, info: %{is_admin: true})
524 |> assign(:user, admin)
525 |> put_req_header("accept", "application/json")
526 |> get("/api/pleroma/admin/users/invite_token")
528 assert conn.status == 200
531 test "/api/pleroma/admin/users/:nickname/password_reset" do
532 admin = insert(:user, info: %{is_admin: true})
537 |> assign(:user, admin)
538 |> put_req_header("accept", "application/json")
539 |> get("/api/pleroma/admin/users/#{user.nickname}/password_reset")
541 assert conn.status == 200
544 describe "GET /api/pleroma/admin/users" do
546 admin = insert(:user, info: %{is_admin: true})
550 |> assign(:user, admin)
552 {:ok, conn: conn, admin: admin}
555 test "renders users array for the first page", %{conn: conn, admin: admin} do
556 user = insert(:user, local: false, tags: ["foo", "bar"])
557 conn = get(conn, "/api/pleroma/admin/users?page=1")
562 "deactivated" => admin.info.deactivated,
564 "nickname" => admin.nickname,
565 "roles" => %{"admin" => true, "moderator" => false},
570 "deactivated" => user.info.deactivated,
572 "nickname" => user.nickname,
573 "roles" => %{"admin" => false, "moderator" => false},
575 "tags" => ["foo", "bar"]
578 |> Enum.sort_by(& &1["nickname"])
580 assert json_response(conn, 200) == %{
587 test "renders empty array for the second page", %{conn: conn} do
590 conn = get(conn, "/api/pleroma/admin/users?page=2")
592 assert json_response(conn, 200) == %{
599 test "regular search", %{conn: conn} do
600 user = insert(:user, nickname: "bob")
602 conn = get(conn, "/api/pleroma/admin/users?query=bo")
604 assert json_response(conn, 200) == %{
609 "deactivated" => user.info.deactivated,
611 "nickname" => user.nickname,
612 "roles" => %{"admin" => false, "moderator" => false},
620 test "search by domain", %{conn: conn} do
621 user = insert(:user, nickname: "nickname@domain.com")
624 conn = get(conn, "/api/pleroma/admin/users?query=domain.com")
626 assert json_response(conn, 200) == %{
631 "deactivated" => user.info.deactivated,
633 "nickname" => user.nickname,
634 "roles" => %{"admin" => false, "moderator" => false},
642 test "search by full nickname", %{conn: conn} do
643 user = insert(:user, nickname: "nickname@domain.com")
646 conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com")
648 assert json_response(conn, 200) == %{
653 "deactivated" => user.info.deactivated,
655 "nickname" => user.nickname,
656 "roles" => %{"admin" => false, "moderator" => false},
664 test "search by display name", %{conn: conn} do
665 user = insert(:user, name: "Display name")
668 conn = get(conn, "/api/pleroma/admin/users?name=display")
670 assert json_response(conn, 200) == %{
675 "deactivated" => user.info.deactivated,
677 "nickname" => user.nickname,
678 "roles" => %{"admin" => false, "moderator" => false},
686 test "search by email", %{conn: conn} do
687 user = insert(:user, email: "email@example.com")
690 conn = get(conn, "/api/pleroma/admin/users?email=email@example.com")
692 assert json_response(conn, 200) == %{
697 "deactivated" => user.info.deactivated,
699 "nickname" => user.nickname,
700 "roles" => %{"admin" => false, "moderator" => false},
708 test "regular search with page size", %{conn: conn} do
709 user = insert(:user, nickname: "aalice")
710 user2 = insert(:user, nickname: "alice")
712 conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1")
714 assert json_response(conn1, 200) == %{
719 "deactivated" => user.info.deactivated,
721 "nickname" => user.nickname,
722 "roles" => %{"admin" => false, "moderator" => false},
729 conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2")
731 assert json_response(conn2, 200) == %{
736 "deactivated" => user2.info.deactivated,
738 "nickname" => user2.nickname,
739 "roles" => %{"admin" => false, "moderator" => false},
747 test "only local users" do
748 admin = insert(:user, info: %{is_admin: true}, nickname: "john")
749 user = insert(:user, nickname: "bob")
751 insert(:user, nickname: "bobb", local: false)
755 |> assign(:user, admin)
756 |> get("/api/pleroma/admin/users?query=bo&filters=local")
758 assert json_response(conn, 200) == %{
763 "deactivated" => user.info.deactivated,
765 "nickname" => user.nickname,
766 "roles" => %{"admin" => false, "moderator" => false},
774 test "only local users with no query", %{admin: old_admin} do
775 admin = insert(:user, info: %{is_admin: true}, nickname: "john")
776 user = insert(:user, nickname: "bob")
778 insert(:user, nickname: "bobb", local: false)
782 |> assign(:user, admin)
783 |> get("/api/pleroma/admin/users?filters=local")
788 "deactivated" => user.info.deactivated,
790 "nickname" => user.nickname,
791 "roles" => %{"admin" => false, "moderator" => false},
796 "deactivated" => admin.info.deactivated,
798 "nickname" => admin.nickname,
799 "roles" => %{"admin" => true, "moderator" => false},
804 "deactivated" => false,
805 "id" => old_admin.id,
807 "nickname" => old_admin.nickname,
808 "roles" => %{"admin" => true, "moderator" => false},
812 |> Enum.sort_by(& &1["nickname"])
814 assert json_response(conn, 200) == %{
821 test "load only admins", %{conn: conn, admin: admin} do
822 second_admin = insert(:user, info: %{is_admin: true})
826 conn = get(conn, "/api/pleroma/admin/users?filters=is_admin")
831 "deactivated" => false,
833 "nickname" => admin.nickname,
834 "roles" => %{"admin" => true, "moderator" => false},
835 "local" => admin.local,
839 "deactivated" => false,
840 "id" => second_admin.id,
841 "nickname" => second_admin.nickname,
842 "roles" => %{"admin" => true, "moderator" => false},
843 "local" => second_admin.local,
847 |> Enum.sort_by(& &1["nickname"])
849 assert json_response(conn, 200) == %{
856 test "load only moderators", %{conn: conn} do
857 moderator = insert(:user, info: %{is_moderator: true})
861 conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator")
863 assert json_response(conn, 200) == %{
868 "deactivated" => false,
869 "id" => moderator.id,
870 "nickname" => moderator.nickname,
871 "roles" => %{"admin" => false, "moderator" => true},
872 "local" => moderator.local,
879 test "load users with tags list", %{conn: conn} do
880 user1 = insert(:user, tags: ["first"])
881 user2 = insert(:user, tags: ["second"])
885 conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second")
890 "deactivated" => false,
892 "nickname" => user1.nickname,
893 "roles" => %{"admin" => false, "moderator" => false},
894 "local" => user1.local,
898 "deactivated" => false,
900 "nickname" => user2.nickname,
901 "roles" => %{"admin" => false, "moderator" => false},
902 "local" => user2.local,
906 |> Enum.sort_by(& &1["nickname"])
908 assert json_response(conn, 200) == %{
915 test "it works with multiple filters" do
916 admin = insert(:user, nickname: "john", info: %{is_admin: true})
917 user = insert(:user, nickname: "bob", local: false, info: %{deactivated: true})
919 insert(:user, nickname: "ken", local: true, info: %{deactivated: true})
920 insert(:user, nickname: "bobb", local: false, info: %{deactivated: false})
924 |> assign(:user, admin)
925 |> get("/api/pleroma/admin/users?filters=deactivated,external")
927 assert json_response(conn, 200) == %{
932 "deactivated" => user.info.deactivated,
934 "nickname" => user.nickname,
935 "roles" => %{"admin" => false, "moderator" => false},
936 "local" => user.local,
944 test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation" do
945 admin = insert(:user, info: %{is_admin: true})
950 |> assign(:user, admin)
951 |> patch("/api/pleroma/admin/users/#{user.nickname}/toggle_activation")
953 assert json_response(conn, 200) ==
955 "deactivated" => !user.info.deactivated,
957 "nickname" => user.nickname,
958 "roles" => %{"admin" => false, "moderator" => false},
964 describe "GET /api/pleroma/admin/users/invite_token" do
966 admin = insert(:user, info: %{is_admin: true})
970 |> assign(:user, admin)
975 test "without options", %{conn: conn} do
976 conn = get(conn, "/api/pleroma/admin/users/invite_token")
978 token = json_response(conn, 200)
979 invite = UserInviteToken.find_by_token!(token)
981 refute invite.expires_at
982 refute invite.max_use
983 assert invite.invite_type == "one_time"
986 test "with expires_at", %{conn: conn} do
988 get(conn, "/api/pleroma/admin/users/invite_token", %{
989 "invite" => %{"expires_at" => Date.to_string(Date.utc_today())}
992 token = json_response(conn, 200)
993 invite = UserInviteToken.find_by_token!(token)
996 assert invite.expires_at == Date.utc_today()
997 refute invite.max_use
998 assert invite.invite_type == "date_limited"
1001 test "with max_use", %{conn: conn} do
1003 get(conn, "/api/pleroma/admin/users/invite_token", %{
1004 "invite" => %{"max_use" => 150}
1007 token = json_response(conn, 200)
1008 invite = UserInviteToken.find_by_token!(token)
1010 refute invite.expires_at
1011 assert invite.max_use == 150
1012 assert invite.invite_type == "reusable"
1015 test "with max use and expires_at", %{conn: conn} do
1017 get(conn, "/api/pleroma/admin/users/invite_token", %{
1018 "invite" => %{"max_use" => 150, "expires_at" => Date.to_string(Date.utc_today())}
1021 token = json_response(conn, 200)
1022 invite = UserInviteToken.find_by_token!(token)
1024 assert invite.expires_at == Date.utc_today()
1025 assert invite.max_use == 150
1026 assert invite.invite_type == "reusable_date_limited"
1030 describe "GET /api/pleroma/admin/users/invites" do
1032 admin = insert(:user, info: %{is_admin: true})
1036 |> assign(:user, admin)
1041 test "no invites", %{conn: conn} do
1042 conn = get(conn, "/api/pleroma/admin/users/invites")
1044 assert json_response(conn, 200) == %{"invites" => []}
1047 test "with invite", %{conn: conn} do
1048 {:ok, invite} = UserInviteToken.create_invite()
1050 conn = get(conn, "/api/pleroma/admin/users/invites")
1052 assert json_response(conn, 200) == %{
1055 "expires_at" => nil,
1057 "invite_type" => "one_time",
1059 "token" => invite.token,
1068 describe "POST /api/pleroma/admin/users/revoke_invite" do
1069 test "with token" do
1070 admin = insert(:user, info: %{is_admin: true})
1071 {:ok, invite} = UserInviteToken.create_invite()
1075 |> assign(:user, admin)
1076 |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token})
1078 assert json_response(conn, 200) == %{
1079 "expires_at" => nil,
1081 "invite_type" => "one_time",
1083 "token" => invite.token,
1090 describe "GET /api/pleroma/admin/reports/:id" do
1091 setup %{conn: conn} do
1092 admin = insert(:user, info: %{is_admin: true})
1094 %{conn: assign(conn, :user, admin)}
1097 test "returns report by its id", %{conn: conn} do
1098 [reporter, target_user] = insert_pair(:user)
1099 activity = insert(:note_activity, user: target_user)
1101 {:ok, %{id: report_id}} =
1102 CommonAPI.report(reporter, %{
1103 "account_id" => target_user.id,
1104 "comment" => "I feel offended",
1105 "status_ids" => [activity.id]
1110 |> get("/api/pleroma/admin/reports/#{report_id}")
1111 |> json_response(:ok)
1113 assert response["id"] == report_id
1116 test "returns 404 when report id is invalid", %{conn: conn} do
1117 conn = get(conn, "/api/pleroma/admin/reports/test")
1119 assert json_response(conn, :not_found) == "Not found"
1123 describe "PUT /api/pleroma/admin/reports/:id" do
1124 setup %{conn: conn} do
1125 admin = insert(:user, info: %{is_admin: true})
1126 [reporter, target_user] = insert_pair(:user)
1127 activity = insert(:note_activity, user: target_user)
1129 {:ok, %{id: report_id}} =
1130 CommonAPI.report(reporter, %{
1131 "account_id" => target_user.id,
1132 "comment" => "I feel offended",
1133 "status_ids" => [activity.id]
1136 %{conn: assign(conn, :user, admin), id: report_id}
1139 test "mark report as resolved", %{conn: conn, id: id} do
1142 |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "resolved"})
1143 |> json_response(:ok)
1145 assert response["state"] == "resolved"
1148 test "closes report", %{conn: conn, id: id} do
1151 |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "closed"})
1152 |> json_response(:ok)
1154 assert response["state"] == "closed"
1157 test "returns 400 when state is unknown", %{conn: conn, id: id} do
1160 |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "test"})
1162 assert json_response(conn, :bad_request) == "Unsupported state"
1165 test "returns 404 when report is not exist", %{conn: conn} do
1168 |> put("/api/pleroma/admin/reports/test", %{"state" => "closed"})
1170 assert json_response(conn, :not_found) == "Not found"
1174 describe "GET /api/pleroma/admin/reports" do
1175 setup %{conn: conn} do
1176 admin = insert(:user, info: %{is_admin: true})
1178 %{conn: assign(conn, :user, admin)}
1181 test "returns empty response when no reports created", %{conn: conn} do
1184 |> get("/api/pleroma/admin/reports")
1185 |> json_response(:ok)
1187 assert Enum.empty?(response["reports"])
1190 test "returns reports", %{conn: conn} do
1191 [reporter, target_user] = insert_pair(:user)
1192 activity = insert(:note_activity, user: target_user)
1194 {:ok, %{id: report_id}} =
1195 CommonAPI.report(reporter, %{
1196 "account_id" => target_user.id,
1197 "comment" => "I feel offended",
1198 "status_ids" => [activity.id]
1203 |> get("/api/pleroma/admin/reports")
1204 |> json_response(:ok)
1206 [report] = response["reports"]
1208 assert length(response["reports"]) == 1
1209 assert report["id"] == report_id
1212 test "returns reports with specified state", %{conn: conn} do
1213 [reporter, target_user] = insert_pair(:user)
1214 activity = insert(:note_activity, user: target_user)
1216 {:ok, %{id: first_report_id}} =
1217 CommonAPI.report(reporter, %{
1218 "account_id" => target_user.id,
1219 "comment" => "I feel offended",
1220 "status_ids" => [activity.id]
1223 {:ok, %{id: second_report_id}} =
1224 CommonAPI.report(reporter, %{
1225 "account_id" => target_user.id,
1226 "comment" => "I don't like this user"
1229 CommonAPI.update_report_state(second_report_id, "closed")
1233 |> get("/api/pleroma/admin/reports", %{
1236 |> json_response(:ok)
1238 [open_report] = response["reports"]
1240 assert length(response["reports"]) == 1
1241 assert open_report["id"] == first_report_id
1245 |> get("/api/pleroma/admin/reports", %{
1248 |> json_response(:ok)
1250 [closed_report] = response["reports"]
1252 assert length(response["reports"]) == 1
1253 assert closed_report["id"] == second_report_id
1257 |> get("/api/pleroma/admin/reports", %{
1258 "state" => "resolved"
1260 |> json_response(:ok)
1262 assert Enum.empty?(response["reports"])
1265 test "returns 403 when requested by a non-admin" do
1266 user = insert(:user)
1270 |> assign(:user, user)
1271 |> get("/api/pleroma/admin/reports")
1273 assert json_response(conn, :forbidden) == %{"error" => "User is not admin."}
1276 test "returns 403 when requested by anonymous" do
1279 |> get("/api/pleroma/admin/reports")
1281 assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."}
1285 describe "POST /api/pleroma/admin/reports/:id/respond" do
1286 setup %{conn: conn} do
1287 admin = insert(:user, info: %{is_admin: true})
1289 %{conn: assign(conn, :user, admin)}
1292 test "returns created dm", %{conn: conn} do
1293 [reporter, target_user] = insert_pair(:user)
1294 activity = insert(:note_activity, user: target_user)
1296 {:ok, %{id: report_id}} =
1297 CommonAPI.report(reporter, %{
1298 "account_id" => target_user.id,
1299 "comment" => "I feel offended",
1300 "status_ids" => [activity.id]
1305 |> post("/api/pleroma/admin/reports/#{report_id}/respond", %{
1306 "status" => "I will check it out"
1308 |> json_response(:ok)
1310 recipients = Enum.map(response["mentions"], & &1["username"])
1312 assert conn.assigns[:user].nickname in recipients
1313 assert reporter.nickname in recipients
1314 assert response["content"] == "I will check it out"
1315 assert response["visibility"] == "direct"
1318 test "returns 400 when status is missing", %{conn: conn} do
1319 conn = post(conn, "/api/pleroma/admin/reports/test/respond")
1321 assert json_response(conn, :bad_request) == "Invalid parameters"
1324 test "returns 404 when report id is invalid", %{conn: conn} do
1326 post(conn, "/api/pleroma/admin/reports/test/respond", %{
1330 assert json_response(conn, :not_found) == "Not found"
1334 describe "PUT /api/pleroma/admin/statuses/:id" do
1335 setup %{conn: conn} do
1336 admin = insert(:user, info: %{is_admin: true})
1337 activity = insert(:note_activity)
1339 %{conn: assign(conn, :user, admin), id: activity.id}
1342 test "toggle sensitive flag", %{conn: conn, id: id} do
1345 |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"})
1346 |> json_response(:ok)
1348 assert response["sensitive"]
1352 |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"})
1353 |> json_response(:ok)
1355 refute response["sensitive"]
1358 test "change visibility flag", %{conn: conn, id: id} do
1361 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "public"})
1362 |> json_response(:ok)
1364 assert response["visibility"] == "public"
1368 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "private"})
1369 |> json_response(:ok)
1371 assert response["visibility"] == "private"
1375 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "unlisted"})
1376 |> json_response(:ok)
1378 assert response["visibility"] == "unlisted"
1381 test "returns 400 when visibility is unknown", %{conn: conn, id: id} do
1384 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "test"})
1386 assert json_response(conn, :bad_request) == "Unsupported visibility"
1390 describe "DELETE /api/pleroma/admin/statuses/:id" do
1391 setup %{conn: conn} do
1392 admin = insert(:user, info: %{is_admin: true})
1393 activity = insert(:note_activity)
1395 %{conn: assign(conn, :user, admin), id: activity.id}
1398 test "deletes status", %{conn: conn, id: id} do
1400 |> delete("/api/pleroma/admin/statuses/#{id}")
1401 |> json_response(:ok)
1403 refute Activity.get_by_id(id)
1406 test "returns error when status is not exist", %{conn: conn} do
1409 |> delete("/api/pleroma/admin/statuses/test")
1411 assert json_response(conn, :bad_request) == "Could not delete"