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.MastodonAPI.FilterControllerTest do
6 use Pleroma.Web.ConnCase, async: false
7 use Oban.Testing, repo: Pleroma.Repo
10 import Pleroma.Factory
14 alias Pleroma.Workers.PurgeExpiredFilter
16 test "non authenticated creation request", %{conn: conn} do
19 |> put_req_header("content-type", "application/json")
20 |> post("/api/v1/filters", %{"phrase" => "knights", context: ["home"]})
23 assert response["error"] == "Invalid credentials."
26 describe "creating" do
27 setup do: oauth_access(["write:filters"])
29 test "a common filter", %{conn: conn, user: user} do
38 |> put_req_header("content-type", "application/json")
39 |> post("/api/v1/filters", params)
40 |> json_response_and_validate_schema(200)
42 assert response["phrase"] == params.phrase
43 assert response["context"] == params.context
44 assert response["irreversible"] == true
45 assert response["id"] != nil
46 assert response["id"] != ""
47 assert response["expires_at"] == nil
49 filter = Filter.get(response["id"], user)
50 assert filter.hide == true
53 test "a filter with expires_in", %{conn: conn, user: user} do
57 with_mock NaiveDateTime, [:passthrough], utc_now: fn -> ~N[2017-03-17 17:09:58] end do
59 |> put_req_header("content-type", "application/json")
60 |> post("/api/v1/filters", %{
61 "phrase" => "knights",
63 expires_in: in_seconds
65 |> json_response_and_validate_schema(200)
68 assert response["irreversible"] == false
69 assert response["expires_at"] == "2017-03-17T17:19:58.000Z"
71 filter = Filter.get(response["id"], user)
76 worker: PurgeExpiredFilter,
77 args: %{filter_id: filter.id}
80 assert {:ok, %{id: ^id}} =
81 perform_job(PurgeExpiredFilter, %{
85 assert Repo.aggregate(Filter, :count, :id) == 0
89 test "fetching a list of filters" do
90 %{user: user, conn: conn} = oauth_access(["read:filters"])
92 %{filter_id: id1} = insert(:filter, user: user)
93 %{filter_id: id2} = insert(:filter, user: user)
98 assert [%{"id" => ^id2}, %{"id" => ^id1}] =
100 |> get("/api/v1/filters")
101 |> json_response_and_validate_schema(200)
104 test "fetching a list of filters without token", %{conn: conn} do
109 |> get("/api/v1/filters")
110 |> json_response(403)
112 assert response["error"] == "Invalid credentials."
115 test "get a filter" do
116 %{user: user, conn: conn} = oauth_access(["read:filters"])
118 # check whole_word false
119 filter = insert(:filter, user: user, whole_word: false)
122 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
124 assert resp1["whole_word"] == false
126 # check whole_word true
127 filter = insert(:filter, user: user, whole_word: true)
130 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
132 assert resp2["whole_word"] == true
135 test "get a filter not_found error" do
136 filter = insert(:filter)
137 %{conn: conn} = oauth_access(["read:filters"])
140 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(404)
142 assert response["error"] == "Record not found"
145 describe "updating a filter" do
146 setup do: oauth_access(["write:filters"])
149 %{conn: conn, user: user} = oauth_access(["write:filters"])
166 |> put_req_header("content-type", "application/json")
167 |> put("/api/v1/filters/#{filter.filter_id}", params)
168 |> json_response_and_validate_schema(200)
170 assert response["phrase"] == params.phrase
171 assert response["context"] == params.context
172 assert response["irreversible"] == false
173 assert response["whole_word"] == true
176 test "with adding expires_at", %{conn: conn, user: user} do
177 filter = insert(:filter, user: user)
181 with_mock NaiveDateTime, [:passthrough], utc_now: fn -> ~N[2017-03-17 17:09:58] end do
183 |> put_req_header("content-type", "application/json")
184 |> put("/api/v1/filters/#{filter.filter_id}", %{
187 expires_in: in_seconds,
190 |> json_response_and_validate_schema(200)
193 assert response["irreversible"] == true
194 assert response["expires_at"] == "2017-03-17T17:19:58.000Z"
196 filter = Filter.get(response["id"], user)
201 worker: PurgeExpiredFilter,
202 args: %{filter_id: id}
205 assert {:ok, %{id: ^id}} =
206 perform_job(PurgeExpiredFilter, %{
210 assert Repo.aggregate(Filter, :count, :id) == 0
213 test "with removing expires_at", %{conn: conn, user: user} do
216 |> put_req_header("content-type", "application/json")
217 |> post("/api/v1/filters", %{
222 |> json_response_and_validate_schema(200)
224 filter = Filter.get(response["id"], user)
227 worker: PurgeExpiredFilter,
228 args: %{filter_id: filter.id}
233 |> put_req_header("content-type", "application/json")
234 |> put("/api/v1/filters/#{filter.filter_id}", %{
240 |> json_response_and_validate_schema(200)
243 worker: PurgeExpiredFilter,
244 args: %{filter_id: filter.id}
247 assert response["irreversible"] == false
248 assert response["whole_word"] == true
249 assert response["expires_at"] == nil
252 test "expires_at is the same in create and update so job is in db", %{conn: conn, user: user} do
255 |> put_req_header("content-type", "application/json")
256 |> post("/api/v1/filters", %{
261 |> json_response_and_validate_schema(200)
263 filter = Filter.get(resp1["id"], user)
266 worker: PurgeExpiredFilter,
267 args: %{filter_id: filter.id}
270 job = PurgeExpiredFilter.get_expiration(filter.id)
274 |> put_req_header("content-type", "application/json")
275 |> put("/api/v1/filters/#{filter.filter_id}", %{
279 |> json_response_and_validate_schema(200)
281 updated_filter = Filter.get(resp2["id"], user)
284 worker: PurgeExpiredFilter,
285 args: %{filter_id: updated_filter.id}
288 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
290 assert resp1["expires_at"] == resp2["expires_at"]
292 assert job.scheduled_at == after_update.scheduled_at
295 test "updating expires_at updates oban job too", %{conn: conn, user: user} do
298 |> put_req_header("content-type", "application/json")
299 |> post("/api/v1/filters", %{
304 |> json_response_and_validate_schema(200)
306 filter = Filter.get(resp1["id"], user)
309 worker: PurgeExpiredFilter,
310 args: %{filter_id: filter.id}
313 job = PurgeExpiredFilter.get_expiration(filter.id)
317 |> put_req_header("content-type", "application/json")
318 |> put("/api/v1/filters/#{filter.filter_id}", %{
323 |> json_response_and_validate_schema(200)
325 updated_filter = Filter.get(resp2["id"], user)
328 worker: PurgeExpiredFilter,
329 args: %{filter_id: updated_filter.id}
332 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
334 refute resp1["expires_at"] == resp2["expires_at"]
336 refute job.scheduled_at == after_update.scheduled_at
340 test "update filter without token", %{conn: conn} do
341 filter = insert(:filter)
345 |> put_req_header("content-type", "application/json")
346 |> put("/api/v1/filters/#{filter.filter_id}", %{
350 |> json_response(403)
352 assert response["error"] == "Invalid credentials."
355 describe "delete a filter" do
356 setup do: oauth_access(["write:filters"])
358 test "common", %{conn: conn, user: user} do
359 filter = insert(:filter, user: user)
362 |> delete("/api/v1/filters/#{filter.filter_id}")
363 |> json_response_and_validate_schema(200) == %{}
365 assert Repo.all(Filter) == []
368 test "with expires_at", %{conn: conn, user: user} do
371 |> put_req_header("content-type", "application/json")
372 |> post("/api/v1/filters", %{
377 |> json_response_and_validate_schema(200)
379 filter = Filter.get(response["id"], user)
382 worker: PurgeExpiredFilter,
383 args: %{filter_id: filter.id}
387 |> delete("/api/v1/filters/#{filter.filter_id}")
388 |> json_response_and_validate_schema(200) == %{}
391 worker: PurgeExpiredFilter,
392 args: %{filter_id: filter.id}
395 assert Repo.all(Filter) == []
396 assert Repo.all(Oban.Job) == []
400 test "delete a filter without token", %{conn: conn} do
401 filter = insert(:filter)
405 |> delete("/api/v1/filters/#{filter.filter_id}")
406 |> json_response(403)
408 assert response["error"] == "Invalid credentials."