simple_form 3.4.0 → 5.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.
Files changed (106) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +118 -8
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +235 -67
  5. data/lib/generators/simple_form/install_generator.rb +1 -0
  6. data/lib/generators/simple_form/templates/README +2 -3
  7. data/lib/generators/simple_form/templates/_form.html.erb +2 -0
  8. data/lib/generators/simple_form/templates/_form.html.haml +2 -0
  9. data/lib/generators/simple_form/templates/_form.html.slim +1 -0
  10. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +14 -7
  11. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +360 -74
  12. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +20 -8
  13. data/lib/simple_form/action_view_extensions/builder.rb +1 -0
  14. data/lib/simple_form/action_view_extensions/form_helper.rb +1 -0
  15. data/lib/simple_form/components/errors.rb +15 -2
  16. data/lib/simple_form/components/hints.rb +1 -0
  17. data/lib/simple_form/components/html5.rb +1 -0
  18. data/lib/simple_form/components/label_input.rb +2 -1
  19. data/lib/simple_form/components/labels.rb +12 -7
  20. data/lib/simple_form/components/maxlength.rb +4 -17
  21. data/lib/simple_form/components/min_max.rb +1 -0
  22. data/lib/simple_form/components/minlength.rb +5 -18
  23. data/lib/simple_form/components/pattern.rb +1 -0
  24. data/lib/simple_form/components/placeholders.rb +2 -1
  25. data/lib/simple_form/components/readonly.rb +1 -0
  26. data/lib/simple_form/components.rb +1 -0
  27. data/lib/simple_form/error_notification.rb +1 -0
  28. data/lib/simple_form/form_builder.rb +104 -29
  29. data/lib/simple_form/helpers/autofocus.rb +1 -0
  30. data/lib/simple_form/helpers/disabled.rb +1 -0
  31. data/lib/simple_form/helpers/readonly.rb +1 -0
  32. data/lib/simple_form/helpers/required.rb +1 -0
  33. data/lib/simple_form/helpers/validators.rb +2 -1
  34. data/lib/simple_form/helpers.rb +1 -0
  35. data/lib/simple_form/inputs/base.rb +24 -5
  36. data/lib/simple_form/inputs/block_input.rb +1 -0
  37. data/lib/simple_form/inputs/boolean_input.rb +4 -2
  38. data/lib/simple_form/inputs/collection_check_boxes_input.rb +3 -2
  39. data/lib/simple_form/inputs/collection_input.rb +6 -7
  40. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +2 -1
  41. data/lib/simple_form/inputs/collection_select_input.rb +1 -0
  42. data/lib/simple_form/inputs/color_input.rb +14 -0
  43. data/lib/simple_form/inputs/date_time_input.rb +1 -0
  44. data/lib/simple_form/inputs/file_input.rb +1 -0
  45. data/lib/simple_form/inputs/grouped_collection_select_input.rb +1 -0
  46. data/lib/simple_form/inputs/hidden_input.rb +1 -0
  47. data/lib/simple_form/inputs/numeric_input.rb +1 -0
  48. data/lib/simple_form/inputs/password_input.rb +1 -0
  49. data/lib/simple_form/inputs/priority_input.rb +1 -4
  50. data/lib/simple_form/inputs/range_input.rb +1 -0
  51. data/lib/simple_form/inputs/rich_text_area_input.rb +12 -0
  52. data/lib/simple_form/inputs/string_input.rb +2 -1
  53. data/lib/simple_form/inputs/text_input.rb +1 -0
  54. data/lib/simple_form/inputs.rb +3 -0
  55. data/lib/simple_form/map_type.rb +1 -0
  56. data/lib/simple_form/railtie.rb +1 -0
  57. data/lib/simple_form/tags.rb +7 -2
  58. data/lib/simple_form/version.rb +2 -1
  59. data/lib/simple_form/wrappers/builder.rb +1 -0
  60. data/lib/simple_form/wrappers/leaf.rb +2 -1
  61. data/lib/simple_form/wrappers/many.rb +1 -0
  62. data/lib/simple_form/wrappers/root.rb +9 -2
  63. data/lib/simple_form/wrappers/single.rb +2 -1
  64. data/lib/simple_form/wrappers.rb +1 -0
  65. data/lib/simple_form.rb +79 -11
  66. data/test/action_view_extensions/builder_test.rb +28 -9
  67. data/test/action_view_extensions/form_helper_test.rb +3 -2
  68. data/test/components/custom_components_test.rb +62 -0
  69. data/test/components/label_test.rb +33 -8
  70. data/test/form_builder/association_test.rb +33 -2
  71. data/test/form_builder/button_test.rb +1 -0
  72. data/test/form_builder/error_notification_test.rb +1 -0
  73. data/test/form_builder/error_test.rb +12 -0
  74. data/test/form_builder/general_test.rb +75 -13
  75. data/test/form_builder/hint_test.rb +6 -0
  76. data/test/form_builder/input_field_test.rb +30 -10
  77. data/test/form_builder/label_test.rb +10 -4
  78. data/test/form_builder/wrapper_test.rb +32 -5
  79. data/test/generators/simple_form_generator_test.rb +4 -3
  80. data/test/inputs/boolean_input_test.rb +17 -0
  81. data/test/inputs/collection_check_boxes_input_test.rb +38 -18
  82. data/test/inputs/collection_radio_buttons_input_test.rb +48 -28
  83. data/test/inputs/collection_select_input_test.rb +46 -43
  84. data/test/inputs/color_input_test.rb +10 -0
  85. data/test/inputs/datetime_input_test.rb +7 -16
  86. data/test/inputs/disabled_test.rb +14 -0
  87. data/test/inputs/discovery_test.rb +22 -0
  88. data/test/inputs/file_input_test.rb +1 -0
  89. data/test/inputs/general_test.rb +3 -2
  90. data/test/inputs/grouped_collection_select_input_test.rb +11 -10
  91. data/test/inputs/hidden_input_test.rb +1 -0
  92. data/test/inputs/numeric_input_test.rb +2 -1
  93. data/test/inputs/priority_input_test.rb +7 -14
  94. data/test/inputs/readonly_test.rb +1 -0
  95. data/test/inputs/required_test.rb +1 -0
  96. data/test/inputs/rich_text_area_input_test.rb +15 -0
  97. data/test/inputs/string_input_test.rb +10 -16
  98. data/test/inputs/text_input_test.rb +1 -0
  99. data/test/simple_form_test.rb +1 -0
  100. data/test/support/discovery_inputs.rb +8 -0
  101. data/test/support/misc_helpers.rb +22 -1
  102. data/test/support/mock_controller.rb +7 -1
  103. data/test/support/models.rb +80 -18
  104. data/test/test_helper.rb +9 -4
  105. metadata +49 -55
  106. data/lib/simple_form/i18n_cache.rb +0 -22
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class SimpleFormGeneratorTest < Rails::Generators::TestCase
@@ -18,7 +19,7 @@ class SimpleFormGeneratorTest < Rails::Generators::TestCase
18
19
  end
19
20
 
20
21
  test 'generates the simple_form initializer with the bootstrap wrappers' do
21
- run_generator %w(--bootstrap)
22
+ run_generator %w[--bootstrap]
22
23
  assert_file 'config/initializers/simple_form.rb',
23
24
  /config\.default_wrapper = :default/, /config\.boolean_style = :nested/
24
25
  assert_file 'config/initializers/simple_form_bootstrap.rb', /config\.wrappers :vertical_form/,
@@ -26,14 +27,14 @@ class SimpleFormGeneratorTest < Rails::Generators::TestCase
26
27
  end
27
28
 
28
29
  test 'generates the simple_form initializer with the foundation wrappers' do
29
- run_generator %w(--foundation)
30
+ run_generator %w[--foundation]
30
31
  assert_file 'config/initializers/simple_form.rb',
31
32
  /config\.default_wrapper = :default/, /config\.boolean_style = :nested/
32
33
  assert_file 'config/initializers/simple_form_foundation.rb', /config\.wrappers :vertical_form/,
33
34
  /config\.default_wrapper = :vertical_form/, /config\.item_wrapper_tag = :div/
34
35
  end
35
36
 
36
- %W(erb haml slim).each do |engine|
37
+ %w[erb haml slim].each do |engine|
37
38
  test "generates the scaffold template when using #{engine}" do
38
39
  run_generator ['-e', engine]
39
40
  assert_file "lib/templates/#{engine}/scaffold/_form.html.#{engine}"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: UTF-8
2
3
  require 'test_helper'
3
4
 
@@ -106,6 +107,14 @@ class BooleanInputTest < ActionView::TestCase
106
107
  end
107
108
  end
108
109
 
110
+ test 'input boolean with nested generates a disabled hidden field with the form attribute when it is given' do
111
+ swap SimpleForm, boolean_style: :nested do
112
+ with_input_for @user, :active, :boolean, input_html: { form: 'form_id' }
113
+
114
+ assert_select "input[type=hidden][form=form_id]+ label.boolean > input.boolean"
115
+ end
116
+ end
117
+
109
118
  test 'input accepts changing boolean style to nested through given options' do
110
119
  with_input_for @user, :active, :boolean, boolean_style: :nested
111
120
  assert_select 'label[for=user_active]', 'Active'
@@ -145,6 +154,14 @@ class BooleanInputTest < ActionView::TestCase
145
154
  end
146
155
  end
147
156
 
157
+ test 'input with nested style does not include hidden field when unchecked_value is false' do
158
+ swap SimpleForm, boolean_style: :nested do
159
+ with_input_for @user, :active, :boolean, unchecked_value: false
160
+ assert_select "label.boolean > input.boolean"
161
+ assert_no_select "input[type=hidden] + label.boolean"
162
+ end
163
+ end
164
+
148
165
  test 'input boolean works using :input only in wrapper config (no label_input)' do
149
166
  swap_wrapper do
150
167
  with_input_for @user, :active, :boolean
@@ -1,39 +1,36 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: UTF-8
2
3
  require 'test_helper'
3
4
 
4
5
  class CollectionCheckBoxesInputTest < ActionView::TestCase
5
- setup do
6
- SimpleForm::Inputs::CollectionCheckBoxesInput.reset_i18n_cache :boolean_collection
7
- end
8
-
9
6
  test 'input check boxes does not include for attribute by default' do
10
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
7
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
11
8
  assert_select 'label'
12
9
  assert_no_select 'label[for=user_gender]'
13
10
  end
14
11
 
15
12
  test 'input check boxes includes for attribute when giving as html option' do
16
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female], label_html: { for: 'gender' }
13
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female], label_html: { for: 'gender' }
17
14
  assert_select 'label[for=gender]'
18
15
  end
19
16
 
20
17
  test 'collection input with check_boxes type does not generate required html attribute' do
21
- with_input_for @user, :name, :check_boxes, collection: ['Jose', 'Carlos']
18
+ with_input_for @user, :name, :check_boxes, collection: %w[Jose Carlos]
22
19
  assert_select 'input.required'
23
20
  assert_no_select 'input[required]'
24
21
  end
25
22
 
26
23
  test 'collection input with check_boxes type does not generate aria-required html attribute' do
27
- with_input_for @user, :name, :check_boxes, collection: ['Jose', 'Carlos']
24
+ with_input_for @user, :name, :check_boxes, collection: %w[Jose Carlos]
28
25
  assert_select 'input.required'
29
26
  assert_no_select 'input[aria-required]'
30
27
  end
31
28
 
32
29
  test 'input does automatic collection translation for check_box types using defaults key' do
33
30
  store_translations(:en, simple_form: { options: { defaults: {
34
- gender: { male: 'Male', female: 'Female'}
31
+ gender: { male: 'Male', female: 'Female' }
35
32
  } } } ) do
36
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
33
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
37
34
  assert_select 'input[type=checkbox][value=male]'
38
35
  assert_select 'input[type=checkbox][value=female]'
39
36
  assert_select 'label.collection_check_boxes', 'Male'
@@ -43,9 +40,9 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
43
40
 
44
41
  test 'input does automatic collection translation for check_box types using specific object key' do
45
42
  store_translations(:en, simple_form: { options: { user: {
46
- gender: { male: 'Male', female: 'Female'}
43
+ gender: { male: 'Male', female: 'Female' }
47
44
  } } } ) do
48
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
45
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
49
46
  assert_select 'input[type=checkbox][value=male]'
50
47
  assert_select 'input[type=checkbox][value=female]'
51
48
  assert_select 'label.collection_check_boxes', 'Male'
@@ -55,11 +52,11 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
55
52
 
56
53
  test 'input that uses automatic collection translation for check_boxes properly sets checked values' do
57
54
  store_translations(:en, simple_form: { options: { defaults: {
58
- gender: { male: 'Male', female: 'Female'}
55
+ gender: { male: 'Male', female: 'Female' }
59
56
  } } } ) do
60
57
  @user.gender = 'male'
61
58
 
62
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
59
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
63
60
  assert_select 'input[type=checkbox][value=male][checked=checked]'
64
61
  assert_select 'input[type=checkbox][value=female]'
65
62
  assert_select 'label.collection_check_boxes', 'Male'
@@ -264,7 +261,7 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
264
261
 
265
262
  test 'input check boxes wrapper class are not included when set to falsey' do
266
263
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
267
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
264
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
268
265
 
269
266
  assert_no_select 'label.checkbox'
270
267
  end
@@ -272,7 +269,7 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
272
269
 
273
270
  test 'input check boxes custom wrapper class is included when include input wrapper class is falsey' do
274
271
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
275
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female], item_wrapper_class: 'custom'
272
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female], item_wrapper_class: 'custom'
276
273
 
277
274
  assert_no_select 'label.checkbox'
278
275
  assert_select 'span.custom'
@@ -282,7 +279,7 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
282
279
  test 'input check boxes with nested style and namespace uses the right for attribute' do
283
280
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
284
281
  with_concat_form_for @user, namespace: :foo do |f|
285
- concat f.input :gender, as: :check_boxes, collection: [:male, :female]
282
+ concat f.input :gender, as: :check_boxes, collection: %i[male female]
286
283
  end
287
284
 
288
285
  assert_select 'label[for=foo_user_gender_male]'
@@ -293,11 +290,34 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
293
290
  test 'input check boxes with nested style and index uses the right for attribute' do
294
291
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
295
292
  with_concat_form_for @user, index: 1 do |f|
296
- concat f.input :gender, as: :check_boxes, collection: [:male, :female]
293
+ concat f.input :gender, as: :check_boxes, collection: %i[male female]
297
294
  end
298
295
 
299
296
  assert_select 'label[for=user_1_gender_male]'
300
297
  assert_select 'label[for=user_1_gender_female]'
301
298
  end
302
299
  end
300
+
301
+ test 'input check boxes with nested style accepts non-string attribute as label' do
302
+ swap SimpleForm, boolean_style: :nested do
303
+ with_input_for @user, :amount,
304
+ :check_boxes,
305
+ collection: { 100 => 'hundred', 200 => 'two_hundred' },
306
+ label_method: :first,
307
+ value_method: :second
308
+
309
+ assert_select 'input[type=checkbox][value=hundred]'
310
+ assert_select 'input[type=checkbox][value=two_hundred]'
311
+ assert_select 'span.checkbox > label', '100'
312
+ assert_select 'span.checkbox > label', '200'
313
+ end
314
+ end
315
+
316
+ test 'input check boxes with inline style support label custom classes' do
317
+ swap SimpleForm, boolean_style: :inline do
318
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female], item_label_class: 'beautiful-label'
319
+
320
+ assert_select 'label.beautiful-label', count: 2
321
+ end
322
+ end
303
323
  end
@@ -1,11 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: UTF-8
2
3
  require 'test_helper'
3
4
 
4
5
  class CollectionRadioButtonsInputTest < ActionView::TestCase
5
- setup do
6
- SimpleForm::Inputs::CollectionRadioButtonsInput.reset_i18n_cache :boolean_collection
7
- end
8
-
9
6
  test 'input generates boolean radio buttons by default for radio types' do
10
7
  with_input_for @user, :active, :radio_buttons
11
8
  assert_select 'input[type=radio][value=true].radio_buttons#user_active_true'
@@ -43,13 +40,13 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
43
40
  end
44
41
 
45
42
  test 'input radio does not include for attribute by default' do
46
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
43
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
47
44
  assert_select 'label'
48
45
  assert_no_select 'label[for=user_gender]'
49
46
  end
50
47
 
51
48
  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' }
49
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female], label_html: { for: 'gender' }
53
50
  assert_select 'label[for=gender]'
54
51
  end
55
52
 
@@ -61,7 +58,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
61
58
  end
62
59
 
63
60
  test 'input allows overriding collection for radio types' do
64
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
61
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
65
62
  assert_select 'input[type=radio][value=Jose]'
66
63
  assert_select 'input[type=radio][value=Carlos]'
67
64
  assert_select 'label.collection_radio_buttons[for=user_name_jose]', 'Jose'
@@ -70,9 +67,9 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
70
67
 
71
68
  test 'input does automatic collection translation for radio types using defaults key' do
72
69
  store_translations(:en, simple_form: { options: { defaults: {
73
- gender: { male: 'Male', female: 'Female'}
70
+ gender: { male: 'Male', female: 'Female' }
74
71
  } } } ) do
75
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
72
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
76
73
  assert_select 'input[type=radio][value=male]'
77
74
  assert_select 'input[type=radio][value=female]'
78
75
  assert_select 'label.collection_radio_buttons[for=user_gender_male]', 'Male'
@@ -82,9 +79,9 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
82
79
 
83
80
  test 'input does automatic collection translation for radio types using specific object key' do
84
81
  store_translations(:en, simple_form: { options: { user: {
85
- gender: { male: 'Male', female: 'Female'}
82
+ gender: { male: 'Male', female: 'Female' }
86
83
  } } } ) do
87
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
84
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
88
85
  assert_select 'input[type=radio][value=male]'
89
86
  assert_select 'input[type=radio][value=female]'
90
87
  assert_select 'label.collection_radio_buttons[for=user_gender_male]', 'Male'
@@ -97,7 +94,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
97
94
  store_translations(:en, simple_form: { options: { user: {
98
95
  gender: { male_html: '<strong>Male</strong>', female_html: '<strong>Female</strong>' }
99
96
  } } } ) do
100
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
97
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
101
98
  assert_select 'input[type=radio][value=male]'
102
99
  assert_select 'input[type=radio][value=female]'
103
100
  assert_select 'label[for=user_gender_male] strong', 'Male'
@@ -111,7 +108,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
111
108
  store_translations(:en, simple_form: { options: { user: {
112
109
  gender: { male_html: 'Male', female_html: 'Female' }
113
110
  } } } ) do
114
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
111
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
115
112
  assert_select 'input[type=radio][value=male]'
116
113
  assert_select 'input[type=radio][value=female]'
117
114
  assert_select 'label[for=user_gender_male]', 'Male'
@@ -122,7 +119,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
122
119
 
123
120
  test 'input marks the current radio value by default' do
124
121
  @user.name = "Carlos"
125
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
122
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
126
123
  assert_select 'input[type=radio][value=Carlos][checked=checked]'
127
124
  end
128
125
 
@@ -132,7 +129,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
132
129
  end
133
130
 
134
131
  test 'input allows using a collection with text/value arrays' do
135
- with_input_for @user, :name, :radio_buttons, collection: [['Jose', 'jose'], ['Carlos', 'carlos']]
132
+ with_input_for @user, :name, :radio_buttons, collection: [%w[Jose jose], %w[Carlos carlos]]
136
133
  assert_select 'input[type=radio][value=jose]'
137
134
  assert_select 'input[type=radio][value=carlos]'
138
135
  assert_select 'label.collection_radio_buttons', 'Jose'
@@ -140,14 +137,14 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
140
137
  end
141
138
 
142
139
  test 'input allows using a collection with a Proc' do
143
- with_input_for @user, :name, :radio_buttons, collection: Proc.new { ['Jose', 'Carlos' ] }
140
+ with_input_for @user, :name, :radio_buttons, collection: proc { %w[Jose Carlos] }
144
141
  assert_select 'label.collection_radio_buttons', 'Jose'
145
142
  assert_select 'label.collection_radio_buttons', 'Carlos'
146
143
  end
147
144
 
148
145
  test 'input allows overriding only label method for collections' do
149
146
  with_input_for @user, :name, :radio_buttons,
150
- collection: ['Jose', 'Carlos'],
147
+ collection: %w[Jose Carlos],
151
148
  label_method: :upcase
152
149
  assert_select 'label.collection_radio_buttons', 'JOSE'
153
150
  assert_select 'label.collection_radio_buttons', 'CARLOS'
@@ -155,7 +152,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
155
152
 
156
153
  test 'input allows overriding only value method for collections' do
157
154
  with_input_for @user, :name, :radio_buttons,
158
- collection: ['Jose', 'Carlos'],
155
+ collection: %w[Jose Carlos],
159
156
  value_method: :upcase
160
157
  assert_select 'input[type=radio][value=JOSE]'
161
158
  assert_select 'input[type=radio][value=CARLOS]'
@@ -163,7 +160,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
163
160
 
164
161
  test 'input allows overriding label and value method for collections' do
165
162
  with_input_for @user, :name, :radio_buttons,
166
- collection: ['Jose', 'Carlos'],
163
+ collection: %w[Jose Carlos],
167
164
  label_method: :upcase,
168
165
  value_method: :downcase
169
166
  assert_select 'input[type=radio][value=jose]'
@@ -174,9 +171,9 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
174
171
 
175
172
  test 'input allows overriding label and value method using a lambda for collections' do
176
173
  with_input_for @user, :name, :radio_buttons,
177
- collection: ['Jose', 'Carlos'],
178
- label_method: lambda { |i| i.upcase },
179
- value_method: lambda { |i| i.downcase }
174
+ collection: %w[Jose Carlos],
175
+ label_method: ->(i) { i.upcase },
176
+ value_method: ->(i) { i.downcase }
180
177
  assert_select 'input[type=radio][value=jose]'
181
178
  assert_select 'input[type=radio][value=carlos]'
182
179
  assert_select 'label.collection_radio_buttons', 'JOSE'
@@ -184,13 +181,13 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
184
181
  end
185
182
 
186
183
  test 'collection input with radio type generates required html attribute' do
187
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
184
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
188
185
  assert_select 'input[type=radio].required'
189
186
  assert_select 'input[type=radio][required]'
190
187
  end
191
188
 
192
189
  test 'collection input with radio type generates aria-required html attribute' do
193
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
190
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
194
191
  assert_select 'input[type=radio].required'
195
192
  assert_select 'input[type=radio][aria-required=true]'
196
193
  end
@@ -387,7 +384,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
387
384
 
388
385
  test 'input radio wrapper class are not included when set to falsey' do
389
386
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
390
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
387
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
391
388
 
392
389
  assert_no_select 'label.radio'
393
390
  end
@@ -395,7 +392,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
395
392
 
396
393
  test 'input radio custom wrapper class is included when include input wrapper class is falsey' do
397
394
  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'
395
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female], item_wrapper_class: 'custom'
399
396
 
400
397
  assert_no_select 'label.radio'
401
398
  assert_select 'span.custom'
@@ -405,7 +402,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
405
402
  test 'input radio with nested style and namespace uses the right for attribute' do
406
403
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
407
404
  with_concat_form_for @user, namespace: :foo do |f|
408
- concat f.input :gender, as: :radio_buttons, collection: [:male, :female]
405
+ concat f.input :gender, as: :radio_buttons, collection: %i[male female]
409
406
  end
410
407
 
411
408
  assert_select 'label[for=foo_user_gender_male]'
@@ -416,11 +413,34 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
416
413
  test 'input radio with nested style and index uses the right for attribute' do
417
414
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
418
415
  with_concat_form_for @user, index: 1 do |f|
419
- concat f.input :gender, as: :radio_buttons, collection: [:male, :female]
416
+ concat f.input :gender, as: :radio_buttons, collection: %i[male female]
420
417
  end
421
418
 
422
419
  assert_select 'label[for=user_1_gender_male]'
423
420
  assert_select 'label[for=user_1_gender_female]'
424
421
  end
425
422
  end
423
+
424
+ test 'input radio with nested style accetps non-string attribute as label' do
425
+ swap SimpleForm, boolean_style: :nested do
426
+ with_input_for @user, :amount,
427
+ :radio_buttons,
428
+ collection: { 100 => 'hundred', 200 => 'two_hundred' },
429
+ label_method: :first,
430
+ value_method: :second
431
+
432
+ assert_select 'input[type=radio][value=hundred]'
433
+ assert_select 'input[type=radio][value=two_hundred]'
434
+ assert_select 'span.radio > label', '100'
435
+ assert_select 'span.radio > label', '200'
436
+ end
437
+ end
438
+
439
+ test 'input check boxes with inline style support label custom classes' do
440
+ swap SimpleForm, boolean_style: :inline do
441
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female], item_label_class: 'beautiful-label'
442
+
443
+ assert_select 'label.beautiful-label', count: 2
444
+ end
445
+ end
426
446
  end