summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaksim Pechnikov <parallel588@gmail.com>2020-06-06 21:12:35 +0300
committerMaksim Pechnikov <parallel588@gmail.com>2020-06-06 21:12:35 +0300
commita602886508b7fd4a4aee128f3b129acb8515cb8e (patch)
treeb75421e979d0ef39a0c6d0e1109b5d443226ab4f
parent0eff690f445261673be09674e8a9646681e60a86 (diff)
added test
-rw-r--r--lib/pleroma/web/media_proxy/invalidation.ex1
-rw-r--r--lib/pleroma/web/media_proxy/media_proxy.ex7
-rw-r--r--lib/pleroma/workers/attachments_cleanup_worker.ex7
-rw-r--r--test/workers/attachments_cleanup_worker_test.exs91
4 files changed, 99 insertions, 7 deletions
diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex
index 537cb76d6..fac731c5c 100644
--- a/lib/pleroma/web/media_proxy/invalidation.ex
+++ b/lib/pleroma/web/media_proxy/invalidation.ex
@@ -31,7 +31,6 @@ defmodule Pleroma.Web.MediaProxy.Invalidation do
def prepare_urls(urls) do
urls
|> List.wrap()
- |> Enum.filter(&MediaProxy.is_url_proxiable?(&1))
|> Enum.map(&MediaProxy.url(&1))
end
end
diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex
index e5f1d242e..59ca217ab 100644
--- a/lib/pleroma/web/media_proxy/media_proxy.ex
+++ b/lib/pleroma/web/media_proxy/media_proxy.ex
@@ -30,11 +30,7 @@ defmodule Pleroma.Web.MediaProxy do
end
def put_in_deleted_urls(url) when is_binary(url) do
- if is_url_proxiable?(url) do
- Cachex.put(:deleted_urls_cache, url(url), true)
- else
- true
- end
+ Cachex.put(:deleted_urls_cache, url(url), true)
end
def url(url) when is_nil(url) or url == "", do: nil
@@ -48,6 +44,7 @@ defmodule Pleroma.Web.MediaProxy do
end
end
+ @spec is_url_proxiable?(String.t()) :: boolean()
def is_url_proxiable?(url) do
if local?(url) or whitelisted?(url) do
false
diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex
index 170bca976..4a7b67080 100644
--- a/lib/pleroma/workers/attachments_cleanup_worker.ex
+++ b/lib/pleroma/workers/attachments_cleanup_worker.ex
@@ -78,7 +78,12 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
defp cache_purge(true, [_ | _] = urls), do: MediaProxy.Invalidation.purge(urls)
defp cache_purge(_, _), do: :ok
- defp lock_attachments(true, urls), do: MediaProxy.put_in_deleted_urls(urls)
+ defp lock_attachments(true, [_ | _] = urls) do
+ urls
+ |> Enum.filter(&MediaProxy.is_url_proxiable?(&1))
+ |> MediaProxy.put_in_deleted_urls()
+ end
+
defp lock_attachments(_, _), do: :ok
# we should delete 1 object for any given attachment, but don't delete
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