diff --git a/lib/vex/extract.ex b/lib/vex/extract.ex index 6991774..e28e3e3 100644 --- a/lib/vex/extract.ex +++ b/lib/vex/extract.ex @@ -25,6 +25,10 @@ defimpl Vex.Extract, for: Map do def settings(map) do Map.get(map, :_vex) end + + def attribute(map, path) when is_list(path) do + get_in map, path + end def attribute(map, name) do Map.get(map, name) end diff --git a/test/validations/nested_test.exs b/test/validations/nested_test.exs index 1ae3218..adfd8fa 100644 --- a/test/validations/nested_test.exs +++ b/test/validations/nested_test.exs @@ -8,25 +8,61 @@ end defmodule NestedTest do use ExUnit.Case - test "nested" do + test "keyword list, nested" do assert Vex.valid?([author: [name: "Foo"]], %{[:author, :name] => [presence: true]}) + assert Vex.valid?([author: %{name: "Foo"}], %{[:author, :name] => [presence: true]}) - nested_errors = [{:error, [:author, :name], :presence, "must be present"}] - assert nested_errors == Vex.errors([author: [name: ""]], %{[:author, :name] => [presence: true]}) + nested_errors_list = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_list == Vex.errors([author: [name: ""]], %{[:author, :name] => [presence: true]}) + + nested_errors_mixed = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_mixed == Vex.errors([author: %{name: ""}], %{[:author, :name] => [presence: true]}) end - test "nested with _vex" do + test "keyword list, nested with _vex" do assert Vex.valid?([author: [name: "Foo"], _vex: %{[:author, :name] => [presence: true]}]) + assert Vex.valid?([author: %{name: "Foo"}, _vex: %{[:author, :name] => [presence: true]}]) - nested_errors = [{:error, [:author, :name], :presence, "must be present"}] - assert nested_errors == Vex.errors([author: [name: ""], _vex: %{[:author, :name] => [presence: true]}]) + nested_errors_list = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_list == Vex.errors([author: [name: ""], _vex: %{[:author, :name] => [presence: true]}]) + + nested_errors_mixed = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_mixed == Vex.errors([author: %{name: ""}, _vex: %{[:author, :name] => [presence: true]}]) end - test "nested in Record" do + test "keyword list, nested in Record" do assert Vex.valid?(%NestedTestRecord{author: [name: "Foo"]}) nested_errors = [{:error, [:author, :name], :presence, "must be present"}] assert nested_errors == Vex.errors(%NestedTestRecord{author: [name: ""]}) end + test "map, nested" do + assert Vex.valid?(%{author: %{name: "Foo"}}, %{[:author, :name] => [presence: true]}) + assert Vex.valid?(%{author: [name: "Foo"]}, %{[:author, :name] => [presence: true]}) + + nested_errors_map = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_map == Vex.errors(%{author: %{name: ""}}, %{[:author, :name] => [presence: true]}) + + nested_errors_mixed = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_mixed == Vex.errors(%{author: [name: ""]}, %{[:author, :name] => [presence: true]}) + end + + test "map, nested with _vex" do + assert Vex.valid?(%{author: %{name: "Foo"}, _vex: %{[:author, :name] => [presence: true]}}) + assert Vex.valid?(%{author: [name: "Foo"], _vex: %{[:author, :name] => [presence: true]}}) + + nested_errors_map = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_map == Vex.errors(%{author: %{name: ""}, _vex: %{[:author, :name] => [presence: true]}}) + + nested_errors_mixed = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_mixed == Vex.errors(%{author: [name: ""], _vex: %{[:author, :name] => [presence: true]}}) + end + + test "map, nested in Record" do + assert Vex.valid?(%NestedTestRecord{author: %{name: "Foo"}}) + + nested_errors = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors == Vex.errors(%NestedTestRecord{author: %{name: ""}}) + end end