simple_form 2.1.0 → 3.2.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.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +77 -33
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +387 -187
  5. data/lib/generators/simple_form/install_generator.rb +4 -4
  6. data/lib/generators/simple_form/templates/README +3 -4
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +45 -22
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +128 -24
  9. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +87 -6
  10. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +7 -2
  11. data/lib/simple_form/action_view_extensions/builder.rb +2 -319
  12. data/lib/simple_form/action_view_extensions/form_helper.rb +8 -11
  13. data/lib/simple_form/components/errors.rb +28 -2
  14. data/lib/simple_form/components/hints.rb +8 -3
  15. data/lib/simple_form/components/html5.rb +6 -3
  16. data/lib/simple_form/components/label_input.rb +20 -2
  17. data/lib/simple_form/components/labels.rb +14 -10
  18. data/lib/simple_form/components/maxlength.rb +2 -9
  19. data/lib/simple_form/components/min_max.rb +1 -1
  20. data/lib/simple_form/components/pattern.rb +3 -3
  21. data/lib/simple_form/components/placeholders.rb +2 -2
  22. data/lib/simple_form/components/readonly.rb +1 -1
  23. data/lib/simple_form/components.rb +1 -1
  24. data/lib/simple_form/error_notification.rb +2 -2
  25. data/lib/simple_form/form_builder.rb +262 -107
  26. data/lib/simple_form/helpers.rb +6 -6
  27. data/lib/simple_form/inputs/base.rb +37 -16
  28. data/lib/simple_form/inputs/block_input.rb +2 -2
  29. data/lib/simple_form/inputs/boolean_input.rb +33 -18
  30. data/lib/simple_form/inputs/collection_input.rb +34 -13
  31. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +7 -12
  32. data/lib/simple_form/inputs/collection_select_input.rb +4 -2
  33. data/lib/simple_form/inputs/date_time_input.rb +23 -9
  34. data/lib/simple_form/inputs/file_input.rb +4 -2
  35. data/lib/simple_form/inputs/grouped_collection_select_input.rb +15 -3
  36. data/lib/simple_form/inputs/hidden_input.rb +4 -2
  37. data/lib/simple_form/inputs/numeric_input.rb +3 -8
  38. data/lib/simple_form/inputs/password_input.rb +4 -3
  39. data/lib/simple_form/inputs/priority_input.rb +4 -2
  40. data/lib/simple_form/inputs/range_input.rb +1 -1
  41. data/lib/simple_form/inputs/string_input.rb +4 -3
  42. data/lib/simple_form/inputs/text_input.rb +4 -2
  43. data/lib/simple_form/railtie.rb +14 -0
  44. data/lib/simple_form/tags.rb +68 -0
  45. data/lib/simple_form/version.rb +1 -1
  46. data/lib/simple_form/wrappers/builder.rb +11 -35
  47. data/lib/simple_form/wrappers/leaf.rb +28 -0
  48. data/lib/simple_form/wrappers/many.rb +7 -7
  49. data/lib/simple_form/wrappers/root.rb +2 -2
  50. data/lib/simple_form/wrappers/single.rb +5 -3
  51. data/lib/simple_form/wrappers.rb +2 -1
  52. data/lib/simple_form.rb +99 -52
  53. data/test/action_view_extensions/builder_test.rb +113 -127
  54. data/test/action_view_extensions/form_helper_test.rb +58 -30
  55. data/test/components/label_test.rb +83 -83
  56. data/test/form_builder/association_test.rb +96 -61
  57. data/test/form_builder/button_test.rb +14 -14
  58. data/test/form_builder/error_notification_test.rb +9 -9
  59. data/test/form_builder/error_test.rb +159 -34
  60. data/test/form_builder/general_test.rb +176 -121
  61. data/test/form_builder/hint_test.rb +43 -37
  62. data/test/form_builder/input_field_test.rb +99 -52
  63. data/test/form_builder/label_test.rb +67 -15
  64. data/test/form_builder/wrapper_test.rb +157 -41
  65. data/test/generators/simple_form_generator_test.rb +4 -4
  66. data/test/inputs/boolean_input_test.rb +92 -24
  67. data/test/inputs/collection_check_boxes_input_test.rb +150 -71
  68. data/test/inputs/collection_radio_buttons_input_test.rb +213 -113
  69. data/test/inputs/collection_select_input_test.rb +221 -85
  70. data/test/inputs/datetime_input_test.rb +125 -47
  71. data/test/inputs/disabled_test.rb +25 -25
  72. data/test/inputs/discovery_test.rb +60 -10
  73. data/test/inputs/file_input_test.rb +3 -3
  74. data/test/inputs/general_test.rb +48 -32
  75. data/test/inputs/grouped_collection_select_input_test.rb +76 -27
  76. data/test/inputs/hidden_input_test.rb +6 -5
  77. data/test/inputs/numeric_input_test.rb +46 -46
  78. data/test/inputs/priority_input_test.rb +21 -15
  79. data/test/inputs/readonly_test.rb +31 -31
  80. data/test/inputs/required_test.rb +30 -18
  81. data/test/inputs/string_input_test.rb +53 -52
  82. data/test/inputs/text_input_test.rb +15 -8
  83. data/test/simple_form_test.rb +8 -0
  84. data/test/support/discovery_inputs.rb +32 -2
  85. data/test/support/misc_helpers.rb +130 -29
  86. data/test/support/mock_controller.rb +6 -6
  87. data/test/support/models.rb +125 -71
  88. data/test/test_helper.rb +28 -35
  89. metadata +17 -29
  90. data/lib/simple_form/action_view_extensions/builder.rb.orig +0 -247
  91. data/lib/simple_form/core_ext/hash.rb +0 -16
  92. data/lib/simple_form/form_builder.rb.orig +0 -486
  93. data/lib/simple_form/version.rb.orig +0 -7
@@ -6,246 +6,292 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
6
6
  SimpleForm::Inputs::CollectionRadioButtonsInput.reset_i18n_cache :boolean_collection
7
7
  end
8
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
9
+ test 'input generates boolean radio buttons by default for radio types' do
19
10
  with_input_for @user, :active, :radio_buttons
20
11
  assert_select 'input[type=radio][value=true].radio_buttons#user_active_true'
21
12
  assert_select 'input[type=radio][value=false].radio_buttons#user_active_false'
22
13
  end
23
14
 
24
- test 'input as radio should generate internal labels by default' do
15
+ test 'input as radio generates internal labels by default' do
25
16
  with_input_for @user, :active, :radio_buttons
26
17
  assert_select 'label[for=user_active_true]', 'Yes'
27
18
  assert_select 'label[for=user_active_false]', 'No'
28
19
  end
29
20
 
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
21
+ test 'input as radio generates internal labels with accurate `for` values with nested boolean style' do
22
+ swap SimpleForm, boolean_style: :nested do
23
+ with_input_for @user, :active, :radio_buttons
24
+ assert_select 'label[for=user_active_true]', 'Yes'
25
+ assert_select 'label[for=user_active_false]', 'No'
26
+ end
27
+ end
28
+
29
+ test 'nested label does not duplicate input id' do
30
+ swap SimpleForm, boolean_style: :nested do
31
+ with_input_for @user, :active, :radio_buttons, id: 'nested_id'
32
+ assert_select 'input#user_active_true'
33
+ assert_no_select 'label#user_active_true'
34
+ end
35
+ end
36
+
37
+ test 'input as radio uses i18n to translate internal labels' do
38
+ store_translations(:en, simple_form: { yes: 'Sim', no: 'Não' }) do
32
39
  with_input_for @user, :active, :radio_buttons
33
40
  assert_select 'label[for=user_active_true]', 'Sim'
34
41
  assert_select 'label[for=user_active_false]', 'Não'
35
42
  end
36
43
  end
37
44
 
38
- test 'input radio should not include for attribute by default' do
39
- with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female]
45
+ test 'input radio does not include for attribute by default' do
46
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
40
47
  assert_select 'label'
41
48
  assert_no_select 'label[for=user_gender]'
42
49
  end
43
50
 
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' }
51
+ test 'input radio includes for attribute when giving as html option' do
52
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female], label_html: { for: 'gender' }
46
53
  assert_select 'label[for=gender]'
47
54
  end
48
55
 
49
- test 'input should mark the checked value when using boolean and radios' do
56
+ test 'input marks the checked value when using boolean and radios' do
50
57
  @user.active = false
51
58
  with_input_for @user, :active, :radio_buttons
52
59
  assert_no_select 'input[type=radio][value=true][checked]'
53
60
  assert_select 'input[type=radio][value=false][checked]'
54
61
  end
55
62
 
56
- test 'input should allow overriding collection for radio types' do
57
- with_input_for @user, :name, :radio_buttons, :collection => ['Jose', 'Carlos']
63
+ test 'input allows overriding collection for radio types' do
64
+ with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
58
65
  assert_select 'input[type=radio][value=Jose]'
59
66
  assert_select 'input[type=radio][value=Carlos]'
60
- assert_select 'label.collection_radio_buttons', 'Jose'
61
- assert_select 'label.collection_radio_buttons', 'Carlos'
67
+ assert_select 'label.collection_radio_buttons[for=user_name_jose]', 'Jose'
68
+ assert_select 'label.collection_radio_buttons[for=user_name_carlos]', 'Carlos'
62
69
  end
63
70
 
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'}
71
+ test 'input does automatic collection translation for radio types using defaults key' do
72
+ store_translations(:en, simple_form: { options: { defaults: {
73
+ gender: { male: 'Male', female: 'Female'}
67
74
  } } } ) do
68
- with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female]
75
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
69
76
  assert_select 'input[type=radio][value=male]'
70
77
  assert_select 'input[type=radio][value=female]'
71
- assert_select 'label.collection_radio_buttons', 'Male'
72
- assert_select 'label.collection_radio_buttons', 'Female'
78
+ assert_select 'label.collection_radio_buttons[for=user_gender_male]', 'Male'
79
+ assert_select 'label.collection_radio_buttons[for=user_gender_female]', 'Female'
73
80
  end
74
81
  end
75
82
 
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'}
83
+ test 'input does automatic collection translation for radio types using specific object key' do
84
+ store_translations(:en, simple_form: { options: { user: {
85
+ gender: { male: 'Male', female: 'Female'}
79
86
  } } } ) do
80
- with_input_for @user, :gender, :radio_buttons, :collection => [:male, :female]
87
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
81
88
  assert_select 'input[type=radio][value=male]'
82
89
  assert_select 'input[type=radio][value=female]'
83
- assert_select 'label.collection_radio_buttons', 'Male'
84
- assert_select 'label.collection_radio_buttons', 'Female'
90
+ assert_select 'label.collection_radio_buttons[for=user_gender_male]', 'Male'
91
+ assert_select 'label.collection_radio_buttons[for=user_gender_female]', 'Female'
92
+ end
93
+ end
94
+
95
+ test 'input does automatic collection translation and preserve html markup' do
96
+ swap SimpleForm, boolean_style: :nested do
97
+ store_translations(:en, simple_form: { options: { user: {
98
+ gender: { male_html: '<strong>Male</strong>', female_html: '<strong>Female</strong>' }
99
+ } } } ) do
100
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
101
+ assert_select 'input[type=radio][value=male]'
102
+ assert_select 'input[type=radio][value=female]'
103
+ assert_select 'label[for=user_gender_male] strong', 'Male'
104
+ assert_select 'label[for=user_gender_female] strong', 'Female'
105
+ end
106
+ end
107
+ end
108
+
109
+ test 'input does automatic collection translation with keys prefixed with _html and a string value' do
110
+ swap SimpleForm, boolean_style: :nested do
111
+ store_translations(:en, simple_form: { options: { user: {
112
+ gender: { male_html: 'Male', female_html: 'Female' }
113
+ } } } ) do
114
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
115
+ assert_select 'input[type=radio][value=male]'
116
+ assert_select 'input[type=radio][value=female]'
117
+ assert_select 'label[for=user_gender_male]', 'Male'
118
+ assert_select 'label[for=user_gender_female]', 'Female'
119
+ end
85
120
  end
86
121
  end
87
122
 
88
- test 'input should mark the current radio value by default' do
123
+ test 'input marks the current radio value by default' do
89
124
  @user.name = "Carlos"
90
- with_input_for @user, :name, :radio_buttons, :collection => ['Jose', 'Carlos']
125
+ with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
91
126
  assert_select 'input[type=radio][value=Carlos][checked=checked]'
92
127
  end
93
128
 
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']]
129
+ test 'input accepts html options as the last element of collection' do
130
+ with_input_for @user, :name, :radio_buttons, collection: [['Jose', 'jose', class: 'foo']]
131
+ assert_select 'input.foo[type=radio][value=jose]'
132
+ end
133
+
134
+ test 'input allows using a collection with text/value arrays' do
135
+ with_input_for @user, :name, :radio_buttons, collection: [['Jose', 'jose'], ['Carlos', 'carlos']]
96
136
  assert_select 'input[type=radio][value=jose]'
97
137
  assert_select 'input[type=radio][value=carlos]'
98
138
  assert_select 'label.collection_radio_buttons', 'Jose'
99
139
  assert_select 'label.collection_radio_buttons', 'Carlos'
100
140
  end
101
141
 
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' ] }
142
+ test 'input allows using a collection with a Proc' do
143
+ with_input_for @user, :name, :radio_buttons, collection: Proc.new { ['Jose', 'Carlos' ] }
104
144
  assert_select 'label.collection_radio_buttons', 'Jose'
105
145
  assert_select 'label.collection_radio_buttons', 'Carlos'
106
146
  end
107
147
 
108
- test 'input should allow overriding only label method for collections' do
148
+ test 'input allows overriding only label method for collections' do
109
149
  with_input_for @user, :name, :radio_buttons,
110
- :collection => ['Jose' , 'Carlos'],
111
- :label_method => :upcase
150
+ collection: ['Jose', 'Carlos'],
151
+ label_method: :upcase
112
152
  assert_select 'label.collection_radio_buttons', 'JOSE'
113
153
  assert_select 'label.collection_radio_buttons', 'CARLOS'
114
154
  end
115
155
 
116
- test 'input should allow overriding only value method for collections' do
156
+ test 'input allows overriding only value method for collections' do
117
157
  with_input_for @user, :name, :radio_buttons,
118
- :collection => ['Jose' , 'Carlos'],
119
- :value_method => :upcase
158
+ collection: ['Jose', 'Carlos'],
159
+ value_method: :upcase
120
160
  assert_select 'input[type=radio][value=JOSE]'
121
161
  assert_select 'input[type=radio][value=CARLOS]'
122
162
  end
123
163
 
124
- test 'input should allow overriding label and value method for collections' do
164
+ test 'input allows overriding label and value method for collections' do
125
165
  with_input_for @user, :name, :radio_buttons,
126
- :collection => ['Jose' , 'Carlos'],
127
- :label_method => :upcase,
128
- :value_method => :downcase
166
+ collection: ['Jose', 'Carlos'],
167
+ label_method: :upcase,
168
+ value_method: :downcase
129
169
  assert_select 'input[type=radio][value=jose]'
130
170
  assert_select 'input[type=radio][value=carlos]'
131
171
  assert_select 'label.collection_radio_buttons', 'JOSE'
132
172
  assert_select 'label.collection_radio_buttons', 'CARLOS'
133
173
  end
134
174
 
135
- test 'input should allow overriding label and value method using a lambda for collections' do
175
+ test 'input allows overriding label and value method using a lambda for collections' do
136
176
  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 }
177
+ collection: ['Jose', 'Carlos'],
178
+ label_method: lambda { |i| i.upcase },
179
+ value_method: lambda { |i| i.downcase }
140
180
  assert_select 'input[type=radio][value=jose]'
141
181
  assert_select 'input[type=radio][value=carlos]'
142
182
  assert_select 'label.collection_radio_buttons', 'JOSE'
143
183
  assert_select 'label.collection_radio_buttons', 'CARLOS'
144
184
  end
145
185
 
146
- test 'collection input with radio type should generate required html attribute' do
147
- with_input_for @user, :name, :radio_buttons, :collection => ['Jose' , 'Carlos']
186
+ test 'collection input with radio type generates required html attribute' do
187
+ with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
148
188
  assert_select 'input[type=radio].required'
149
189
  assert_select 'input[type=radio][required]'
150
190
  end
151
191
 
192
+ test 'collection input with radio type generates aria-required html attribute' do
193
+ with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
194
+ assert_select 'input[type=radio].required'
195
+ assert_select 'input[type=radio][aria-required=true]'
196
+ end
197
+
152
198
  test 'input radio does not wrap the collection by default' do
153
199
  with_input_for @user, :active, :radio_buttons
154
200
 
155
- assert_select 'form input[type=radio]', :count => 2
201
+ assert_select 'form input[type=radio]', count: 2
156
202
  assert_no_select 'form ul'
157
203
  end
158
204
 
159
205
  test 'input radio wraps the collection in the configured collection wrapper tag' do
160
- swap SimpleForm, :collection_wrapper_tag => :ul do
206
+ swap SimpleForm, collection_wrapper_tag: :ul do
161
207
  with_input_for @user, :active, :radio_buttons
162
208
 
163
- assert_select 'form ul input[type=radio]', :count => 2
209
+ assert_select 'form ul input[type=radio]', count: 2
164
210
  end
165
211
  end
166
212
 
167
213
  test 'input radio does not wrap the collection when configured with falsy values' do
168
- swap SimpleForm, :collection_wrapper_tag => false do
214
+ swap SimpleForm, collection_wrapper_tag: false do
169
215
  with_input_for @user, :active, :radio_buttons
170
216
 
171
- assert_select 'form input[type=radio]', :count => 2
217
+ assert_select 'form input[type=radio]', count: 2
172
218
  assert_no_select 'form ul'
173
219
  end
174
220
  end
175
221
 
176
222
  test 'input radio allows overriding the collection wrapper tag at input level' do
177
- swap SimpleForm, :collection_wrapper_tag => :ul do
178
- with_input_for @user, :active, :radio_buttons, :collection_wrapper_tag => :section
223
+ swap SimpleForm, collection_wrapper_tag: :ul do
224
+ with_input_for @user, :active, :radio_buttons, collection_wrapper_tag: :section
179
225
 
180
- assert_select 'form section input[type=radio]', :count => 2
226
+ assert_select 'form section input[type=radio]', count: 2
181
227
  assert_no_select 'form ul'
182
228
  end
183
229
  end
184
230
 
185
231
  test 'input radio allows disabling the collection wrapper tag at input level' do
186
- swap SimpleForm, :collection_wrapper_tag => :ul do
187
- with_input_for @user, :active, :radio_buttons, :collection_wrapper_tag => false
232
+ swap SimpleForm, collection_wrapper_tag: :ul do
233
+ with_input_for @user, :active, :radio_buttons, collection_wrapper_tag: false
188
234
 
189
- assert_select 'form input[type=radio]', :count => 2
235
+ assert_select 'form input[type=radio]', count: 2
190
236
  assert_no_select 'form ul'
191
237
  end
192
238
  end
193
239
 
194
240
  test 'input radio renders the wrapper tag with the configured wrapper class' do
195
- swap SimpleForm, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do
241
+ swap SimpleForm, collection_wrapper_tag: :ul, collection_wrapper_class: 'inputs-list' do
196
242
  with_input_for @user, :active, :radio_buttons
197
243
 
198
- assert_select 'form ul.inputs-list input[type=radio]', :count => 2
244
+ assert_select 'form ul.inputs-list input[type=radio]', count: 2
199
245
  end
200
246
  end
201
247
 
202
248
  test 'input radio allows giving wrapper class at input level only' do
203
- swap SimpleForm, :collection_wrapper_tag => :ul do
204
- with_input_for @user, :active, :radio_buttons, :collection_wrapper_class => 'items-list'
249
+ swap SimpleForm, collection_wrapper_tag: :ul do
250
+ with_input_for @user, :active, :radio_buttons, collection_wrapper_class: 'items-list'
205
251
 
206
- assert_select 'form ul.items-list input[type=radio]', :count => 2
252
+ assert_select 'form ul.items-list input[type=radio]', count: 2
207
253
  end
208
254
  end
209
255
 
210
256
  test 'input radio uses both configured and given wrapper classes for wrapper tag' do
211
- swap SimpleForm, :collection_wrapper_tag => :ul, :collection_wrapper_class => 'inputs-list' do
212
- with_input_for @user, :active, :radio_buttons, :collection_wrapper_class => 'items-list'
257
+ swap SimpleForm, collection_wrapper_tag: :ul, collection_wrapper_class: 'inputs-list' do
258
+ with_input_for @user, :active, :radio_buttons, collection_wrapper_class: 'items-list'
213
259
 
214
- assert_select 'form ul.inputs-list.items-list input[type=radio]', :count => 2
260
+ assert_select 'form ul.inputs-list.items-list input[type=radio]', count: 2
215
261
  end
216
262
  end
217
263
 
218
264
  test 'input radio wraps each item in the configured item wrapper tag' do
219
- swap SimpleForm, :item_wrapper_tag => :li do
265
+ swap SimpleForm, item_wrapper_tag: :li do
220
266
  with_input_for @user, :active, :radio_buttons
221
267
 
222
- assert_select 'form li input[type=radio]', :count => 2
268
+ assert_select 'form li input[type=radio]', count: 2
223
269
  end
224
270
  end
225
271
 
226
272
  test 'input radio does not wrap items when configured with falsy values' do
227
- swap SimpleForm, :item_wrapper_tag => false do
273
+ swap SimpleForm, item_wrapper_tag: false do
228
274
  with_input_for @user, :active, :radio_buttons
229
275
 
230
- assert_select 'form input[type=radio]', :count => 2
276
+ assert_select 'form input[type=radio]', count: 2
231
277
  assert_no_select 'form li'
232
278
  end
233
279
  end
234
280
 
235
281
  test 'input radio allows overriding the item wrapper tag at input level' do
236
- swap SimpleForm, :item_wrapper_tag => :li do
237
- with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => :dl
282
+ swap SimpleForm, item_wrapper_tag: :li do
283
+ with_input_for @user, :active, :radio_buttons, item_wrapper_tag: :dl
238
284
 
239
- assert_select 'form dl input[type=radio]', :count => 2
285
+ assert_select 'form dl input[type=radio]', count: 2
240
286
  assert_no_select 'form li'
241
287
  end
242
288
  end
243
289
 
244
290
  test 'input radio allows disabling the item wrapper tag at input level' do
245
- swap SimpleForm, :item_wrapper_tag => :ul do
246
- with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => false
291
+ swap SimpleForm, item_wrapper_tag: :ul do
292
+ with_input_for @user, :active, :radio_buttons, item_wrapper_tag: false
247
293
 
248
- assert_select 'form input[type=radio]', :count => 2
294
+ assert_select 'form input[type=radio]', count: 2
249
295
  assert_no_select 'form li'
250
296
  end
251
297
  end
@@ -253,74 +299,128 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
253
299
  test 'input radio wraps items in a span tag by default' do
254
300
  with_input_for @user, :active, :radio_buttons
255
301
 
256
- assert_select 'form span input[type=radio]', :count => 2
302
+ assert_select 'form span input[type=radio]', count: 2
257
303
  end
258
304
 
259
305
  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
306
+ with_input_for @user, :active, :radio_buttons, item_wrapper_tag: :li
261
307
 
262
- assert_select 'form li.radio input[type=radio]', :count => 2
308
+ assert_select 'form li.radio input[type=radio]', count: 2
263
309
  end
264
310
 
265
311
  test 'input radio renders the item wrapper tag with the configured item wrapper class' do
266
- swap SimpleForm, :item_wrapper_tag => :li, :item_wrapper_class => 'item' do
312
+ swap SimpleForm, item_wrapper_tag: :li, item_wrapper_class: 'item' do
267
313
  with_input_for @user, :active, :radio_buttons
268
314
 
269
- assert_select 'form li.radio.item input[type=radio]', :count => 2
315
+ assert_select 'form li.radio.item input[type=radio]', count: 2
270
316
  end
271
317
  end
272
318
 
273
319
  test 'input radio allows giving item wrapper class at input level only' do
274
- swap SimpleForm, :item_wrapper_tag => :li do
275
- with_input_for @user, :active, :radio_buttons, :item_wrapper_class => 'item'
320
+ swap SimpleForm, item_wrapper_tag: :li do
321
+ with_input_for @user, :active, :radio_buttons, item_wrapper_class: 'item'
276
322
 
277
- assert_select 'form li.radio.item input[type=radio]', :count => 2
323
+ assert_select 'form li.radio.item input[type=radio]', count: 2
278
324
  end
279
325
  end
280
326
 
281
327
  test 'input radio uses both configured and given item wrapper classes for item wrapper tag' do
282
- swap SimpleForm, :item_wrapper_tag => :li, :item_wrapper_class => 'item' do
283
- with_input_for @user, :active, :radio_buttons, :item_wrapper_class => 'inline'
328
+ swap SimpleForm, item_wrapper_tag: :li, item_wrapper_class: 'item' do
329
+ with_input_for @user, :active, :radio_buttons, item_wrapper_class: 'inline'
284
330
 
285
- assert_select 'form li.radio.item.inline input[type=radio]', :count => 2
331
+ assert_select 'form li.radio.item.inline input[type=radio]', count: 2
286
332
  end
287
333
  end
288
334
 
289
335
  test 'input radio respects the nested boolean style config, generating nested label > input' do
290
- swap SimpleForm, :boolean_style => :nested do
336
+ swap SimpleForm, boolean_style: :nested do
291
337
  with_input_for @user, :active, :radio_buttons
292
338
 
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'
339
+ assert_select 'span.radio > label > input#user_active_true[type=radio]'
340
+ assert_select 'span.radio > label', 'Yes'
341
+ assert_select 'span.radio > label > input#user_active_false[type=radio]'
342
+ assert_select 'span.radio > label', 'No'
297
343
  assert_no_select 'label.collection_radio_buttons'
298
344
  end
299
345
  end
300
346
 
301
- test 'input radio with nested style overrides configured item wrapper tag, forcing the :label' do
302
- swap SimpleForm, :boolean_style => :nested, :item_wrapper_tag => :li do
347
+ test 'input radio with nested style does not overrides configured item wrapper tag' do
348
+ swap SimpleForm, boolean_style: :nested, item_wrapper_tag: :li do
303
349
  with_input_for @user, :active, :radio_buttons
304
350
 
305
- assert_select 'label.radio > input'
306
- assert_no_select 'li'
351
+ assert_select 'li.radio > label > input'
307
352
  end
308
353
  end
309
354
 
310
- test 'input radio with nested style overrides given item wrapper tag, forcing the :label' do
311
- swap SimpleForm, :boolean_style => :nested do
312
- with_input_for @user, :active, :radio_buttons, :item_wrapper_tag => :li
355
+ test 'input radio with nested style does not overrides given item wrapper tag' do
356
+ swap SimpleForm, boolean_style: :nested do
357
+ with_input_for @user, :active, :radio_buttons, item_wrapper_tag: :li
313
358
 
314
- assert_select 'label.radio > input'
315
- assert_no_select 'li'
359
+ assert_select 'li.radio > label > input'
316
360
  end
317
361
  end
318
362
 
319
363
  test 'input radio with nested style accepts giving extra wrapper classes' do
320
- swap SimpleForm, :boolean_style => :nested do
321
- with_input_for @user, :active, :radio_buttons, :item_wrapper_class => "inline"
364
+ swap SimpleForm, boolean_style: :nested do
365
+ with_input_for @user, :active, :radio_buttons, item_wrapper_class: "inline"
366
+
367
+ assert_select 'span.radio.inline > label > input'
368
+ end
369
+ end
370
+
371
+ test 'input radio with nested style renders item labels with specified class' do
372
+ swap SimpleForm, boolean_style: :nested do
373
+ with_input_for @user, :active, :radio_buttons, item_label_class: "test"
374
+
375
+ assert_select 'span.radio > label.test > input'
376
+ end
377
+ end
378
+
379
+ test 'input radio with nested style and falsey input wrapper renders item labels with specified class' do
380
+ swap SimpleForm, boolean_style: :nested, item_wrapper_tag: false do
381
+ with_input_for @user, :active, :radio_buttons, item_label_class: "radio-inline"
382
+
383
+ assert_select 'label.radio-inline > input'
384
+ assert_no_select 'span.radio'
385
+ end
386
+ end
387
+
388
+ test 'input radio wrapper class are not included when set to falsey' do
389
+ swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
390
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
391
+
392
+ assert_no_select 'label.radio'
393
+ end
394
+ end
395
+
396
+ test 'input radio custom wrapper class is included when include input wrapper class is falsey' do
397
+ swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
398
+ with_input_for @user, :gender, :radio_buttons, collection: [:male, :female], item_wrapper_class: 'custom'
399
+
400
+ assert_no_select 'label.radio'
401
+ assert_select 'span.custom'
402
+ end
403
+ end
404
+
405
+ test 'input radio with nested style and namespace uses the right for attribute' do
406
+ swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
407
+ with_concat_form_for @user, namespace: :foo do |f|
408
+ concat f.input :gender, as: :radio_buttons, collection: [:male, :female]
409
+ end
410
+
411
+ assert_select 'label[for=foo_user_gender_male]'
412
+ assert_select 'label[for=foo_user_gender_female]'
413
+ end
414
+ end
415
+
416
+ test 'input radio with nested style and index uses the right for attribute' do
417
+ swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
418
+ with_concat_form_for @user, index: 1 do |f|
419
+ concat f.input :gender, as: :radio_buttons, collection: [:male, :female]
420
+ end
322
421
 
323
- assert_select 'label.radio.inline > input'
422
+ assert_select 'label[for=user_1_gender_male]'
423
+ assert_select 'label[for=user_1_gender_female]'
324
424
  end
325
425
  end
326
426
  end