diff options
author | Maksim Pechnikov <parallel588@gmail.com> | 2020-06-06 21:12:35 +0300 |
---|---|---|
committer | Maksim Pechnikov <parallel588@gmail.com> | 2020-06-06 21:12:35 +0300 |
commit | a602886508b7fd4a4aee128f3b129acb8515cb8e (patch) | |
tree | b75421e979d0ef39a0c6d0e1109b5d443226ab4f | |
parent | 0eff690f445261673be09674e8a9646681e60a86 (diff) | |
download | pleroma-a602886508b7fd4a4aee128f3b129acb8515cb8e.tar.gz |
added test
-rw-r--r-- | lib/pleroma/web/media_proxy/invalidation.ex | 1 | ||||
-rw-r--r-- | lib/pleroma/web/media_proxy/media_proxy.ex | 7 | ||||
-rw-r--r-- | lib/pleroma/workers/attachments_cleanup_worker.ex | 7 | ||||
-rw-r--r-- | test/workers/attachments_cleanup_worker_test.exs | 91 |
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 |