1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.FilterControllerTest do
6 use Pleroma.Web.ConnCase, async: true
7 use Oban.Testing, repo: Pleroma.Repo
13 alias Pleroma.Workers.PurgeExpiredFilter
15 test "non authenticated creation request", %{conn: conn} do
18 |> put_req_header("content-type", "application/json")
19 |> post("/api/v1/filters", %{"phrase" => "knights", context: ["home"]})
22 assert response["error"] == "Invalid credentials."
25 describe "creating" do
26 setup do: oauth_access(["write:filters"])
28 test "a common filter", %{conn: conn, user: user} do
37 |> put_req_header("content-type", "application/json")
38 |> post("/api/v1/filters", params)
39 |> json_response_and_validate_schema(200)
41 assert response["phrase"] == params.phrase
42 assert response["context"] == params.context
43 assert response["irreversible"] == true
44 assert response["id"] != nil
45 assert response["id"] != ""
46 assert response["expires_at"] == nil
48 filter = Filter.get(response["id"], user)
49 assert filter.hide == true
52 test "a filter with expires_in", %{conn: conn, user: user} do
57 |> put_req_header("content-type", "application/json")
58 |> post("/api/v1/filters", %{
59 "phrase" => "knights",
61 expires_in: in_seconds
63 |> json_response_and_validate_schema(200)
65 assert response["irreversible"] == false
68 NaiveDateTime.utc_now()
69 |> NaiveDateTime.add(in_seconds)
70 |> Pleroma.Web.CommonAPI.Utils.to_masto_date()
72 assert response["expires_at"] == expires_at
74 filter = Filter.get(response["id"], user)
79 worker: PurgeExpiredFilter,
80 args: %{filter_id: filter.id}
83 assert {:ok, %{id: ^id}} =
84 perform_job(PurgeExpiredFilter, %{
88 assert Repo.aggregate(Filter, :count, :id) == 0
92 test "fetching a list of filters" do
93 %{user: user, conn: conn} = oauth_access(["read:filters"])
95 %{filter_id: id1} = insert(:filter, user: user)
96 %{filter_id: id2} = insert(:filter, user: user)
101 assert [%{"id" => ^id2}, %{"id" => ^id1}] =
103 |> get("/api/v1/filters")
104 |> json_response_and_validate_schema(200)
107 test "fetching a list of filters without token", %{conn: conn} do
112 |> get("/api/v1/filters")
113 |> json_response(403)
115 assert response["error"] == "Invalid credentials."
118 test "get a filter" do
119 %{user: user, conn: conn} = oauth_access(["read:filters"])
121 # check whole_word false
122 filter = insert(:filter, user: user, whole_word: false)
125 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
127 assert resp1["whole_word"] == false
129 # check whole_word true
130 filter = insert(:filter, user: user, whole_word: true)
133 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
135 assert resp2["whole_word"] == true
138 test "get a filter not_found error" do
139 filter = insert(:filter)
140 %{conn: conn} = oauth_access(["read:filters"])
143 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(404)
145 assert response["error"] == "Record not found"
148 describe "updating a filter" do
149 setup do: oauth_access(["write:filters"])
152 %{conn: conn, user: user} = oauth_access(["write:filters"])
169 |> put_req_header("content-type", "application/json")
170 |> put("/api/v1/filters/#{filter.filter_id}", params)
171 |> json_response_and_validate_schema(200)
173 assert response["phrase"] == params.phrase
174 assert response["context"] == params.context
175 assert response["irreversible"] == false
176 assert response["whole_word"] == true
179 test "with adding expires_at", %{conn: conn, user: user} do
180 filter = insert(:filter, user: user)
185 |> put_req_header("content-type", "application/json")
186 |> put("/api/v1/filters/#{filter.filter_id}", %{
189 expires_in: in_seconds,
192 |> json_response_and_validate_schema(200)
194 assert response["irreversible"] == true
196 assert response["expires_at"] ==
197 NaiveDateTime.utc_now()
198 |> NaiveDateTime.add(in_seconds)
199 |> Pleroma.Web.CommonAPI.Utils.to_masto_date()
201 filter = Filter.get(response["id"], user)
206 worker: PurgeExpiredFilter,
207 args: %{filter_id: id}
210 assert {:ok, %{id: ^id}} =
211 perform_job(PurgeExpiredFilter, %{
215 assert Repo.aggregate(Filter, :count, :id) == 0
218 test "with removing expires_at", %{conn: conn, user: user} do
221 |> put_req_header("content-type", "application/json")
222 |> post("/api/v1/filters", %{
227 |> json_response_and_validate_schema(200)
229 filter = Filter.get(response["id"], user)
232 worker: PurgeExpiredFilter,
233 args: %{filter_id: filter.id}
238 |> put_req_header("content-type", "application/json")
239 |> put("/api/v1/filters/#{filter.filter_id}", %{
245 |> json_response_and_validate_schema(200)
248 worker: PurgeExpiredFilter,
249 args: %{filter_id: filter.id}
252 assert response["irreversible"] == false
253 assert response["whole_word"] == true
254 assert response["expires_at"] == nil
257 test "expires_at is the same in create and update so job is in db", %{conn: conn, user: user} do
260 |> put_req_header("content-type", "application/json")
261 |> post("/api/v1/filters", %{
266 |> json_response_and_validate_schema(200)
268 filter = Filter.get(resp1["id"], user)
271 worker: PurgeExpiredFilter,
272 args: %{filter_id: filter.id}
275 job = PurgeExpiredFilter.get_expiration(filter.id)
279 |> put_req_header("content-type", "application/json")
280 |> put("/api/v1/filters/#{filter.filter_id}", %{
284 |> json_response_and_validate_schema(200)
286 updated_filter = Filter.get(resp2["id"], user)
289 worker: PurgeExpiredFilter,
290 args: %{filter_id: updated_filter.id}
293 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
295 assert resp1["expires_at"] == resp2["expires_at"]
297 assert job.scheduled_at == after_update.scheduled_at
300 test "updating expires_at updates oban job too", %{conn: conn, user: user} do
303 |> put_req_header("content-type", "application/json")
304 |> post("/api/v1/filters", %{
309 |> json_response_and_validate_schema(200)
311 filter = Filter.get(resp1["id"], user)
314 worker: PurgeExpiredFilter,
315 args: %{filter_id: filter.id}
318 job = PurgeExpiredFilter.get_expiration(filter.id)
322 |> put_req_header("content-type", "application/json")
323 |> put("/api/v1/filters/#{filter.filter_id}", %{
328 |> json_response_and_validate_schema(200)
330 updated_filter = Filter.get(resp2["id"], user)
333 worker: PurgeExpiredFilter,
334 args: %{filter_id: updated_filter.id}
337 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
339 refute resp1["expires_at"] == resp2["expires_at"]
341 refute job.scheduled_at == after_update.scheduled_at
345 test "update filter without token", %{conn: conn} do
346 filter = insert(:filter)
350 |> put_req_header("content-type", "application/json")
351 |> put("/api/v1/filters/#{filter.filter_id}", %{
355 |> json_response(403)
357 assert response["error"] == "Invalid credentials."
360 describe "delete a filter" do
361 setup do: oauth_access(["write:filters"])
363 test "common", %{conn: conn, user: user} do
364 filter = insert(:filter, user: user)
367 |> delete("/api/v1/filters/#{filter.filter_id}")
368 |> json_response_and_validate_schema(200) == %{}
370 assert Repo.all(Filter) == []
373 test "with expires_at", %{conn: conn, user: user} do
376 |> put_req_header("content-type", "application/json")
377 |> post("/api/v1/filters", %{
382 |> json_response_and_validate_schema(200)
384 filter = Filter.get(response["id"], user)
387 worker: PurgeExpiredFilter,
388 args: %{filter_id: filter.id}
392 |> delete("/api/v1/filters/#{filter.filter_id}")
393 |> json_response_and_validate_schema(200) == %{}
396 worker: PurgeExpiredFilter,
397 args: %{filter_id: filter.id}
400 assert Repo.all(Filter) == []
401 assert Repo.all(Oban.Job) == []
405 test "delete a filter without token", %{conn: conn} do
406 filter = insert(:filter)
410 |> delete("/api/v1/filters/#{filter.filter_id}")
411 |> json_response(403)
413 assert response["error"] == "Invalid credentials."