added tests for Pleroma.Upload.Filter See merge request pleroma/pleroma!1434tags/v1.1.4
@@ -6,10 +6,19 @@ defmodule Pleroma.Upload.Filter.Dedupe do | |||
@behaviour Pleroma.Upload.Filter | |||
alias Pleroma.Upload | |||
def filter(%Upload{name: name} = upload) do | |||
extension = String.split(name, ".") |> List.last() | |||
shasum = :crypto.hash(:sha256, File.read!(upload.tempfile)) |> Base.encode16(case: :lower) | |||
def filter(%Upload{name: name, tempfile: tempfile} = upload) do | |||
extension = | |||
name | |||
|> String.split(".") | |||
|> List.last() | |||
shasum = | |||
:crypto.hash(:sha256, File.read!(tempfile)) | |||
|> Base.encode16(case: :lower) | |||
filename = shasum <> "." <> extension | |||
{:ok, %Upload{upload | id: shasum, path: filename}} | |||
end | |||
def filter(_), do: :ok | |||
end |
@@ -4,6 +4,7 @@ | |||
defmodule Pleroma.Upload.Filter.Mogrifun do | |||
@behaviour Pleroma.Upload.Filter | |||
alias Pleroma.Upload.Filter | |||
@filters [ | |||
{"implode", "1"}, | |||
@@ -34,31 +35,10 @@ defmodule Pleroma.Upload.Filter.Mogrifun do | |||
] | |||
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do | |||
filter = Enum.random(@filters) | |||
file | |||
|> Mogrify.open() | |||
|> mogrify_filter(filter) | |||
|> Mogrify.save(in_place: true) | |||
Filter.Mogrify.do_filter(file, [Enum.random(@filters)]) | |||
:ok | |||
end | |||
def filter(_), do: :ok | |||
defp mogrify_filter(mogrify, [filter | rest]) do | |||
mogrify | |||
|> mogrify_filter(filter) | |||
|> mogrify_filter(rest) | |||
end | |||
defp mogrify_filter(mogrify, []), do: mogrify | |||
defp mogrify_filter(mogrify, {action, options}) do | |||
Mogrify.custom(mogrify, action, options) | |||
end | |||
defp mogrify_filter(mogrify, string) when is_binary(string) do | |||
Mogrify.custom(mogrify, string) | |||
end | |||
end |
@@ -11,16 +11,19 @@ defmodule Pleroma.Upload.Filter.Mogrify do | |||
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do | |||
filters = Pleroma.Config.get!([__MODULE__, :args]) | |||
do_filter(file, filters) | |||
:ok | |||
end | |||
def filter(_), do: :ok | |||
def do_filter(file, filters) do | |||
file | |||
|> Mogrify.open() | |||
|> mogrify_filter(filters) | |||
|> Mogrify.save(in_place: true) | |||
:ok | |||
end | |||
def filter(_), do: :ok | |||
defp mogrify_filter(mogrify, nil), do: mogrify | |||
defp mogrify_filter(mogrify, [filter | rest]) do | |||
@@ -0,0 +1,31 @@ | |||
# Pleroma: A lightweight social networking server | |||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||
# SPDX-License-Identifier: AGPL-3.0-only | |||
defmodule Pleroma.Upload.Filter.DedupeTest do | |||
use Pleroma.DataCase | |||
alias Pleroma.Upload | |||
alias Pleroma.Upload.Filter.Dedupe | |||
@shasum "e30397b58d226d6583ab5b8b3c5defb0c682bda5c31ef07a9f57c1c4986e3781" | |||
test "adds shasum" do | |||
File.cp!( | |||
"test/fixtures/image.jpg", | |||
"test/fixtures/image_tmp.jpg" | |||
) | |||
upload = %Upload{ | |||
name: "an… image.jpg", | |||
content_type: "image/jpg", | |||
path: Path.absname("test/fixtures/image_tmp.jpg"), | |||
tempfile: Path.absname("test/fixtures/image_tmp.jpg") | |||
} | |||
assert { | |||
:ok, | |||
%Pleroma.Upload{id: @shasum, path: "#{@shasum}.jpg"} | |||
} = Dedupe.filter(upload) | |||
end | |||
end |
@@ -0,0 +1,44 @@ | |||
# Pleroma: A lightweight social networking server | |||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||
# SPDX-License-Identifier: AGPL-3.0-only | |||
defmodule Pleroma.Upload.Filter.MogrifunTest do | |||
use Pleroma.DataCase | |||
import Mock | |||
alias Pleroma.Upload | |||
alias Pleroma.Upload.Filter | |||
test "apply mogrify filter" do | |||
File.cp!( | |||
"test/fixtures/image.jpg", | |||
"test/fixtures/image_tmp.jpg" | |||
) | |||
upload = %Upload{ | |||
name: "an… image.jpg", | |||
content_type: "image/jpg", | |||
path: Path.absname("test/fixtures/image_tmp.jpg"), | |||
tempfile: Path.absname("test/fixtures/image_tmp.jpg") | |||
} | |||
task = | |||
Task.async(fn -> | |||
assert_receive {:apply_filter, {}}, 4_000 | |||
end) | |||
with_mocks([ | |||
{Mogrify, [], | |||
[ | |||
open: fn _f -> %Mogrify.Image{} end, | |||
custom: fn _m, _a -> send(task.pid, {:apply_filter, {}}) end, | |||
custom: fn _m, _a, _o -> send(task.pid, {:apply_filter, {}}) end, | |||
save: fn _f, _o -> :ok end | |||
]} | |||
]) do | |||
assert Filter.Mogrifun.filter(upload) == :ok | |||
end | |||
Task.await(task) | |||
end | |||
end |
@@ -0,0 +1,51 @@ | |||
# Pleroma: A lightweight social networking server | |||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||
# SPDX-License-Identifier: AGPL-3.0-only | |||
defmodule Pleroma.Upload.Filter.MogrifyTest do | |||
use Pleroma.DataCase | |||
import Mock | |||
alias Pleroma.Config | |||
alias Pleroma.Upload | |||
alias Pleroma.Upload.Filter | |||
setup do | |||
filter = Config.get([Filter.Mogrify, :args]) | |||
on_exit(fn -> | |||
Config.put([Filter.Mogrify, :args], filter) | |||
end) | |||
end | |||
test "apply mogrify filter" do | |||
Config.put([Filter.Mogrify, :args], [{"tint", "40"}]) | |||
File.cp!( | |||
"test/fixtures/image.jpg", | |||
"test/fixtures/image_tmp.jpg" | |||
) | |||
upload = %Upload{ | |||
name: "an… image.jpg", | |||
content_type: "image/jpg", | |||
path: Path.absname("test/fixtures/image_tmp.jpg"), | |||
tempfile: Path.absname("test/fixtures/image_tmp.jpg") | |||
} | |||
task = | |||
Task.async(fn -> | |||
assert_receive {:apply_filter, {_, "tint", "40"}}, 4_000 | |||
end) | |||
with_mock Mogrify, | |||
open: fn _f -> %Mogrify.Image{} end, | |||
custom: fn _m, _a -> :ok end, | |||
custom: fn m, a, o -> send(task.pid, {:apply_filter, {m, a, o}}) end, | |||
save: fn _f, _o -> :ok end do | |||
assert Filter.Mogrify.filter(upload) == :ok | |||
end | |||
Task.await(task) | |||
end | |||
end |
@@ -0,0 +1,39 @@ | |||
# Pleroma: A lightweight social networking server | |||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> | |||
# SPDX-License-Identifier: AGPL-3.0-only | |||
defmodule Pleroma.Upload.FilterTest do | |||
use Pleroma.DataCase | |||
alias Pleroma.Config | |||
alias Pleroma.Upload.Filter | |||
setup do | |||
custom_filename = Config.get([Pleroma.Upload.Filter.AnonymizeFilename, :text]) | |||
on_exit(fn -> | |||
Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], custom_filename) | |||
end) | |||
end | |||
test "applies filters" do | |||
Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], "custom-file.png") | |||
File.cp!( | |||
"test/fixtures/image.jpg", | |||
"test/fixtures/image_tmp.jpg" | |||
) | |||
upload = %Pleroma.Upload{ | |||
name: "an… image.jpg", | |||
content_type: "image/jpg", | |||
path: Path.absname("test/fixtures/image_tmp.jpg"), | |||
tempfile: Path.absname("test/fixtures/image_tmp.jpg") | |||
} | |||
assert Filter.filter([], upload) == {:ok, upload} | |||
assert {:ok, upload} = Filter.filter([Pleroma.Upload.Filter.AnonymizeFilename], upload) | |||
assert upload.name == "custom-file.png" | |||
end | |||
end |