@@ -228,6 +228,69 @@ defmodule PolymorphicEmbedTest do
228228 insert_result
229229 end
230230
231+ test "infer type from parent field and cast an empty embed" do
232+ generator = :polymorphic
233+ reminder_module = get_module ( Reminder , generator )
234+
235+ reminder_attrs = % {
236+ date: DateTime . utc_now ( ) ,
237+ text: "This is a reminder #{ generator } " ,
238+ type: "not_provided" ,
239+ channel4: % { }
240+ }
241+
242+ insert_result =
243+ struct ( reminder_module )
244+ |> reminder_module . changeset ( reminder_attrs )
245+ |> Repo . insert ( )
246+
247+ assert { :ok , % { id: id , channel4: % PolymorphicEmbed.Channel.NotProvided { } } } =
248+ insert_result
249+
250+ assert % { channel4: % PolymorphicEmbed.Channel.NotProvided { } } = Repo . get! ( reminder_module , id )
251+ end
252+
253+ test "cast an empty embed with no type if the embedded field is not required" do
254+ generator = :polymorphic
255+ reminder_module = get_module ( Reminder , generator )
256+
257+ reminder_attrs = % {
258+ date: DateTime . utc_now ( ) ,
259+ text: "This is a reminder #{ generator } " ,
260+ channel2: % { }
261+ }
262+
263+ insert_result =
264+ struct ( reminder_module )
265+ |> reminder_module . changeset ( reminder_attrs )
266+ |> Repo . insert ( )
267+
268+ assert { :ok , % { id: id , channel2: nil } } = insert_result
269+
270+ assert % { channel2: nil } = Repo . get! ( reminder_module , id )
271+ end
272+
273+ test "cannot cast an empty embed when no type can be inferred but the embed is required" do
274+ generator = :polymorphic
275+ reminder_module = get_module ( Reminder , generator )
276+
277+ reminder_attrs = % {
278+ date: DateTime . utc_now ( ) ,
279+ text: "This is a reminder #{ generator } " ,
280+ channel2: % { }
281+ }
282+
283+ insert_result =
284+ struct ( reminder_module )
285+ |> reminder_module . changeset ( reminder_attrs , channel2_required?: true )
286+ |> Repo . insert ( )
287+
288+ assert { :error , changeset } = insert_result
289+
290+ assert changeset . errors == [ channel2: { "is invalid" , [ ] } ]
291+ refute changeset . valid?
292+ end
293+
231294 test "validations before casting polymorphic embed still work" do
232295 for generator <- @ generators do
233296 reminder_module = get_module ( Reminder , generator )
0 commit comments