From 03256bd91675f68aa4aa869f9477f633ad46568a Mon Sep 17 00:00:00 2001 From: Rick Littel Date: Tue, 14 Jan 2025 11:57:06 +0100 Subject: [PATCH 1/3] Check for valid map and return changeset error in cast_attachments --- lib/waffle_ecto/schema.ex | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/waffle_ecto/schema.ex b/lib/waffle_ecto/schema.ex index b4a774e..6d75fdc 100644 --- a/lib/waffle_ecto/schema.ex +++ b/lib/waffle_ecto/schema.ex @@ -21,7 +21,7 @@ defmodule Waffle.Ecto.Schema do field :avatar, MyApp.Uploaders.AvatarUploader.Type end - def changeset(user, params \\ :invalid) do + def changeset(user, params \\ %{}) do user |> cast(params, [:name]) |> cast_attachments(params, [:avatar]) @@ -69,20 +69,24 @@ defmodule Waffle.Ecto.Schema do end end) - waffle_params = - case params do - :invalid -> - :invalid - - %{} -> + case params do + params when is_map(params) and map_size(params) > 0 -> + waffle_params = params |> convert_params_to_binary() |> Map.take(allowed_param_keys) |> check_and_apply_scope(scope, options) |> Enum.into(%{}) - end - Ecto.Changeset.cast(changeset_or_data, waffle_params, allowed) + Ecto.Changeset.cast(changeset_or_data, waffle_params, allowed) + + _ -> + Ecto.Changeset.add_error( + changeset_or_data, + :missing_attachment, + "no attachment(s) given to cast" + ) + end end end From 4b96be8328bc3838df7ae9475e768ad621235901 Mon Sep 17 00:00:00 2001 From: Rick Littel Date: Tue, 14 Jan 2025 13:44:18 +0100 Subject: [PATCH 2/3] Updat test case for :invalid --- test/schema_test.exs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/schema_test.exs b/test/schema_test.exs index 7417dab..32b27ef 100644 --- a/test/schema_test.exs +++ b/test/schema_test.exs @@ -45,11 +45,15 @@ defmodule WaffleTest.Ecto.Schema do %{__struct__: Plug.Upload, path: path, filename: Path.basename(path)} end - test "supports :invalid changeset" do + test "supports invalid empty changeset" do cs = TestUser.changeset(%TestUser{}) assert cs.valid? == false assert cs.changes == %{} - assert cs.errors == [avatar: {"can't be blank", [validation: :required]}] + + assert cs.errors == [ + avatar: {"can't be blank", [validation: :required]}, + missing_attachment: {"no attachment(s) given to cast", []} + ] end test_with_mock "cascades storage success into a valid change", DummyDefinition, From 2954172ea541468b010116cd2e785c79db6caddc Mon Sep 17 00:00:00 2001 From: Rick Littel Date: Tue, 14 Jan 2025 16:56:17 +0100 Subject: [PATCH 3/3] Do not assume attachments are a required param --- lib/waffle_ecto/schema.ex | 6 +----- test/schema_test.exs | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/waffle_ecto/schema.ex b/lib/waffle_ecto/schema.ex index 6d75fdc..fc360e1 100644 --- a/lib/waffle_ecto/schema.ex +++ b/lib/waffle_ecto/schema.ex @@ -81,11 +81,7 @@ defmodule Waffle.Ecto.Schema do Ecto.Changeset.cast(changeset_or_data, waffle_params, allowed) _ -> - Ecto.Changeset.add_error( - changeset_or_data, - :missing_attachment, - "no attachment(s) given to cast" - ) + changeset_or_data end end end diff --git a/test/schema_test.exs b/test/schema_test.exs index 32b27ef..07035ec 100644 --- a/test/schema_test.exs +++ b/test/schema_test.exs @@ -49,11 +49,7 @@ defmodule WaffleTest.Ecto.Schema do cs = TestUser.changeset(%TestUser{}) assert cs.valid? == false assert cs.changes == %{} - - assert cs.errors == [ - avatar: {"can't be blank", [validation: :required]}, - missing_attachment: {"no attachment(s) given to cast", []} - ] + assert cs.errors == [avatar: {"can't be blank", [validation: :required]}] end test_with_mock "cascades storage success into a valid change", DummyDefinition,