forked from AkkomaGang/akkoma
added tests for Pleroma.Upload.Filter
This commit is contained in:
parent
4ac269a2c3
commit
21e3f9ac69
7 changed files with 187 additions and 30 deletions
|
@ -6,10 +6,19 @@ defmodule Pleroma.Upload.Filter.Dedupe do
|
||||||
@behaviour Pleroma.Upload.Filter
|
@behaviour Pleroma.Upload.Filter
|
||||||
alias Pleroma.Upload
|
alias Pleroma.Upload
|
||||||
|
|
||||||
def filter(%Upload{name: name} = upload) do
|
def filter(%Upload{name: name, tempfile: tempfile} = upload) do
|
||||||
extension = String.split(name, ".") |> List.last()
|
extension =
|
||||||
shasum = :crypto.hash(:sha256, File.read!(upload.tempfile)) |> Base.encode16(case: :lower)
|
name
|
||||||
|
|> String.split(".")
|
||||||
|
|> List.last()
|
||||||
|
|
||||||
|
shasum =
|
||||||
|
:crypto.hash(:sha256, File.read!(tempfile))
|
||||||
|
|> Base.encode16(case: :lower)
|
||||||
|
|
||||||
filename = shasum <> "." <> extension
|
filename = shasum <> "." <> extension
|
||||||
{:ok, %Upload{upload | id: shasum, path: filename}}
|
{:ok, %Upload{upload | id: shasum, path: filename}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def filter(_), do: :ok
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
defmodule Pleroma.Upload.Filter.Mogrifun do
|
defmodule Pleroma.Upload.Filter.Mogrifun do
|
||||||
@behaviour Pleroma.Upload.Filter
|
@behaviour Pleroma.Upload.Filter
|
||||||
|
alias Pleroma.Upload.Filter
|
||||||
|
|
||||||
@filters [
|
@filters [
|
||||||
{"implode", "1"},
|
{"implode", "1"},
|
||||||
|
@ -34,31 +35,10 @@ defmodule Pleroma.Upload.Filter.Mogrifun do
|
||||||
]
|
]
|
||||||
|
|
||||||
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
||||||
filter = Enum.random(@filters)
|
Filter.Mogrify.do_filter(file, [Enum.random(@filters)])
|
||||||
|
|
||||||
file
|
|
||||||
|> Mogrify.open()
|
|
||||||
|> mogrify_filter(filter)
|
|
||||||
|> Mogrify.save(in_place: true)
|
|
||||||
|
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter(_), do: :ok
|
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
|
end
|
||||||
|
|
|
@ -11,16 +11,19 @@ defmodule Pleroma.Upload.Filter.Mogrify do
|
||||||
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
||||||
filters = Pleroma.Config.get!([__MODULE__, :args])
|
filters = Pleroma.Config.get!([__MODULE__, :args])
|
||||||
|
|
||||||
file
|
do_filter(file, filters)
|
||||||
|> Mogrify.open()
|
|
||||||
|> mogrify_filter(filters)
|
|
||||||
|> Mogrify.save(in_place: true)
|
|
||||||
|
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter(_), do: :ok
|
def filter(_), do: :ok
|
||||||
|
|
||||||
|
def do_filter(file, filters) do
|
||||||
|
file
|
||||||
|
|> Mogrify.open()
|
||||||
|
|> mogrify_filter(filters)
|
||||||
|
|> Mogrify.save(in_place: true)
|
||||||
|
end
|
||||||
|
|
||||||
defp mogrify_filter(mogrify, nil), do: mogrify
|
defp mogrify_filter(mogrify, nil), do: mogrify
|
||||||
|
|
||||||
defp mogrify_filter(mogrify, [filter | rest]) do
|
defp mogrify_filter(mogrify, [filter | rest]) do
|
||||||
|
|
31
test/upload/filter/dedupe_test.exs
Normal file
31
test/upload/filter/dedupe_test.exs
Normal file
|
@ -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
|
44
test/upload/filter/mogrifun_test.exs
Normal file
44
test/upload/filter/mogrifun_test.exs
Normal file
|
@ -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
|
51
test/upload/filter/mogrify_test.exs
Normal file
51
test/upload/filter/mogrify_test.exs
Normal file
|
@ -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
|
39
test/upload/filter_test.exs
Normal file
39
test/upload/filter_test.exs
Normal file
|
@ -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
|
Loading…
Reference in a new issue