From 0efb6971ae4e740247e951dbed9f4d09b23dbe01 Mon Sep 17 00:00:00 2001 From: Anastasiya Dyachenko Date: Wed, 15 Aug 2018 23:10:09 +0300 Subject: [PATCH 1/3] nested map --- lib/vex/extract.ex | 4 +++ test/validations/nested_test.exs | 61 ++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 14 deletions(-) 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..ddbef11 100644 --- a/test/validations/nested_test.exs +++ b/test/validations/nested_test.exs @@ -8,25 +8,58 @@ end defmodule NestedTest do use ExUnit.Case - test "nested" do - assert Vex.valid?([author: [name: "Foo"]], %{[:author, :name] => [presence: true]}) + describe "keyword list" do + test "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]}) - end + nested_errors_list = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_list == Vex.errors([author: [name: ""]], %{[:author, :name] => [presence: true]}) - test "nested with _vex" do - assert Vex.valid?([author: [name: "Foo"], _vex: %{[: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 - nested_errors = [{:error, [:author, :name], :presence, "must be present"}] - assert nested_errors == Vex.errors([author: [name: ""], _vex: %{[:author, :name] => [presence: true]}]) - end + test "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_list = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_list == Vex.errors([author: [name: ""], _vex: %{[:author, :name] => [presence: true]}]) - test "nested in Record" do - assert Vex.valid?(%NestedTestRecord{author: [name: "Foo"]}) + nested_errors_mixed = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors_mixed == Vex.errors([author: %{name: ""}, _vex: %{[:author, :name] => [presence: true]}]) + end - nested_errors = [{:error, [:author, :name], :presence, "must be present"}] - assert nested_errors == Vex.errors(%NestedTestRecord{author: [name: ""]}) + test "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 + describe "map" do + test "nested " do + 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]}) + end + + test "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]}]) + end + + test "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 end From 5fb4f1f88bfa77e85c7628b660c1cd2d552467cb Mon Sep 17 00:00:00 2001 From: Anastasiya Dyachenko Date: Wed, 15 Aug 2018 23:12:37 +0300 Subject: [PATCH 2/3] more tests --- test/validations/nested_test.exs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/validations/nested_test.exs b/test/validations/nested_test.exs index ddbef11..990ba6e 100644 --- a/test/validations/nested_test.exs +++ b/test/validations/nested_test.exs @@ -42,17 +42,24 @@ defmodule NestedTest do describe "map" do test "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_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 "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_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 "nested in Record" do From 3117af59ea34a9c1c0f6045bfe35c03b48eda5d5 Mon Sep 17 00:00:00 2001 From: Anastasiya Dyachenko Date: Wed, 15 Aug 2018 23:14:34 +0300 Subject: [PATCH 3/3] without descibe --- test/validations/nested_test.exs | 84 +++++++++++++++----------------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/test/validations/nested_test.exs b/test/validations/nested_test.exs index 990ba6e..adfd8fa 100644 --- a/test/validations/nested_test.exs +++ b/test/validations/nested_test.exs @@ -8,65 +8,61 @@ end defmodule NestedTest do use ExUnit.Case - describe "keyword list" do - test "nested" do - assert Vex.valid?([author: [name: "Foo"]], %{[:author, :name] => [presence: true]}) - assert Vex.valid?([author: %{name: "Foo"}], %{[:author, :name] => [presence: true]}) + 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_list = [{:error, [:author, :name], :presence, "must be present"}] - assert nested_errors_list == 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 + 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 - assert Vex.valid?([author: [name: "Foo"], _vex: %{[:author, :name] => [presence: true]}]) - assert Vex.valid?([author: %{name: "Foo"}, _vex: %{[:author, :name] => [presence: true]}]) + 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_list = [{:error, [:author, :name], :presence, "must be present"}] - assert nested_errors_list == 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 + 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 - assert Vex.valid?(%NestedTestRecord{author: [name: "Foo"]}) + 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 + nested_errors = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors == Vex.errors(%NestedTestRecord{author: [name: ""]}) end - describe "map" do - test "nested " do - assert Vex.valid?(%{author: %{name: "Foo"}}, %{[:author, :name] => [presence: true]}) - assert Vex.valid?(%{author: [name: "Foo"]}, %{[:author, :name] => [presence: true]}) + 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_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 + 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 - assert Vex.valid?(%{author: %{name: "Foo"}, _vex: %{[:author, :name] => [presence: true]}}) - assert Vex.valid?(%{author: [name: "Foo"], _vex: %{[:author, :name] => [presence: true]}}) + 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_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 + 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 - assert Vex.valid?(%NestedTestRecord{author: %{name: "Foo"}}) + 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 + nested_errors = [{:error, [:author, :name], :presence, "must be present"}] + assert nested_errors == Vex.errors(%NestedTestRecord{author: %{name: ""}}) end end