diff --git a/lib/waffle/definition/versioning.ex b/lib/waffle/definition/versioning.ex index 06ee5e6..8905b6b 100644 --- a/lib/waffle/definition/versioning.ex +++ b/lib/waffle/definition/versioning.ex @@ -28,6 +28,9 @@ defmodule Waffle.Definition.Versioning do quote do @versions [:original] @before_compile Waffle.Definition.Versioning + + def extension(_, {file, _}), do: Path.extname(file.file_name) + defoverridable extension: 2 end end @@ -38,7 +41,7 @@ defmodule Waffle.Definition.Versioning do case conversion do :skip -> nil {_, _, ext} -> "#{name}.#{ext}" - _ -> "#{name}#{Path.extname(file.file_name)}" + _ -> "#{name}#{definition.extension(version, {file, scope})}" end end diff --git a/test/actions/store_test.exs b/test/actions/store_test.exs index 439c8ab..d2574e7 100644 --- a/test/actions/store_test.exs +++ b/test/actions/store_test.exs @@ -16,6 +16,7 @@ defmodule WaffleTest.Actions.Store do def transform(:skipped, _), do: :skip def transform(_, _), do: :noaction def __versions, do: [:original, :thumb, :skipped] + def extension(_, {file, _}), do: Path.extname(file.file_name) end defmodule DummyDefinitionWithHeaders do @@ -24,6 +25,7 @@ defmodule WaffleTest.Actions.Store do def transform(_, _), do: :noaction def __versions, do: [:original, :thumb, :skipped] + def extension(_, {file, _}), do: Path.extname(file.file_name) def remote_file_headers(%URI{host: "www.google.com"}), do: [{"User-Agent", "MyApp"}] end @@ -36,6 +38,16 @@ defmodule WaffleTest.Actions.Store do def __versions, do: [:original, :thumb, :skipped] end + defmodule DummyDefinitionWithExtension do + use Waffle.Actions.Store + use Waffle.Definition.Storage + + def validate({file, _}), do: true + def transform(_, _), do: :noaction + def __versions, do: [:original] + def extension(_, {file, _}), do: ".jpeg" + end + test "checks file existence" do assert DummyDefinition.store("non-existent-file.png") == {:error, :invalid_file_path} end @@ -151,6 +163,15 @@ defmodule WaffleTest.Actions.Store do end end + test "sets extension from extension/2" do + with_mock Waffle.Storage.S3, + put: fn DummyDefinitionWithExtension, _, {%{file_name: "image.jpeg", path: @img}, nil} -> + {:ok, "resp"} + end do + assert DummyDefinitionWithExtension.store(@img) == {:ok, "image.png"} + end + end + test "sets remote filename from content-disposition header when available" do with_mocks([ { diff --git a/test/actions/url_test.exs b/test/actions/url_test.exs index cc88127..2bb0611 100644 --- a/test/actions/url_test.exs +++ b/test/actions/url_test.exs @@ -9,6 +9,7 @@ defmodule WaffleTest.Actions.Url do def __versions, do: [:original, :thumb, :skipped] def transform(:skipped, _), do: :skip def transform(_, _), do: :noaction + def extension(_, {file, _}), do: Path.extname(file.file_name) def default_url(version, scope) when is_nil(scope), do: "dummy-#{version}" def default_url(version, scope), do: "dummy-#{version}-#{scope}" def __storage, do: Waffle.Storage.S3