/
validation_error_collection_spec.rb
175 lines (160 loc) · 6.61 KB
/
validation_error_collection_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
require File.dirname(__FILE__) + "/../spec_helper"
describe Braintree::ValidationErrorCollection do
describe "initialize" do
it "builds an error object given an array of hashes" do
hash = {:errors => [{ :attribute => "some model attribute", :code => 1, :message => "bad juju" }]}
collection = Braintree::ValidationErrorCollection.new(hash)
error = collection[0]
error.attribute.should == "some model attribute"
error.code.should == 1
error.message.should == "bad juju"
end
end
describe "for" do
it "provides access to nested errors" do
hash = {
:errors => [{ :attribute => "some model attribute", :code => 1, :message => "bad juju" }],
:nested => {
:errors => [{ :attribute => "number", :code => 2, :message => "badder juju"}]
}
}
errors = Braintree::ValidationErrorCollection.new(hash)
errors.for(:nested).on(:number)[0].code.should == 2
errors.for(:nested).on(:number)[0].message.should == "badder juju"
errors.for(:nested).on(:number)[0].attribute.should == "number"
end
end
describe "inspect" do
it "shows the errors at the current level" do
errors = Braintree::ValidationErrorCollection.new(:errors => [
{:attribute => "name", :code => "code1", :message => "message1"},
{:attribute => "name", :code => "code2", :message => "message2"}
])
errors.inspect.should == "#<Braintree::ValidationErrorCollection errors:[(code1) message1, (code2) message2]>"
end
it "shows errors 1 level deep" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [
{:attribute => "name", :code => "code1", :message => "message1"},
],
:level1 => {
:errors => [{:attribute => "name", :code => "code2", :message => "message2"}]
}
)
errors.inspect.should == "#<Braintree::ValidationErrorCollection errors:[(code1) message1], level1:[(code2) message2]>"
end
it "shows errors 2 levels deep" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [
{:attribute => "name", :code => "code1", :message => "message1"},
],
:level1 => {
:errors => [{:attribute => "name", :code => "code2", :message => "message2"}],
:level2 => {
:errors => [{:attribute => "name", :code => "code3", :message => "message3"}],
}
}
)
errors.inspect.should == "#<Braintree::ValidationErrorCollection errors:[(code1) message1], level1:[(code2) message2], level1/level2:[(code3) message3]>"
end
end
describe "on" do
it "returns an array of errors on the given attribute" do
errors = Braintree::ValidationErrorCollection.new(:errors => [
{:attribute => "name", :code => 1, :message => "is too long"},
{:attribute => "name", :code => 2, :message => "contains invalid chars"},
{:attribute => "not name", :code => 3, :message => "is invalid"}
])
errors.on("name").size.should == 2
errors.on("name").map{ |e| e.code }.should == [1, 2]
end
it "has indifferent access" do
errors = Braintree::ValidationErrorCollection.new(:errors => [
{ :attribute => "name", :code => 3, :message => "is too long" },
])
errors.on(:name).size.should == 1
errors.on(:name)[0].code.should == 3
end
end
describe "deep_size" do
it "returns the size for a non-nested collection" do
errors = Braintree::ValidationErrorCollection.new(:errors => [
{:attribute => "one", :code => 1, :message => "is too long"},
{:attribute => "two", :code => 2, :message => "contains invalid chars"},
{:attribute => "thr", :code => 3, :message => "is invalid"}
])
errors.deep_size.should == 3
end
it "returns the size of nested errors as well" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [{ :attribute => "some model attribute", :code => 1, :message => "bad juju" }],
:nested => {
:errors => [{ :attribute => "number", :code => 2, :message => "badder juju"}]
}
)
errors.deep_size.should == 2
end
it "returns the size of multiple nestings of errors" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [
{ :attribute => "one", :code => 1, :message => "bad juju" },
{ :attribute => "two", :code => 1, :message => "bad juju" }],
:nested => {
:errors => [{ :attribute => "three", :code => 2, :message => "badder juju"}],
:nested_again => {
:errors => [{ :attribute => "four", :code => 2, :message => "badder juju"}]
}
},
:same_level => {
:errors => [{ :attribute => "five", :code => 2, :message => "badder juju"}],
}
)
errors.deep_size.should == 5
end
end
describe "deep_errors" do
it "returns errors from all levels" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [
{ :attribute => "one", :code => 1, :message => "bad juju" },
{ :attribute => "two", :code => 2, :message => "bad juju" }],
:nested => {
:errors => [{ :attribute => "three", :code => 3, :message => "badder juju"}],
:nested_again => {
:errors => [{ :attribute => "four", :code => 4, :message => "badder juju"}]
}
},
:same_level => {
:errors => [{ :attribute => "five", :code => 5, :message => "badder juju"}],
}
)
errors.deep_errors.map { |e| e.code }.sort.should == [1, 2, 3, 4, 5]
end
end
describe "shallow_errors" do
it "returns errors on one level" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [
{ :attribute => "one", :code => 1, :message => "bad juju" },
{ :attribute => "two", :code => 2, :message => "bad juju" }],
:nested => {
:errors => [{ :attribute => "three", :code => 3, :message => "badder juju"}],
:nested_again => {
:errors => [{ :attribute => "four", :code => 4, :message => "badder juju"}]
}
}
)
errors.shallow_errors.map {|e| e.code}.should == [1, 2]
errors.for(:nested).shallow_errors.map {|e| e.code}.should == [3]
end
it "returns an clone of the real array" do
errors = Braintree::ValidationErrorCollection.new(
:errors => [
{ :attribute => "one", :code => 1, :message => "bad juju" },
{ :attribute => "two", :code => 2, :message => "bad juju" }]
)
errors.shallow_errors.pop
errors.shallow_errors.map {|e| e.code}.should == [1, 2]
end
end
end