instructure-active_model-better_errors 1.6.3.rails2.5 → 1.6.5.rails2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +37 -0
  3. data/.rspec +4 -1
  4. data/.ruby-gemset +1 -0
  5. data/.travis.yml +5 -1
  6. data/Gemfile +9 -11
  7. data/Gemfile.devtools +66 -0
  8. data/Guardfile +32 -0
  9. data/LICENSE.txt +2 -0
  10. data/README.md +12 -10
  11. data/Rakefile +20 -49
  12. data/config/devtools.yml +4 -0
  13. data/config/flay.yml +3 -0
  14. data/config/flog.yml +2 -0
  15. data/config/mutant.yml +3 -0
  16. data/config/reek.yml +103 -0
  17. data/config/rubocop.yml +62 -0
  18. data/config/yardstick.yml +2 -0
  19. data/instructure-active_model-better_errors.gemspec +25 -112
  20. data/lib/active_model/better_errors/array_reporter.rb +14 -0
  21. data/lib/active_model/{error_collecting → better_errors}/emulation.rb +13 -6
  22. data/lib/active_model/{error_collecting → better_errors}/error_collection.rb +14 -6
  23. data/lib/active_model/{error_collecting → better_errors}/error_message.rb +12 -5
  24. data/lib/active_model/{error_collecting → better_errors}/error_message_set.rb +7 -2
  25. data/lib/active_model/{error_collecting → better_errors}/errors.rb +10 -3
  26. data/lib/active_model/better_errors/formatter.rb +26 -0
  27. data/lib/active_model/better_errors/hash_reporter.rb +14 -0
  28. data/lib/active_model/{error_collecting → better_errors}/human_array_reporter.rb +6 -1
  29. data/lib/active_model/{error_collecting → better_errors}/human_hash_reporter.rb +8 -3
  30. data/lib/active_model/{error_collecting → better_errors}/human_message_formatter.rb +16 -20
  31. data/lib/active_model/{error_collecting → better_errors}/human_message_reporter.rb +19 -12
  32. data/lib/active_model/{error_collecting → better_errors}/machine_array_reporter.rb +10 -2
  33. data/lib/active_model/{error_collecting → better_errors}/machine_hash_reporter.rb +10 -3
  34. data/lib/active_model/{error_collecting → better_errors}/message_reporter.rb +10 -5
  35. data/lib/active_model/{error_collecting → better_errors}/reporter.rb +7 -2
  36. data/lib/active_model/better_errors/version.rb +10 -0
  37. data/lib/active_model/better_errors.rb +67 -3
  38. data/spec/spec_helper.rb +21 -14
  39. data/spec/support/string_ext.rb +14 -0
  40. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/emulation_spec.rb +8 -6
  41. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/error_collection_spec.rb +66 -62
  42. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/error_message_set_spec.rb +27 -25
  43. data/spec/unit/lib/active_model/better_errors/error_message_spec.rb +315 -0
  44. data/spec/unit/lib/active_model/better_errors/errors_spec.rb +98 -0
  45. data/spec/unit/lib/active_model/better_errors/human_array_reporter_spec.rb +39 -0
  46. data/spec/unit/lib/active_model/better_errors/human_hash_reporter_spec.rb +37 -0
  47. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/human_message_formatter_spec.rb +13 -7
  48. data/spec/unit/lib/active_model/better_errors/human_message_reporter_spec.rb +58 -0
  49. data/spec/unit/lib/active_model/better_errors/machine_array_reporter_spec.rb +45 -0
  50. data/spec/unit/lib/active_model/better_errors/machine_hash_reporter_spec.rb +45 -0
  51. data/spec/unit/lib/active_model/better_errors_spec.rb +37 -0
  52. metadata +79 -171
  53. data/.document +0 -5
  54. data/VERSION +0 -1
  55. data/lib/active_model/error_collecting/array_reporter.rb +0 -9
  56. data/lib/active_model/error_collecting/hash_reporter.rb +0 -9
  57. data/lib/active_model/error_collecting.rb +0 -47
  58. data/spec/lib/active_model/better_errors_spec.rb +0 -7
  59. data/spec/lib/active_model/error_collecting/error_message_spec.rb +0 -309
  60. data/spec/lib/active_model/error_collecting/errors_spec.rb +0 -95
  61. data/spec/lib/active_model/error_collecting/human_array_reporter_spec.rb +0 -33
  62. data/spec/lib/active_model/error_collecting/human_hash_reporter_spec.rb +0 -32
  63. data/spec/lib/active_model/error_collecting/human_message_reporter_spec.rb +0 -61
  64. data/spec/lib/active_model/error_collecting/machine_array_reporter_spec.rb +0 -40
  65. data/spec/lib/active_model/error_collecting/machine_hash_reporter_spec.rb +0 -40
  66. data/spec/lib/active_model/error_collecting_spec.rb +0 -22
  67. data/test/integration.rb +0 -10
@@ -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
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ActiveModel::BetterErrors::Errors do
6
+ subject(:instance) { klass.new base }
7
+ let(:klass) { ActiveModel::BetterErrors::Errors }
8
+ let(:base) { User.new }
9
+ let(:reporter_name) { :mock }
10
+ let(:mock_reporter) do
11
+ Class.new do
12
+ def initialize(collection)
13
+ end
14
+ end
15
+ end
16
+
17
+ before { ActiveModel::BetterErrors.set_reporter(:mock, mock_reporter) }
18
+ after { ActiveModel::BetterErrors.set_reporter(:mock, nil) }
19
+
20
+ describe '#initialize' do
21
+ its(:base) { should be base }
22
+ end
23
+
24
+ describe '#error_collection' do
25
+ subject { instance.error_collection }
26
+ it { should be_a ActiveModel::BetterErrors::ErrorCollection }
27
+ its(:base) { should be base }
28
+ end
29
+
30
+ describe '#message_reporter' do
31
+ subject { instance.message_reporter }
32
+ before do
33
+ instance
34
+ .should_receive(:get_reporter)
35
+ .with(:message)
36
+ .and_return(mock_reporter)
37
+ end
38
+
39
+ it { should be mock_reporter }
40
+ end
41
+
42
+ describe '#hash_reporter' do
43
+ subject { instance.hash_reporter }
44
+ before do
45
+ instance
46
+ .should_receive(:get_reporter)
47
+ .with(:hash)
48
+ .and_return(mock_reporter)
49
+ end
50
+
51
+ it { should be mock_reporter }
52
+ end
53
+
54
+ describe '#array_reporter' do
55
+ subject { instance.array_reporter }
56
+ before do
57
+ instance
58
+ .should_receive(:get_reporter)
59
+ .with(:array)
60
+ .and_return(mock_reporter)
61
+ end
62
+
63
+ it { should be mock_reporter }
64
+ end
65
+
66
+ describe '#set_reporter' do
67
+ before { instance.get_reporter(:mock) }
68
+ it 'should set the reporter class' do
69
+ instance.set_reporter reporter_name, mock_reporter
70
+ reporter_classes = instance.instance_variable_get(:@reporter_classes)
71
+ reporter_classes[reporter_name.to_s].should == mock_reporter
72
+ end
73
+
74
+ it 'should delete old reporter instance' do
75
+ reporters = instance.instance_variable_get(:@reporters)
76
+ reporters[reporter_name] = double
77
+ instance.set_reporter reporter_name, mock_reporter
78
+ reporters.key?(reporter_name.to_s).should be false
79
+ end
80
+ end
81
+
82
+ describe '#get_reporter_class' do
83
+ subject { instance.get_reporter_class(reporter_name) }
84
+ before { instance.set_reporter reporter_name, mock_reporter }
85
+ it { should == mock_reporter }
86
+ end
87
+
88
+ describe '#get_reporter' do
89
+ subject { instance.get_reporter(reporter_name) }
90
+ before { instance.set_reporter reporter_name, mock_reporter }
91
+ it { should be_a mock_reporter }
92
+ end
93
+
94
+ describe '#reporter_classes' do
95
+ subject { instance.reporter_classes }
96
+ it { should == ::ActiveModel::BetterErrors.reporters }
97
+ end
98
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ActiveModel::BetterErrors::HumanArrayReporter do
6
+ subject { reporter }
7
+ let(:reporter) { klass.new collection }
8
+ let(:klass) { ActiveModel::BetterErrors::HumanArrayReporter }
9
+ let(:collection) { ActiveModel::BetterErrors::ErrorCollection.new base }
10
+ let(:base) { User.new }
11
+
12
+ describe '#initialize' do
13
+ its(:collection) { should be collection }
14
+ end
15
+
16
+ describe '#base' do
17
+ its(:base) { should be base }
18
+ end
19
+
20
+ describe '#to_a' do
21
+ subject { reporter.to_a }
22
+ let(:expected) do
23
+ %w(foo bar)
24
+ end
25
+
26
+ before do
27
+ message_reporter = double
28
+ ActiveModel::BetterErrors::HumanMessageReporter
29
+ .should_receive(:new)
30
+ .and_return(message_reporter)
31
+
32
+ message_reporter
33
+ .should_receive(:full_messages)
34
+ .and_return(expected)
35
+ end
36
+
37
+ it { should == expected }
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ActiveModel::BetterErrors::HumanHashReporter do
6
+ subject { reporter }
7
+ let(:reporter) { klass.new collection }
8
+ let(:klass) { ActiveModel::BetterErrors::HumanHashReporter }
9
+ let(:collection) { ActiveModel::BetterErrors::ErrorCollection.new base }
10
+ let(:base) { User.new }
11
+
12
+ describe '#initialize' do
13
+ its(:collection) { should be collection }
14
+ end
15
+
16
+ describe '#base' do
17
+ its(:base) { should be base }
18
+ end
19
+
20
+ describe '#to_hash' do
21
+ subject { reporter.to_hash }
22
+ let(:expected) do
23
+ {
24
+ first_name: ['is invalid', "can't be empty"],
25
+ last_name: ['is invalid']
26
+ }
27
+ end
28
+
29
+ before do
30
+ collection[:first_name] << :invalid
31
+ collection[:first_name] << :empty
32
+ collection[:last_name] << :invalid
33
+ end
34
+
35
+ it { should == expected }
36
+ end
37
+ end
@@ -1,12 +1,18 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe ActiveModel::ErrorCollecting::HumanMessageFormatter do
5
+ describe ActiveModel::BetterErrors::HumanMessageFormatter do
4
6
  subject(:formatter) { klass.new base, error_message }
5
- let(:klass) { ActiveModel::ErrorCollecting::HumanMessageFormatter }
7
+ let(:klass) { ActiveModel::BetterErrors::HumanMessageFormatter }
6
8
  let(:base) { User.new }
7
- let(:error_message) { ActiveModel::ErrorCollecting::ErrorMessage.build base, :first_name, :invalid }
9
+ let(:error_message) do
10
+ ActiveModel::BetterErrors::ErrorMessage.build(
11
+ base, :first_name, :invalid
12
+ )
13
+ end
8
14
 
9
- describe "#initialize" do
15
+ describe '#initialize' do
10
16
  its(:base) { should be base }
11
17
  its(:error_message) { should be error_message }
12
18
  its(:attribute) { should be error_message.attribute }
@@ -15,8 +21,8 @@ describe ActiveModel::ErrorCollecting::HumanMessageFormatter do
15
21
  its(:options) { should be error_message.options }
16
22
  end
17
23
 
18
- describe "#format_message" do
24
+ describe '#format_message' do
19
25
  subject { formatter.format_message }
20
- it { should == "is invalid" }
26
+ it { should == 'is invalid' }
21
27
  end
22
- end
28
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ActiveModel::BetterErrors::HumanMessageReporter do
6
+ subject { reporter }
7
+ let(:reporter) { klass.new collection }
8
+ let(:klass) { ActiveModel::BetterErrors::HumanMessageReporter }
9
+ let(:collection) { ActiveModel::BetterErrors::ErrorCollection.new base }
10
+ let(:base) { User.new }
11
+
12
+ describe '#initialize' do
13
+ its(:collection) { should be collection }
14
+ end
15
+
16
+ describe '#base' do
17
+ its(:base) { should be base }
18
+ end
19
+
20
+ describe '#full_message' do
21
+ subject { reporter.full_message attribute, message }
22
+ let(:attribute) { :first_name }
23
+ let(:message) { 'is invalid' }
24
+
25
+ it { should == 'First name is invalid' }
26
+ end
27
+
28
+ describe '#full_messages' do
29
+ subject { reporter.full_messages }
30
+ let(:expected) do
31
+ [
32
+ 'First name is invalid',
33
+ "First name can't be empty",
34
+ 'Last name is invalid'
35
+ ]
36
+ end
37
+
38
+ before do
39
+ collection[:first_name] << :invalid
40
+ collection[:first_name] << :empty
41
+ collection[:last_name] << :invalid
42
+ end
43
+
44
+ it { should == expected }
45
+ end
46
+
47
+ describe '#generate_message' do
48
+ subject { reporter.generate_message attribute, type, options }
49
+ let(:attribute) { :first_name }
50
+
51
+ context 'when passing symbols as message' do
52
+ let(:type) { :too_short }
53
+ let(:options) { { count: 3 } }
54
+ let(:expected) { 'is too short (minimum is 3 characters)' }
55
+ it { should == expected }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ActiveModel::BetterErrors::MachineArrayReporter do
6
+ subject { reporter }
7
+ let(:reporter) { klass.new collection }
8
+ let(:klass) { ActiveModel::BetterErrors::MachineArrayReporter }
9
+ let(:collection) { ActiveModel::BetterErrors::ErrorCollection.new base }
10
+ let(:base) { User.new }
11
+
12
+ describe '#initialize' do
13
+ its(:collection) { should be collection }
14
+ end
15
+
16
+ describe '#base' do
17
+ its(:base) { should be base }
18
+ end
19
+
20
+ describe '#to_a' do
21
+ subject { reporter.to_a }
22
+
23
+ before do
24
+ collection[:first_name] << :invalid
25
+ collection[:first_name] << [:too_short, { count: 3 }]
26
+ collection[:last_name] << :invalid
27
+ end
28
+
29
+ let(:expected) do
30
+ [{
31
+ attribute: 'first_name',
32
+ type: :invalid
33
+ }, {
34
+ attribute: 'first_name',
35
+ type: :too_short,
36
+ options: { count: 3 }
37
+ }, {
38
+ attribute: 'last_name',
39
+ type: :invalid
40
+ }]
41
+ end
42
+
43
+ it { should == expected }
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe ActiveModel::BetterErrors::MachineHashReporter do
6
+ subject { reporter }
7
+ let(:reporter) { klass.new collection }
8
+ let(:klass) { ActiveModel::BetterErrors::MachineHashReporter }
9
+ let(:collection) { ActiveModel::BetterErrors::ErrorCollection.new base }
10
+ let(:base) { User.new }
11
+
12
+ describe '#initialize' do
13
+ its(:collection) { should be collection }
14
+ end
15
+
16
+ describe '#base' do
17
+ its(:base) { should be base }
18
+ end
19
+
20
+ describe '#to_hash' do
21
+ subject { reporter.to_hash }
22
+
23
+ before do
24
+ collection[:first_name] << :invalid
25
+ collection[:first_name] << [:too_short, { count: 3 }]
26
+ collection[:last_name] << :invalid
27
+ end
28
+
29
+ let(:expected) do
30
+ {
31
+ first_name: [{
32
+ type: :invalid
33
+ }, {
34
+ type: :too_short,
35
+ options: { count: 3 }
36
+ }],
37
+ last_name: [{
38
+ type: :invalid
39
+ }]
40
+ }
41
+ end
42
+
43
+ it { should == expected }
44
+ end
45
+ end