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: 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
70 assert response["expires_at"] == "2017-03-17T17:19:58.000Z"
72 filter = Filter.get(response["id"], user)
77 worker: PurgeExpiredFilter,
78 args: %{filter_id: filter.id}
81 assert {:ok, %{id: ^id}} =
82 perform_job(PurgeExpiredFilter, %{
86 assert Repo.aggregate(Filter, :count, :id) == 0
89 test "a filter with expires_at", %{conn: conn, user: user} do
91 with_mock NaiveDateTime, [:passthrough], utc_now: fn -> ~N[2017-03-17 17:09:58] end do
93 |> put_req_header("content-type", "application/json")
94 |> post("/api/v1/filters", %{
95 "phrase" => "bad memes",
97 expires_at: "2017-03-17T17:19:58.000Z"
99 |> json_response_and_validate_schema(200)
102 assert response["irreversible"] == false
104 assert response["expires_at"] == "2017-03-17T17:19:58.000Z"
106 filter = Filter.get(response["id"], user)
111 worker: PurgeExpiredFilter,
112 args: %{filter_id: filter.id}
115 assert {:ok, %{id: ^id}} =
116 perform_job(PurgeExpiredFilter, %{
120 assert Repo.aggregate(Filter, :count, :id) == 0
124 test "fetching a list of filters" do
125 %{user: user, conn: conn} = oauth_access(["read:filters"])
127 %{filter_id: id1} = insert(:filter, user: user)
128 %{filter_id: id2} = insert(:filter, user: user)
133 assert [%{"id" => ^id2}, %{"id" => ^id1}] =
135 |> get("/api/v1/filters")
136 |> json_response_and_validate_schema(200)
139 test "fetching a list of filters without token", %{conn: conn} do
144 |> get("/api/v1/filters")
145 |> json_response(403)
147 assert response["error"] == "Invalid credentials."
150 test "get a filter" do
151 %{user: user, conn: conn} = oauth_access(["read:filters"])
153 # check whole_word false
154 filter = insert(:filter, user: user, whole_word: false)
157 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
159 assert resp1["whole_word"] == false
161 # check whole_word true
162 filter = insert(:filter, user: user, whole_word: true)
165 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
167 assert resp2["whole_word"] == true
170 test "get a filter not_found error" do
171 filter = insert(:filter)
172 %{conn: conn} = oauth_access(["read:filters"])
175 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(404)
177 assert response["error"] == "Record not found"
180 describe "updating a filter" do
181 setup do: oauth_access(["write:filters"])
184 %{conn: conn, user: user} = oauth_access(["write:filters"])
201 |> put_req_header("content-type", "application/json")
202 |> put("/api/v1/filters/#{filter.filter_id}", params)
203 |> json_response_and_validate_schema(200)
205 assert response["phrase"] == params.phrase
206 assert response["context"] == params.context
207 assert response["irreversible"] == false
208 assert response["whole_word"] == true
211 test "with adding expires_at", %{conn: conn, user: user} do
212 filter = insert(:filter, user: user)
216 with_mock NaiveDateTime, [:passthrough], utc_now: fn -> ~N[2017-03-17 17:09:58] end do
218 |> put_req_header("content-type", "application/json")
219 |> put("/api/v1/filters/#{filter.filter_id}", %{
222 expires_in: in_seconds,
225 |> json_response_and_validate_schema(200)
228 assert response["irreversible"] == true
230 assert response["expires_at"] == "2017-03-17T17:19:58.000Z"
232 filter = Filter.get(response["id"], user)
237 worker: PurgeExpiredFilter,
238 args: %{filter_id: id}
241 assert {:ok, %{id: ^id}} =
242 perform_job(PurgeExpiredFilter, %{
246 assert Repo.aggregate(Filter, :count, :id) == 0
249 test "with removing expires_at", %{conn: conn, user: user} do
252 |> put_req_header("content-type", "application/json")
253 |> post("/api/v1/filters", %{
258 |> json_response_and_validate_schema(200)
260 filter = Filter.get(response["id"], user)
263 worker: PurgeExpiredFilter,
264 args: %{filter_id: filter.id}
269 |> put_req_header("content-type", "application/json")
270 |> put("/api/v1/filters/#{filter.filter_id}", %{
276 |> json_response_and_validate_schema(200)
279 worker: PurgeExpiredFilter,
280 args: %{filter_id: filter.id}
283 assert response["irreversible"] == false
284 assert response["whole_word"] == true
285 assert response["expires_at"] == nil
288 test "expires_at is the same in create and update so job is in db", %{conn: conn, user: user} do
291 |> put_req_header("content-type", "application/json")
292 |> post("/api/v1/filters", %{
297 |> json_response_and_validate_schema(200)
299 filter = Filter.get(resp1["id"], user)
302 worker: PurgeExpiredFilter,
303 args: %{filter_id: filter.id}
306 job = PurgeExpiredFilter.get_expiration(filter.id)
310 |> put_req_header("content-type", "application/json")
311 |> put("/api/v1/filters/#{filter.filter_id}", %{
315 |> json_response_and_validate_schema(200)
317 updated_filter = Filter.get(resp2["id"], user)
320 worker: PurgeExpiredFilter,
321 args: %{filter_id: updated_filter.id}
324 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
326 assert resp1["expires_at"] == resp2["expires_at"]
328 assert job.scheduled_at == after_update.scheduled_at
331 test "updating expires_at updates oban job too", %{conn: conn, user: user} do
334 |> put_req_header("content-type", "application/json")
335 |> post("/api/v1/filters", %{
340 |> json_response_and_validate_schema(200)
342 filter = Filter.get(resp1["id"], user)
345 worker: PurgeExpiredFilter,
346 args: %{filter_id: filter.id}
349 job = PurgeExpiredFilter.get_expiration(filter.id)
353 |> put_req_header("content-type", "application/json")
354 |> put("/api/v1/filters/#{filter.filter_id}", %{
359 |> json_response_and_validate_schema(200)
361 updated_filter = Filter.get(resp2["id"], user)
364 worker: PurgeExpiredFilter,
365 args: %{filter_id: updated_filter.id}
368 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
370 refute resp1["expires_at"] == resp2["expires_at"]
372 refute job.scheduled_at == after_update.scheduled_at
376 test "update filter without token", %{conn: conn} do
377 filter = insert(:filter)
381 |> put_req_header("content-type", "application/json")
382 |> put("/api/v1/filters/#{filter.filter_id}", %{
386 |> json_response(403)
388 assert response["error"] == "Invalid credentials."
391 describe "delete a filter" do
392 setup do: oauth_access(["write:filters"])
394 test "common", %{conn: conn, user: user} do
395 filter = insert(:filter, user: user)
398 |> delete("/api/v1/filters/#{filter.filter_id}")
399 |> json_response_and_validate_schema(200) == %{}
401 assert Repo.all(Filter) == []
404 test "with expires_at", %{conn: conn, user: user} do
407 |> put_req_header("content-type", "application/json")
408 |> post("/api/v1/filters", %{
413 |> json_response_and_validate_schema(200)
415 filter = Filter.get(response["id"], user)
418 worker: PurgeExpiredFilter,
419 args: %{filter_id: filter.id}
423 |> delete("/api/v1/filters/#{filter.filter_id}")
424 |> json_response_and_validate_schema(200) == %{}
427 worker: PurgeExpiredFilter,
428 args: %{filter_id: filter.id}
431 assert Repo.all(Filter) == []
432 assert Repo.all(Oban.Job) == []
436 test "delete a filter without token", %{conn: conn} do
437 filter = insert(:filter)
441 |> delete("/api/v1/filters/#{filter.filter_id}")
442 |> json_response(403)
444 assert response["error"] == "Invalid credentials."