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)
71 assert NaiveDateTime.diff(
72 NaiveDateTime.from_iso8601!(response["expires_at"]),
76 filter = Filter.get(response["id"], user)
81 worker: PurgeExpiredFilter,
82 args: %{filter_id: filter.id}
85 assert {:ok, %{id: ^id}} =
86 perform_job(PurgeExpiredFilter, %{
90 assert Repo.aggregate(Filter, :count, :id) == 0
94 test "fetching a list of filters" do
95 %{user: user, conn: conn} = oauth_access(["read:filters"])
97 %{filter_id: id1} = insert(:filter, user: user)
98 %{filter_id: id2} = insert(:filter, user: user)
103 assert [%{"id" => ^id2}, %{"id" => ^id1}] =
105 |> get("/api/v1/filters")
106 |> json_response_and_validate_schema(200)
109 test "fetching a list of filters without token", %{conn: conn} do
114 |> get("/api/v1/filters")
115 |> json_response(403)
117 assert response["error"] == "Invalid credentials."
120 test "get a filter" do
121 %{user: user, conn: conn} = oauth_access(["read:filters"])
123 # check whole_word false
124 filter = insert(:filter, user: user, whole_word: false)
127 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
129 assert resp1["whole_word"] == false
131 # check whole_word true
132 filter = insert(:filter, user: user, whole_word: true)
135 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(200)
137 assert resp2["whole_word"] == true
140 test "get a filter not_found error" do
141 filter = insert(:filter)
142 %{conn: conn} = oauth_access(["read:filters"])
145 conn |> get("/api/v1/filters/#{filter.filter_id}") |> json_response_and_validate_schema(404)
147 assert response["error"] == "Record not found"
150 describe "updating a filter" do
151 setup do: oauth_access(["write:filters"])
154 %{conn: conn, user: user} = oauth_access(["write:filters"])
171 |> put_req_header("content-type", "application/json")
172 |> put("/api/v1/filters/#{filter.filter_id}", params)
173 |> json_response_and_validate_schema(200)
175 assert response["phrase"] == params.phrase
176 assert response["context"] == params.context
177 assert response["irreversible"] == false
178 assert response["whole_word"] == true
181 test "with adding expires_at", %{conn: conn, user: user} do
182 filter = insert(:filter, user: user)
187 |> put_req_header("content-type", "application/json")
188 |> put("/api/v1/filters/#{filter.filter_id}", %{
191 expires_in: in_seconds,
194 |> json_response_and_validate_schema(200)
196 assert response["irreversible"] == true
199 NaiveDateTime.utc_now()
200 |> NaiveDateTime.add(in_seconds)
202 assert NaiveDateTime.diff(
203 NaiveDateTime.from_iso8601!(response["expires_at"]),
207 filter = Filter.get(response["id"], user)
212 worker: PurgeExpiredFilter,
213 args: %{filter_id: id}
216 assert {:ok, %{id: ^id}} =
217 perform_job(PurgeExpiredFilter, %{
221 assert Repo.aggregate(Filter, :count, :id) == 0
224 test "with removing expires_at", %{conn: conn, user: user} do
227 |> put_req_header("content-type", "application/json")
228 |> post("/api/v1/filters", %{
233 |> json_response_and_validate_schema(200)
235 filter = Filter.get(response["id"], user)
238 worker: PurgeExpiredFilter,
239 args: %{filter_id: filter.id}
244 |> put_req_header("content-type", "application/json")
245 |> put("/api/v1/filters/#{filter.filter_id}", %{
251 |> json_response_and_validate_schema(200)
254 worker: PurgeExpiredFilter,
255 args: %{filter_id: filter.id}
258 assert response["irreversible"] == false
259 assert response["whole_word"] == true
260 assert response["expires_at"] == nil
263 test "expires_at is the same in create and update so job is in db", %{conn: conn, user: user} do
266 |> put_req_header("content-type", "application/json")
267 |> post("/api/v1/filters", %{
272 |> json_response_and_validate_schema(200)
274 filter = Filter.get(resp1["id"], user)
277 worker: PurgeExpiredFilter,
278 args: %{filter_id: filter.id}
281 job = PurgeExpiredFilter.get_expiration(filter.id)
285 |> put_req_header("content-type", "application/json")
286 |> put("/api/v1/filters/#{filter.filter_id}", %{
290 |> json_response_and_validate_schema(200)
292 updated_filter = Filter.get(resp2["id"], user)
295 worker: PurgeExpiredFilter,
296 args: %{filter_id: updated_filter.id}
299 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
301 assert resp1["expires_at"] == resp2["expires_at"]
303 assert job.scheduled_at == after_update.scheduled_at
306 test "updating expires_at updates oban job too", %{conn: conn, user: user} do
309 |> put_req_header("content-type", "application/json")
310 |> post("/api/v1/filters", %{
315 |> json_response_and_validate_schema(200)
317 filter = Filter.get(resp1["id"], user)
320 worker: PurgeExpiredFilter,
321 args: %{filter_id: filter.id}
324 job = PurgeExpiredFilter.get_expiration(filter.id)
328 |> put_req_header("content-type", "application/json")
329 |> put("/api/v1/filters/#{filter.filter_id}", %{
334 |> json_response_and_validate_schema(200)
336 updated_filter = Filter.get(resp2["id"], user)
339 worker: PurgeExpiredFilter,
340 args: %{filter_id: updated_filter.id}
343 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
345 refute resp1["expires_at"] == resp2["expires_at"]
347 refute job.scheduled_at == after_update.scheduled_at
351 test "update filter without token", %{conn: conn} do
352 filter = insert(:filter)
356 |> put_req_header("content-type", "application/json")
357 |> put("/api/v1/filters/#{filter.filter_id}", %{
361 |> json_response(403)
363 assert response["error"] == "Invalid credentials."
366 describe "delete a filter" do
367 setup do: oauth_access(["write:filters"])
369 test "common", %{conn: conn, user: user} do
370 filter = insert(:filter, user: user)
373 |> delete("/api/v1/filters/#{filter.filter_id}")
374 |> json_response_and_validate_schema(200) == %{}
376 assert Repo.all(Filter) == []
379 test "with expires_at", %{conn: conn, user: user} do
382 |> put_req_header("content-type", "application/json")
383 |> post("/api/v1/filters", %{
388 |> json_response_and_validate_schema(200)
390 filter = Filter.get(response["id"], user)
393 worker: PurgeExpiredFilter,
394 args: %{filter_id: filter.id}
398 |> delete("/api/v1/filters/#{filter.filter_id}")
399 |> json_response_and_validate_schema(200) == %{}
402 worker: PurgeExpiredFilter,
403 args: %{filter_id: filter.id}
406 assert Repo.all(Filter) == []
407 assert Repo.all(Oban.Job) == []
411 test "delete a filter without token", %{conn: conn} do
412 filter = insert(:filter)
416 |> delete("/api/v1/filters/#{filter.filter_id}")
417 |> json_response(403)
419 assert response["error"] == "Invalid credentials."