From e0d6f0ad88d9ef2c59b9f83e559e5f67407f456c Mon Sep 17 00:00:00 2001 From: Kieran Eglin Date: Wed, 1 May 2024 14:38:06 -0700 Subject: [PATCH] Hooked up media deletion user script --- lib/pinchflat/media/media.ex | 12 ++++++- .../media_retention_worker_test.exs | 9 +++++ test/pinchflat/media_test.exs | 36 +++++++++++++++++++ test/pinchflat/profiles_test.exs | 9 +++++ test/pinchflat/sources_test.exs | 6 ++++ .../media_item_controller_test.exs | 4 +++ .../media_profile_controller_test.exs | 9 +++++ .../controllers/source_controller_test.exs | 6 ++++ 8 files changed, 90 insertions(+), 1 deletion(-) diff --git a/lib/pinchflat/media/media.ex b/lib/pinchflat/media/media.ex index 43f7b6e..9178a67 100644 --- a/lib/pinchflat/media/media.ex +++ b/lib/pinchflat/media/media.ex @@ -10,8 +10,10 @@ defmodule Pinchflat.Media do alias Pinchflat.Sources.Source alias Pinchflat.Media.MediaItem alias Pinchflat.Media.MediaQuery - alias Pinchflat.Metadata.MediaMetadata alias Pinchflat.Utils.FilesystemUtils + alias Pinchflat.Metadata.MediaMetadata + + alias Pinchflat.Lifecycle.UserScripts.CommandRunner, as: UserScriptRunner @doc """ Returns the list of media_items. @@ -180,6 +182,7 @@ defmodule Pinchflat.Media do if delete_files do {:ok, _} = do_delete_media_files(media_item) + :ok = run_user_script(:media_deleted, media_item) end # Should delete these no matter what @@ -202,6 +205,7 @@ defmodule Pinchflat.Media do Tasks.delete_tasks_for(media_item) {:ok, _} = do_delete_media_files(media_item) + :ok = run_user_script(:media_deleted, media_item) update_media_item(media_item, Map.merge(filepath_attrs, addl_attrs)) end @@ -237,4 +241,10 @@ defmodule Pinchflat.Media do |> Enum.filter(&is_binary/1) |> Enum.each(&FilesystemUtils.delete_file_and_remove_empty_directories/1) end + + defp run_user_script(event, media_item) do + runner = Application.get_env(:pinchflat, :user_script_runner, UserScriptRunner) + + runner.run(event, media_item) + end end diff --git a/test/pinchflat/downloading/media_retention_worker_test.exs b/test/pinchflat/downloading/media_retention_worker_test.exs index a77fd76..3ae1eaa 100644 --- a/test/pinchflat/downloading/media_retention_worker_test.exs +++ b/test/pinchflat/downloading/media_retention_worker_test.exs @@ -1,13 +1,22 @@ defmodule Pinchflat.Downloading.MediaRetentionWorkerTest do use Pinchflat.DataCase + import Mox import Pinchflat.MediaFixtures import Pinchflat.SourcesFixtures alias Pinchflat.Media alias Pinchflat.Downloading.MediaRetentionWorker + setup :verify_on_exit! + describe "perform/1" do + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "deletes media files that are past their retention date" do {_source, old_media_item, new_media_item} = prepare_records() diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs index 1c91be6..cf238c1 100644 --- a/test/pinchflat/media_test.exs +++ b/test/pinchflat/media_test.exs @@ -749,6 +749,12 @@ defmodule Pinchflat.MediaTest do end describe "delete_media_item/2 when testing file deletion" do + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "deletes the media item's files" do media_item = media_item_with_attachments() @@ -799,9 +805,27 @@ defmodule Pinchflat.MediaTest do :ok = File.rm(Path.join([root_directory, "test.txt"])) :ok = File.rmdir(root_directory) end + + test "calls the user script runner" do + media_item = media_item_with_attachments() + + expect(UserScriptRunnerMock, :run, fn :media_deleted, data -> + assert data.id == media_item.id + + :ok + end) + + assert {:ok, _} = Media.delete_media_item(media_item, delete_files: true) + end end describe "delete_media_files/2" do + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "does not delete the media_item" do media_item = media_item_fixture() @@ -854,6 +878,18 @@ defmodule Pinchflat.MediaTest do assert {:ok, updated_media_item} = Media.delete_media_files(media_item, %{prevent_download: true}) assert updated_media_item.prevent_download end + + test "calls the user script runner" do + media_item = media_item_with_attachments() + + expect(UserScriptRunnerMock, :run, fn :media_deleted, data -> + assert data.id == media_item.id + + :ok + end) + + assert {:ok, _} = Media.delete_media_files(media_item) + end end describe "change_media_item/1" do diff --git a/test/pinchflat/profiles_test.exs b/test/pinchflat/profiles_test.exs index 79405c2..e81ad58 100644 --- a/test/pinchflat/profiles_test.exs +++ b/test/pinchflat/profiles_test.exs @@ -1,6 +1,7 @@ defmodule Pinchflat.ProfilesTest do use Pinchflat.DataCase + import Mox import Pinchflat.MediaFixtures import Pinchflat.SourcesFixtures import Pinchflat.ProfilesFixtures @@ -10,6 +11,8 @@ defmodule Pinchflat.ProfilesTest do @invalid_attrs %{name: nil, output_path_template: nil} + setup :verify_on_exit! + describe "schema" do test "can be JSON encoded without error" do profile = media_profile_fixture() @@ -112,6 +115,12 @@ defmodule Pinchflat.ProfilesTest do end describe "delete_media_profile/2 when deleting files" do + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "still deletes all the needful records" do media_profile = media_profile_fixture() source = source_fixture(media_profile_id: media_profile.id) diff --git a/test/pinchflat/sources_test.exs b/test/pinchflat/sources_test.exs index 28e9f16..4703450 100644 --- a/test/pinchflat/sources_test.exs +++ b/test/pinchflat/sources_test.exs @@ -618,6 +618,12 @@ defmodule Pinchflat.SourcesTest do end describe "delete_source/2 when deleting files" do + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "deletes source and media_items" do source = source_fixture() media_item = media_item_with_attachments(%{source_id: source.id}) diff --git a/test/pinchflat_web/controllers/media_item_controller_test.exs b/test/pinchflat_web/controllers/media_item_controller_test.exs index 5a2dbd9..bd22f59 100644 --- a/test/pinchflat_web/controllers/media_item_controller_test.exs +++ b/test/pinchflat_web/controllers/media_item_controller_test.exs @@ -1,11 +1,14 @@ defmodule PinchflatWeb.MediaItemControllerTest do use PinchflatWeb.ConnCase + import Mox import Pinchflat.MediaFixtures alias Pinchflat.Repo alias Pinchflat.Downloading.MediaDownloadWorker + setup :verify_on_exit! + describe "show media" do setup [:create_media_item] @@ -49,6 +52,7 @@ defmodule PinchflatWeb.MediaItemControllerTest do describe "delete media" do setup do media_item = media_item_with_attachments() + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) %{media_item: media_item} end diff --git a/test/pinchflat_web/controllers/media_profile_controller_test.exs b/test/pinchflat_web/controllers/media_profile_controller_test.exs index df1013b..37fcaf6 100644 --- a/test/pinchflat_web/controllers/media_profile_controller_test.exs +++ b/test/pinchflat_web/controllers/media_profile_controller_test.exs @@ -1,6 +1,7 @@ defmodule PinchflatWeb.MediaProfileControllerTest do use PinchflatWeb.ConnCase + import Mox import Pinchflat.MediaFixtures import Pinchflat.SourcesFixtures import Pinchflat.ProfilesFixtures @@ -15,6 +16,8 @@ defmodule PinchflatWeb.MediaProfileControllerTest do } @invalid_attrs %{name: nil, output_path_template: nil} + setup :verify_on_exit! + setup do Settings.set(onboarding: false) @@ -136,6 +139,12 @@ defmodule PinchflatWeb.MediaProfileControllerTest do describe "delete media_profile when deleting the records and files" do setup [:create_media_profile] + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "deletes chosen media_profile and its associations", %{conn: conn, media_profile: media_profile} do source = source_fixture(media_profile_id: media_profile.id) media_item = media_item_with_attachments(%{source_id: source.id}) diff --git a/test/pinchflat_web/controllers/source_controller_test.exs b/test/pinchflat_web/controllers/source_controller_test.exs index 8599688..02ec838 100644 --- a/test/pinchflat_web/controllers/source_controller_test.exs +++ b/test/pinchflat_web/controllers/source_controller_test.exs @@ -145,6 +145,12 @@ defmodule PinchflatWeb.SourceControllerTest do describe "delete source when deleting the records and files" do setup [:create_source] + setup do + stub(UserScriptRunnerMock, :run, fn _event_type, _data -> :ok end) + + :ok + end + test "deletes chosen source and media_items", %{conn: conn, source: source, media_item: media_item} do delete(conn, ~p"/sources/#{source}?delete_files=true")