Move status actions to AdminAPI.StatusController
[akkoma] / test / web / admin_api / controllers / status_controller_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.StatusControllerTest do
6 use Pleroma.Web.ConnCase
7
8 import Pleroma.Factory
9
10 alias Pleroma.Activity
11 alias Pleroma.Config
12 alias Pleroma.ModerationLog
13 alias Pleroma.Repo
14 alias Pleroma.User
15 alias Pleroma.Web.CommonAPI
16
17 setup do
18 admin = insert(:user, is_admin: true)
19 token = insert(:oauth_admin_token, user: admin)
20
21 conn =
22 build_conn()
23 |> assign(:user, admin)
24 |> assign(:token, token)
25
26 {:ok, %{admin: admin, token: token, conn: conn}}
27 end
28
29 describe "GET /api/pleroma/admin/statuses/:id" do
30 test "not found", %{conn: conn} do
31 assert conn
32 |> get("/api/pleroma/admin/statuses/not_found")
33 |> json_response(:not_found)
34 end
35
36 test "shows activity", %{conn: conn} do
37 activity = insert(:note_activity)
38
39 response =
40 conn
41 |> get("/api/pleroma/admin/statuses/#{activity.id}")
42 |> json_response(200)
43
44 assert response["id"] == activity.id
45 end
46 end
47
48 describe "PUT /api/pleroma/admin/statuses/:id" do
49 setup do
50 activity = insert(:note_activity)
51
52 %{id: activity.id}
53 end
54
55 test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do
56 response =
57 conn
58 |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"})
59 |> json_response(:ok)
60
61 assert response["sensitive"]
62
63 log_entry = Repo.one(ModerationLog)
64
65 assert ModerationLog.get_log_entry_message(log_entry) ==
66 "@#{admin.nickname} updated status ##{id}, set sensitive: 'true'"
67
68 response =
69 conn
70 |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"})
71 |> json_response(:ok)
72
73 refute response["sensitive"]
74 end
75
76 test "change visibility flag", %{conn: conn, id: id, admin: admin} do
77 response =
78 conn
79 |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "public"})
80 |> json_response(:ok)
81
82 assert response["visibility"] == "public"
83
84 log_entry = Repo.one(ModerationLog)
85
86 assert ModerationLog.get_log_entry_message(log_entry) ==
87 "@#{admin.nickname} updated status ##{id}, set visibility: 'public'"
88
89 response =
90 conn
91 |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "private"})
92 |> json_response(:ok)
93
94 assert response["visibility"] == "private"
95
96 response =
97 conn
98 |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"})
99 |> json_response(:ok)
100
101 assert response["visibility"] == "unlisted"
102 end
103
104 test "returns 400 when visibility is unknown", %{conn: conn, id: id} do
105 conn = put(conn, "/api/pleroma/admin/statuses/#{id}", %{visibility: "test"})
106
107 assert json_response(conn, :bad_request) == "Unsupported visibility"
108 end
109 end
110
111 describe "DELETE /api/pleroma/admin/statuses/:id" do
112 setup do
113 activity = insert(:note_activity)
114
115 %{id: activity.id}
116 end
117
118 test "deletes status", %{conn: conn, id: id, admin: admin} do
119 conn
120 |> delete("/api/pleroma/admin/statuses/#{id}")
121 |> json_response(:ok)
122
123 refute Activity.get_by_id(id)
124
125 log_entry = Repo.one(ModerationLog)
126
127 assert ModerationLog.get_log_entry_message(log_entry) ==
128 "@#{admin.nickname} deleted status ##{id}"
129 end
130
131 test "returns 404 when the status does not exist", %{conn: conn} do
132 conn = delete(conn, "/api/pleroma/admin/statuses/test")
133
134 assert json_response(conn, :not_found) == "Not found"
135 end
136 end
137
138 describe "GET /api/pleroma/admin/statuses" do
139 test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do
140 blocked = insert(:user)
141 user = insert(:user)
142 User.block(admin, blocked)
143
144 {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"})
145
146 {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
147 {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"})
148 {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"})
149 {:ok, _} = CommonAPI.post(blocked, %{status: ".", visibility: "public"})
150
151 response =
152 conn
153 |> get("/api/pleroma/admin/statuses")
154 |> json_response(200)
155
156 refute "private" in Enum.map(response, & &1["visibility"])
157 assert length(response) == 3
158 end
159
160 test "returns only local statuses with local_only on", %{conn: conn} do
161 user = insert(:user)
162 remote_user = insert(:user, local: false, nickname: "archaeme@archae.me")
163 insert(:note_activity, user: user, local: true)
164 insert(:note_activity, user: remote_user, local: false)
165
166 response =
167 conn
168 |> get("/api/pleroma/admin/statuses?local_only=true")
169 |> json_response(200)
170
171 assert length(response) == 1
172 end
173
174 test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do
175 user = insert(:user)
176
177 {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"})
178
179 {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"})
180 {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"})
181 conn = get(conn, "/api/pleroma/admin/statuses?godmode=true")
182 assert json_response(conn, 200) |> length() == 3
183 end
184 end
185 end