From e1ae56d7a55d948e6922c5149d45e82cca566979 Mon Sep 17 00:00:00 2001 From: Jim Kane Date: Tue, 15 Jul 2025 09:33:19 -0500 Subject: [PATCH] Support stream attachments Update check function to allow stream-based attachments. --- lib/waffle_ecto/schema.ex | 4 ++++ test/schema_test.exs | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/waffle_ecto/schema.ex b/lib/waffle_ecto/schema.ex index fc360e1..3c8a303 100644 --- a/lib/waffle_ecto/schema.ex +++ b/lib/waffle_ecto/schema.ex @@ -110,6 +110,10 @@ defmodule Waffle.Ecto.Schema do upload = %{upload | path: path} if path_allowed?(path, options), do: [{field, {upload, scope}} | fields], else: fields + {field, upload = %{filename: filename, stream: stream}}, fields + when is_binary(filename) and is_map(stream) -> + [{field, {upload, scope}} | fields] + # If casting a binary (path), ensure we've explicitly allowed paths {field, path}, fields when is_binary(path) -> path = String.trim(path) diff --git a/test/schema_test.exs b/test/schema_test.exs index 07035ec..9f2c090 100644 --- a/test/schema_test.exs +++ b/test/schema_test.exs @@ -223,4 +223,19 @@ defmodule WaffleTest.Ecto.Schema do ) ) end + + test_with_mock "casting stream data", DummyDefinition, + store: fn {%{filename: "/path/to/my/file.png", stream: %Stream{}}, %TestUser{}} -> + {:ok, "file.png"} + end do + TestUser.changeset(%TestUser{}, %{ + "avatar" => %{filename: "/path/to/my/file.png", stream: %Stream{}} + }) + + assert called( + DummyDefinition.store( + {%{filename: "/path/to/my/file.png", stream: %Stream{}}, %TestUser{}} + ) + ) + end end