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
11 alias Pleroma.UserInviteToken
12 alias Pleroma.Web.CommonAPI
13 alias Pleroma.Web.MediaProxy
14 import Pleroma.Factory
16 describe "/api/pleroma/admin/users" do
18 admin = insert(:user, info: %{is_admin: true})
23 |> assign(:user, admin)
24 |> put_req_header("accept", "application/json")
25 |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}")
27 assert json_response(conn, 200) == user.nickname
31 admin = insert(:user, info: %{is_admin: true})
35 |> assign(:user, admin)
36 |> put_req_header("accept", "application/json")
37 |> post("/api/pleroma/admin/users", %{
41 "email" => "lain@example.org",
45 "nickname" => "lain2",
46 "email" => "lain2@example.org",
52 response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type"))
53 assert response == ["success", "success"]
56 test "Cannot create user with exisiting email" do
57 admin = insert(:user, info: %{is_admin: true})
62 |> assign(:user, admin)
63 |> put_req_header("accept", "application/json")
64 |> post("/api/pleroma/admin/users", %{
68 "email" => user.email,
74 assert json_response(conn, 409) == [
78 "email" => user.email,
81 "error" => "email has already been taken",
87 test "Cannot create user with exisiting nickname" do
88 admin = insert(:user, info: %{is_admin: true})
93 |> assign(:user, admin)
94 |> put_req_header("accept", "application/json")
95 |> post("/api/pleroma/admin/users", %{
98 "nickname" => user.nickname,
99 "email" => "someuser@plerama.social",
105 assert json_response(conn, 409) == [
109 "email" => "someuser@plerama.social",
110 "nickname" => user.nickname
112 "error" => "nickname has already been taken",
118 test "Multiple user creation works in transaction" do
119 admin = insert(:user, info: %{is_admin: true})
124 |> assign(:user, admin)
125 |> put_req_header("accept", "application/json")
126 |> post("/api/pleroma/admin/users", %{
129 "nickname" => "newuser",
130 "email" => "newuser@pleroma.social",
134 "nickname" => "lain",
135 "email" => user.email,
141 assert json_response(conn, 409) == [
145 "email" => user.email,
148 "error" => "email has already been taken",
154 "email" => "newuser@pleroma.social",
155 "nickname" => "newuser"
162 assert User.get_by_nickname("newuser") === nil
166 describe "/api/pleroma/admin/users/:nickname" do
167 test "Show", %{conn: conn} do
168 admin = insert(:user, info: %{is_admin: true})
173 |> assign(:user, admin)
174 |> get("/api/pleroma/admin/users/#{user.nickname}")
177 "deactivated" => false,
178 "id" => to_string(user.id),
180 "nickname" => user.nickname,
181 "roles" => %{"admin" => false, "moderator" => false},
183 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
184 "display_name" => HTML.strip_tags(user.name || user.nickname)
187 assert expected == json_response(conn, 200)
190 test "when the user doesn't exist", %{conn: conn} do
191 admin = insert(:user, info: %{is_admin: true})
196 |> assign(:user, admin)
197 |> get("/api/pleroma/admin/users/#{user.nickname}")
199 assert "Not found" == json_response(conn, 404)
203 describe "/api/pleroma/admin/users/follow" do
204 test "allows to force-follow another user" do
205 admin = insert(:user, info: %{is_admin: true})
207 follower = insert(:user)
210 |> assign(:user, admin)
211 |> put_req_header("accept", "application/json")
212 |> post("/api/pleroma/admin/users/follow", %{
213 "follower" => follower.nickname,
214 "followed" => user.nickname
217 user = User.get_cached_by_id(user.id)
218 follower = User.get_cached_by_id(follower.id)
220 assert User.following?(follower, user)
224 describe "/api/pleroma/admin/users/unfollow" do
225 test "allows to force-unfollow another user" do
226 admin = insert(:user, info: %{is_admin: true})
228 follower = insert(:user)
230 User.follow(follower, user)
233 |> assign(:user, admin)
234 |> put_req_header("accept", "application/json")
235 |> post("/api/pleroma/admin/users/unfollow", %{
236 "follower" => follower.nickname,
237 "followed" => user.nickname
240 user = User.get_cached_by_id(user.id)
241 follower = User.get_cached_by_id(follower.id)
243 refute User.following?(follower, user)
247 describe "PUT /api/pleroma/admin/users/tag" do
249 admin = insert(:user, info: %{is_admin: true})
250 user1 = insert(:user, %{tags: ["x"]})
251 user2 = insert(:user, %{tags: ["y"]})
252 user3 = insert(:user, %{tags: ["unchanged"]})
256 |> assign(:user, admin)
257 |> put_req_header("accept", "application/json")
259 "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=#{
261 }&tags[]=foo&tags[]=bar"
264 %{conn: conn, user1: user1, user2: user2, user3: user3}
267 test "it appends specified tags to users with specified nicknames", %{
272 assert json_response(conn, :no_content)
273 assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"]
274 assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"]
277 test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
278 assert json_response(conn, :no_content)
279 assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
283 describe "DELETE /api/pleroma/admin/users/tag" do
285 admin = insert(:user, info: %{is_admin: true})
286 user1 = insert(:user, %{tags: ["x"]})
287 user2 = insert(:user, %{tags: ["y", "z"]})
288 user3 = insert(:user, %{tags: ["unchanged"]})
292 |> assign(:user, admin)
293 |> put_req_header("accept", "application/json")
295 "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=#{
300 %{conn: conn, user1: user1, user2: user2, user3: user3}
303 test "it removes specified tags from users with specified nicknames", %{
308 assert json_response(conn, :no_content)
309 assert User.get_cached_by_id(user1.id).tags == []
310 assert User.get_cached_by_id(user2.id).tags == ["y"]
313 test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
314 assert json_response(conn, :no_content)
315 assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
319 describe "/api/pleroma/admin/users/:nickname/permission_group" do
320 test "GET is giving user_info" do
321 admin = insert(:user, info: %{is_admin: true})
325 |> assign(:user, admin)
326 |> put_req_header("accept", "application/json")
327 |> get("/api/pleroma/admin/users/#{admin.nickname}/permission_group/")
329 assert json_response(conn, 200) == %{
331 "is_moderator" => false
335 test "/:right POST, can add to a permission group" do
336 admin = insert(:user, info: %{is_admin: true})
341 |> assign(:user, admin)
342 |> put_req_header("accept", "application/json")
343 |> post("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin")
345 assert json_response(conn, 200) == %{
350 test "/:right DELETE, can remove from a permission group" do
351 admin = insert(:user, info: %{is_admin: true})
352 user = insert(:user, info: %{is_admin: true})
356 |> assign(:user, admin)
357 |> put_req_header("accept", "application/json")
358 |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin")
360 assert json_response(conn, 200) == %{
366 describe "PUT /api/pleroma/admin/users/:nickname/activation_status" do
367 setup %{conn: conn} do
368 admin = insert(:user, info: %{is_admin: true})
372 |> assign(:user, admin)
373 |> put_req_header("accept", "application/json")
378 test "deactivates the user", %{conn: conn} do
383 |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false})
385 user = User.get_cached_by_id(user.id)
386 assert user.info.deactivated == true
387 assert json_response(conn, :no_content)
390 test "activates the user", %{conn: conn} do
391 user = insert(:user, info: %{deactivated: true})
395 |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: true})
397 user = User.get_cached_by_id(user.id)
398 assert user.info.deactivated == false
399 assert json_response(conn, :no_content)
402 test "returns 403 when requested by a non-admin", %{conn: conn} do
407 |> assign(:user, user)
408 |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false})
410 assert json_response(conn, :forbidden)
414 describe "POST /api/pleroma/admin/email_invite, with valid config" do
416 [user: insert(:user, info: %{is_admin: true})]
419 clear_config([:instance, :registrations_open]) do
420 Pleroma.Config.put([:instance, :registrations_open], false)
423 clear_config([:instance, :invites_enabled]) do
424 Pleroma.Config.put([:instance, :invites_enabled], true)
427 test "sends invitation and returns 204", %{conn: conn, user: user} do
428 recipient_email = "foo@bar.com"
429 recipient_name = "J. D."
433 |> assign(:user, user)
435 "/api/pleroma/admin/users/email_invite?email=#{recipient_email}&name=#{recipient_name}"
438 assert json_response(conn, :no_content)
440 token_record = List.last(Pleroma.Repo.all(Pleroma.UserInviteToken))
442 refute token_record.used
444 notify_email = Pleroma.Config.get([:instance, :notify_email])
445 instance_name = Pleroma.Config.get([:instance, :name])
448 Pleroma.Emails.UserEmail.user_invitation_email(
455 Swoosh.TestAssertions.assert_email_sent(
456 from: {instance_name, notify_email},
457 to: {recipient_name, recipient_email},
458 html_body: email.html_body
462 test "it returns 403 if requested by a non-admin", %{conn: conn} do
463 non_admin_user = insert(:user)
467 |> assign(:user, non_admin_user)
468 |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
470 assert json_response(conn, :forbidden)
474 describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do
476 [user: insert(:user, info: %{is_admin: true})]
479 clear_config([:instance, :registrations_open])
480 clear_config([:instance, :invites_enabled])
482 test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn, user: user} do
483 Pleroma.Config.put([:instance, :registrations_open], false)
484 Pleroma.Config.put([:instance, :invites_enabled], false)
488 |> assign(:user, user)
489 |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
491 assert json_response(conn, :internal_server_error)
494 test "it returns 500 if `registrations_open` is enabled", %{conn: conn, user: user} do
495 Pleroma.Config.put([:instance, :registrations_open], true)
496 Pleroma.Config.put([:instance, :invites_enabled], true)
500 |> assign(:user, user)
501 |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD")
503 assert json_response(conn, :internal_server_error)
507 test "/api/pleroma/admin/users/invite_token" do
508 admin = insert(:user, info: %{is_admin: true})
512 |> assign(:user, admin)
513 |> put_req_header("accept", "application/json")
514 |> get("/api/pleroma/admin/users/invite_token")
516 assert conn.status == 200
519 test "/api/pleroma/admin/users/:nickname/password_reset" do
520 admin = insert(:user, info: %{is_admin: true})
525 |> assign(:user, admin)
526 |> put_req_header("accept", "application/json")
527 |> get("/api/pleroma/admin/users/#{user.nickname}/password_reset")
529 assert conn.status == 200
532 describe "GET /api/pleroma/admin/users" do
534 admin = insert(:user, info: %{is_admin: true})
538 |> assign(:user, admin)
540 {:ok, conn: conn, admin: admin}
543 test "renders users array for the first page", %{conn: conn, admin: admin} do
544 user = insert(:user, local: false, tags: ["foo", "bar"])
545 conn = get(conn, "/api/pleroma/admin/users?page=1")
550 "deactivated" => admin.info.deactivated,
552 "nickname" => admin.nickname,
553 "roles" => %{"admin" => true, "moderator" => false},
556 "avatar" => User.avatar_url(admin) |> MediaProxy.url(),
557 "display_name" => HTML.strip_tags(admin.name || admin.nickname)
560 "deactivated" => user.info.deactivated,
562 "nickname" => user.nickname,
563 "roles" => %{"admin" => false, "moderator" => false},
565 "tags" => ["foo", "bar"],
566 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
567 "display_name" => HTML.strip_tags(user.name || user.nickname)
570 |> Enum.sort_by(& &1["nickname"])
572 assert json_response(conn, 200) == %{
579 test "renders empty array for the second page", %{conn: conn} do
582 conn = get(conn, "/api/pleroma/admin/users?page=2")
584 assert json_response(conn, 200) == %{
591 test "regular search", %{conn: conn} do
592 user = insert(:user, nickname: "bob")
594 conn = get(conn, "/api/pleroma/admin/users?query=bo")
596 assert json_response(conn, 200) == %{
601 "deactivated" => user.info.deactivated,
603 "nickname" => user.nickname,
604 "roles" => %{"admin" => false, "moderator" => false},
607 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
608 "display_name" => HTML.strip_tags(user.name || user.nickname)
614 test "search by domain", %{conn: conn} do
615 user = insert(:user, nickname: "nickname@domain.com")
618 conn = get(conn, "/api/pleroma/admin/users?query=domain.com")
620 assert json_response(conn, 200) == %{
625 "deactivated" => user.info.deactivated,
627 "nickname" => user.nickname,
628 "roles" => %{"admin" => false, "moderator" => false},
631 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
632 "display_name" => HTML.strip_tags(user.name || user.nickname)
638 test "search by full nickname", %{conn: conn} do
639 user = insert(:user, nickname: "nickname@domain.com")
642 conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com")
644 assert json_response(conn, 200) == %{
649 "deactivated" => user.info.deactivated,
651 "nickname" => user.nickname,
652 "roles" => %{"admin" => false, "moderator" => false},
655 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
656 "display_name" => HTML.strip_tags(user.name || user.nickname)
662 test "search by display name", %{conn: conn} do
663 user = insert(:user, name: "Display name")
666 conn = get(conn, "/api/pleroma/admin/users?name=display")
668 assert json_response(conn, 200) == %{
673 "deactivated" => user.info.deactivated,
675 "nickname" => user.nickname,
676 "roles" => %{"admin" => false, "moderator" => false},
679 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
680 "display_name" => HTML.strip_tags(user.name || user.nickname)
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},
703 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
704 "display_name" => HTML.strip_tags(user.name || user.nickname)
710 test "regular search with page size", %{conn: conn} do
711 user = insert(:user, nickname: "aalice")
712 user2 = insert(:user, nickname: "alice")
714 conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1")
716 assert json_response(conn1, 200) == %{
721 "deactivated" => user.info.deactivated,
723 "nickname" => user.nickname,
724 "roles" => %{"admin" => false, "moderator" => false},
727 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
728 "display_name" => HTML.strip_tags(user.name || user.nickname)
733 conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2")
735 assert json_response(conn2, 200) == %{
740 "deactivated" => user2.info.deactivated,
742 "nickname" => user2.nickname,
743 "roles" => %{"admin" => false, "moderator" => false},
746 "avatar" => User.avatar_url(user2) |> MediaProxy.url(),
747 "display_name" => HTML.strip_tags(user2.name || user2.nickname)
753 test "only local users" do
754 admin = insert(:user, info: %{is_admin: true}, nickname: "john")
755 user = insert(:user, nickname: "bob")
757 insert(:user, nickname: "bobb", local: false)
761 |> assign(:user, admin)
762 |> get("/api/pleroma/admin/users?query=bo&filters=local")
764 assert json_response(conn, 200) == %{
769 "deactivated" => user.info.deactivated,
771 "nickname" => user.nickname,
772 "roles" => %{"admin" => false, "moderator" => false},
775 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
776 "display_name" => HTML.strip_tags(user.name || user.nickname)
782 test "only local users with no query", %{admin: old_admin} do
783 admin = insert(:user, info: %{is_admin: true}, nickname: "john")
784 user = insert(:user, nickname: "bob")
786 insert(:user, nickname: "bobb", local: false)
790 |> assign(:user, admin)
791 |> get("/api/pleroma/admin/users?filters=local")
796 "deactivated" => user.info.deactivated,
798 "nickname" => user.nickname,
799 "roles" => %{"admin" => false, "moderator" => false},
802 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
803 "display_name" => HTML.strip_tags(user.name || user.nickname)
806 "deactivated" => admin.info.deactivated,
808 "nickname" => admin.nickname,
809 "roles" => %{"admin" => true, "moderator" => false},
812 "avatar" => User.avatar_url(admin) |> MediaProxy.url(),
813 "display_name" => HTML.strip_tags(admin.name || admin.nickname)
816 "deactivated" => false,
817 "id" => old_admin.id,
819 "nickname" => old_admin.nickname,
820 "roles" => %{"admin" => true, "moderator" => false},
822 "avatar" => User.avatar_url(old_admin) |> MediaProxy.url(),
823 "display_name" => HTML.strip_tags(old_admin.name || old_admin.nickname)
826 |> Enum.sort_by(& &1["nickname"])
828 assert json_response(conn, 200) == %{
835 test "load only admins", %{conn: conn, admin: admin} do
836 second_admin = insert(:user, info: %{is_admin: true})
840 conn = get(conn, "/api/pleroma/admin/users?filters=is_admin")
845 "deactivated" => false,
847 "nickname" => admin.nickname,
848 "roles" => %{"admin" => true, "moderator" => false},
849 "local" => admin.local,
851 "avatar" => User.avatar_url(admin) |> MediaProxy.url(),
852 "display_name" => HTML.strip_tags(admin.name || admin.nickname)
855 "deactivated" => false,
856 "id" => second_admin.id,
857 "nickname" => second_admin.nickname,
858 "roles" => %{"admin" => true, "moderator" => false},
859 "local" => second_admin.local,
861 "avatar" => User.avatar_url(second_admin) |> MediaProxy.url(),
862 "display_name" => HTML.strip_tags(second_admin.name || second_admin.nickname)
865 |> Enum.sort_by(& &1["nickname"])
867 assert json_response(conn, 200) == %{
874 test "load only moderators", %{conn: conn} do
875 moderator = insert(:user, info: %{is_moderator: true})
879 conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator")
881 assert json_response(conn, 200) == %{
886 "deactivated" => false,
887 "id" => moderator.id,
888 "nickname" => moderator.nickname,
889 "roles" => %{"admin" => false, "moderator" => true},
890 "local" => moderator.local,
892 "avatar" => User.avatar_url(moderator) |> MediaProxy.url(),
893 "display_name" => HTML.strip_tags(moderator.name || moderator.nickname)
899 test "load users with tags list", %{conn: conn} do
900 user1 = insert(:user, tags: ["first"])
901 user2 = insert(:user, tags: ["second"])
905 conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second")
910 "deactivated" => false,
912 "nickname" => user1.nickname,
913 "roles" => %{"admin" => false, "moderator" => false},
914 "local" => user1.local,
916 "avatar" => User.avatar_url(user1) |> MediaProxy.url(),
917 "display_name" => HTML.strip_tags(user1.name || user1.nickname)
920 "deactivated" => false,
922 "nickname" => user2.nickname,
923 "roles" => %{"admin" => false, "moderator" => false},
924 "local" => user2.local,
925 "tags" => ["second"],
926 "avatar" => User.avatar_url(user2) |> MediaProxy.url(),
927 "display_name" => HTML.strip_tags(user2.name || user2.nickname)
930 |> Enum.sort_by(& &1["nickname"])
932 assert json_response(conn, 200) == %{
939 test "it works with multiple filters" do
940 admin = insert(:user, nickname: "john", info: %{is_admin: true})
941 user = insert(:user, nickname: "bob", local: false, info: %{deactivated: true})
943 insert(:user, nickname: "ken", local: true, info: %{deactivated: true})
944 insert(:user, nickname: "bobb", local: false, info: %{deactivated: false})
948 |> assign(:user, admin)
949 |> get("/api/pleroma/admin/users?filters=deactivated,external")
951 assert json_response(conn, 200) == %{
956 "deactivated" => user.info.deactivated,
958 "nickname" => user.nickname,
959 "roles" => %{"admin" => false, "moderator" => false},
960 "local" => user.local,
962 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
963 "display_name" => HTML.strip_tags(user.name || user.nickname)
970 test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation" do
971 admin = insert(:user, info: %{is_admin: true})
976 |> assign(:user, admin)
977 |> patch("/api/pleroma/admin/users/#{user.nickname}/toggle_activation")
979 assert json_response(conn, 200) ==
981 "deactivated" => !user.info.deactivated,
983 "nickname" => user.nickname,
984 "roles" => %{"admin" => false, "moderator" => false},
987 "avatar" => User.avatar_url(user) |> MediaProxy.url(),
988 "display_name" => HTML.strip_tags(user.name || user.nickname)
992 describe "GET /api/pleroma/admin/users/invite_token" do
994 admin = insert(:user, info: %{is_admin: true})
998 |> assign(:user, admin)
1003 test "without options", %{conn: conn} do
1004 conn = get(conn, "/api/pleroma/admin/users/invite_token")
1006 token = json_response(conn, 200)
1007 invite = UserInviteToken.find_by_token!(token)
1009 refute invite.expires_at
1010 refute invite.max_use
1011 assert invite.invite_type == "one_time"
1014 test "with expires_at", %{conn: conn} do
1016 get(conn, "/api/pleroma/admin/users/invite_token", %{
1017 "invite" => %{"expires_at" => Date.to_string(Date.utc_today())}
1020 token = json_response(conn, 200)
1021 invite = UserInviteToken.find_by_token!(token)
1024 assert invite.expires_at == Date.utc_today()
1025 refute invite.max_use
1026 assert invite.invite_type == "date_limited"
1029 test "with max_use", %{conn: conn} do
1031 get(conn, "/api/pleroma/admin/users/invite_token", %{
1032 "invite" => %{"max_use" => 150}
1035 token = json_response(conn, 200)
1036 invite = UserInviteToken.find_by_token!(token)
1038 refute invite.expires_at
1039 assert invite.max_use == 150
1040 assert invite.invite_type == "reusable"
1043 test "with max use and expires_at", %{conn: conn} do
1045 get(conn, "/api/pleroma/admin/users/invite_token", %{
1046 "invite" => %{"max_use" => 150, "expires_at" => Date.to_string(Date.utc_today())}
1049 token = json_response(conn, 200)
1050 invite = UserInviteToken.find_by_token!(token)
1052 assert invite.expires_at == Date.utc_today()
1053 assert invite.max_use == 150
1054 assert invite.invite_type == "reusable_date_limited"
1058 describe "GET /api/pleroma/admin/users/invites" do
1060 admin = insert(:user, info: %{is_admin: true})
1064 |> assign(:user, admin)
1069 test "no invites", %{conn: conn} do
1070 conn = get(conn, "/api/pleroma/admin/users/invites")
1072 assert json_response(conn, 200) == %{"invites" => []}
1075 test "with invite", %{conn: conn} do
1076 {:ok, invite} = UserInviteToken.create_invite()
1078 conn = get(conn, "/api/pleroma/admin/users/invites")
1080 assert json_response(conn, 200) == %{
1083 "expires_at" => nil,
1085 "invite_type" => "one_time",
1087 "token" => invite.token,
1096 describe "POST /api/pleroma/admin/users/revoke_invite" do
1097 test "with token" do
1098 admin = insert(:user, info: %{is_admin: true})
1099 {:ok, invite} = UserInviteToken.create_invite()
1103 |> assign(:user, admin)
1104 |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token})
1106 assert json_response(conn, 200) == %{
1107 "expires_at" => nil,
1109 "invite_type" => "one_time",
1111 "token" => invite.token,
1117 test "with invalid token" do
1118 admin = insert(:user, info: %{is_admin: true})
1122 |> assign(:user, admin)
1123 |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"})
1125 assert json_response(conn, :not_found) == "Not found"
1129 describe "GET /api/pleroma/admin/reports/:id" do
1130 setup %{conn: conn} do
1131 admin = insert(:user, info: %{is_admin: true})
1133 %{conn: assign(conn, :user, admin)}
1136 test "returns report by its id", %{conn: conn} do
1137 [reporter, target_user] = insert_pair(:user)
1138 activity = insert(:note_activity, user: target_user)
1140 {:ok, %{id: report_id}} =
1141 CommonAPI.report(reporter, %{
1142 "account_id" => target_user.id,
1143 "comment" => "I feel offended",
1144 "status_ids" => [activity.id]
1149 |> get("/api/pleroma/admin/reports/#{report_id}")
1150 |> json_response(:ok)
1152 assert response["id"] == report_id
1155 test "returns 404 when report id is invalid", %{conn: conn} do
1156 conn = get(conn, "/api/pleroma/admin/reports/test")
1158 assert json_response(conn, :not_found) == "Not found"
1162 describe "PUT /api/pleroma/admin/reports/:id" do
1163 setup %{conn: conn} do
1164 admin = insert(:user, info: %{is_admin: true})
1165 [reporter, target_user] = insert_pair(:user)
1166 activity = insert(:note_activity, user: target_user)
1168 {:ok, %{id: report_id}} =
1169 CommonAPI.report(reporter, %{
1170 "account_id" => target_user.id,
1171 "comment" => "I feel offended",
1172 "status_ids" => [activity.id]
1175 %{conn: assign(conn, :user, admin), id: report_id}
1178 test "mark report as resolved", %{conn: conn, id: id} do
1181 |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "resolved"})
1182 |> json_response(:ok)
1184 assert response["state"] == "resolved"
1187 test "closes report", %{conn: conn, id: id} do
1190 |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "closed"})
1191 |> json_response(:ok)
1193 assert response["state"] == "closed"
1196 test "returns 400 when state is unknown", %{conn: conn, id: id} do
1199 |> put("/api/pleroma/admin/reports/#{id}", %{"state" => "test"})
1201 assert json_response(conn, :bad_request) == "Unsupported state"
1204 test "returns 404 when report is not exist", %{conn: conn} do
1207 |> put("/api/pleroma/admin/reports/test", %{"state" => "closed"})
1209 assert json_response(conn, :not_found) == "Not found"
1213 describe "GET /api/pleroma/admin/reports" do
1214 setup %{conn: conn} do
1215 admin = insert(:user, info: %{is_admin: true})
1217 %{conn: assign(conn, :user, admin)}
1220 test "returns empty response when no reports created", %{conn: conn} do
1223 |> get("/api/pleroma/admin/reports")
1224 |> json_response(:ok)
1226 assert Enum.empty?(response["reports"])
1229 test "returns reports", %{conn: conn} do
1230 [reporter, target_user] = insert_pair(:user)
1231 activity = insert(:note_activity, user: target_user)
1233 {:ok, %{id: report_id}} =
1234 CommonAPI.report(reporter, %{
1235 "account_id" => target_user.id,
1236 "comment" => "I feel offended",
1237 "status_ids" => [activity.id]
1242 |> get("/api/pleroma/admin/reports")
1243 |> json_response(:ok)
1245 [report] = response["reports"]
1247 assert length(response["reports"]) == 1
1248 assert report["id"] == report_id
1251 test "returns reports with specified state", %{conn: conn} do
1252 [reporter, target_user] = insert_pair(:user)
1253 activity = insert(:note_activity, user: target_user)
1255 {:ok, %{id: first_report_id}} =
1256 CommonAPI.report(reporter, %{
1257 "account_id" => target_user.id,
1258 "comment" => "I feel offended",
1259 "status_ids" => [activity.id]
1262 {:ok, %{id: second_report_id}} =
1263 CommonAPI.report(reporter, %{
1264 "account_id" => target_user.id,
1265 "comment" => "I don't like this user"
1268 CommonAPI.update_report_state(second_report_id, "closed")
1272 |> get("/api/pleroma/admin/reports", %{
1275 |> json_response(:ok)
1277 [open_report] = response["reports"]
1279 assert length(response["reports"]) == 1
1280 assert open_report["id"] == first_report_id
1284 |> get("/api/pleroma/admin/reports", %{
1287 |> json_response(:ok)
1289 [closed_report] = response["reports"]
1291 assert length(response["reports"]) == 1
1292 assert closed_report["id"] == second_report_id
1296 |> get("/api/pleroma/admin/reports", %{
1297 "state" => "resolved"
1299 |> json_response(:ok)
1301 assert Enum.empty?(response["reports"])
1304 test "returns 403 when requested by a non-admin" do
1305 user = insert(:user)
1309 |> assign(:user, user)
1310 |> get("/api/pleroma/admin/reports")
1312 assert json_response(conn, :forbidden) == %{"error" => "User is not admin."}
1315 test "returns 403 when requested by anonymous" do
1318 |> get("/api/pleroma/admin/reports")
1320 assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."}
1324 describe "POST /api/pleroma/admin/reports/:id/respond" do
1325 setup %{conn: conn} do
1326 admin = insert(:user, info: %{is_admin: true})
1328 %{conn: assign(conn, :user, admin)}
1331 test "returns created dm", %{conn: conn} do
1332 [reporter, target_user] = insert_pair(:user)
1333 activity = insert(:note_activity, user: target_user)
1335 {:ok, %{id: report_id}} =
1336 CommonAPI.report(reporter, %{
1337 "account_id" => target_user.id,
1338 "comment" => "I feel offended",
1339 "status_ids" => [activity.id]
1344 |> post("/api/pleroma/admin/reports/#{report_id}/respond", %{
1345 "status" => "I will check it out"
1347 |> json_response(:ok)
1349 recipients = Enum.map(response["mentions"], & &1["username"])
1351 assert reporter.nickname in recipients
1352 assert response["content"] == "I will check it out"
1353 assert response["visibility"] == "direct"
1356 test "returns 400 when status is missing", %{conn: conn} do
1357 conn = post(conn, "/api/pleroma/admin/reports/test/respond")
1359 assert json_response(conn, :bad_request) == "Invalid parameters"
1362 test "returns 404 when report id is invalid", %{conn: conn} do
1364 post(conn, "/api/pleroma/admin/reports/test/respond", %{
1368 assert json_response(conn, :not_found) == "Not found"
1372 describe "PUT /api/pleroma/admin/statuses/:id" do
1373 setup %{conn: conn} do
1374 admin = insert(:user, info: %{is_admin: true})
1375 activity = insert(:note_activity)
1377 %{conn: assign(conn, :user, admin), id: activity.id}
1380 test "toggle sensitive flag", %{conn: conn, id: id} do
1383 |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"})
1384 |> json_response(:ok)
1386 assert response["sensitive"]
1390 |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"})
1391 |> json_response(:ok)
1393 refute response["sensitive"]
1396 test "change visibility flag", %{conn: conn, id: id} do
1399 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "public"})
1400 |> json_response(:ok)
1402 assert response["visibility"] == "public"
1406 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "private"})
1407 |> json_response(:ok)
1409 assert response["visibility"] == "private"
1413 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "unlisted"})
1414 |> json_response(:ok)
1416 assert response["visibility"] == "unlisted"
1419 test "returns 400 when visibility is unknown", %{conn: conn, id: id} do
1422 |> put("/api/pleroma/admin/statuses/#{id}", %{"visibility" => "test"})
1424 assert json_response(conn, :bad_request) == "Unsupported visibility"
1428 describe "DELETE /api/pleroma/admin/statuses/:id" do
1429 setup %{conn: conn} do
1430 admin = insert(:user, info: %{is_admin: true})
1431 activity = insert(:note_activity)
1433 %{conn: assign(conn, :user, admin), id: activity.id}
1436 test "deletes status", %{conn: conn, id: id} do
1438 |> delete("/api/pleroma/admin/statuses/#{id}")
1439 |> json_response(:ok)
1441 refute Activity.get_by_id(id)
1444 test "returns error when status is not exist", %{conn: conn} do
1447 |> delete("/api/pleroma/admin/statuses/test")
1449 assert json_response(conn, :bad_request) == "Could not delete"
1453 describe "GET /api/pleroma/admin/config" do
1454 setup %{conn: conn} do
1455 admin = insert(:user, info: %{is_admin: true})
1457 %{conn: assign(conn, :user, admin)}
1460 test "without any settings in db", %{conn: conn} do
1461 conn = get(conn, "/api/pleroma/admin/config")
1463 assert json_response(conn, 200) == %{"configs" => []}
1466 test "with settings in db", %{conn: conn} do
1467 config1 = insert(:config)
1468 config2 = insert(:config)
1470 conn = get(conn, "/api/pleroma/admin/config")
1483 } = json_response(conn, 200)
1485 assert key1 == config1.key
1486 assert key2 == config2.key
1490 describe "POST /api/pleroma/admin/config" do
1491 setup %{conn: conn} do
1492 admin = insert(:user, info: %{is_admin: true})
1494 temp_file = "config/test.exported_from_db.secret.exs"
1497 Application.delete_env(:pleroma, :key1)
1498 Application.delete_env(:pleroma, :key2)
1499 Application.delete_env(:pleroma, :key3)
1500 Application.delete_env(:pleroma, :key4)
1501 Application.delete_env(:pleroma, :keyaa1)
1502 Application.delete_env(:pleroma, :keyaa2)
1503 Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal)
1504 Application.delete_env(:pleroma, Pleroma.Captcha.NotReal)
1505 :ok = File.rm(temp_file)
1508 %{conn: assign(conn, :user, admin)}
1511 clear_config([:instance, :dynamic_configuration]) do
1512 Pleroma.Config.put([:instance, :dynamic_configuration], true)
1515 test "create new config setting in db", %{conn: conn} do
1517 post(conn, "/api/pleroma/admin/config", %{
1519 %{group: "pleroma", key: "key1", value: "value1"},
1522 key: "Ueberauth.Strategy.Twitter.OAuth",
1523 value: [%{"tuple" => [":consumer_secret", "aaaa"]}]
1529 ":nested_1" => "nested_value1",
1531 %{":nested_22" => "nested_value222"},
1532 %{":nested_33" => %{":nested_44" => "nested_444"}}
1540 %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
1541 %{"nested_4" => true}
1547 value: %{":nested_5" => ":upload", "endpoint" => "https://example.com"}
1552 value: %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}
1557 assert json_response(conn, 200) == %{
1560 "group" => "pleroma",
1565 "group" => "ueberauth",
1566 "key" => "Ueberauth.Strategy.Twitter.OAuth",
1567 "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}]
1570 "group" => "pleroma",
1573 ":nested_1" => "nested_value1",
1575 %{":nested_22" => "nested_value222"},
1576 %{":nested_33" => %{":nested_44" => "nested_444"}}
1581 "group" => "pleroma",
1584 %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
1585 %{"nested_4" => true}
1589 "group" => "pleroma",
1591 "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}
1596 "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}
1601 assert Application.get_env(:pleroma, :key1) == "value1"
1603 assert Application.get_env(:pleroma, :key2) == %{
1604 nested_1: "nested_value1",
1606 %{nested_22: "nested_value222"},
1607 %{nested_33: %{nested_44: "nested_444"}}
1611 assert Application.get_env(:pleroma, :key3) == [
1612 %{"nested_3" => :nested_3, "nested_33" => "nested_33"},
1613 %{"nested_4" => true}
1616 assert Application.get_env(:pleroma, :key4) == %{
1617 "endpoint" => "https://example.com",
1621 assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}
1624 test "update config setting & delete", %{conn: conn} do
1625 config1 = insert(:config, key: "keyaa1")
1626 config2 = insert(:config, key: "keyaa2")
1630 key: "Ueberauth.Strategy.Microsoft.OAuth",
1631 value: :erlang.term_to_binary([])
1635 post(conn, "/api/pleroma/admin/config", %{
1637 %{group: config1.group, key: config1.key, value: "another_value"},
1638 %{group: config2.group, key: config2.key, delete: "true"},
1641 key: "Ueberauth.Strategy.Microsoft.OAuth",
1647 assert json_response(conn, 200) == %{
1650 "group" => "pleroma",
1651 "key" => config1.key,
1652 "value" => "another_value"
1657 assert Application.get_env(:pleroma, :keyaa1) == "another_value"
1658 refute Application.get_env(:pleroma, :keyaa2)
1661 test "common config example", %{conn: conn} do
1663 post(conn, "/api/pleroma/admin/config", %{
1666 "group" => "pleroma",
1667 "key" => "Pleroma.Captcha.NotReal",
1669 %{"tuple" => [":enabled", false]},
1670 %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},
1671 %{"tuple" => [":seconds_valid", 60]},
1672 %{"tuple" => [":path", ""]},
1673 %{"tuple" => [":key1", nil]},
1674 %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}
1680 assert json_response(conn, 200) == %{
1683 "group" => "pleroma",
1684 "key" => "Pleroma.Captcha.NotReal",
1686 %{"tuple" => [":enabled", false]},
1687 %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},
1688 %{"tuple" => [":seconds_valid", 60]},
1689 %{"tuple" => [":path", ""]},
1690 %{"tuple" => [":key1", nil]},
1691 %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}
1698 test "tuples with more than two values", %{conn: conn} do
1700 post(conn, "/api/pleroma/admin/config", %{
1703 "group" => "pleroma",
1704 "key" => "Pleroma.Web.Endpoint.NotReal",
1720 "/api/v1/streaming",
1721 "Pleroma.Web.MastodonAPI.WebsocketHandler",
1728 "Phoenix.Endpoint.CowboyWebSocket",
1731 "Phoenix.Transports.WebSocket",
1734 "Pleroma.Web.Endpoint",
1735 "Pleroma.Web.UserSocket",
1746 "Phoenix.Endpoint.Cowboy2Handler",
1747 %{"tuple" => ["Pleroma.Web.Endpoint", []]}
1764 assert json_response(conn, 200) == %{
1767 "group" => "pleroma",
1768 "key" => "Pleroma.Web.Endpoint.NotReal",
1784 "/api/v1/streaming",
1785 "Pleroma.Web.MastodonAPI.WebsocketHandler",
1792 "Phoenix.Endpoint.CowboyWebSocket",
1795 "Phoenix.Transports.WebSocket",
1798 "Pleroma.Web.Endpoint",
1799 "Pleroma.Web.UserSocket",
1810 "Phoenix.Endpoint.Cowboy2Handler",
1811 %{"tuple" => ["Pleroma.Web.Endpoint", []]}
1829 test "settings with nesting map", %{conn: conn} do
1831 post(conn, "/api/pleroma/admin/config", %{
1834 "group" => "pleroma",
1837 %{"tuple" => [":key2", "some_val"]},
1842 ":max_options" => 20,
1843 ":max_option_chars" => 200,
1844 ":min_expiration" => 0,
1845 ":max_expiration" => 31_536_000,
1847 ":max_options" => 20,
1848 ":max_option_chars" => 200,
1849 ":min_expiration" => 0,
1850 ":max_expiration" => 31_536_000
1860 assert json_response(conn, 200) ==
1864 "group" => "pleroma",
1867 %{"tuple" => [":key2", "some_val"]},
1872 ":max_expiration" => 31_536_000,
1873 ":max_option_chars" => 200,
1874 ":max_options" => 20,
1875 ":min_expiration" => 0,
1877 ":max_expiration" => 31_536_000,
1878 ":max_option_chars" => 200,
1879 ":max_options" => 20,
1880 ":min_expiration" => 0
1891 test "value as map", %{conn: conn} do
1893 post(conn, "/api/pleroma/admin/config", %{
1896 "group" => "pleroma",
1898 "value" => %{"key" => "some_val"}
1903 assert json_response(conn, 200) ==
1907 "group" => "pleroma",
1909 "value" => %{"key" => "some_val"}
1915 test "dispatch setting", %{conn: conn} do
1917 post(conn, "/api/pleroma/admin/config", %{
1920 "group" => "pleroma",
1921 "key" => "Pleroma.Web.Endpoint.NotReal",
1927 %{"tuple" => [":ip", %{"tuple" => [127, 0, 0, 1]}]},
1928 %{"tuple" => [":dispatch", ["{:_,
1930 {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
1931 {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket,
1932 {Phoenix.Transports.WebSocket,
1933 {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}},
1934 {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
1945 "{:_, [{\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, " <>
1946 "{\"/websocket\", Phoenix.Endpoint.CowboyWebSocket, {Phoenix.Transports.WebSocket, " <>
1947 "{Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}}, " <>
1948 "{:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}]}"
1950 assert json_response(conn, 200) == %{
1953 "group" => "pleroma",
1954 "key" => "Pleroma.Web.Endpoint.NotReal",
1960 %{"tuple" => [":ip", %{"tuple" => [127, 0, 0, 1]}]},
1978 test "queues key as atom", %{conn: conn} do
1980 post(conn, "/api/pleroma/admin/config", %{
1983 "group" => "pleroma_job_queue",
1986 %{"tuple" => [":federator_incoming", 50]},
1987 %{"tuple" => [":federator_outgoing", 50]},
1988 %{"tuple" => [":web_push", 50]},
1989 %{"tuple" => [":mailer", 10]},
1990 %{"tuple" => [":transmogrifier", 20]},
1991 %{"tuple" => [":scheduled_activities", 10]},
1992 %{"tuple" => [":background", 5]}
1998 assert json_response(conn, 200) == %{
2001 "group" => "pleroma_job_queue",
2004 %{"tuple" => [":federator_incoming", 50]},
2005 %{"tuple" => [":federator_outgoing", 50]},
2006 %{"tuple" => [":web_push", 50]},
2007 %{"tuple" => [":mailer", 10]},
2008 %{"tuple" => [":transmogrifier", 20]},
2009 %{"tuple" => [":scheduled_activities", 10]},
2010 %{"tuple" => [":background", 5]}
2017 test "delete part of settings by atom subkeys", %{conn: conn} do
2021 value: :erlang.term_to_binary(subkey1: "val1", subkey2: "val2", subkey3: "val3")
2025 post(conn, "/api/pleroma/admin/config", %{
2028 group: config.group,
2030 subkeys: [":subkey1", ":subkey3"],
2037 json_response(conn, 200) == %{
2040 "group" => "pleroma",
2042 "value" => [%{"tuple" => [":subkey2", "val2"]}]
2050 describe "config mix tasks run" do
2051 setup %{conn: conn} do
2052 admin = insert(:user, info: %{is_admin: true})
2054 temp_file = "config/test.exported_from_db.secret.exs"
2056 Mix.shell(Mix.Shell.Quiet)
2059 Mix.shell(Mix.Shell.IO)
2060 :ok = File.rm(temp_file)
2063 %{conn: assign(conn, :user, admin), admin: admin}
2066 clear_config([:instance, :dynamic_configuration]) do
2067 Pleroma.Config.put([:instance, :dynamic_configuration], true)
2070 test "transfer settings to DB and to file", %{conn: conn, admin: admin} do
2071 assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == []
2072 conn = get(conn, "/api/pleroma/admin/config/migrate_to_db")
2073 assert json_response(conn, 200) == %{}
2074 assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) > 0
2078 |> assign(:user, admin)
2079 |> get("/api/pleroma/admin/config/migrate_from_db")
2081 assert json_response(conn, 200) == %{}
2082 assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == []
2086 describe "GET /api/pleroma/admin/users/:nickname/statuses" do
2088 admin = insert(:user, info: %{is_admin: true})
2089 user = insert(:user)
2091 date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!()
2092 date2 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!()
2093 date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!()
2095 insert(:note_activity, user: user, published: date1)
2096 insert(:note_activity, user: user, published: date2)
2097 insert(:note_activity, user: user, published: date3)
2101 |> assign(:user, admin)
2103 {:ok, conn: conn, user: user}
2106 test "renders user's statuses", %{conn: conn, user: user} do
2107 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses")
2109 assert json_response(conn, 200) |> length() == 3
2112 test "renders user's statuses with a limit", %{conn: conn, user: user} do
2113 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=2")
2115 assert json_response(conn, 200) |> length() == 2
2118 test "doesn't return private statuses by default", %{conn: conn, user: user} do
2119 {:ok, _private_status} =
2120 CommonAPI.post(user, %{"status" => "private", "visibility" => "private"})
2122 {:ok, _public_status} =
2123 CommonAPI.post(user, %{"status" => "public", "visibility" => "public"})
2125 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses")
2127 assert json_response(conn, 200) |> length() == 4
2130 test "returns private statuses with godmode on", %{conn: conn, user: user} do
2131 {:ok, _private_status} =
2132 CommonAPI.post(user, %{"status" => "private", "visibility" => "private"})
2134 {:ok, _public_status} =
2135 CommonAPI.post(user, %{"status" => "public", "visibility" => "public"})
2137 conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true")
2139 assert json_response(conn, 200) |> length() == 5
2144 # Needed for testing
2145 defmodule Pleroma.Web.Endpoint.NotReal do
2148 defmodule Pleroma.Captcha.NotReal do