active_model-better_errors 1.6.3 → 1.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +37 -0
- data/.rspec +4 -1
- data/.ruby-gemset +1 -0
- data/.travis.yml +5 -1
- data/Gemfile +9 -13
- data/Gemfile.devtools +66 -0
- data/Guardfile +32 -0
- data/LICENSE.txt +2 -0
- data/README.md +12 -10
- data/Rakefile +20 -49
- data/active_model-better_errors.gemspec +27 -107
- data/config/devtools.yml +4 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/mutant.yml +3 -0
- data/config/reek.yml +103 -0
- data/config/rubocop.yml +62 -0
- data/config/yardstick.yml +2 -0
- data/lib/active_model/better_errors.rb +64 -4
- data/lib/active_model/better_errors/array_reporter.rb +14 -0
- data/lib/active_model/{error_collecting → better_errors}/emulation.rb +15 -8
- data/lib/active_model/{error_collecting → better_errors}/error_collection.rb +14 -6
- data/lib/active_model/{error_collecting → better_errors}/error_message.rb +16 -5
- data/lib/active_model/{error_collecting → better_errors}/error_message_set.rb +7 -2
- data/lib/active_model/{error_collecting → better_errors}/errors.rb +10 -3
- data/lib/active_model/better_errors/formatter.rb +26 -0
- data/lib/active_model/better_errors/hash_reporter.rb +14 -0
- data/lib/active_model/{error_collecting → better_errors}/human_array_reporter.rb +6 -1
- data/lib/active_model/{error_collecting → better_errors}/human_hash_reporter.rb +8 -3
- data/lib/active_model/better_errors/human_message_formatter.rb +66 -0
- data/lib/active_model/{error_collecting → better_errors}/human_message_reporter.rb +19 -12
- data/lib/active_model/{error_collecting → better_errors}/machine_array_reporter.rb +10 -2
- data/lib/active_model/{error_collecting → better_errors}/machine_hash_reporter.rb +10 -3
- data/lib/active_model/{error_collecting → better_errors}/message_reporter.rb +10 -5
- data/lib/active_model/{error_collecting → better_errors}/reporter.rb +7 -2
- data/lib/active_model/better_errors/version.rb +10 -0
- data/spec/spec_helper.rb +19 -10
- data/spec/support/i18n_deprecation_silence.rb +4 -0
- data/spec/support/models.rb +11 -4
- data/spec/support/string_ext.rb +14 -0
- data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/emulation_spec.rb +8 -6
- data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/error_collection_spec.rb +66 -62
- data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/error_message_set_spec.rb +27 -25
- data/spec/unit/lib/active_model/better_errors/error_message_spec.rb +315 -0
- data/spec/unit/lib/active_model/better_errors/errors_spec.rb +98 -0
- data/spec/unit/lib/active_model/better_errors/human_array_reporter_spec.rb +39 -0
- data/spec/unit/lib/active_model/better_errors/human_hash_reporter_spec.rb +37 -0
- data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/human_message_formatter_spec.rb +13 -7
- data/spec/unit/lib/active_model/better_errors/human_message_reporter_spec.rb +65 -0
- data/spec/unit/lib/active_model/better_errors/machine_array_reporter_spec.rb +45 -0
- data/spec/unit/lib/active_model/better_errors/machine_hash_reporter_spec.rb +45 -0
- data/spec/unit/lib/active_model/better_errors_spec.rb +37 -0
- metadata +98 -143
- data/.document +0 -5
- data/VERSION +0 -1
- data/lib/active_model/error_collecting.rb +0 -49
- data/lib/active_model/error_collecting/array_reporter.rb +0 -9
- data/lib/active_model/error_collecting/core_ext.rb +0 -6
- data/lib/active_model/error_collecting/hash_reporter.rb +0 -9
- data/lib/active_model/error_collecting/human_message_formatter.rb +0 -58
- data/spec/lib/active_model/better_errors_spec.rb +0 -7
- data/spec/lib/active_model/error_collecting/error_message_spec.rb +0 -293
- data/spec/lib/active_model/error_collecting/errors_spec.rb +0 -95
- data/spec/lib/active_model/error_collecting/human_array_reporter_spec.rb +0 -33
- data/spec/lib/active_model/error_collecting/human_hash_reporter_spec.rb +0 -32
- data/spec/lib/active_model/error_collecting/human_message_reporter_spec.rb +0 -61
- data/spec/lib/active_model/error_collecting/machine_array_reporter_spec.rb +0 -40
- data/spec/lib/active_model/error_collecting/machine_hash_reporter_spec.rb +0 -40
- data/spec/lib/active_model/error_collecting_spec.rb +0 -22
- data/test/integration.rb +0 -10
@@ -1,14 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
|
-
describe ActiveModel::
|
5
|
+
describe ActiveModel::BetterErrors::ErrorCollection do
|
4
6
|
subject(:collection) { klass.new(base) }
|
5
|
-
let(:klass) { ActiveModel::
|
7
|
+
let(:klass) { ActiveModel::BetterErrors::ErrorCollection }
|
6
8
|
let(:base) { User.new }
|
7
|
-
let(:errors)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
let(:errors) do
|
10
|
+
{
|
11
|
+
:first_name => [[:too_long, { count: 3 }]],
|
12
|
+
'last_name' => [[:invalid, { message: 'Invalid' }]],
|
13
|
+
:email => [:invalid],
|
14
|
+
}
|
15
|
+
end
|
12
16
|
|
13
17
|
before do
|
14
18
|
errors.each do |attribute, error_list|
|
@@ -18,12 +22,12 @@ describe ActiveModel::ErrorCollecting::ErrorCollection do
|
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
|
-
describe
|
25
|
+
describe '#clear' do
|
22
26
|
before { collection.clear }
|
23
27
|
it { should be_empty }
|
24
28
|
end
|
25
29
|
|
26
|
-
describe
|
30
|
+
describe '#include?' do
|
27
31
|
it { should be_include :first_name }
|
28
32
|
it { should be_include :last_name }
|
29
33
|
it { should be_include :email }
|
@@ -32,82 +36,82 @@ describe ActiveModel::ErrorCollecting::ErrorCollection do
|
|
32
36
|
it { should_not be_include 'email' }
|
33
37
|
end
|
34
38
|
|
35
|
-
describe
|
39
|
+
describe '#get' do
|
36
40
|
subject { collection.get(:first_name) }
|
37
|
-
it { should be_a ActiveModel::
|
41
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessageSet }
|
38
42
|
its(:length) { should be 1 }
|
39
43
|
|
40
|
-
describe
|
44
|
+
describe 'when value is nil' do
|
41
45
|
before { collection.delete :first_name }
|
42
46
|
it { should be nil }
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
46
|
-
describe
|
50
|
+
describe '#set' do
|
47
51
|
subject { collection.get :first_name }
|
48
52
|
|
49
|
-
describe
|
53
|
+
describe 'when value is array' do
|
50
54
|
before { collection.set(:first_name, []) }
|
51
|
-
it { should be_a ActiveModel::
|
55
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessageSet }
|
52
56
|
its(:length) { should be 0 }
|
53
57
|
end
|
54
58
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
describe 'when value is nil' do
|
60
|
+
before { collection.set(:first_name, nil) }
|
61
|
+
it { should be_nil }
|
62
|
+
end
|
59
63
|
end
|
60
64
|
|
61
|
-
describe
|
65
|
+
describe '#delete' do
|
62
66
|
subject { collection.get(:first_name) }
|
63
67
|
before { collection.delete(:first_name) }
|
64
68
|
it { should be_nil }
|
65
69
|
end
|
66
70
|
|
67
|
-
describe
|
71
|
+
describe '#[]' do
|
68
72
|
subject { collection[:first_name] }
|
69
73
|
|
70
|
-
describe
|
74
|
+
describe 'when no error messages' do
|
71
75
|
before { collection.clear }
|
72
76
|
it { should be_blank }
|
73
77
|
it { should_not be_nil }
|
74
|
-
it { should be_a ActiveModel::
|
78
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessageSet }
|
75
79
|
end
|
76
80
|
|
77
|
-
describe
|
81
|
+
describe 'when there are error messages' do
|
78
82
|
it { should_not be_blank }
|
79
83
|
it { should_not be_nil }
|
80
|
-
it { should be_a ActiveModel::
|
84
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessageSet }
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
84
|
-
describe
|
88
|
+
describe '#[]=' do
|
85
89
|
subject(:error_message_set) { collection.get field }
|
86
90
|
|
87
|
-
describe
|
91
|
+
describe 'when assigning existing attribute' do
|
88
92
|
let(:field) { :first_name }
|
89
|
-
it
|
90
|
-
expect
|
93
|
+
it 'should append to existing set' do
|
94
|
+
expect do
|
91
95
|
collection[field] = "I'm invalid."
|
92
|
-
|
96
|
+
end.to change { error_message_set.length }.by(1)
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
96
|
-
describe
|
100
|
+
describe 'when assigning to new attribute' do
|
97
101
|
let(:field) { :a_new_attribute }
|
98
102
|
before { collection[field] = "I'm invalid" }
|
99
103
|
it { should_not be_nil }
|
100
|
-
it { should be_a ActiveModel::
|
104
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessageSet }
|
101
105
|
its(:length) { should be 1 }
|
102
106
|
end
|
103
107
|
end
|
104
108
|
|
105
|
-
describe
|
106
|
-
it
|
109
|
+
describe '#each' do
|
110
|
+
it 'should loop through each error' do
|
107
111
|
count = 0
|
108
112
|
collection.each do |attribute, error|
|
109
113
|
attribute.should be_a Symbol
|
110
|
-
error.should be_a ActiveModel::
|
114
|
+
error.should be_a ActiveModel::BetterErrors::ErrorMessage
|
111
115
|
count += 1
|
112
116
|
end
|
113
117
|
|
@@ -115,51 +119,51 @@ describe ActiveModel::ErrorCollecting::ErrorCollection do
|
|
115
119
|
end
|
116
120
|
end
|
117
121
|
|
118
|
-
describe
|
122
|
+
describe '#size' do
|
119
123
|
subject { collection.size }
|
120
124
|
it { should be 3 }
|
121
125
|
|
122
|
-
describe
|
123
|
-
before { collection[:name] =
|
126
|
+
describe 'when adding one more error' do
|
127
|
+
before { collection[:name] = 'Not Valid' }
|
124
128
|
it { should be 4 }
|
125
129
|
end
|
126
130
|
end
|
127
131
|
|
128
|
-
describe
|
132
|
+
describe '#values' do
|
129
133
|
subject { collection.values }
|
130
134
|
|
131
135
|
it { should be_a Array }
|
132
136
|
its(:length) { should be 3 }
|
133
137
|
|
134
|
-
it
|
138
|
+
it 'should contain ErrorMessageSet as elements' do
|
135
139
|
collection.values.each do |el|
|
136
|
-
el.should be_a ActiveModel::
|
140
|
+
el.should be_a ActiveModel::BetterErrors::ErrorMessageSet
|
137
141
|
end
|
138
142
|
end
|
139
143
|
end
|
140
144
|
|
141
|
-
describe
|
145
|
+
describe '#keys' do
|
142
146
|
subject { collection.keys }
|
143
147
|
it { should == [:first_name, :last_name, :email] }
|
144
148
|
end
|
145
149
|
|
146
|
-
describe
|
150
|
+
describe '#to_a' do
|
147
151
|
subject { collection.to_a }
|
148
152
|
its(:size) { should == 3 }
|
149
153
|
|
150
|
-
describe
|
151
|
-
before { collection[:name] =
|
154
|
+
describe 'when adding one more error' do
|
155
|
+
before { collection[:name] = 'Not Valid' }
|
152
156
|
its(:size) { should == 4 }
|
153
157
|
end
|
154
158
|
|
155
|
-
it
|
159
|
+
it 'should contain ErrorMessage as elements' do
|
156
160
|
collection.to_a.each do |error|
|
157
|
-
error.should be_a ActiveModel::
|
161
|
+
error.should be_a ActiveModel::BetterErrors::ErrorMessage
|
158
162
|
end
|
159
163
|
end
|
160
164
|
end
|
161
165
|
|
162
|
-
describe
|
166
|
+
describe '#to_hash' do
|
163
167
|
subject { collection.to_hash }
|
164
168
|
|
165
169
|
it { should be_a Hash }
|
@@ -167,38 +171,38 @@ describe ActiveModel::ErrorCollecting::ErrorCollection do
|
|
167
171
|
it { should_not be collection.instance_variable_get(:@collection) }
|
168
172
|
end
|
169
173
|
|
170
|
-
describe
|
174
|
+
describe '#empty?' do
|
171
175
|
subject { collection.empty? }
|
172
|
-
it{ should be false }
|
176
|
+
it { should be false }
|
173
177
|
|
174
|
-
describe
|
178
|
+
describe 'after clearing the collection' do
|
175
179
|
before { collection.clear }
|
176
180
|
|
177
181
|
it { should be true }
|
178
182
|
end
|
179
183
|
end
|
180
184
|
|
181
|
-
describe
|
182
|
-
it
|
183
|
-
expect
|
184
|
-
collection.add
|
185
|
-
|
185
|
+
describe '#add' do
|
186
|
+
it 'should add error to collection' do
|
187
|
+
expect do
|
188
|
+
collection.add(:name, 'Invalid')
|
189
|
+
end.to change { collection[:name].length }.by(1)
|
186
190
|
end
|
187
191
|
end
|
188
192
|
|
189
|
-
describe
|
190
|
-
describe
|
193
|
+
describe '#added?' do
|
194
|
+
describe 'when an error message is not added' do
|
191
195
|
subject { collection.added? :name, :not_there }
|
192
196
|
it { should be false }
|
193
197
|
end
|
194
198
|
|
195
|
-
describe
|
196
|
-
subject { collection.added? :first_name, :too_long,
|
199
|
+
describe 'when an error message with the same option is added' do
|
200
|
+
subject { collection.added? :first_name, :too_long, count: 3 }
|
197
201
|
it { should be true }
|
198
202
|
end
|
199
203
|
|
200
|
-
describe
|
201
|
-
subject { collection.added? :first_name, :too_long,
|
204
|
+
describe 'when an error message with the different option is added' do
|
205
|
+
subject { collection.added? :first_name, :too_long, count: 4 }
|
202
206
|
it { should be false }
|
203
207
|
end
|
204
208
|
end
|
@@ -1,66 +1,68 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
|
-
describe ActiveModel::
|
5
|
+
describe ActiveModel::BetterErrors::ErrorMessageSet do
|
4
6
|
subject(:set) { klass.new base, attribute, errors }
|
5
|
-
let(:klass) { ActiveModel::
|
7
|
+
let(:klass) { ActiveModel::BetterErrors::ErrorMessageSet }
|
6
8
|
let(:attribute) { :first_name }
|
7
9
|
let(:errors) { [] }
|
8
10
|
let(:base) { User.new }
|
9
11
|
|
10
|
-
describe
|
11
|
-
context
|
12
|
+
describe '#initialize' do
|
13
|
+
context 'with no errors' do
|
12
14
|
its(:length) { should == 0 }
|
13
15
|
end
|
14
16
|
|
15
|
-
context
|
17
|
+
context 'with one error' do
|
16
18
|
let(:errors) { [:invalid] }
|
17
19
|
its(:length) { should == 1 }
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
describe
|
23
|
+
describe '#push' do
|
22
24
|
before { set.push error, options }
|
23
25
|
let(:error) { :invalid }
|
24
26
|
let(:options) { nil }
|
25
27
|
subject { set.first }
|
26
28
|
|
27
|
-
describe
|
28
|
-
it { should be_a ActiveModel::
|
29
|
-
its(:message) { should
|
29
|
+
describe 'without options' do
|
30
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessage }
|
31
|
+
its(:message) { should be_nil }
|
30
32
|
its(:type) { should == error }
|
31
33
|
end
|
32
34
|
|
33
|
-
describe
|
35
|
+
describe 'with options' do
|
34
36
|
let(:options) { { message: 'Invalid' } }
|
35
37
|
|
36
|
-
it { should be_a ActiveModel::
|
38
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessage }
|
37
39
|
its(:message) { should == options[:message] }
|
38
40
|
its(:type) { should == error }
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
|
-
describe
|
44
|
+
describe '#<<' do
|
43
45
|
before { set << error }
|
44
46
|
subject { set.first }
|
45
47
|
|
46
|
-
describe
|
48
|
+
describe 'when accepting error as a symbol' do
|
47
49
|
let(:error) { :invalid }
|
48
50
|
|
49
|
-
it { should be_a ActiveModel::
|
50
|
-
its(:message) { should
|
51
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessage }
|
52
|
+
its(:message) { should be_nil }
|
51
53
|
its(:type) { should == error }
|
52
54
|
end
|
53
55
|
|
54
|
-
describe
|
55
|
-
let(:error) { [
|
56
|
+
describe 'when accepting error as a tuple' do
|
57
|
+
let(:error) { [:invalid, { message: 'OMG!!' }] }
|
56
58
|
|
57
|
-
it { should be_a ActiveModel::
|
58
|
-
its(:message) { should ==
|
59
|
+
it { should be_a ActiveModel::BetterErrors::ErrorMessage }
|
60
|
+
its(:message) { should == 'OMG!!' }
|
59
61
|
its(:type) { should == :invalid }
|
60
62
|
end
|
61
63
|
end
|
62
64
|
|
63
|
-
describe
|
65
|
+
describe '#to_a' do
|
64
66
|
let(:errors) { [:invalid, :too_long] }
|
65
67
|
subject { set.to_a }
|
66
68
|
|
@@ -68,23 +70,23 @@ describe ActiveModel::ErrorCollecting::ErrorMessageSet do
|
|
68
70
|
its(:length) { should == 2 }
|
69
71
|
end
|
70
72
|
|
71
|
-
describe
|
73
|
+
describe '#empty?' do
|
72
74
|
subject { set.empty? }
|
73
75
|
|
74
|
-
describe
|
76
|
+
describe 'when no error messages' do
|
75
77
|
it { should be_true }
|
76
78
|
end
|
77
79
|
|
78
|
-
describe
|
80
|
+
describe 'when contains error messages' do
|
79
81
|
let(:errors) { [:invalid, :too_long] }
|
80
82
|
it { should be_false }
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
|
-
describe
|
86
|
+
describe '#==' do
|
85
87
|
subject { errors == set }
|
86
88
|
let(:errors) { [:invalid] }
|
87
|
-
let(:expected) { [
|
89
|
+
let(:expected) { ['is invalid'] }
|
88
90
|
specify do
|
89
91
|
set.should == expected
|
90
92
|
end
|
@@ -0,0 +1,315 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe ActiveModel::BetterErrors::ErrorMessage do
|
6
|
+
let(:klass) { ActiveModel::BetterErrors::ErrorMessage }
|
7
|
+
let(:attribute) { :name }
|
8
|
+
let(:base) { User.new }
|
9
|
+
subject(:error_message) { klass.build(base, attribute, message, options) }
|
10
|
+
|
11
|
+
describe '.normalize' do
|
12
|
+
subject { klass.normalize message }
|
13
|
+
context 'when message is a symbol' do
|
14
|
+
let(:message) { :invalid }
|
15
|
+
it { should == message }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when message is nil' do
|
19
|
+
let(:message) { nil }
|
20
|
+
it { should be nil }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when message is a string' do
|
24
|
+
let(:message) { 'bad' }
|
25
|
+
it { should == message }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when message is a proc' do
|
29
|
+
let(:message) { proc { 'bad' } }
|
30
|
+
it { should == 'bad' }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '.identify' do
|
35
|
+
subject { klass.identify message, override }
|
36
|
+
context 'when message is a symbol and' do
|
37
|
+
let(:message) { :invalid }
|
38
|
+
|
39
|
+
context 'when override is a symbol' do
|
40
|
+
let(:override) { :not_good }
|
41
|
+
it { should == [:not_good, nil] }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when override is nil' do
|
45
|
+
let(:override) { nil }
|
46
|
+
it { should == [:invalid, nil] }
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when override is a string' do
|
50
|
+
let(:override) { 'invalid' }
|
51
|
+
it { should == [:invalid, 'invalid'] }
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when override is a proc' do
|
55
|
+
let(:override) { proc { 'Not good' } }
|
56
|
+
it { should == [:invalid, 'Not good'] }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'when message is a string and' do
|
61
|
+
let(:message) { 'Invalid' }
|
62
|
+
|
63
|
+
context 'when override is a symbol' do
|
64
|
+
let(:override) { :not_good }
|
65
|
+
it { should == [:not_good, 'Invalid'] }
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when override is nil' do
|
69
|
+
let(:override) { nil }
|
70
|
+
it { should == [nil, 'Invalid'] }
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when override is a string' do
|
74
|
+
let(:override) { 'not good' }
|
75
|
+
it { should == [nil, 'not good'] }
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when override is a proc' do
|
79
|
+
let(:override) { proc { 'Not Good' } }
|
80
|
+
it { should == [nil, 'Not Good'] }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when message is nil and' do
|
85
|
+
let(:message) { nil }
|
86
|
+
|
87
|
+
context 'when override is a symbol' do
|
88
|
+
let(:override) { :not_good }
|
89
|
+
it { should == [:not_good, nil] }
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'when override is nil' do
|
93
|
+
let(:override) { nil }
|
94
|
+
it { should == [nil, nil] }
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when override is a string' do
|
98
|
+
let(:override) { 'not good' }
|
99
|
+
it { should == [nil, 'not good'] }
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'when override is a proc' do
|
103
|
+
let(:override) { proc { 'Not Good' } }
|
104
|
+
it { should == [nil, 'Not Good'] }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when message is a proc and' do
|
109
|
+
let(:message) { proc { 'invalid' } }
|
110
|
+
|
111
|
+
context 'when override is a symbol' do
|
112
|
+
let(:override) { :not_good }
|
113
|
+
it { should == [:not_good, 'invalid'] }
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when override is nil' do
|
117
|
+
let(:override) { nil }
|
118
|
+
it { should == [nil, 'invalid'] }
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when override is a string' do
|
122
|
+
let(:override) { 'not good' }
|
123
|
+
it { should == [nil, 'not good'] }
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'when override is a proc' do
|
127
|
+
let(:override) { proc { 'Not Good' } }
|
128
|
+
it { should == [nil, 'Not Good'] }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '.build' do
|
134
|
+
context 'when message is a symbol and' do
|
135
|
+
let(:message) { :invalid }
|
136
|
+
|
137
|
+
context 'when options[:message] is a string' do
|
138
|
+
let(:options) { { message: 'Not Really Valid!' } }
|
139
|
+
its(:type) { should == message }
|
140
|
+
its(:message) { should == options[:message] }
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'when options[:message] is a symbol' do
|
144
|
+
let(:options) { { message: :not_really_valid } }
|
145
|
+
its(:type) { should == options[:message] }
|
146
|
+
its(:message) { should be_nil }
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'when options[:message] is nil' do
|
150
|
+
let(:options) { { message: nil } }
|
151
|
+
its(:type) { should == message }
|
152
|
+
its(:message) { should be_nil }
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'when options[:message] is proc' do
|
156
|
+
let(:options) { { message: proc { 'Not Really Valid!' } } }
|
157
|
+
its(:type) { should == message }
|
158
|
+
its(:message) { should == options[:message].call }
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when message is a string and' do
|
163
|
+
let(:message) { 'Invalid!' }
|
164
|
+
|
165
|
+
context 'when options[:message] is a string' do
|
166
|
+
let(:options) { { message: 'Not Really Valid!' } }
|
167
|
+
its(:type) { should be_nil }
|
168
|
+
its(:message) { should == options[:message] }
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'when options[:message] is a symbol' do
|
172
|
+
let(:options) { { message: :not_really_valid } }
|
173
|
+
its(:type) { should == options[:message] }
|
174
|
+
its(:message) { should == message }
|
175
|
+
end
|
176
|
+
|
177
|
+
context 'when options[:message] is nil' do
|
178
|
+
let(:options) { {} }
|
179
|
+
its(:type) { should be_nil }
|
180
|
+
its(:message) { should == message }
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'when options[:message] is proc' do
|
184
|
+
let(:options) { { message: proc { 'Not Really Valid!' } } }
|
185
|
+
its(:type) { should be_nil }
|
186
|
+
its(:message) { should == options[:message].call }
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'when message is a proc and' do
|
191
|
+
let(:message) { proc { 'Invalid!' } }
|
192
|
+
|
193
|
+
context 'when options[:message] is a string' do
|
194
|
+
let(:options) { { message: 'Not Really Valid!' } }
|
195
|
+
its(:type) { should be_nil }
|
196
|
+
its(:message) { should == options[:message] }
|
197
|
+
end
|
198
|
+
|
199
|
+
context 'when options[:message] is a symbol' do
|
200
|
+
let(:options) { { message: :not_really_valid } }
|
201
|
+
its(:type) { should == options[:message] }
|
202
|
+
its(:message) { should == message.call }
|
203
|
+
end
|
204
|
+
|
205
|
+
context 'when options[:message] is nil' do
|
206
|
+
let(:options) { {} }
|
207
|
+
its(:type) { should be_nil }
|
208
|
+
its(:message) { should == message.call }
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'when options[:message] is proc' do
|
212
|
+
let(:options) { { message: proc { 'Not Really Valid!' } } }
|
213
|
+
its(:type) { should be_nil }
|
214
|
+
its(:message) { should == options[:message].call }
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'when message is nil and' do
|
219
|
+
let(:message) { nil }
|
220
|
+
|
221
|
+
context 'when options[:message] is a string' do
|
222
|
+
let(:options) { { message: 'Not Really Valid!' } }
|
223
|
+
its(:type) { should be_nil }
|
224
|
+
its(:message) { should == options[:message] }
|
225
|
+
end
|
226
|
+
|
227
|
+
context 'when options[:message] is a symbol' do
|
228
|
+
let(:options) { { message: :not_really_valid } }
|
229
|
+
its(:type) { should == options[:message] }
|
230
|
+
its(:message) { should be_nil }
|
231
|
+
end
|
232
|
+
|
233
|
+
context 'when options[:message] is nil' do
|
234
|
+
let(:options) { {} }
|
235
|
+
its(:type) { should be_nil }
|
236
|
+
its(:message) { should be_nil }
|
237
|
+
end
|
238
|
+
|
239
|
+
context 'when options[:message] is proc' do
|
240
|
+
let(:options) { { message: proc { 'Not Really Valid!' } } }
|
241
|
+
its(:type) { should be_nil }
|
242
|
+
its(:message) { should == options[:message].call }
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
[
|
247
|
+
:if, :unless, :on, :allow_nil, :allow_blank, :strict, :message
|
248
|
+
].each do |field|
|
249
|
+
context "when options includes :#{field}" do
|
250
|
+
let(:message) { :invalid }
|
251
|
+
let(:options) { {} }
|
252
|
+
before { options[field] = proc {} }
|
253
|
+
its(:options) { should == {} }
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe '#initialize' do
|
259
|
+
let(:message) { :invalid }
|
260
|
+
let(:options) { { message: 'Invalid!', count: 12 } }
|
261
|
+
|
262
|
+
its(:options) { should == { count: 12 } }
|
263
|
+
its(:attribute) { should == attribute }
|
264
|
+
end
|
265
|
+
|
266
|
+
describe '#to_hash' do
|
267
|
+
let(:message) { :invalid }
|
268
|
+
let(:options) { {} }
|
269
|
+
let(:expected) do
|
270
|
+
{ attribute: attribute, type: :invalid, message: nil, options: {} }
|
271
|
+
end
|
272
|
+
|
273
|
+
its(:to_hash) { should == expected }
|
274
|
+
end
|
275
|
+
|
276
|
+
describe '#as_json' do
|
277
|
+
let(:message) { :invalid }
|
278
|
+
let(:options) { {} }
|
279
|
+
let(:expected) do
|
280
|
+
{ attribute: attribute, type: :invalid, message: nil, options: {} }
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'should respond to as_json taking json arguments' do
|
284
|
+
subject.as_json(test: :arguments).should == expected
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
describe '#<=>' do
|
289
|
+
subject { e1 <=> e2 }
|
290
|
+
|
291
|
+
context 'when attribute is different' do
|
292
|
+
let(:e1) { klass.build base, :name, :invalid }
|
293
|
+
let(:e2) { klass.build base, :name1, :invalid }
|
294
|
+
it { should be_nil }
|
295
|
+
end
|
296
|
+
|
297
|
+
context 'when type is different' do
|
298
|
+
let(:e1) { klass.build base, :name, :invalid }
|
299
|
+
let(:e2) { klass.build base, :name, :invalid1 }
|
300
|
+
it { should be_nil }
|
301
|
+
end
|
302
|
+
|
303
|
+
context 'when message is different' do
|
304
|
+
let(:e1) { klass.build base, :name, :invalid, message: 'a' }
|
305
|
+
let(:e2) { klass.build base, :name, :invalid, message: 'b' }
|
306
|
+
it { should be_nil }
|
307
|
+
end
|
308
|
+
|
309
|
+
context 'when it is the same' do
|
310
|
+
let(:e1) { klass.build base, :name, :invalid }
|
311
|
+
let(:e2) { klass.build base, :name, :invalid }
|
312
|
+
it { should == 0 }
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|