241710807c
Happens when a file is uploaded, then orphaned, and a similar file is used somewhere. The CleanMedia job service didn't consider that case Signed-off-by: Thomas Citharel <tcit@tcit.fr>
152 lines
4.9 KiB
Elixir
152 lines
4.9 KiB
Elixir
defmodule Mix.Tasks.Mobilizon.Media.CleanOrphanTest do
|
|
use Mobilizon.DataCase
|
|
import Mock
|
|
import Mobilizon.Factory
|
|
|
|
alias Mix.Tasks.Mobilizon.Media.CleanOrphan
|
|
alias Mobilizon.Service.CleanOrphanMedia
|
|
|
|
Mix.shell(Mix.Shell.Process)
|
|
|
|
describe "with default options" do
|
|
test "nothing returned" do
|
|
with_mock CleanOrphanMedia, clean: fn [dry_run: false, grace_period: 48] -> {:ok, []} end do
|
|
CleanOrphan.run([])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "No files were deleted"
|
|
end
|
|
end
|
|
|
|
test "media returned" do
|
|
media1 = insert(:media)
|
|
media2 = insert(:media)
|
|
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: false, grace_period: 48] -> {:ok, [media1, media2]} end do
|
|
CleanOrphan.run([])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "2 files have been deleted"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "with dry-run option" do
|
|
test "with nothing returned" do
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: true, grace_period: 48] -> {:ok, []} end do
|
|
CleanOrphan.run(["--dry-run"])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "No files would have been deleted"
|
|
end
|
|
end
|
|
|
|
test "with media returned" do
|
|
media1 = insert(:media)
|
|
media2 = insert(:media)
|
|
media3 = insert(:media, file: create_file())
|
|
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: true, grace_period: 48] -> {:ok, [[media1, media2], [media3]]} end do
|
|
CleanOrphan.run(["--dry-run"])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "List of files that would have been deleted"
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
|
|
assert output_received ==
|
|
"ID: #{media1.id}, Actor: #{media1.actor_id}, Deduplicated 2 times, URL: #{media1.file.url}"
|
|
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
|
|
assert output_received ==
|
|
"ID: #{media3.id}, Actor: #{media3.actor_id}, Deduplicated 1 times, URL: #{media3.file.url}"
|
|
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "2 files would have been deleted"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "with verbose option" do
|
|
test "with nothing returned" do
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: false, grace_period: 48] -> {:ok, []} end do
|
|
CleanOrphan.run(["--verbose"])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "No files were deleted"
|
|
end
|
|
end
|
|
|
|
test "with media returned" do
|
|
media1 = insert(:media)
|
|
media2 = insert(:media)
|
|
media3 = insert(:media, file: create_file())
|
|
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: false, grace_period: 48] -> {:ok, [[media1, media2], [media3]]} end do
|
|
CleanOrphan.run(["--verbose"])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "List of files that have been deleted"
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
|
|
assert output_received ==
|
|
"ID: #{media1.id}, Actor: #{media1.actor_id}, Deduplicated 2 times, URL: #{media1.file.url}"
|
|
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
|
|
assert output_received ==
|
|
"ID: #{media3.id}, Actor: #{media3.actor_id}, Deduplicated 1 times, URL: #{media3.file.url}"
|
|
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "2 files have been deleted"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "with days option" do
|
|
test "with nothing returned" do
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: false, grace_period: 120] -> {:ok, []} end do
|
|
CleanOrphan.run(["--days", "5"])
|
|
assert_received {:mix_shell, :info, [output_received]}
|
|
assert output_received == "No files were deleted"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "returns an error" do
|
|
test "for some reason" do
|
|
with_mock CleanOrphanMedia,
|
|
clean: fn [dry_run: false, grace_period: 48] -> {:error, "Some error"} end do
|
|
CleanOrphan.run([])
|
|
assert_received {:mix_shell, :error, [output_received]}
|
|
assert output_received == "Error while cleaning orphan media files"
|
|
end
|
|
end
|
|
end
|
|
|
|
defp create_file do
|
|
File.cp!("test/fixtures/picture.png", "test/fixtures/picture_tmp.png")
|
|
|
|
file = %Plug.Upload{
|
|
content_type: "image/png",
|
|
path: Path.absname("test/fixtures/picture_tmp.png"),
|
|
filename: "image.png"
|
|
}
|
|
|
|
{:ok, data} = Mobilizon.Web.Upload.store(file)
|
|
|
|
%{
|
|
content_type: "image/png",
|
|
name: "image.png",
|
|
url: url
|
|
} = data
|
|
|
|
%Mobilizon.Medias.File{
|
|
name: "My Media",
|
|
url: url,
|
|
content_type: "image/png",
|
|
size: 13_120
|
|
}
|
|
end
|
|
end
|