client_side_validations 3.0.3 → 3.1.0
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.
- data/client_side_validations.gemspec +4 -7
- data/lib/client_side_validations/action_view/form_builder.rb +85 -11
- data/lib/client_side_validations/action_view/form_helper.rb +21 -3
- data/lib/client_side_validations/action_view.rb +4 -3
- data/lib/client_side_validations/active_model/length.rb +12 -10
- data/lib/client_side_validations/active_model/numericality.rb +14 -9
- data/lib/client_side_validations/active_model.rb +21 -13
- data/lib/client_side_validations/active_record/middleware.rb +5 -1
- data/lib/client_side_validations/active_record/uniqueness.rb +10 -8
- data/lib/client_side_validations/engine.rb +6 -0
- data/lib/client_side_validations/files.rb +8 -0
- data/lib/client_side_validations/formtastic.rb +3 -3
- data/lib/client_side_validations/middleware.rb +5 -7
- data/lib/client_side_validations/mongo_mapper/middleware.rb +20 -0
- data/lib/client_side_validations/mongo_mapper/uniqueness.rb +28 -0
- data/lib/client_side_validations/mongo_mapper.rb +9 -0
- data/lib/client_side_validations/mongoid/uniqueness.rb +10 -8
- data/lib/client_side_validations/version.rb +1 -1
- data/lib/client_side_validations.rb +8 -3
- data/lib/generators/client_side_validations/copy_asset_generator.rb +23 -0
- data/lib/generators/client_side_validations/install_generator.rb +18 -6
- data/lib/generators/templates/client_side_validations/README.rails.3.0 +6 -0
- data/lib/generators/templates/client_side_validations/README.rails.3.1 +7 -0
- data/lib/generators/templates/{client_side_validations.rb → client_side_validations/initializer.rb} +1 -1
- data/test/action_view/cases/helper.rb +34 -12
- data/test/action_view/cases/test_helpers.rb +314 -1
- data/test/action_view/cases/test_legacy_helpers.rb +58 -1
- data/test/active_model/cases/test_validations.rb +21 -8
- data/test/active_record/cases/test_middleware.rb +41 -16
- data/test/active_record/cases/test_uniqueness_validator.rb +5 -0
- data/test/active_record/models/user.rb +4 -0
- data/test/base_helper.rb +2 -0
- data/test/core_ext/cases/test_core_ext.rb +1 -0
- data/test/formtastic/cases/helper.rb +5 -0
- data/test/formtastic/cases/test_form_builder.rb +3 -3
- data/test/formtastic/cases/test_form_helper.rb +3 -4
- data/test/generators/cases/test_generators.rb +31 -0
- data/test/javascript/public/test/callbacks/elementAfter.js +1 -1
- data/test/javascript/public/test/callbacks/elementBefore.js +1 -1
- data/test/javascript/public/test/callbacks/elementFail.js +1 -1
- data/test/javascript/public/test/callbacks/elementPass.js +1 -1
- data/test/javascript/public/test/callbacks/formAfter.js +1 -1
- data/test/javascript/public/test/callbacks/formBefore.js +1 -1
- data/test/javascript/public/test/callbacks/formFail.js +1 -1
- data/test/javascript/public/test/callbacks/formPass.js +1 -1
- data/test/javascript/public/test/form_builders/validateForm.js +1 -1
- data/test/javascript/public/test/form_builders/validateFormtastic.js +2 -2
- data/test/javascript/public/test/form_builders/validateNestedForm.js +66 -0
- data/test/javascript/public/test/form_builders/validateSimpleForm.js +1 -1
- data/test/javascript/public/test/validateElement.js +36 -1
- data/test/javascript/public/test/validators/length.js +7 -1
- data/test/javascript/public/test/validators/numericality.js +7 -0
- data/test/javascript/public/test/validators/presence.js +6 -0
- data/test/javascript/public/test/validators/uniqueness.js +8 -1
- data/test/javascript/server.rb +9 -3
- data/test/javascript/views/index.erb +1 -1
- data/test/javascript/views/layout.erb +1 -1
- data/test/middleware/cases/helper.rb +3 -0
- data/test/mongo_mapper/cases/helper.rb +9 -0
- data/test/mongo_mapper/cases/test_base.rb +15 -0
- data/test/mongo_mapper/cases/test_middleware.rb +77 -0
- data/test/mongo_mapper/cases/test_uniqueness_validator.rb +50 -0
- data/test/mongo_mapper/models/magazine.rb +11 -0
- data/test/mongoid/cases/test_middleware.rb +15 -6
- data/test/mongoid/cases/test_uniqueness_validator.rb +5 -0
- data/test/mongoid/models/book.rb +4 -0
- data/test/simple_form/cases/helper.rb +3 -0
- data/test/simple_form/cases/test_form_helper.rb +3 -1
- data/test/test_loader.rb +6 -0
- data/{javascript → vendor/assets/javascripts}/rails.validations.js +32 -17
- metadata +44 -23
- data/lib/generators/templates/README +0 -7
- data/test/generators/cases/test_install_generator.rb +0 -15
|
@@ -1,20 +1,32 @@
|
|
|
1
1
|
module ClientSideValidations
|
|
2
2
|
module Generators
|
|
3
3
|
class InstallGenerator < Rails::Generators::Base
|
|
4
|
-
source_root File.expand_path('../../templates', __FILE__)
|
|
4
|
+
source_root File.expand_path('../../templates/client_side_validations', __FILE__)
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
if Rails.version >= '3.1'
|
|
7
|
+
desc 'Creates a ClientSideValidations initializer.'
|
|
8
|
+
else
|
|
9
|
+
desc 'Creates a ClientSideValidations initializer and copies rails.validations.js to public/javascripts.'
|
|
10
|
+
end
|
|
7
11
|
|
|
8
12
|
def copy_initializer
|
|
9
|
-
copy_file '
|
|
13
|
+
copy_file 'initializer.rb', 'config/initializers/client_side_validations.rb'
|
|
10
14
|
end
|
|
11
15
|
|
|
12
|
-
def
|
|
13
|
-
|
|
16
|
+
def copy_javascript_asset
|
|
17
|
+
if Rails.version >= '3.0'
|
|
18
|
+
if Rails.version < '3.1'
|
|
19
|
+
copy_file '../../../../vendor/assets/javascripts/rails.validations.js', 'public/javascripts/rails.validations.js'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
14
22
|
end
|
|
15
23
|
|
|
16
24
|
def show_readme
|
|
17
|
-
|
|
25
|
+
if Rails.version >= '3.1'
|
|
26
|
+
readme 'README.rails.3.1' if behavior == :invoke
|
|
27
|
+
else
|
|
28
|
+
readme 'README.rails.3.0' if behavior == :invoke
|
|
29
|
+
end
|
|
18
30
|
end
|
|
19
31
|
end
|
|
20
32
|
end
|
data/lib/generators/templates/{client_side_validations.rb → client_side_validations/initializer.rb}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ClientSideValidations Initializer
|
|
2
2
|
|
|
3
3
|
require 'client_side_validations/simple_form' if defined?(::SimpleForm)
|
|
4
|
-
require 'client_side_validations/formtastic'
|
|
4
|
+
require 'client_side_validations/formtastic' if defined?(::Formtastic)
|
|
5
5
|
|
|
6
6
|
# Uncomment the following block if you want each input field to have the validation messages attached.
|
|
7
7
|
# ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
require 'base_helper'
|
|
2
2
|
require 'action_view'
|
|
3
|
-
require '
|
|
4
|
-
require 'action_view/template/handlers/erb'
|
|
3
|
+
require 'action_view/template'
|
|
5
4
|
require 'action_view/models'
|
|
5
|
+
require 'client_side_validations/action_view'
|
|
6
|
+
|
|
7
|
+
module ActionController
|
|
8
|
+
class Base
|
|
9
|
+
include ActionDispatch::Routing::RouteSet.new.url_helpers
|
|
10
|
+
end
|
|
11
|
+
end
|
|
6
12
|
|
|
7
13
|
module ActionViewTestSetup
|
|
8
14
|
include ::ClientSideValidations::ActionView::Helpers::FormHelper
|
|
@@ -12,6 +18,19 @@ module ActionViewTestSetup
|
|
|
12
18
|
@output_buffer = super
|
|
13
19
|
end
|
|
14
20
|
|
|
21
|
+
Routes = ActionDispatch::Routing::RouteSet.new
|
|
22
|
+
Routes.draw do
|
|
23
|
+
resources :posts do
|
|
24
|
+
resources :comments
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def _routes
|
|
29
|
+
Routes
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
include Routes.url_helpers
|
|
33
|
+
|
|
15
34
|
def setup
|
|
16
35
|
super
|
|
17
36
|
|
|
@@ -67,14 +86,11 @@ module ActionViewTestSetup
|
|
|
67
86
|
@post.body = "Back to the hill and over it again!"
|
|
68
87
|
@post.secret = 1
|
|
69
88
|
@post.written_on = Date.new(2004, 6, 15)
|
|
70
|
-
end
|
|
71
89
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if object.is_a?(Hash)
|
|
75
|
-
"http://www.example.com"
|
|
90
|
+
if defined?(ActionView::OutputFlow)
|
|
91
|
+
@view_flow = ActionView::OutputFlow.new
|
|
76
92
|
else
|
|
77
|
-
|
|
93
|
+
@_content_for = Hash.new { |h,k| h[k] = ActiveSupport::SafeBuffer.new }
|
|
78
94
|
end
|
|
79
95
|
end
|
|
80
96
|
|
|
@@ -85,11 +101,12 @@ module ActionViewTestSetup
|
|
|
85
101
|
txt << %{</div>}
|
|
86
102
|
end
|
|
87
103
|
|
|
88
|
-
def form_text(action = "http://www.example.com", id = nil, html_class = nil, remote = nil, validators = nil)
|
|
104
|
+
def form_text(action = "http://www.example.com", id = nil, html_class = nil, remote = nil, validators = nil, file = nil)
|
|
89
105
|
txt = %{<form accept-charset="UTF-8" action="#{action}"}
|
|
90
106
|
txt << %{ data-remote="true"} if remote
|
|
91
107
|
txt << %{ class="#{html_class}"} if html_class
|
|
92
108
|
txt << %{ data-validate="true"} if validators
|
|
109
|
+
txt << %{ enctype="multipart/form-data"} if file
|
|
93
110
|
txt << %{ id="#{id}"} if id
|
|
94
111
|
txt << %{ method="post"}
|
|
95
112
|
txt << %{ novalidate="novalidate"} if validators
|
|
@@ -100,20 +117,24 @@ module ActionViewTestSetup
|
|
|
100
117
|
contents = block_given? ? yield : ""
|
|
101
118
|
|
|
102
119
|
if options.is_a?(Hash)
|
|
103
|
-
method, remote, validators = options.values_at(:method, :remote, :validators)
|
|
120
|
+
method, remote, validators, file = options.values_at(:method, :remote, :validators, :file)
|
|
104
121
|
else
|
|
105
122
|
method = options
|
|
106
123
|
end
|
|
107
124
|
|
|
108
|
-
html = form_text(action, id, html_class, remote, validators) + snowman(method) + (contents || "") + "</form>"
|
|
125
|
+
html = form_text(action, id, html_class, remote, validators, file) + snowman(method) + (contents || "") + "</form>"
|
|
109
126
|
|
|
110
127
|
if options.is_a?(Hash) && options[:validators]
|
|
111
|
-
html
|
|
128
|
+
build_script_tag(html, id, options[:validators])
|
|
112
129
|
else
|
|
113
130
|
html
|
|
114
131
|
end
|
|
115
132
|
end
|
|
116
133
|
|
|
134
|
+
def build_script_tag(html, id, validators)
|
|
135
|
+
(html || "") + %Q{<script>window['#{id}'] = #{client_side_form_settings_helper.merge(:validators => validators).to_json};</script>}
|
|
136
|
+
end
|
|
137
|
+
|
|
117
138
|
protected
|
|
118
139
|
def comments_path(post)
|
|
119
140
|
"/posts/#{post.id}/comments"
|
|
@@ -152,3 +173,4 @@ module ActionViewTestSetup
|
|
|
152
173
|
end
|
|
153
174
|
|
|
154
175
|
end
|
|
176
|
+
|
|
@@ -44,7 +44,7 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
|
|
47
|
-
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
47
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators, :file => true) do
|
|
48
48
|
%{<input data-validate="true" id="post_cost" name="post[cost]" type="file" />}
|
|
49
49
|
end
|
|
50
50
|
assert_equal expected, output_buffer
|
|
@@ -283,5 +283,318 @@ class ClientSideValidations::ActionViewHelpersTest < ActionView::TestCase
|
|
|
283
283
|
end
|
|
284
284
|
assert_equal expected, output_buffer
|
|
285
285
|
end
|
|
286
|
+
|
|
287
|
+
def test_select
|
|
288
|
+
form_for(@post, :validate => true) do |f|
|
|
289
|
+
concat f.select(:cost, [])
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
|
|
293
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
294
|
+
%{<select data-validate="true" id="post_cost" name="post[cost]"></select>}
|
|
295
|
+
end
|
|
296
|
+
assert_equal expected, output_buffer
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def test_select_multiple
|
|
300
|
+
form_for(@post, :validate => true) do |f|
|
|
301
|
+
concat f.select(:cost, [], {}, :multiple => true)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
validators = {'post[cost][]' => {:presence => {:message => "can't be blank"}}}
|
|
305
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
306
|
+
%{<select data-validate="true" id="post_cost" multiple="multiple" name="post[cost][]"></select>}
|
|
307
|
+
end
|
|
308
|
+
assert_equal expected, output_buffer
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def test_collection_select
|
|
312
|
+
form_for(@post, :validate => true) do |f|
|
|
313
|
+
concat f.collection_select(:cost, [], :id, :name)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
|
|
317
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
318
|
+
%{<select data-validate="true" id="post_cost" name="post[cost]"></select>}
|
|
319
|
+
end
|
|
320
|
+
assert_equal expected, output_buffer
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def test_grouped_collection_select
|
|
324
|
+
form_for(@post, :validate => true) do |f|
|
|
325
|
+
concat f.grouped_collection_select(:cost, [], :group_method, :group_label_method, :id, :name)
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
|
|
329
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
330
|
+
%{<select data-validate="true" id="post_cost" name="post[cost]"></select>}
|
|
331
|
+
end
|
|
332
|
+
assert_equal expected, output_buffer
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def test_time_zone_select
|
|
336
|
+
zones = mock('TimeZones')
|
|
337
|
+
zones.stubs(:all).returns([])
|
|
338
|
+
form_for(@post, :validate => true) do |f|
|
|
339
|
+
concat f.time_zone_select(:cost, nil, :model => zones)
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
|
|
343
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
344
|
+
%{<select data-validate="true" id="post_cost" name="post[cost]"></select>}
|
|
345
|
+
end
|
|
346
|
+
assert_equal expected, output_buffer
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
def test_conditional_validator_filters
|
|
350
|
+
hash = {
|
|
351
|
+
:cost => {
|
|
352
|
+
:presence => {
|
|
353
|
+
:message => "can't be blank",
|
|
354
|
+
:unless => :cannot_validate?
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
:title => {
|
|
358
|
+
:presence => {
|
|
359
|
+
:message => "can't be blank",
|
|
360
|
+
:if => :can_validate?
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
@post.title = nil
|
|
366
|
+
@post.stubs(:cannot_validate?).returns(false)
|
|
367
|
+
@post.stubs(:can_validate?).returns(true)
|
|
368
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
369
|
+
form_for(@post, :validate => true) do |f|
|
|
370
|
+
concat f.text_field(:cost)
|
|
371
|
+
concat f.text_field(:title)
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
validators = {}
|
|
375
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
376
|
+
%{<input id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
377
|
+
%{<input id="post_title" name="post[title]" size="30" type="text" />}
|
|
378
|
+
end
|
|
379
|
+
assert_equal expected, output_buffer
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def test_conditional_validators_should_be_filtered
|
|
383
|
+
hash = {
|
|
384
|
+
:cost => {
|
|
385
|
+
:presence => {
|
|
386
|
+
:message => "can't be blank",
|
|
387
|
+
:unless => :cannot_validate?
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
:title => {
|
|
391
|
+
:presence => {
|
|
392
|
+
:message => "can't be blank",
|
|
393
|
+
:if => :can_validate?
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
@post.title = nil
|
|
399
|
+
@post.stubs(:cannot_validate?).returns(false)
|
|
400
|
+
@post.stubs(:can_validate?).returns(true)
|
|
401
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
402
|
+
form_for(@post, :validate => true) do |f|
|
|
403
|
+
concat f.text_field(:cost)
|
|
404
|
+
concat f.text_field(:title)
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
validators = {}
|
|
408
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
409
|
+
%{<input id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
410
|
+
%{<input id="post_title" name="post[title]" size="30" type="text" />}
|
|
411
|
+
end
|
|
412
|
+
assert_equal expected, output_buffer
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
def test_conditional_validator_filters_being_forced
|
|
416
|
+
hash = {
|
|
417
|
+
:cost => {
|
|
418
|
+
:presence => {
|
|
419
|
+
:message => "can't be blank",
|
|
420
|
+
:unless => :cannot_validate?
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
:title => {
|
|
424
|
+
:presence => {
|
|
425
|
+
:message => "can't be blank",
|
|
426
|
+
:if => :can_validate?
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
@post.title = nil
|
|
432
|
+
@post.stubs(:cannot_validate?).returns(false)
|
|
433
|
+
@post.stubs(:can_validate?).returns(true)
|
|
434
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
435
|
+
form_for(@post, :validate => true) do |f|
|
|
436
|
+
concat f.text_field(:cost, :validate => true)
|
|
437
|
+
concat f.text_field(:title, :validate => true)
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
validators = {
|
|
441
|
+
'post[cost]' => {:presence => {:message => "can't be blank"}},
|
|
442
|
+
'post[title]' => {:presence => {:message => "can't be blank"}}
|
|
443
|
+
}
|
|
444
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
445
|
+
%{<input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
446
|
+
%{<input data-validate="true" id="post_title" name="post[title]" size="30" type="text" />}
|
|
447
|
+
end
|
|
448
|
+
assert_equal expected, output_buffer
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def test_conditional_validator_filters_being_forced_and_not_meeting_condition
|
|
452
|
+
hash = {
|
|
453
|
+
:cost => {
|
|
454
|
+
:presence => {
|
|
455
|
+
:message => "can't be blank",
|
|
456
|
+
:unless => :cannot_validate?
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
:title => {
|
|
460
|
+
:presence => {
|
|
461
|
+
:message => "can't be blank",
|
|
462
|
+
:if => :can_validate?
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
@post.title = nil
|
|
468
|
+
@post.stubs(:cannot_validate?).returns(true)
|
|
469
|
+
@post.stubs(:can_validate?).returns(false)
|
|
470
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
471
|
+
form_for(@post, :validate => true) do |f|
|
|
472
|
+
concat f.text_field(:cost, :validate => true)
|
|
473
|
+
concat f.text_field(:title, :validate => true)
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
validators = {}
|
|
477
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
478
|
+
%{<input id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
479
|
+
%{<input id="post_title" name="post[title]" size="30" type="text" />}
|
|
480
|
+
end
|
|
481
|
+
assert_equal expected, output_buffer
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
def test_conditional_validator_filters_being_forced_individually
|
|
485
|
+
hash = {
|
|
486
|
+
:cost => {
|
|
487
|
+
:presence => {
|
|
488
|
+
:message => "can't be blank",
|
|
489
|
+
:unless => :cannot_validate?
|
|
490
|
+
}
|
|
491
|
+
},
|
|
492
|
+
:title => {
|
|
493
|
+
:presence => {
|
|
494
|
+
:message => "can't be blank",
|
|
495
|
+
:if => :can_validate?
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
@post.title = nil
|
|
501
|
+
@post.stubs(:cannot_validate?).returns(false)
|
|
502
|
+
@post.stubs(:can_validate?).returns(true)
|
|
503
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
504
|
+
form_for(@post, :validate => true) do |f|
|
|
505
|
+
concat f.text_field(:cost, :validate => { :presence => true })
|
|
506
|
+
concat f.text_field(:title, :validate => { :presence => true })
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
validators = {
|
|
510
|
+
'post[cost]' => {:presence => {:message => "can't be blank"}},
|
|
511
|
+
'post[title]' => {:presence => {:message => "can't be blank"}}
|
|
512
|
+
}
|
|
513
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
514
|
+
%{<input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
515
|
+
%{<input data-validate="true" id="post_title" name="post[title]" size="30" type="text" />}
|
|
516
|
+
end
|
|
517
|
+
assert_equal expected, output_buffer
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
def test_conditional_validator_filters_being_forced_and_not_meeting_condition_individually
|
|
521
|
+
hash = {
|
|
522
|
+
:cost => {
|
|
523
|
+
:presence => {
|
|
524
|
+
:message => "can't be blank",
|
|
525
|
+
:unless => :cannot_validate?
|
|
526
|
+
}
|
|
527
|
+
},
|
|
528
|
+
:title => {
|
|
529
|
+
:presence => {
|
|
530
|
+
:message => "can't be blank",
|
|
531
|
+
:if => :can_validate?
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
@post.title = nil
|
|
537
|
+
@post.stubs(:cannot_validate?).returns(true)
|
|
538
|
+
@post.stubs(:can_validate?).returns(false)
|
|
539
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
540
|
+
form_for(@post, :validate => true) do |f|
|
|
541
|
+
concat f.text_field(:cost, :validate => { :presence => true })
|
|
542
|
+
concat f.text_field(:title, :validate => { :presence => true })
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
validators = {}
|
|
546
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
547
|
+
%{<input id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
548
|
+
%{<input id="post_title" name="post[title]" size="30" type="text" />}
|
|
549
|
+
end
|
|
550
|
+
assert_equal expected, output_buffer
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
def test_conditional_validator_filters_being_forced_with_procs
|
|
554
|
+
hash = {
|
|
555
|
+
:cost => {
|
|
556
|
+
:presence => {
|
|
557
|
+
:message => "can't be blank",
|
|
558
|
+
:unless => Proc.new { |post| post.cannot_validate? }
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
:title => {
|
|
562
|
+
:presence => {
|
|
563
|
+
:message => "can't be blank",
|
|
564
|
+
:if => Proc.new { |post| post.can_validate? }
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
@post.title = nil
|
|
570
|
+
@post.stubs(:cannot_validate?).returns(false)
|
|
571
|
+
@post.stubs(:can_validate?).returns(true)
|
|
572
|
+
@post.stubs(:client_side_validation_hash).returns(hash)
|
|
573
|
+
form_for(@post, :validate => true) do |f|
|
|
574
|
+
concat f.text_field(:cost, :validate => true)
|
|
575
|
+
concat f.text_field(:title, :validate => true)
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
validators = {
|
|
579
|
+
'post[cost]' => {:presence => {:message => "can't be blank"}},
|
|
580
|
+
'post[title]' => {:presence => {:message => "can't be blank"}}
|
|
581
|
+
}
|
|
582
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => "put", :validators => validators) do
|
|
583
|
+
%{<input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" />} +
|
|
584
|
+
%{<input data-validate="true" id="post_title" name="post[title]" size="30" type="text" />}
|
|
585
|
+
end
|
|
586
|
+
assert_equal expected, output_buffer
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
def test_pushing_script_to_content_for
|
|
590
|
+
form_for(@post, :validate => :post) do |f|
|
|
591
|
+
concat f.text_field(:cost)
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
validators = {'post[cost]' => {:presence => {:message => "can't be blank"}}}
|
|
595
|
+
expected = %{<form accept-charset="UTF-8" action="/posts/123" class="edit_post" data-validate="true" id="edit_post_123" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="put" /></div><input data-validate="true" id="post_cost" name="post[cost]" size="30" type="text" /></form>}
|
|
596
|
+
assert_equal expected, output_buffer
|
|
597
|
+
assert_equal build_script_tag(nil, "edit_post_123", validators), content_for(:post)
|
|
598
|
+
end
|
|
286
599
|
end
|
|
287
600
|
|
|
@@ -30,7 +30,7 @@ class ClientSideValidations::LegacyActionViewHelpersTest < ActionView::TestCase
|
|
|
30
30
|
concat f.file_field(:cost)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
expected = whole_form("/posts/123", "edit_post_123", "edit_post",
|
|
33
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", :method => :put, :file => true) do
|
|
34
34
|
%{<input id="post_cost" name="post[cost]" type="file" />}
|
|
35
35
|
end
|
|
36
36
|
assert_equal expected, output_buffer
|
|
@@ -157,4 +157,61 @@ class ClientSideValidations::LegacyActionViewHelpersTest < ActionView::TestCase
|
|
|
157
157
|
assert_equal expected, result
|
|
158
158
|
end
|
|
159
159
|
|
|
160
|
+
def test_select
|
|
161
|
+
form_for(@post) do |f|
|
|
162
|
+
concat f.select(:cost, [])
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
|
166
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
|
167
|
+
end
|
|
168
|
+
assert_equal expected, output_buffer
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def test_select_multiple
|
|
172
|
+
form_for(@post) do |f|
|
|
173
|
+
concat f.select(:cost, [], {}, :multiple => true)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
|
177
|
+
%{<select id="post_cost" multiple="multiple" name="post[cost][]"></select>}
|
|
178
|
+
end
|
|
179
|
+
assert_equal expected, output_buffer
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_collection_select
|
|
183
|
+
form_for(@post) do |f|
|
|
184
|
+
concat f.collection_select(:cost, [], :id, :name)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
|
188
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
|
189
|
+
end
|
|
190
|
+
assert_equal expected, output_buffer
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def test_grouped_collection_select
|
|
194
|
+
form_for(@post) do |f|
|
|
195
|
+
concat f.grouped_collection_select(:cost, [], :group_method, :group_label_method, :id, :name)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
|
199
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
|
200
|
+
end
|
|
201
|
+
assert_equal expected, output_buffer
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_time_zone_select
|
|
205
|
+
zones = mock('TimeZones')
|
|
206
|
+
zones.stubs(:all).returns([])
|
|
207
|
+
form_for(@post) do |f|
|
|
208
|
+
concat f.time_zone_select(:cost, nil, :model => zones)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
expected = whole_form("/posts/123", "edit_post_123", "edit_post", "put") do
|
|
212
|
+
%{<select id="post_cost" name="post[cost]"></select>}
|
|
213
|
+
end
|
|
214
|
+
assert_equal expected, output_buffer
|
|
215
|
+
end
|
|
160
216
|
end
|
|
217
|
+
|
|
@@ -138,24 +138,37 @@ class ActiveModel::ValidationsTest < ClientSideValidations::ActiveModelTestBase
|
|
|
138
138
|
assert_equal expected_hash, person.client_side_validation_hash
|
|
139
139
|
end
|
|
140
140
|
|
|
141
|
-
def
|
|
141
|
+
def test_generic_block_validators_should_be_ignored
|
|
142
142
|
person = new_person do |p|
|
|
143
|
-
p.
|
|
144
|
-
|
|
143
|
+
p.validates_each(:first_name) do |record, attr, value|
|
|
144
|
+
record.errors.add(:first_name, "failed")
|
|
145
|
+
end
|
|
145
146
|
end
|
|
146
147
|
|
|
147
148
|
expected_hash = {}
|
|
148
149
|
assert_equal expected_hash, person.client_side_validation_hash
|
|
149
150
|
end
|
|
150
151
|
|
|
151
|
-
def
|
|
152
|
+
def test_conditionals_persist_on_validator
|
|
152
153
|
person = new_person do |p|
|
|
153
|
-
p.
|
|
154
|
-
|
|
155
|
-
end
|
|
154
|
+
p.validates :first_name, :presence => { :if => :can_validate? }
|
|
155
|
+
p.validates :last_name, :presence => { :unless => :cannot_validate? }
|
|
156
156
|
end
|
|
157
157
|
|
|
158
|
-
expected_hash = {
|
|
158
|
+
expected_hash = {
|
|
159
|
+
:first_name => {
|
|
160
|
+
:presence => {
|
|
161
|
+
:message => "can't be blank",
|
|
162
|
+
:if => :can_validate?
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
:last_name => {
|
|
166
|
+
:presence => {
|
|
167
|
+
:message => "can't be blank",
|
|
168
|
+
:unless => :cannot_validate?
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
159
172
|
assert_equal expected_hash, person.client_side_validation_hash
|
|
160
173
|
end
|
|
161
174
|
end
|