diff --git a/test/phoenix_html/form_test.exs b/test/phoenix_html/form_test.exs index f772aad..cb11c45 100644 --- a/test/phoenix_html/form_test.exs +++ b/test/phoenix_html/form_test.exs @@ -288,4 +288,194 @@ defmodule Phoenix.HTML.FormTest do ~s() <> ~s() end end + + describe "to_form/4" do + defp nested_form(field, opts \\ []) do + map = %{ + "date" => %{"year" => "2020", "month" => "4", "day" => "17"}, + "dates" => %{ + "0" => %{"year" => "2010", "month" => "4", "day" => "17"}, + "1" => %{"year" => "2020", "month" => "4", "day" => "17"} + } + } + + form = Phoenix.HTML.FormData.to_form(map, as: "search") + Phoenix.HTML.FormData.to_form(map, form, field, opts) + end + + ## Cardinality one + + test "one: without default and field is not present" do + [f] = nested_form(:unknown) + assert f.index == nil + assert f.impl == Phoenix.HTML.FormData.Map + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_year", + name: "search[unknown][year]", + field: :year, + value: nil + } = f[:year] + end + + test "one: without default and field is present" do + [f] = nested_form(:date) + + assert %Phoenix.HTML.FormField{ + id: "search_date_year", + name: "search[date][year]", + field: :year, + value: "2020" + } = f[:year] + end + + test "one: with default and field is not present" do + [f] = nested_form(:unknown, default: %{year: 2015}) + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_year", + name: "search[unknown][year]", + field: :year, + value: 2015 + } = f[:year] + end + + test "one: with default and field is present" do + [f] = nested_form(:date, default: %{year: 2015}) + + assert %Phoenix.HTML.FormField{ + id: "search_date_year", + name: "search[date][year]", + field: :year, + value: "2020" + } = f[:year] + end + + test "one: with custom name and id" do + [f] = nested_form(:date, as: :foo, id: :bar) + + assert %Phoenix.HTML.FormField{ + id: "bar_year", + name: "foo[year]", + field: :year, + value: "2020" + } = f[:year] + end + + # ## Cardinality many + + test "many: with defaults" do + [f1, f2] = nested_form(:unknown, default: [%{}, %{}]) + + assert f1.index == 0 + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_0_year", + name: "search[unknown][0][year]", + field: :year, + value: nil + } = f1[:year] + + assert f2.index == 1 + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_1_year", + name: "search[unknown][1][year]", + field: :year, + value: nil + } = f2[:year] + end + + test "many: with default and field is present" do + [f1, f2] = nested_form(:dates, default: [%{year: 1000}, %{year: 1001}]) + + assert %Phoenix.HTML.FormField{ + id: "search_dates_0_year", + name: "search[dates][0][year]", + field: :year, + value: "2010" + } = f1[:year] + + assert %Phoenix.HTML.FormField{ + id: "search_dates_1_year", + name: "search[dates][1][year]", + field: :year, + value: "2020" + } = f2[:year] + end + + test "many: with name and id" do + [f1, f2] = nested_form(:dates, default: [%{year: 1000}, %{year: 1001}], as: :foo, id: :bar) + + assert %Phoenix.HTML.FormField{ + id: "bar_0_year", + name: "foo[0][year]", + field: :year, + value: "2010" + } = f1[:year] + + assert %Phoenix.HTML.FormField{ + id: "bar_1_year", + name: "foo[1][year]", + field: :year, + value: "2020" + } = f2[:year] + end + + @prepend_append [ + prepend: [%{year: 2008}], + append: [%{year: 2022}], + default: [%{year: 2012}, %{year: 2018}] + ] + + test "many: inputs_for/4 with prepend/append and field is not present" do + [f0, f1, f2, f3] = nested_form(:unknown, @prepend_append) + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_0_year", + name: "search[unknown][0][year]", + field: :year, + value: 2008 + } = f0[:year] + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_1_year", + name: "search[unknown][1][year]", + field: :year, + value: 2012 + } = f1[:year] + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_2_year", + name: "search[unknown][2][year]", + field: :year, + value: 2018 + } = f2[:year] + + assert %Phoenix.HTML.FormField{ + id: "search_unknown_3_year", + name: "search[unknown][3][year]", + field: :year, + value: 2022 + } = f3[:year] + end + + test "many: with prepend/append and field is present" do + [f1, f2] = nested_form(:dates, @prepend_append) + + assert %Phoenix.HTML.FormField{ + id: "search_dates_0_year", + name: "search[dates][0][year]", + field: :year, + value: "2010" + } = f1[:year] + + assert %Phoenix.HTML.FormField{ + id: "search_dates_1_year", + name: "search[dates][1][year]", + field: :year, + value: "2020" + } = f2[:year] + end + end end