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
197 NaiveDateTime.utc_now()
198 |> NaiveDateTime.add(in_seconds)
200 assert NaiveDateTime.diff(
201 NaiveDateTime.from_iso8601!(response["expires_at"]),
205 filter = Filter.get(response["id"], user)
210 worker: PurgeExpiredFilter,
211 args: %{filter_id: id}
214 assert {:ok, %{id: ^id}} =
215 perform_job(PurgeExpiredFilter, %{
219 assert Repo.aggregate(Filter, :count, :id) == 0
222 test "with removing expires_at", %{conn: conn, user: user} do
225 |> put_req_header("content-type", "application/json")
226 |> post("/api/v1/filters", %{
231 |> json_response_and_validate_schema(200)
233 filter = Filter.get(response["id"], user)
236 worker: PurgeExpiredFilter,
237 args: %{filter_id: filter.id}
242 |> put_req_header("content-type", "application/json")
243 |> put("/api/v1/filters/#{filter.filter_id}", %{
249 |> json_response_and_validate_schema(200)
252 worker: PurgeExpiredFilter,
253 args: %{filter_id: filter.id}
256 assert response["irreversible"] == false
257 assert response["whole_word"] == true
258 assert response["expires_at"] == nil
261 test "expires_at is the same in create and update so job is in db", %{conn: conn, user: user} do
264 |> put_req_header("content-type", "application/json")
265 |> post("/api/v1/filters", %{
270 |> json_response_and_validate_schema(200)
272 filter = Filter.get(resp1["id"], user)
275 worker: PurgeExpiredFilter,
276 args: %{filter_id: filter.id}
279 job = PurgeExpiredFilter.get_expiration(filter.id)
283 |> put_req_header("content-type", "application/json")
284 |> put("/api/v1/filters/#{filter.filter_id}", %{
288 |> json_response_and_validate_schema(200)
290 updated_filter = Filter.get(resp2["id"], user)
293 worker: PurgeExpiredFilter,
294 args: %{filter_id: updated_filter.id}
297 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
299 assert resp1["expires_at"] == resp2["expires_at"]
301 assert job.scheduled_at == after_update.scheduled_at
304 test "updating expires_at updates oban job too", %{conn: conn, user: user} do
307 |> put_req_header("content-type", "application/json")
308 |> post("/api/v1/filters", %{
313 |> json_response_and_validate_schema(200)
315 filter = Filter.get(resp1["id"], user)
318 worker: PurgeExpiredFilter,
319 args: %{filter_id: filter.id}
322 job = PurgeExpiredFilter.get_expiration(filter.id)
326 |> put_req_header("content-type", "application/json")
327 |> put("/api/v1/filters/#{filter.filter_id}", %{
332 |> json_response_and_validate_schema(200)
334 updated_filter = Filter.get(resp2["id"], user)
337 worker: PurgeExpiredFilter,
338 args: %{filter_id: updated_filter.id}
341 after_update = PurgeExpiredFilter.get_expiration(updated_filter.id)
343 refute resp1["expires_at"] == resp2["expires_at"]
345 refute job.scheduled_at == after_update.scheduled_at
349 test "update filter without token", %{conn: conn} do
350 filter = insert(:filter)
354 |> put_req_header("content-type", "application/json")
355 |> put("/api/v1/filters/#{filter.filter_id}", %{
359 |> json_response(403)
361 assert response["error"] == "Invalid credentials."
364 describe "delete a filter" do
365 setup do: oauth_access(["write:filters"])
367 test "common", %{conn: conn, user: user} do
368 filter = insert(:filter, user: user)
371 |> delete("/api/v1/filters/#{filter.filter_id}")
372 |> json_response_and_validate_schema(200) == %{}
374 assert Repo.all(Filter) == []
377 test "with expires_at", %{conn: conn, user: user} do
380 |> put_req_header("content-type", "application/json")
381 |> post("/api/v1/filters", %{
386 |> json_response_and_validate_schema(200)
388 filter = Filter.get(response["id"], user)
391 worker: PurgeExpiredFilter,
392 args: %{filter_id: filter.id}
396 |> delete("/api/v1/filters/#{filter.filter_id}")
397 |> json_response_and_validate_schema(200) == %{}
400 worker: PurgeExpiredFilter,
401 args: %{filter_id: filter.id}
404 assert Repo.all(Filter) == []
405 assert Repo.all(Oban.Job) == []
409 test "delete a filter without token", %{conn: conn} do
410 filter = insert(:filter)
414 |> delete("/api/v1/filters/#{filter.filter_id}")
415 |> json_response(403)
417 assert response["error"] == "Invalid credentials."