浏览代码

Merge branch 'tests/upload_filters' into 'develop'

added tests for Pleroma.Upload.Filter

See merge request pleroma/pleroma!1434
tags/v1.1.4
kaniini 5 年前
父节点
当前提交
33fbb638cd
共有 7 个文件被更改,包括 186 次插入29 次删除
  1. +12
    -3
      lib/pleroma/upload/filter/dedupe.ex
  2. +2
    -22
      lib/pleroma/upload/filter/mogrifun.ex
  3. +7
    -4
      lib/pleroma/upload/filter/mogrify.ex
  4. +31
    -0
      test/upload/filter/dedupe_test.exs
  5. +44
    -0
      test/upload/filter/mogrifun_test.exs
  6. +51
    -0
      test/upload/filter/mogrify_test.exs
  7. +39
    -0
      test/upload/filter_test.exs

+ 12
- 3
lib/pleroma/upload/filter/dedupe.ex 查看文件

@@ -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

+ 2
- 22
lib/pleroma/upload/filter/mogrifun.ex 查看文件

@@ -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

+ 7
- 4
lib/pleroma/upload/filter/mogrify.ex 查看文件

@@ -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


+ 31
- 0
test/upload/filter/dedupe_test.exs 查看文件

@@ -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
- 0
test/upload/filter/mogrifun_test.exs 查看文件

@@ -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
- 0
test/upload/filter/mogrify_test.exs 查看文件

@@ -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
- 0
test/upload/filter_test.exs 查看文件

@@ -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

正在加载...
取消
保存