simple_form_with_client_validation 0.0.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/CHANGELOG.md +6 -0
- data/MIT-LICENSE +20 -0
- data/README.md +783 -0
- data/lib/generators/simple_form_with_client_validation/USAGE +3 -0
- data/lib/generators/simple_form_with_client_validation/install_generator.rb +32 -0
- data/lib/generators/simple_form_with_client_validation/templates/README +12 -0
- data/lib/generators/simple_form_with_client_validation/templates/_form.html.erb +13 -0
- data/lib/generators/simple_form_with_client_validation/templates/_form.html.haml +10 -0
- data/lib/generators/simple_form_with_client_validation/templates/_form.html.slim +10 -0
- data/lib/generators/simple_form_with_client_validation/templates/config/initializers/simple_form.rb.tt +179 -0
- data/lib/generators/simple_form_with_client_validation/templates/config/locales/simple_form.en.yml +26 -0
- data/lib/simple_form_with_client_validation/action_view_extensions/builder.rb +331 -0
- data/lib/simple_form_with_client_validation/action_view_extensions/form_helper.rb +74 -0
- data/lib/simple_form_with_client_validation/components/errors.rb +35 -0
- data/lib/simple_form_with_client_validation/components/hints.rb +18 -0
- data/lib/simple_form_with_client_validation/components/html5.rb +26 -0
- data/lib/simple_form_with_client_validation/components/label_input.rb +15 -0
- data/lib/simple_form_with_client_validation/components/labels.rb +79 -0
- data/lib/simple_form_with_client_validation/components/maxlength.rb +41 -0
- data/lib/simple_form_with_client_validation/components/min_max.rb +50 -0
- data/lib/simple_form_with_client_validation/components/minlength.rb +41 -0
- data/lib/simple_form_with_client_validation/components/pattern.rb +34 -0
- data/lib/simple_form_with_client_validation/components/placeholders.rb +16 -0
- data/lib/simple_form_with_client_validation/components/readonly.rb +22 -0
- data/lib/simple_form_with_client_validation/components.rb +21 -0
- data/lib/simple_form_with_client_validation/core_ext/hash.rb +16 -0
- data/lib/simple_form_with_client_validation/error_notification.rb +48 -0
- data/lib/simple_form_with_client_validation/form_builder.rb +484 -0
- data/lib/simple_form_with_client_validation/helpers/autofocus.rb +11 -0
- data/lib/simple_form_with_client_validation/helpers/disabled.rb +15 -0
- data/lib/simple_form_with_client_validation/helpers/readonly.rb +15 -0
- data/lib/simple_form_with_client_validation/helpers/required.rb +35 -0
- data/lib/simple_form_with_client_validation/helpers/validators.rb +44 -0
- data/lib/simple_form_with_client_validation/helpers.rb +12 -0
- data/lib/simple_form_with_client_validation/i18n_cache.rb +22 -0
- data/lib/simple_form_with_client_validation/inputs/base.rb +162 -0
- data/lib/simple_form_with_client_validation/inputs/block_input.rb +14 -0
- data/lib/simple_form_with_client_validation/inputs/boolean_input.rb +64 -0
- data/lib/simple_form_with_client_validation/inputs/collection_check_boxes_input.rb +21 -0
- data/lib/simple_form_with_client_validation/inputs/collection_input.rb +101 -0
- data/lib/simple_form_with_client_validation/inputs/collection_radio_buttons_input.rb +63 -0
- data/lib/simple_form_with_client_validation/inputs/collection_select_input.rb +14 -0
- data/lib/simple_form_with_client_validation/inputs/date_time_input.rb +28 -0
- data/lib/simple_form_with_client_validation/inputs/file_input.rb +9 -0
- data/lib/simple_form_with_client_validation/inputs/grouped_collection_select_input.rb +41 -0
- data/lib/simple_form_with_client_validation/inputs/hidden_input.rb +17 -0
- data/lib/simple_form_with_client_validation/inputs/numeric_input.rb +24 -0
- data/lib/simple_form_with_client_validation/inputs/password_input.rb +12 -0
- data/lib/simple_form_with_client_validation/inputs/priority_input.rb +24 -0
- data/lib/simple_form_with_client_validation/inputs/range_input.rb +14 -0
- data/lib/simple_form_with_client_validation/inputs/string_input.rb +23 -0
- data/lib/simple_form_with_client_validation/inputs/text_input.rb +11 -0
- data/lib/simple_form_with_client_validation/inputs.rb +21 -0
- data/lib/simple_form_with_client_validation/map_type.rb +16 -0
- data/lib/simple_form_with_client_validation/version.rb +3 -0
- data/lib/simple_form_with_client_validation/wrappers/builder.rb +115 -0
- data/lib/simple_form_with_client_validation/wrappers/many.rb +78 -0
- data/lib/simple_form_with_client_validation/wrappers/root.rb +34 -0
- data/lib/simple_form_with_client_validation/wrappers/single.rb +18 -0
- data/lib/simple_form_with_client_validation/wrappers.rb +8 -0
- data/lib/simple_form_with_client_validation.rb +218 -0
- data/test/action_view_extensions/builder_test.rb +577 -0
- data/test/action_view_extensions/form_helper_test.rb +104 -0
- data/test/components/label_test.rb +310 -0
- data/test/form_builder/association_test.rb +177 -0
- data/test/form_builder/button_test.rb +47 -0
- data/test/form_builder/error_notification_test.rb +79 -0
- data/test/form_builder/error_test.rb +121 -0
- data/test/form_builder/general_test.rb +356 -0
- data/test/form_builder/hint_test.rb +139 -0
- data/test/form_builder/input_field_test.rb +63 -0
- data/test/form_builder/label_test.rb +71 -0
- data/test/form_builder/wrapper_test.rb +149 -0
- data/test/generators/simple_form_generator_test.rb +32 -0
- data/test/inputs/boolean_input_test.rb +108 -0
- data/test/inputs/collection_check_boxes_input_test.rb +224 -0
- data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
- data/test/inputs/collection_select_input_test.rb +241 -0
- data/test/inputs/datetime_input_test.rb +99 -0
- data/test/inputs/disabled_test.rb +38 -0
- data/test/inputs/discovery_test.rb +61 -0
- data/test/inputs/file_input_test.rb +16 -0
- data/test/inputs/general_test.rb +69 -0
- data/test/inputs/grouped_collection_select_input_test.rb +118 -0
- data/test/inputs/hidden_input_test.rb +30 -0
- data/test/inputs/numeric_input_test.rb +173 -0
- data/test/inputs/priority_input_test.rb +43 -0
- data/test/inputs/readonly_test.rb +61 -0
- data/test/inputs/required_test.rb +113 -0
- data/test/inputs/string_input_test.rb +140 -0
- data/test/inputs/text_input_test.rb +29 -0
- data/test/simple_form_test.rb +9 -0
- data/test/support/discovery_inputs.rb +21 -0
- data/test/support/misc_helpers.rb +102 -0
- data/test/support/mock_controller.rb +24 -0
- data/test/support/mock_response.rb +14 -0
- data/test/support/models.rb +210 -0
- data/test/test_helper.rb +95 -0
- metadata +227 -0
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class BooleanInputTest < ActionView::TestCase
|
5
|
+
test 'input should generate a checkbox by default for boolean attributes' do
|
6
|
+
with_input_for @user, :active, :boolean
|
7
|
+
assert_select 'input[type=checkbox].boolean#user_active'
|
8
|
+
assert_select 'label.boolean.optional', 'Active'
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'input does not generate the label with the checkbox when label option is false' do
|
12
|
+
with_input_for @user, :active, :boolean, :label => false
|
13
|
+
assert_select 'input[type=checkbox].boolean#user_active'
|
14
|
+
assert_no_select 'label'
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'input uses inline boolean style by default' do
|
18
|
+
with_input_for @user, :active, :boolean
|
19
|
+
assert_select 'input.boolean + label.boolean.optional'
|
20
|
+
assert_no_select 'label > input'
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'input allows changing default boolean style config to nested, generating a default label and a manual hidden field for checkbox' do
|
24
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
25
|
+
with_input_for @user, :active, :boolean
|
26
|
+
assert_select 'label[for=user_active]', 'Active'
|
27
|
+
assert_select 'label.boolean > input.boolean'
|
28
|
+
assert_no_select 'input[type=checkbox] + label'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'input boolean with nested allows :inline_label' do
|
33
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
34
|
+
with_input_for @user, :active, :boolean, :label => false, :inline_label => 'I am so inline.'
|
35
|
+
assert_select 'label.checkbox', :text => 'I am so inline.'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'input boolean with nested generates a manual hidden field for checkbox outside the label, to recreate Rails functionality with valid html5' do
|
40
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
41
|
+
with_input_for @user, :active, :boolean
|
42
|
+
|
43
|
+
assert_select "input[type=hidden][name='user[active]'] + label.boolean > input.boolean"
|
44
|
+
assert_no_select 'input[type=checkbox] + label'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
test 'input boolean with nested generates a disabled hidden field for checkbox outside the label, if the field is disabled' do
|
49
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
50
|
+
with_input_for @user, :active, :boolean, :disabled => true
|
51
|
+
|
52
|
+
assert_select "input[type=hidden][name='user[active]'][disabled] + label.boolean > input.boolean[disabled]"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'input accepts changing boolean style to nested through given options' do
|
57
|
+
with_input_for @user, :active, :boolean, :boolean_style => :nested
|
58
|
+
assert_select 'label[for=user_active]', 'Active'
|
59
|
+
assert_select 'label.boolean > input.boolean'
|
60
|
+
assert_no_select 'input[type=checkbox] + label'
|
61
|
+
end
|
62
|
+
|
63
|
+
test 'input accepts changing boolean style to inline through given options, when default is nested' do
|
64
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
65
|
+
with_input_for @user, :active, :boolean, :boolean_style => :inline
|
66
|
+
assert_select 'label[for=user_active]', 'Active'
|
67
|
+
assert_select 'input.boolean + label.boolean'
|
68
|
+
assert_no_select 'label > input'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
test 'input with nested style allows disabling label' do
|
73
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
74
|
+
with_input_for @user, :active, :boolean, :label => false
|
75
|
+
assert_select 'input.boolean'
|
76
|
+
assert_no_select 'label.boolean'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
test 'input boolean works using :input only in wrapper config (no label_input)' do
|
81
|
+
swap_wrapper do
|
82
|
+
with_input_for @user, :active, :boolean
|
83
|
+
|
84
|
+
assert_select 'label.boolean + input[type=hidden] + input.boolean'
|
85
|
+
assert_no_select 'label.checkbox'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
test 'input boolean with nested style works using :input only in wrapper config (no label_input), adding the extra "checkbox" label wrapper' do
|
90
|
+
swap_wrapper do
|
91
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
92
|
+
with_input_for @user, :active, :boolean
|
93
|
+
|
94
|
+
assert_select 'label.boolean + input[type=hidden] + label.checkbox > input.boolean'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
test 'input boolean with nested style works using :label_input in wrapper config, adding "checkbox" class to label' do
|
100
|
+
swap_wrapper :default, self.custom_wrapper_without_top_level do
|
101
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
102
|
+
with_input_for @user, :active, :boolean
|
103
|
+
|
104
|
+
assert_select 'input[type=hidden] + label.boolean.checkbox > input.boolean'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,224 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class CollectionCheckBoxesInputTest < ActionView::TestCase
|
5
|
+
setup do
|
6
|
+
SimpleFormWithClientValidation::Inputs::CollectionCheckBoxesInput.reset_i18n_cache :boolean_collection
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'input check boxes should not include for attribute by default' do
|
10
|
+
with_input_for @user, :gender, :check_boxes, :collection => [:male, :female]
|
11
|
+
assert_select 'label'
|
12
|
+
assert_no_select 'label[for=user_gender]'
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'input check boxes should include for attribute when giving as html option' do
|
16
|
+
with_input_for @user, :gender, :check_boxes, :collection => [:male, :female], :label_html => { :for => 'gender' }
|
17
|
+
assert_select 'label[for=gender]'
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'collection input with check_boxes type should not generate required html attribute' do
|
21
|
+
with_input_for @user, :name, :check_boxes, :collection => ['Jose' , 'Carlos']
|
22
|
+
assert_select 'input.required'
|
23
|
+
assert_no_select 'input[required]'
|
24
|
+
end
|
25
|
+
|
26
|
+
test 'input should do automatic collection translation for check_box types using defaults key' do
|
27
|
+
store_translations(:en, :simple_form => { :options => { :defaults => {
|
28
|
+
:gender => { :male => 'Male', :female => 'Female'}
|
29
|
+
} } } ) do
|
30
|
+
with_input_for @user, :gender, :check_boxes, :collection => [:male, :female]
|
31
|
+
assert_select 'input[type=checkbox][value=male]'
|
32
|
+
assert_select 'input[type=checkbox][value=female]'
|
33
|
+
assert_select 'label.collection_check_boxes', 'Male'
|
34
|
+
assert_select 'label.collection_check_boxes', 'Female'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'input should do automatic collection translation for check_box types using specific object key' do
|
39
|
+
store_translations(:en, :simple_form => { :options => { :user => {
|
40
|
+
:gender => { :male => 'Male', :female => 'Female'}
|
41
|
+
} } } ) do
|
42
|
+
with_input_for @user, :gender, :check_boxes, :collection => [:male, :female]
|
43
|
+
assert_select 'input[type=checkbox][value=male]'
|
44
|
+
assert_select 'input[type=checkbox][value=female]'
|
45
|
+
assert_select 'label.collection_check_boxes', 'Male'
|
46
|
+
assert_select 'label.collection_check_boxes', 'Female'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
test 'input check boxes does not wrap the collection by default' do
|
51
|
+
with_input_for @user, :active, :check_boxes
|
52
|
+
|
53
|
+
assert_select 'form input[type=checkbox]', :count => 2
|
54
|
+
assert_no_select 'form ul'
|
55
|
+
end
|
56
|
+
|
57
|
+
test 'input check boxes wraps the collection in the configured collection wrapper tag' do
|
58
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
59
|
+
with_input_for @user, :active, :check_boxes
|
60
|
+
|
61
|
+
assert_select 'form ul input[type=checkbox]', :count => 2
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
test 'input check boxes does not wrap the collection when configured with falsy values' do
|
66
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => false do
|
67
|
+
with_input_for @user, :active, :check_boxes
|
68
|
+
|
69
|
+
assert_select 'form input[type=checkbox]', :count => 2
|
70
|
+
assert_no_select 'form ul'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'input check boxes allows overriding the collection wrapper tag at input level' do
|
75
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
76
|
+
with_input_for @user, :active, :check_boxes, :collection_wrapper_tag => :section
|
77
|
+
|
78
|
+
assert_select 'form section input[type=checkbox]', :count => 2
|
79
|
+
assert_no_select 'form ul'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
test 'input check boxes allows disabling the collection wrapper tag at input level' do
|
84
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
85
|
+
with_input_for @user, :active, :check_boxes, :collection_wrapper_tag => false
|
86
|
+
|
87
|
+
assert_select 'form input[type=checkbox]', :count => 2
|
88
|
+
assert_no_select 'form ul'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
test 'input check boxes renders the wrapper tag with the configured wrapper class' do
|
93
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do
|
94
|
+
with_input_for @user, :active, :check_boxes
|
95
|
+
|
96
|
+
assert_select 'form ul.inputs-list input[type=checkbox]', :count => 2
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
test 'input check boxes allows giving wrapper class at input level only' do
|
101
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
102
|
+
with_input_for @user, :active, :check_boxes, :collection_wrapper_class => 'items-list'
|
103
|
+
|
104
|
+
assert_select 'form ul.items-list input[type=checkbox]', :count => 2
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
test 'input check boxes uses both configured and given wrapper classes for wrapper tag' do
|
109
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do
|
110
|
+
with_input_for @user, :active, :check_boxes, :collection_wrapper_class => 'items-list'
|
111
|
+
|
112
|
+
assert_select 'form ul.inputs-list.items-list input[type=checkbox]', :count => 2
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
test 'input check boxes wraps each item in the configured item wrapper tag' do
|
117
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li do
|
118
|
+
with_input_for @user, :active, :check_boxes
|
119
|
+
|
120
|
+
assert_select 'form li input[type=checkbox]', :count => 2
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
test 'input check boxes does not wrap items when configured with falsy values' do
|
125
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => false do
|
126
|
+
with_input_for @user, :active, :check_boxes
|
127
|
+
|
128
|
+
assert_select 'form input[type=checkbox]', :count => 2
|
129
|
+
assert_no_select 'form li'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
test 'input check boxes allows overriding the item wrapper tag at input level' do
|
134
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li do
|
135
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_tag => :dl
|
136
|
+
|
137
|
+
assert_select 'form dl input[type=checkbox]', :count => 2
|
138
|
+
assert_no_select 'form li'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
test 'input check boxes allows disabling the item wrapper tag at input level' do
|
143
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :ul do
|
144
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_tag => false
|
145
|
+
|
146
|
+
assert_select 'form input[type=checkbox]', :count => 2
|
147
|
+
assert_no_select 'form li'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
test 'input check boxes wraps items in a span tag by default' do
|
152
|
+
with_input_for @user, :active, :check_boxes
|
153
|
+
|
154
|
+
assert_select 'form span input[type=checkbox]', :count => 2
|
155
|
+
end
|
156
|
+
|
157
|
+
test 'input check boxes renders the item wrapper tag with a default class "checkbox"' do
|
158
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_tag => :li
|
159
|
+
|
160
|
+
assert_select 'form li.checkbox input[type=checkbox]', :count => 2
|
161
|
+
end
|
162
|
+
|
163
|
+
test 'input check boxes renders the item wrapper tag with the configured item wrapper class' do
|
164
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li, :item_wrapper_class => 'item' do
|
165
|
+
with_input_for @user, :active, :check_boxes
|
166
|
+
|
167
|
+
assert_select 'form li.checkbox.item input[type=checkbox]', :count => 2
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
test 'input check boxes allows giving item wrapper class at input level only' do
|
172
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li do
|
173
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_class => 'item'
|
174
|
+
|
175
|
+
assert_select 'form li.checkbox.item input[type=checkbox]', :count => 2
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
test 'input check boxes uses both configured and given item wrapper classes for item wrapper tag' do
|
180
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li, :item_wrapper_class => 'item' do
|
181
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_class => 'inline'
|
182
|
+
|
183
|
+
assert_select 'form li.checkbox.item.inline input[type=checkbox]', :count => 2
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
test 'input check boxes respects the nested boolean style config, generating nested label > input' do
|
188
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
189
|
+
with_input_for @user, :active, :check_boxes
|
190
|
+
|
191
|
+
assert_select 'label.checkbox > input#user_active_true[type=checkbox]'
|
192
|
+
assert_select 'label.checkbox', 'Yes'
|
193
|
+
assert_select 'label.checkbox > input#user_active_false[type=checkbox]'
|
194
|
+
assert_select 'label.checkbox', 'No'
|
195
|
+
assert_no_select 'label.collection_radio_buttons'
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
test 'input check boxes with nested style overrides configured item wrapper tag, forcing the :label' do
|
200
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested, :item_wrapper_tag => :li do
|
201
|
+
with_input_for @user, :active, :check_boxes
|
202
|
+
|
203
|
+
assert_select 'label.checkbox > input'
|
204
|
+
assert_no_select 'li'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
test 'input check boxes with nested style overrides given item wrapper tag, forcing the :label' do
|
209
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
210
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_tag => :li
|
211
|
+
|
212
|
+
assert_select 'label.checkbox > input'
|
213
|
+
assert_no_select 'li'
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
test 'input check boxes with nested style accepts giving extra wrapper classes' do
|
218
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
219
|
+
with_input_for @user, :active, :check_boxes, :item_wrapper_class => "inline"
|
220
|
+
|
221
|
+
assert_select 'label.checkbox.inline > input'
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
@@ -0,0 +1,326 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class CollectionRadioButtonsInputTest < ActionView::TestCase
|
5
|
+
setup do
|
6
|
+
SimpleFormWithClientValidation::Inputs::CollectionRadioButtonsInput.reset_i18n_cache :boolean_collection
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'input :as => :radio is deprecated in favor of :as => :radio_buttons' do
|
10
|
+
assert_deprecated "[SIMPLE_FORM] Using `:as => :radio` as " \
|
11
|
+
"input type is deprecated, please change it to `:as => :radio_buttons`." do
|
12
|
+
with_input_for @user, :active, :radio
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_select 'input[type=radio].radio_buttons', :count => 2
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'input should generate boolean radio buttons by default for radio types' do
|
19
|
+
with_input_for @user, :active, :radio_buttons
|
20
|
+
assert_select 'input[type=radio][value=true].radio_buttons#user_active_true'
|
21
|
+
assert_select 'input[type=radio][value=false].radio_buttons#user_active_false'
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'input as radio should generate internal labels by default' do
|
25
|
+
with_input_for @user, :active, :radio_buttons
|
26
|
+
assert_select 'label[for=user_active_true]', 'Yes'
|
27
|
+
assert_select 'label[for=user_active_false]', 'No'
|
28
|
+
end
|
29
|
+
|
30
|
+
test 'input as radio should use i18n to translate internal labels' do
|
31
|
+
store_translations(:en, :simple_form => { :yes => 'Sim', :no => 'Não' }) do
|
32
|
+
with_input_for @user, :active, :radio_buttons
|
33
|
+
assert_select 'label[for=user_active_true]', 'Sim'
|
34
|
+
assert_select 'label[for=user_active_false]', 'Não'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'input radio should not include for attribute by default' do
|
39
|
+
with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female]
|
40
|
+
assert_select 'label'
|
41
|
+
assert_no_select 'label[for=user_gender]'
|
42
|
+
end
|
43
|
+
|
44
|
+
test 'input radio should include for attribute when giving as html option' do
|
45
|
+
with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female], :label_html => { :for => 'gender' }
|
46
|
+
assert_select 'label[for=gender]'
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'input should mark the checked value when using boolean and radios' do
|
50
|
+
@user.active = false
|
51
|
+
with_input_for @user, :active, :radio_buttons
|
52
|
+
assert_no_select 'input[type=radio][value=true][checked]'
|
53
|
+
assert_select 'input[type=radio][value=false][checked]'
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'input should allow overriding collection for radio types' do
|
57
|
+
with_input_for @user, :name, :radio_buttons, :collection => ['Jose', 'Carlos']
|
58
|
+
assert_select 'input[type=radio][value=Jose]'
|
59
|
+
assert_select 'input[type=radio][value=Carlos]'
|
60
|
+
assert_select 'label.collection_radio_buttons', 'Jose'
|
61
|
+
assert_select 'label.collection_radio_buttons', 'Carlos'
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'input should do automatic collection translation for radio types using defaults key' do
|
65
|
+
store_translations(:en, :simple_form => { :options => { :defaults => {
|
66
|
+
:gender => { :male => 'Male', :female => 'Female'}
|
67
|
+
} } } ) do
|
68
|
+
with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female]
|
69
|
+
assert_select 'input[type=radio][value=male]'
|
70
|
+
assert_select 'input[type=radio][value=female]'
|
71
|
+
assert_select 'label.collection_radio_buttons', 'Male'
|
72
|
+
assert_select 'label.collection_radio_buttons', 'Female'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
test 'input should do automatic collection translation for radio types using specific object key' do
|
77
|
+
store_translations(:en, :simple_form => { :options => { :user => {
|
78
|
+
:gender => { :male => 'Male', :female => 'Female'}
|
79
|
+
} } } ) do
|
80
|
+
with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female]
|
81
|
+
assert_select 'input[type=radio][value=male]'
|
82
|
+
assert_select 'input[type=radio][value=female]'
|
83
|
+
assert_select 'label.collection_radio_buttons', 'Male'
|
84
|
+
assert_select 'label.collection_radio_buttons', 'Female'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
test 'input should mark the current radio value by default' do
|
89
|
+
@user.name = "Carlos"
|
90
|
+
with_input_for @user, :name, :radio_buttons, :collection => ['Jose', 'Carlos']
|
91
|
+
assert_select 'input[type=radio][value=Carlos][checked=checked]'
|
92
|
+
end
|
93
|
+
|
94
|
+
test 'input should allow using a collection with text/value arrays' do
|
95
|
+
with_input_for @user, :name, :radio_buttons, :collection => [['Jose', 'jose'], ['Carlos', 'carlos']]
|
96
|
+
assert_select 'input[type=radio][value=jose]'
|
97
|
+
assert_select 'input[type=radio][value=carlos]'
|
98
|
+
assert_select 'label.collection_radio_buttons', 'Jose'
|
99
|
+
assert_select 'label.collection_radio_buttons', 'Carlos'
|
100
|
+
end
|
101
|
+
|
102
|
+
test 'input should allow using a collection with a Proc' do
|
103
|
+
with_input_for @user, :name, :radio_buttons, :collection => Proc.new { ['Jose', 'Carlos' ] }
|
104
|
+
assert_select 'label.collection_radio_buttons', 'Jose'
|
105
|
+
assert_select 'label.collection_radio_buttons', 'Carlos'
|
106
|
+
end
|
107
|
+
|
108
|
+
test 'input should allow overriding only label method for collections' do
|
109
|
+
with_input_for @user, :name, :radio_buttons,
|
110
|
+
:collection => ['Jose' , 'Carlos'],
|
111
|
+
:label_method => :upcase
|
112
|
+
assert_select 'label.collection_radio_buttons', 'JOSE'
|
113
|
+
assert_select 'label.collection_radio_buttons', 'CARLOS'
|
114
|
+
end
|
115
|
+
|
116
|
+
test 'input should allow overriding only value method for collections' do
|
117
|
+
with_input_for @user, :name, :radio_buttons,
|
118
|
+
:collection => ['Jose' , 'Carlos'],
|
119
|
+
:value_method => :upcase
|
120
|
+
assert_select 'input[type=radio][value=JOSE]'
|
121
|
+
assert_select 'input[type=radio][value=CARLOS]'
|
122
|
+
end
|
123
|
+
|
124
|
+
test 'input should allow overriding label and value method for collections' do
|
125
|
+
with_input_for @user, :name, :radio_buttons,
|
126
|
+
:collection => ['Jose' , 'Carlos'],
|
127
|
+
:label_method => :upcase,
|
128
|
+
:value_method => :downcase
|
129
|
+
assert_select 'input[type=radio][value=jose]'
|
130
|
+
assert_select 'input[type=radio][value=carlos]'
|
131
|
+
assert_select 'label.collection_radio_buttons', 'JOSE'
|
132
|
+
assert_select 'label.collection_radio_buttons', 'CARLOS'
|
133
|
+
end
|
134
|
+
|
135
|
+
test 'input should allow overriding label and value method using a lambda for collections' do
|
136
|
+
with_input_for @user, :name, :radio_buttons,
|
137
|
+
:collection => ['Jose' , 'Carlos'],
|
138
|
+
:label_method => lambda { |i| i.upcase },
|
139
|
+
:value_method => lambda { |i| i.downcase }
|
140
|
+
assert_select 'input[type=radio][value=jose]'
|
141
|
+
assert_select 'input[type=radio][value=carlos]'
|
142
|
+
assert_select 'label.collection_radio_buttons', 'JOSE'
|
143
|
+
assert_select 'label.collection_radio_buttons', 'CARLOS'
|
144
|
+
end
|
145
|
+
|
146
|
+
test 'collection input with radio type should generate required html attribute' do
|
147
|
+
with_input_for @user, :name, :radio_buttons, :collection => ['Jose' , 'Carlos']
|
148
|
+
assert_select 'input[type=radio].required'
|
149
|
+
assert_select 'input[type=radio][required]'
|
150
|
+
end
|
151
|
+
|
152
|
+
test 'input radio does not wrap the collection by default' do
|
153
|
+
with_input_for @user, :active, :radio_buttons
|
154
|
+
|
155
|
+
assert_select 'form input[type=radio]', :count => 2
|
156
|
+
assert_no_select 'form ul'
|
157
|
+
end
|
158
|
+
|
159
|
+
test 'input radio wraps the collection in the configured collection wrapper tag' do
|
160
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
161
|
+
with_input_for @user, :active, :radio_buttons
|
162
|
+
|
163
|
+
assert_select 'form ul input[type=radio]', :count => 2
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
test 'input radio does not wrap the collection when configured with falsy values' do
|
168
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => false do
|
169
|
+
with_input_for @user, :active, :radio_buttons
|
170
|
+
|
171
|
+
assert_select 'form input[type=radio]', :count => 2
|
172
|
+
assert_no_select 'form ul'
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
test 'input radio allows overriding the collection wrapper tag at input level' do
|
177
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
178
|
+
with_input_for @user, :active, :radio_buttons, :collection_wrapper_tag => :section
|
179
|
+
|
180
|
+
assert_select 'form section input[type=radio]', :count => 2
|
181
|
+
assert_no_select 'form ul'
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
test 'input radio allows disabling the collection wrapper tag at input level' do
|
186
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
187
|
+
with_input_for @user, :active, :radio_buttons, :collection_wrapper_tag => false
|
188
|
+
|
189
|
+
assert_select 'form input[type=radio]', :count => 2
|
190
|
+
assert_no_select 'form ul'
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
test 'input radio renders the wrapper tag with the configured wrapper class' do
|
195
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do
|
196
|
+
with_input_for @user, :active, :radio_buttons
|
197
|
+
|
198
|
+
assert_select 'form ul.inputs-list input[type=radio]', :count => 2
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
test 'input radio allows giving wrapper class at input level only' do
|
203
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul do
|
204
|
+
with_input_for @user, :active, :radio_buttons, :collection_wrapper_class => 'items-list'
|
205
|
+
|
206
|
+
assert_select 'form ul.items-list input[type=radio]', :count => 2
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
test 'input radio uses both configured and given wrapper classes for wrapper tag' do
|
211
|
+
swap SimpleFormWithClientValidation, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do
|
212
|
+
with_input_for @user, :active, :radio_buttons, :collection_wrapper_class => 'items-list'
|
213
|
+
|
214
|
+
assert_select 'form ul.inputs-list.items-list input[type=radio]', :count => 2
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
test 'input radio wraps each item in the configured item wrapper tag' do
|
219
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li do
|
220
|
+
with_input_for @user, :active, :radio_buttons
|
221
|
+
|
222
|
+
assert_select 'form li input[type=radio]', :count => 2
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
test 'input radio does not wrap items when configured with falsy values' do
|
227
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => false do
|
228
|
+
with_input_for @user, :active, :radio_buttons
|
229
|
+
|
230
|
+
assert_select 'form input[type=radio]', :count => 2
|
231
|
+
assert_no_select 'form li'
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
test 'input radio allows overriding the item wrapper tag at input level' do
|
236
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li do
|
237
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => :dl
|
238
|
+
|
239
|
+
assert_select 'form dl input[type=radio]', :count => 2
|
240
|
+
assert_no_select 'form li'
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
test 'input radio allows disabling the item wrapper tag at input level' do
|
245
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :ul do
|
246
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => false
|
247
|
+
|
248
|
+
assert_select 'form input[type=radio]', :count => 2
|
249
|
+
assert_no_select 'form li'
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
test 'input radio wraps items in a span tag by default' do
|
254
|
+
with_input_for @user, :active, :radio_buttons
|
255
|
+
|
256
|
+
assert_select 'form span input[type=radio]', :count => 2
|
257
|
+
end
|
258
|
+
|
259
|
+
test 'input radio renders the item wrapper tag with a default class "radio"' do
|
260
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => :li
|
261
|
+
|
262
|
+
assert_select 'form li.radio input[type=radio]', :count => 2
|
263
|
+
end
|
264
|
+
|
265
|
+
test 'input radio renders the item wrapper tag with the configured item wrapper class' do
|
266
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li, :item_wrapper_class => 'item' do
|
267
|
+
with_input_for @user, :active, :radio_buttons
|
268
|
+
|
269
|
+
assert_select 'form li.radio.item input[type=radio]', :count => 2
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
test 'input radio allows giving item wrapper class at input level only' do
|
274
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li do
|
275
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_class => 'item'
|
276
|
+
|
277
|
+
assert_select 'form li.radio.item input[type=radio]', :count => 2
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
test 'input radio uses both configured and given item wrapper classes for item wrapper tag' do
|
282
|
+
swap SimpleFormWithClientValidation, :item_wrapper_tag => :li, :item_wrapper_class => 'item' do
|
283
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_class => 'inline'
|
284
|
+
|
285
|
+
assert_select 'form li.radio.item.inline input[type=radio]', :count => 2
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
test 'input radio respects the nested boolean style config, generating nested label > input' do
|
290
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
291
|
+
with_input_for @user, :active, :radio_buttons
|
292
|
+
|
293
|
+
assert_select 'label.radio > input#user_active_true[type=radio]'
|
294
|
+
assert_select 'label.radio', 'Yes'
|
295
|
+
assert_select 'label.radio > input#user_active_false[type=radio]'
|
296
|
+
assert_select 'label.radio', 'No'
|
297
|
+
assert_no_select 'label.collection_radio_buttons'
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
test 'input radio with nested style overrides configured item wrapper tag, forcing the :label' do
|
302
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested, :item_wrapper_tag => :li do
|
303
|
+
with_input_for @user, :active, :radio_buttons
|
304
|
+
|
305
|
+
assert_select 'label.radio > input'
|
306
|
+
assert_no_select 'li'
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
test 'input radio with nested style overrides given item wrapper tag, forcing the :label' do
|
311
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
312
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => :li
|
313
|
+
|
314
|
+
assert_select 'label.radio > input'
|
315
|
+
assert_no_select 'li'
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
test 'input radio with nested style accepts giving extra wrapper classes' do
|
320
|
+
swap SimpleFormWithClientValidation, :boolean_style => :nested do
|
321
|
+
with_input_for @user, :active, :radio_buttons, :item_wrapper_class => "inline"
|
322
|
+
|
323
|
+
assert_select 'label.radio.inline > input'
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|