client_side_validations 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,74 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ gem 'actionpack', '~> 2.0'
3
+ require 'action_pack'
4
+ require 'action_view'
5
+ require 'client_side_validations'
6
+
7
+ describe 'ActionView 2.x Form Helper' do
8
+ context 'ActionView::Base' do
9
+ subject { ActionView::Base.new }
10
+
11
+ context 'only the url' do
12
+ before do
13
+ @object_name = 'object'
14
+ @url = '/objects/new.json'
15
+ @expected_javascript = <<-JS
16
+ <script type="text/javascript">
17
+ $(document).ready(function() {
18
+ $('##{@object_name}').clientSideValidations('#{@url}', 'jquery.validate');
19
+ })
20
+ </script>
21
+ JS
22
+ subject.should_receive(:dom_id).and_return(@object_name)
23
+ end
24
+
25
+ it 'should generate the proper javascript' do
26
+ subject.client_side_validations(@object_name,
27
+ :url => @url).should == @expected_javascript
28
+ end
29
+ end
30
+
31
+ context 'a different adapter' do
32
+ before do
33
+ @object_name = 'object'
34
+ @url = '/objects/new.json'
35
+ @adapter = 'some.other.adapter'
36
+ @expected_javascript = <<-JS
37
+ <script type="text/javascript">
38
+ $(document).ready(function() {
39
+ $('##{@object_name}').clientSideValidations('#{@url}', '#{@adapter}');
40
+ })
41
+ </script>
42
+ JS
43
+ subject.should_receive(:dom_id).and_return(@object_name)
44
+ end
45
+
46
+ it 'should generate the proper javascript' do
47
+ subject.client_side_validations(@object_name,
48
+ :url => @url, :adapter => @adapter).should == @expected_javascript
49
+ end
50
+ end
51
+
52
+ context 'not including the :url' do
53
+ before do
54
+ @object_name = 'object'
55
+ @adapter = 'some.other.adapter'
56
+ @expected_javascript = <<-JS
57
+ <script type="text/javascript">
58
+ $(document).ready(function() {
59
+ $('##{@object_name}').clientSideValidations('#{@url}', '#{@some_other_adapter}');
60
+ })
61
+ </script>
62
+ JS
63
+ end
64
+
65
+ it 'should raise an error' do
66
+ expect {
67
+ subject.client_side_validations(@object_name,
68
+ :adapter => @some_other_adapter)
69
+ }.to raise_error
70
+ end
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,74 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ gem 'actionpack', '~> 3.0'
3
+ require 'action_pack'
4
+ require 'action_view'
5
+ require 'client_side_validations'
6
+
7
+ describe 'ActionView 2.x Form Helper' do
8
+ context 'ActionView::Base' do
9
+ subject { ActionView::Base.new }
10
+
11
+ context 'only the url' do
12
+ before do
13
+ @object_name = 'object'
14
+ @url = '/objects/new.json'
15
+ @expected_javascript = <<-JS
16
+ <script type="text/javascript">
17
+ $(document).ready(function() {
18
+ $('##{@object_name}').clientSideValidations('#{@url}', 'jquery.validate');
19
+ })
20
+ </script>
21
+ JS
22
+ subject.should_receive(:dom_id).and_return(@object_name)
23
+ end
24
+
25
+ it 'should generate the proper javascript' do
26
+ subject.client_side_validations(@object_name,
27
+ :url => @url).should == @expected_javascript
28
+ end
29
+ end
30
+
31
+ context 'a different adapter' do
32
+ before do
33
+ @object_name = 'object'
34
+ @url = '/objects/new.json'
35
+ @adapter = 'some.other.adapter'
36
+ @expected_javascript = <<-JS
37
+ <script type="text/javascript">
38
+ $(document).ready(function() {
39
+ $('##{@object_name}').clientSideValidations('#{@url}', '#{@adapter}');
40
+ })
41
+ </script>
42
+ JS
43
+ subject.should_receive(:dom_id).and_return(@object_name)
44
+ end
45
+
46
+ it 'should generate the proper javascript' do
47
+ subject.client_side_validations(@object_name,
48
+ :url => @url, :adapter => @adapter).should == @expected_javascript
49
+ end
50
+ end
51
+
52
+ context 'not including the :url' do
53
+ before do
54
+ @object_name = 'object'
55
+ @adapter = 'some.other.adapter'
56
+ @expected_javascript = <<-JS
57
+ <script type="text/javascript">
58
+ $(document).ready(function() {
59
+ $('##{@object_name}').clientSideValidations('#{@url}', '#{@some_other_adapter}');
60
+ })
61
+ </script>
62
+ JS
63
+ end
64
+
65
+ it 'should raise an error' do
66
+ expect {
67
+ subject.client_side_validations(@object_name,
68
+ :adapter => @some_other_adapter)
69
+ }.to raise_error
70
+ end
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,271 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'active_model'
3
+ require 'client_side_validations'
4
+
5
+ describe "Validation to hash" do
6
+
7
+ before do
8
+ class Klass
9
+ include ActiveModel::Validations
10
+ end
11
+ end
12
+
13
+ after do
14
+ Object.send(:remove_const, :Klass)
15
+ end
16
+
17
+ it "should support validate_presence_of" do
18
+ Klass.class_eval { validates_presence_of :string }
19
+ instance = Klass.new
20
+ expected_hash = { "presence" => { "message" => "can't be blank"} }
21
+ result_hash = instance.validation_to_hash(:string)
22
+ result_hash.should == expected_hash
23
+ end
24
+
25
+ it "should support validates_format_of of" do
26
+ Klass.class_eval { validates_format_of :string, :with => /\A\d\Z/i }
27
+ instance = Klass.new
28
+ expected_hash = { "format" => { "message" => "is invalid", "with" => "^\\d$" } }
29
+ result_hash = instance.validation_to_hash(:string)
30
+ result_hash.should == expected_hash
31
+ end
32
+
33
+ it "should support different ways to write regex" do
34
+ Klass.class_eval do
35
+ validates_format_of :string, :with => /^\d$/i
36
+ validates_format_of :string_2, :with => /\d/
37
+ end
38
+ instance = Klass.new
39
+ expected_hash_1 = { "format" => { "message" => "is invalid", "with" => "^\\d$" } }
40
+ expected_hash_2 = { "format" => { "message" => "is invalid", "with" => "\\d" } }
41
+ result_hash_1 = instance.validation_to_hash(:string)
42
+ result_hash_2 = instance.validation_to_hash(:string_2)
43
+ result_hash_1.should == expected_hash_1
44
+ result_hash_2.should == expected_hash_2
45
+ end
46
+
47
+ it "should support minimum validates_length_of of" do
48
+ Klass.class_eval { validates_length_of :string, :minimum => 10 }
49
+ instance = Klass.new
50
+ expected_hash = { "length" => { "message" => "is too short (minimum is 10 characters)", "minimum" => 10 } }
51
+ result_hash = instance.validation_to_hash(:string)
52
+ result_hash.should == expected_hash
53
+ end
54
+
55
+ it "should support maximum validates_length_of of" do
56
+ Klass.class_eval { validates_length_of :string, :maximum => 10 }
57
+ instance = Klass.new
58
+ expected_hash = { "length" => { "message" => "is too long (maximum is 10 characters)", "maximum" => 10 } }
59
+ result_hash = instance.validation_to_hash(:string)
60
+ result_hash.should == expected_hash
61
+ end
62
+
63
+ it "should support validations with conditionals" do
64
+ Klass.class_eval do
65
+ validates_presence_of :string, :if => :need_string?
66
+ validates_presence_of :string_2, :unless => :need_string?
67
+ validates_presence_of :integer, :if => :need_integer?
68
+
69
+ def need_string?
70
+ true
71
+ end
72
+
73
+ def need_integer?
74
+ false
75
+ end
76
+ end
77
+
78
+ instance = Klass.new
79
+ expected_hash_1 = { "presence" => { "message" => "can't be blank" } }
80
+ result_hash_1 = instance.validation_to_hash(:string)
81
+ result_hash_1.should == expected_hash_1
82
+
83
+ expected_hash_2 = { }
84
+ result_hash_2 = instance.validation_to_hash(:string_2)
85
+ result_hash_2.should == expected_hash_2
86
+
87
+ expected_hash_3 = { }
88
+ result_hash_3 = instance.validation_to_hash(:integer)
89
+ result_hash_3.should == expected_hash_3
90
+ end
91
+
92
+ it "should support validating the validates_numericality_of of" do
93
+ Klass.class_eval { validates_numericality_of :integer }
94
+ instance = Klass.new
95
+ expected_hash = { "numericality" => { "message" => "is not a number" } }
96
+ result_hash = instance.validation_to_hash(:integer)
97
+ result_hash.should == expected_hash
98
+ end
99
+
100
+ it "should strip out the AR callback options" do
101
+ Klass.class_eval { validates_presence_of :string, :on => :create }
102
+ instance = Klass.new
103
+ expected_hash = { "presence" => { "message" => "can't be blank"} }
104
+ result_hash = instance.validation_to_hash(:string)
105
+ result_hash.should == expected_hash
106
+ end
107
+
108
+ it "should support multiple validations for the same method" do
109
+ Klass.class_eval do
110
+ validates_presence_of :integer
111
+ validates_numericality_of :integer
112
+ end
113
+
114
+ instance = Klass.new
115
+ expected_hash = { "presence" => { "message" => "can't be blank" },
116
+ "numericality" => { "message" => "is not a number" } }
117
+ result_hash = instance.validation_to_hash(:integer)
118
+ result_hash.should == expected_hash
119
+ end
120
+
121
+ context 'with custom validation messages' do
122
+ before do
123
+ add_translation(:en, :klass => { :attributes => { :string_2 => { :presence => "String_2" } } })
124
+
125
+ Klass.class_eval do
126
+ validates_presence_of :string, :message => "String"
127
+ validates_presence_of :string_2, :message => :presence
128
+ end
129
+ end
130
+
131
+ after do
132
+ remove_translation(:en, :klass)
133
+ end
134
+
135
+ it 'should have a message of "String" for #string' do
136
+ instance = Klass.new
137
+ expected_hash = { "presence" => { "message" => "String" } }
138
+ result_hash = instance.validation_to_hash(:string)
139
+ result_hash.should == expected_hash
140
+ end
141
+
142
+ it 'should have a message of "String_2" for #string_2' do
143
+ instance = Klass.new
144
+ expected_hash = { "presence" => { "message" => "String_2" } }
145
+ result_hash = instance.validation_to_hash(:string_2)
146
+ result_hash.should == expected_hash
147
+ end
148
+ end
149
+
150
+ context 'Other languages' do
151
+ before do
152
+ add_translation(:es, :klass => { :attributes => { :string => { :presence => "String-es" } } })
153
+
154
+ Klass.class_eval do
155
+ validates_presence_of :string, :message => :presence
156
+ end
157
+ end
158
+
159
+ after do
160
+ remove_translation(:es, :klass)
161
+ end
162
+
163
+ it 'should result in "String-es" for Spanish translations' do
164
+ instance = Klass.new
165
+ expected_hash = { "presence" => { "message" => "String-es" } }
166
+ result_hash = instance.validation_to_hash(:string, :locale => :es)
167
+ result_hash.should == expected_hash
168
+ end
169
+
170
+ it 'should result in "String-es" for Spanish translations when passed string "es" instead of symbol' do
171
+ instance = Klass.new
172
+ expected_hash = { "presence" => { "message" => "String-es" } }
173
+ result_hash = instance.validation_to_hash(:string, :locale => "es")
174
+ result_hash.should == expected_hash
175
+ end
176
+ end
177
+
178
+ xit "should support the regular validate method" do
179
+ Klass.class_eval do
180
+ validate :do_something
181
+
182
+ def do_something
183
+ errors.add(:string, "test this out")
184
+ end
185
+ end
186
+
187
+ instance = Klass.new
188
+ # TODO: Unsupported right now
189
+ end
190
+
191
+ def add_translation(lang, hash)
192
+ validations = {
193
+ :errors => {
194
+ :models => hash
195
+ }
196
+ }
197
+ I18n.backend.store_translations(lang, validations)
198
+ end
199
+
200
+ def remove_translation(lang, key)
201
+ model_validations = I18n.translate('errors.models')
202
+ model_validations.delete(key)
203
+ validations = {
204
+ :errors => model_validations
205
+ }
206
+ I18n.backend.store_translations(lang, validations)
207
+ end
208
+ end
209
+
210
+ describe "Validations to JSON" do
211
+ before do
212
+ class Klass
213
+ include ActiveModel::Validations
214
+ end
215
+ end
216
+
217
+ after do
218
+ Object.send(:remove_const, :Klass)
219
+ end
220
+
221
+ it "should support a sinlgle validation" do
222
+ Klass.class_eval do
223
+ validates_presence_of :string
224
+ end
225
+
226
+ instance = Klass.new
227
+ expected_json = {:string => { "presence" => { "message" => "can't be blank" } } }.to_json
228
+ result_json = instance.validations_to_json(:string)
229
+ result_json.should == expected_json
230
+ end
231
+
232
+ it "should support multiple validations on the same field" do
233
+ Klass.class_eval do
234
+ validates_presence_of :number
235
+ validates_numericality_of :number
236
+ end
237
+
238
+ instance = Klass.new
239
+ expected_json = {:number => { "presence" => { "message" => "can't be blank" }, "numericality" => { "message" => "is not a number" } } }.to_json
240
+ result_json = instance.validations_to_json(:number)
241
+ result_json.should == expected_json
242
+ end
243
+
244
+ it "should support single validations on different fields" do
245
+ Klass.class_eval do
246
+ validates_presence_of :string
247
+ validates_presence_of :string_2
248
+ end
249
+
250
+ instance = Klass.new
251
+ expected_json = {:string => { "presence" => { "message" => "can't be blank" } },
252
+ :string_2 => { "presence" => { "message" => "can't be blank" } } }.to_json
253
+ result_json = instance.validations_to_json(:string, :string_2)
254
+ result_json.should == expected_json
255
+ end
256
+
257
+ it "should support multiple validations on different fields" do
258
+ Klass.class_eval do
259
+ validates_presence_of :number_1
260
+ validates_numericality_of :number_1
261
+ validates_presence_of :number_2
262
+ validates_numericality_of :number_2
263
+ end
264
+
265
+ instance = Klass.new
266
+ expected_json = {:number_1 => { "presence" => { "message" => "can't be blank" }, "numericality" => { "message" => "is not a number" } },
267
+ :number_2 => { "presence" => { "message" => "can't be blank" }, "numericality" => { "message" => "is not a number" } } }.to_json
268
+ result_json = instance.validations_to_json(:number_1, :number_2)
269
+ result_json.should == expected_json
270
+ end
271
+ end
@@ -0,0 +1,286 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ gem 'activerecord', '~> 2.0'
3
+ require 'active_record'
4
+ require 'client_side_validations'
5
+
6
+ describe 'Validations' do
7
+ describe 'to hash' do
8
+
9
+ before do
10
+ class Klass < ActiveRecord::Base
11
+ def self.columns() @columns ||= []; end
12
+
13
+ def self.column(name, sql_type = nil, default = nil, null = true)
14
+ columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
15
+ end
16
+ end
17
+ end
18
+
19
+ after do
20
+ Object.send(:remove_const, :Klass)
21
+ end
22
+
23
+ it "should support validate_presence_of" do
24
+ Klass.class_eval { validates_presence_of :string }
25
+ instance = Klass.new
26
+ expected_hash = { "presence" => { "message" => "can't be blank"} }
27
+ result_hash = instance.validation_to_hash(:string)
28
+ result_hash.should == expected_hash
29
+ end
30
+
31
+ it "should support validates_format_of of" do
32
+ Klass.class_eval { validates_format_of :string, :with => /\A\d\Z/i }
33
+ instance = Klass.new
34
+ expected_hash = { "format" => { "message" => "is invalid", "with" => "^\\d$" } }
35
+ result_hash = instance.validation_to_hash(:string)
36
+ result_hash.should == expected_hash
37
+ end
38
+
39
+ it "should support different ways to write regex" do
40
+ Klass.class_eval do
41
+ validates_format_of :string, :with => /^\d$/i
42
+ validates_format_of :string_2, :with => /\d/
43
+ end
44
+ instance = Klass.new
45
+ expected_hash_1 = { "format" => { "message" => "is invalid", "with" => "^\\d$" } }
46
+ expected_hash_2 = { "format" => { "message" => "is invalid", "with" => "\\d" } }
47
+ result_hash_1 = instance.validation_to_hash(:string)
48
+ result_hash_2 = instance.validation_to_hash(:string_2)
49
+ result_hash_1.should == expected_hash_1
50
+ result_hash_2.should == expected_hash_2
51
+ end
52
+
53
+ it "should support minimum validates_length_of of" do
54
+ Klass.class_eval { validates_length_of :string, :minimum => 10 }
55
+ instance = Klass.new
56
+ expected_hash = { "length" => { "message" => "is too short (minimum is 10 characters)", "minimum" => 10 } }
57
+ result_hash = instance.validation_to_hash(:string)
58
+ result_hash.should == expected_hash
59
+ end
60
+
61
+ it "should support maximum validates_length_of of" do
62
+ Klass.class_eval { validates_length_of :string, :maximum => 10 }
63
+ instance = Klass.new
64
+ expected_hash = { "length" => { "message" => "is too long (maximum is 10 characters)", "maximum" => 10 } }
65
+ result_hash = instance.validation_to_hash(:string)
66
+ result_hash.should == expected_hash
67
+ end
68
+
69
+ it "should support validations with conditionals" do
70
+ Klass.class_eval do
71
+ validates_presence_of :string, :if => :need_string?
72
+ validates_presence_of :string_2, :unless => :need_string?
73
+ validates_presence_of :integer, :if => :need_integer?
74
+
75
+ def need_string?
76
+ true
77
+ end
78
+
79
+ def need_integer?
80
+ false
81
+ end
82
+ end
83
+
84
+ instance = Klass.new
85
+ expected_hash_1 = { "presence" => { "message" => "can't be blank" } }
86
+ result_hash_1 = instance.validation_to_hash(:string)
87
+ result_hash_1.should == expected_hash_1
88
+
89
+ expected_hash_2 = { }
90
+ result_hash_2 = instance.validation_to_hash(:string_2)
91
+ result_hash_2.should == expected_hash_2
92
+
93
+ expected_hash_3 = { }
94
+ result_hash_3 = instance.validation_to_hash(:integer)
95
+ result_hash_3.should == expected_hash_3
96
+ end
97
+
98
+ it "should support validating the validates_numericality_of of" do
99
+ Klass.class_eval { validates_numericality_of :integer }
100
+ instance = Klass.new
101
+ expected_hash = { "numericality" => { "message" => "is not a number" } }
102
+ result_hash = instance.validation_to_hash(:integer)
103
+ result_hash.should == expected_hash
104
+ end
105
+
106
+ it "should strip out the AR callback options" do
107
+ Klass.class_eval { validates_presence_of :string, :on => :create }
108
+ instance = Klass.new
109
+ expected_hash = { "presence" => { "message" => "can't be blank"} }
110
+ result_hash = instance.validation_to_hash(:string)
111
+ result_hash.should == expected_hash
112
+ end
113
+
114
+ it "should support multiple validations for the same method" do
115
+ Klass.class_eval do
116
+ validates_presence_of :integer
117
+ validates_numericality_of :integer
118
+ end
119
+
120
+ instance = Klass.new
121
+ expected_hash = { "presence" => { "message" => "can't be blank" },
122
+ "numericality" => { "message" => "is not a number" } }
123
+ result_hash = instance.validation_to_hash(:integer)
124
+ result_hash.should == expected_hash
125
+ end
126
+
127
+ context 'with custom validation messages' do
128
+ before do
129
+ add_translation(:en, :klass => { :attributes => { :string_2 => { :presence => "String_2" } } })
130
+
131
+ Klass.class_eval do
132
+ validates_presence_of :string, :message => "String"
133
+ validates_presence_of :string_2, :message => :presence
134
+ end
135
+ end
136
+
137
+ after do
138
+ remove_translation(:en, :klass)
139
+ end
140
+
141
+ it 'should have a message of "String" for #string' do
142
+ instance = Klass.new
143
+ expected_hash = { "presence" => { "message" => "String" } }
144
+ result_hash = instance.validation_to_hash(:string)
145
+ result_hash.should == expected_hash
146
+ end
147
+
148
+ it 'should have a message of "String_2" for #string_2' do
149
+ instance = Klass.new
150
+ expected_hash = { "presence" => { "message" => "String_2" } }
151
+ result_hash = instance.validation_to_hash(:string_2)
152
+ result_hash.should == expected_hash
153
+ end
154
+ end
155
+
156
+ context 'Other languages' do
157
+ before do
158
+ add_translation(:es, :klass => { :attributes => { :string => { :presence => "String-es" } } })
159
+
160
+ Klass.class_eval do
161
+ validates_presence_of :string, :message => :presence
162
+ end
163
+ end
164
+
165
+ after do
166
+ remove_translation(:es, :klass)
167
+ end
168
+
169
+ it 'should result in "String-es" for Spanish translations' do
170
+ instance = Klass.new
171
+ expected_hash = { "presence" => { "message" => "String-es" } }
172
+ result_hash = instance.validation_to_hash(:string, :locale => :es)
173
+ result_hash.should == expected_hash
174
+ end
175
+
176
+ it 'should result in "String-es" for Spanish translations when passed string "es" instead of symbol' do
177
+ instance = Klass.new
178
+ expected_hash = { "presence" => { "message" => "String-es" } }
179
+ result_hash = instance.validation_to_hash(:string, :locale => "es")
180
+ result_hash.should == expected_hash
181
+ end
182
+ end
183
+
184
+ xit "should support the regular validate method" do
185
+ Klass.class_eval do
186
+ validate :do_something
187
+
188
+ def do_something
189
+ errors.add(:string, "test this out")
190
+ end
191
+ end
192
+
193
+ instance = Klass.new
194
+ # TODO: Unsupported right now
195
+ end
196
+
197
+ def add_translation(lang, hash)
198
+ validations = {
199
+ :activerecord => {
200
+ :errors => {
201
+ :models => hash
202
+ }
203
+ }
204
+ }
205
+ I18n.backend.store_translations(lang, validations)
206
+ end
207
+
208
+ def remove_translation(lang, key)
209
+ model_validations = I18n.translate('activerecord.errors.models')
210
+ model_validations.delete(key)
211
+ validations = {
212
+ :activerecord => {
213
+ :errors => model_validations
214
+ }
215
+ }
216
+ I18n.backend.store_translations(lang, validations)
217
+ end
218
+ end
219
+
220
+ describe 'to JSON' do
221
+ before do
222
+ class Klass < ActiveRecord::Base
223
+ def self.columns() @columns ||= []; end
224
+
225
+ def self.column(name, sql_type = nil, default = nil, null = true)
226
+ columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null)
227
+ end
228
+ end
229
+ end
230
+
231
+ after do
232
+ Object.send(:remove_const, :Klass)
233
+ end
234
+
235
+ it "should support a sinlgle validation" do
236
+ Klass.class_eval do
237
+ validates_presence_of :string
238
+ end
239
+
240
+ instance = Klass.new
241
+ expected_json = {:string => { "presence" => { "message" => "can't be blank" } } }.to_json
242
+ result_json = instance.validations_to_json(:string)
243
+ result_json.should == expected_json
244
+ end
245
+
246
+ it "should support multiple validations on the same field" do
247
+ Klass.class_eval do
248
+ validates_presence_of :number
249
+ validates_numericality_of :number
250
+ end
251
+
252
+ instance = Klass.new
253
+ expected_json = {:number => { "presence" => { "message" => "can't be blank" }, "numericality" => { "message" => "is not a number" } } }.to_json
254
+ result_json = instance.validations_to_json(:number)
255
+ result_json.should == expected_json
256
+ end
257
+
258
+ it "should support single validations on different fields" do
259
+ Klass.class_eval do
260
+ validates_presence_of :string
261
+ validates_presence_of :string_2
262
+ end
263
+
264
+ instance = Klass.new
265
+ expected_json = {:string => { "presence" => { "message" => "can't be blank" } },
266
+ :string_2 => { "presence" => { "message" => "can't be blank" } } }.to_json
267
+ result_json = instance.validations_to_json(:string, :string_2)
268
+ result_json.should == expected_json
269
+ end
270
+
271
+ it "should support multiple validations on different fields" do
272
+ Klass.class_eval do
273
+ validates_presence_of :number_1
274
+ validates_numericality_of :number_1
275
+ validates_presence_of :number_2
276
+ validates_numericality_of :number_2
277
+ end
278
+
279
+ instance = Klass.new
280
+ expected_json = {:number_1 => { "presence" => { "message" => "can't be blank" }, "numericality" => { "message" => "is not a number" } },
281
+ :number_2 => { "presence" => { "message" => "can't be blank" }, "numericality" => { "message" => "is not a number" } } }.to_json
282
+ result_json = instance.validations_to_json(:number_1, :number_2)
283
+ result_json.should == expected_json
284
+ end
285
+ end
286
+ end