aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/object_test.exs36
-rw-r--r--test/support/invalidation_mock.ex10
-rw-r--r--test/web/media_proxy/invalidation_test.exs65
-rw-r--r--test/web/media_proxy/invalidations/http_test.exs13
-rw-r--r--test/web/media_proxy/invalidations/script_test.exs21
-rw-r--r--test/web/media_proxy/media_proxy_controller_test.exs17
-rw-r--r--test/workers/attachments_cleanup_worker_test.exs91
7 files changed, 232 insertions, 21 deletions
diff --git a/test/object_test.exs b/test/object_test.exs
index 198d3b1cf..5cd2d2c80 100644
--- a/test/object_test.exs
+++ b/test/object_test.exs
@@ -9,10 +9,12 @@ defmodule Pleroma.ObjectTest do
import Pleroma.Factory
import Tesla.Mock
alias Pleroma.Activity
+ alias Pleroma.Config
alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.Tests.ObanHelpers
alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.MediaProxy.Invalidation
setup do
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
@@ -76,6 +78,7 @@ defmodule Pleroma.ObjectTest do
describe "delete attachments" do
setup do: clear_config([Pleroma.Upload])
setup do: clear_config([:instance, :cleanup_attachments])
+ setup do: clear_config([:media_proxy])
test "Disabled via config" do
Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
@@ -109,11 +112,14 @@ defmodule Pleroma.ObjectTest do
refute Object.get_by_id(attachment.id) == nil
assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}")
+ refute Pleroma.Web.MediaProxy.in_deleted_urls(href)
end
test "in subdirectories" do
- Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
- Pleroma.Config.put([:instance, :cleanup_attachments], true)
+ Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ Config.put([:instance, :cleanup_attachments], true)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], Invalidation.Mock)
file = %Plug.Upload{
content_type: "image/jpg",
@@ -143,12 +149,15 @@ defmodule Pleroma.ObjectTest do
assert Object.get_by_id(attachment.id) == nil
assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
+ refute Pleroma.Web.MediaProxy.in_deleted_urls(href)
end
test "with dedupe enabled" do
- Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
- Pleroma.Config.put([Pleroma.Upload, :filters], [Pleroma.Upload.Filter.Dedupe])
- Pleroma.Config.put([:instance, :cleanup_attachments], true)
+ Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ Config.put([Pleroma.Upload, :filters], [Pleroma.Upload.Filter.Dedupe])
+ Config.put([:instance, :cleanup_attachments], true)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], Invalidation.Mock)
uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
@@ -181,11 +190,14 @@ defmodule Pleroma.ObjectTest do
assert Object.get_by_id(attachment.id) == nil
assert {:ok, files} = File.ls(uploads_dir)
refute filename in files
+ refute Pleroma.Web.MediaProxy.in_deleted_urls(href)
end
test "with objects that have legacy data.url attribute" do
- Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
- Pleroma.Config.put([:instance, :cleanup_attachments], true)
+ Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ Config.put([:instance, :cleanup_attachments], true)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], Invalidation.Mock)
file = %Plug.Upload{
content_type: "image/jpg",
@@ -217,12 +229,15 @@ defmodule Pleroma.ObjectTest do
assert Object.get_by_id(attachment.id) == nil
assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
+ refute Pleroma.Web.MediaProxy.in_deleted_urls(href)
end
test "With custom base_url" do
- Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
- Pleroma.Config.put([Pleroma.Upload, :base_url], "https://sub.domain.tld/dir/")
- Pleroma.Config.put([:instance, :cleanup_attachments], true)
+ Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ Config.put([Pleroma.Upload, :base_url], "https://sub.domain.tld/dir/")
+ Config.put([:instance, :cleanup_attachments], true)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], Invalidation.Mock)
file = %Plug.Upload{
content_type: "image/jpg",
@@ -252,6 +267,7 @@ defmodule Pleroma.ObjectTest do
assert Object.get_by_id(attachment.id) == nil
assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
+ refute Pleroma.Web.MediaProxy.in_deleted_urls(href)
end
end
diff --git a/test/support/invalidation_mock.ex b/test/support/invalidation_mock.ex
new file mode 100644
index 000000000..3cba697dc
--- /dev/null
+++ b/test/support/invalidation_mock.ex
@@ -0,0 +1,10 @@
+defmodule Pleroma.Web.MediaProxy.Invalidation.Mock do
+ @moduledoc false
+
+ @behaviour Pleroma.Web.MediaProxy.Invalidation
+
+ @impl Pleroma.Web.MediaProxy.Invalidation
+ def purge(urls, _opts) do
+ {:ok, urls}
+ end
+end
diff --git a/test/web/media_proxy/invalidation_test.exs b/test/web/media_proxy/invalidation_test.exs
new file mode 100644
index 000000000..3a9fa8c88
--- /dev/null
+++ b/test/web/media_proxy/invalidation_test.exs
@@ -0,0 +1,65 @@
+defmodule Pleroma.Web.MediaProxy.InvalidationTest do
+ use ExUnit.Case
+ use Pleroma.Tests.Helpers
+
+ alias Pleroma.Config
+ alias Pleroma.Web.MediaProxy.Invalidation
+
+ import ExUnit.CaptureLog
+ import Mock
+ import Tesla.Mock
+
+ setup do: clear_config([:media_proxy])
+
+ setup do
+ on_exit(fn -> Cachex.clear(:deleted_urls_cache) end)
+ :ok
+ end
+
+ describe "Invalidation.Http" do
+ test "perform request to clear cache" do
+ Config.put([:media_proxy, :enabled], false)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], Invalidation.Http)
+
+ Config.put([Invalidation.Http], method: :purge, headers: [{"x-refresh", 1}])
+ image_url = "http://example.com/media/example.jpg"
+ Pleroma.Web.MediaProxy.put_in_deleted_urls(image_url)
+
+ mock(fn
+ %{
+ method: :purge,
+ url: "http://example.com/media/example.jpg",
+ headers: [{"x-refresh", 1}]
+ } ->
+ %Tesla.Env{status: 200}
+ end)
+
+ assert capture_log(fn ->
+ assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url)
+ assert Invalidation.purge([image_url]) == {:ok, [image_url]}
+ assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url)
+ end) =~ "Running cache purge: [\"#{image_url}\"]"
+ end
+ end
+
+ describe "Invalidation.Script" do
+ test "run script to clear cache" do
+ Config.put([:media_proxy, :enabled], false)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], Invalidation.Script)
+ Config.put([Invalidation.Script], script_path: "purge-nginx")
+
+ image_url = "http://example.com/media/example.jpg"
+ Pleroma.Web.MediaProxy.put_in_deleted_urls(image_url)
+
+ with_mocks [{System, [], [cmd: fn _, _ -> {"ok", 0} end]}] do
+ assert capture_log(fn ->
+ assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url)
+ assert Invalidation.purge([image_url]) == {:ok, [image_url]}
+ assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url)
+ end) =~ "Running cache purge: [\"#{image_url}\"]"
+ end
+ end
+ end
+end
diff --git a/test/web/media_proxy/invalidations/http_test.exs b/test/web/media_proxy/invalidations/http_test.exs
index 8a3b4141c..09e7ca0fb 100644
--- a/test/web/media_proxy/invalidations/http_test.exs
+++ b/test/web/media_proxy/invalidations/http_test.exs
@@ -5,6 +5,11 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do
import ExUnit.CaptureLog
import Tesla.Mock
+ setup do
+ on_exit(fn -> Cachex.clear(:deleted_urls_cache) end)
+ :ok
+ end
+
test "logs hasn't error message when request is valid" do
mock(fn
%{method: :purge, url: "http://example.com/media/example.jpg"} ->
@@ -14,8 +19,8 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do
refute capture_log(fn ->
assert Invalidation.Http.purge(
["http://example.com/media/example.jpg"],
- %{}
- ) == {:ok, "success"}
+ []
+ ) == {:ok, ["http://example.com/media/example.jpg"]}
end) =~ "Error while cache purge"
end
@@ -28,8 +33,8 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do
assert capture_log(fn ->
assert Invalidation.Http.purge(
["http://example.com/media/example1.jpg"],
- %{}
- ) == {:ok, "success"}
+ []
+ ) == {:ok, ["http://example.com/media/example1.jpg"]}
end) =~ "Error while cache purge: url - http://example.com/media/example1.jpg"
end
end
diff --git a/test/web/media_proxy/invalidations/script_test.exs b/test/web/media_proxy/invalidations/script_test.exs
index 1358963ab..c69cec07a 100644
--- a/test/web/media_proxy/invalidations/script_test.exs
+++ b/test/web/media_proxy/invalidations/script_test.exs
@@ -4,17 +4,24 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do
import ExUnit.CaptureLog
+ setup do
+ on_exit(fn -> Cachex.clear(:deleted_urls_cache) end)
+ :ok
+ end
+
test "it logger error when script not found" do
assert capture_log(fn ->
assert Invalidation.Script.purge(
["http://example.com/media/example.jpg"],
- %{script_path: "./example"}
- ) == {:error, "\"%ErlangError{original: :enoent}\""}
- end) =~ "Error while cache purge: \"%ErlangError{original: :enoent}\""
+ script_path: "./example"
+ ) == {:error, "%ErlangError{original: :enoent}"}
+ end) =~ "Error while cache purge: %ErlangError{original: :enoent}"
- assert Invalidation.Script.purge(
- ["http://example.com/media/example.jpg"],
- %{}
- ) == {:error, "not found script path"}
+ capture_log(fn ->
+ assert Invalidation.Script.purge(
+ ["http://example.com/media/example.jpg"],
+ []
+ ) == {:error, "\"not found script path\""}
+ end)
end
end
diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs
index da79d38a5..2b6b25221 100644
--- a/test/web/media_proxy/media_proxy_controller_test.exs
+++ b/test/web/media_proxy/media_proxy_controller_test.exs
@@ -10,6 +10,11 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
setup do: clear_config(:media_proxy)
setup do: clear_config([Pleroma.Web.Endpoint, :secret_key_base])
+ setup do
+ on_exit(fn -> Cachex.clear(:deleted_urls_cache) end)
+ :ok
+ end
+
test "it returns 404 when MediaProxy disabled", %{conn: conn} do
Config.put([:media_proxy, :enabled], false)
@@ -66,4 +71,16 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
assert %Plug.Conn{status: :success} = get(conn, url)
end
end
+
+ test "it returns 404 when url contains in deleted_urls cache", %{conn: conn} do
+ Config.put([:media_proxy, :enabled], true)
+ Config.put([Pleroma.Web.Endpoint, :secret_key_base], "00000000000")
+ url = Pleroma.Web.MediaProxy.encode_url("https://google.fn/test.png")
+ Pleroma.Web.MediaProxy.put_in_deleted_urls("https://google.fn/test.png")
+
+ with_mock Pleroma.ReverseProxy,
+ call: fn _conn, _url, _opts -> %Plug.Conn{status: :success} end do
+ assert %Plug.Conn{status: 404, resp_body: "Not Found"} = get(conn, url)
+ end
+ end
end
diff --git a/test/workers/attachments_cleanup_worker_test.exs b/test/workers/attachments_cleanup_worker_test.exs
new file mode 100644
index 000000000..ec13eedbe
--- /dev/null
+++ b/test/workers/attachments_cleanup_worker_test.exs
@@ -0,0 +1,91 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Workers.AttachmentsCleanupWorkerTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Config
+ alias Pleroma.Web.MediaProxy
+ alias Pleroma.Workers.AttachmentsCleanupWorker
+
+ import Mock
+ import Pleroma.Factory
+
+ describe "delete attachments" do
+ setup do: clear_config([Pleroma.Upload])
+ setup do: clear_config([:instance, :cleanup_attachments])
+ setup do: clear_config([:media_proxy])
+
+ test "deletes attachment objects and run purge cache" do
+ Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ Config.put([:instance, :cleanup_attachments], true)
+ Config.put([:media_proxy, :invalidation, :enabled], true)
+ Config.put([:media_proxy, :invalidation, :provider], MediaProxy.Invalidation.Mock)
+
+ file = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ user = insert(:user)
+
+ {:ok, %Pleroma.Object{} = attachment} =
+ Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id)
+
+ remote_url = "http://example.com/media/d6661b98ae72e39.jpg"
+ %{data: %{"url" => [%{"href" => local_url}]}} = attachment
+
+ note =
+ insert(:note, %{
+ user: user,
+ data: %{
+ "attachment" => [
+ attachment.data,
+ %{
+ "actor" => user.ap_id,
+ "name" => "v_image.jpg",
+ "type" => "Document",
+ "url" => [
+ %{"href" => remote_url, "mediaType" => "image/jpeg", "type" => "Link"}
+ ]
+ }
+ ]
+ }
+ })
+
+ uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
+
+ path = local_url |> Path.dirname() |> Path.basename()
+
+ assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}")
+
+ with_mocks [
+ {MediaProxy.Invalidation, [:passthrough],
+ [purge: fn [^local_url, ^remote_url] -> :ok end]}
+ ] do
+ assert AttachmentsCleanupWorker.perform(
+ %{"op" => "cleanup_attachments", "object" => %{"data" => note.data}},
+ :job
+ ) == {:ok, :success}
+ end
+
+ refute Pleroma.Object.get_by_id(attachment.id)
+ assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
+
+ refute Pleroma.Web.MediaProxy.in_deleted_urls(local_url)
+ assert Pleroma.Web.MediaProxy.in_deleted_urls(remote_url)
+ end
+
+ test "skip execution" do
+ assert AttachmentsCleanupWorker.perform(
+ %{
+ "op" => "cleanup_attachments",
+ "object" => %{}
+ },
+ :job
+ ) == {:ok, :skip}
+ end
+ end
+end