Skip to content

Commit 32e9df7

Browse files
committed
Bugfix
1 parent f5901fc commit 32e9df7

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

lib/polymorphic_embed.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,13 @@ defmodule PolymorphicEmbed do
221221
_ -> false
222222
end)
223223

224-
Ecto.Changeset.put_change(changeset, field, embeds)
225-
|> Map.put(:valid?, !any_invalid?)
224+
changeset = Ecto.Changeset.put_change(changeset, field, embeds)
225+
226+
if any_invalid? do
227+
Map.put(changeset, :valid?, false)
228+
else
229+
changeset
230+
end
226231
end
227232
end
228233

test/polymorphic_embed_test.exs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,36 @@ defmodule PolymorphicEmbedTest do
7373
end
7474
end
7575

76+
test "validations before casting polymorphic embed still work" do
77+
for polymorphic? <- [false, true] do
78+
reminder_module = get_module(Reminder, polymorphic?)
79+
80+
sms_reminder_attrs = %{
81+
text: "This is an SMS reminder #{polymorphic?}",
82+
contexts: [
83+
%{
84+
__type__: "location",
85+
address: "Foo St."
86+
},
87+
%{
88+
__type__: "location",
89+
address: "Bar St."
90+
}
91+
]
92+
}
93+
94+
insert_result =
95+
struct(reminder_module)
96+
|> reminder_module.changeset(sms_reminder_attrs)
97+
|> Repo.insert()
98+
99+
assert {:error, changeset} = insert_result
100+
101+
assert changeset.errors == [date: {"can't be blank", [validation: :required]}]
102+
refute changeset.valid?
103+
end
104+
end
105+
76106
test "invalid values" do
77107
for polymorphic? <- [false, true] do
78108
reminder_module = get_module(Reminder, polymorphic?)

test/support/models/not_polymorphic/reminder.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ defmodule PolymorphicEmbed.Regular.Reminder do
1717
def changeset(struct, values) do
1818
struct
1919
|> cast(values, [:date, :text])
20+
|> validate_required(:date)
2021
|> cast_embed(:channel)
2122
|> cast_embed(:contexts)
22-
|> validate_required(:date)
2323
end
2424

2525
def custom_changeset(struct, values) do

test/support/models/polymorphic/reminder.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ defmodule PolymorphicEmbed.Reminder do
3535
def changeset(struct, values) do
3636
struct
3737
|> cast(values, [:date, :text])
38+
|> validate_required(:date)
3839
|> cast_polymorphic_embed(:channel)
3940
|> cast_polymorphic_embed(:contexts)
40-
|> validate_required(:date)
4141
end
4242

4343
def custom_changeset(struct, values) do

0 commit comments

Comments
 (0)