simple_form 3.5.0 → 3.5.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +38 -28
  4. data/lib/generators/simple_form/install_generator.rb +1 -0
  5. data/lib/generators/simple_form/templates/_form.html.erb +1 -0
  6. data/lib/generators/simple_form/templates/_form.html.haml +1 -0
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +1 -0
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +1 -0
  9. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +2 -1
  10. data/lib/simple_form.rb +8 -6
  11. data/lib/simple_form/action_view_extensions/builder.rb +1 -0
  12. data/lib/simple_form/action_view_extensions/form_helper.rb +1 -0
  13. data/lib/simple_form/components.rb +1 -0
  14. data/lib/simple_form/components/errors.rb +2 -1
  15. data/lib/simple_form/components/hints.rb +1 -0
  16. data/lib/simple_form/components/html5.rb +1 -0
  17. data/lib/simple_form/components/label_input.rb +2 -1
  18. data/lib/simple_form/components/labels.rb +2 -1
  19. data/lib/simple_form/components/maxlength.rb +1 -0
  20. data/lib/simple_form/components/min_max.rb +1 -0
  21. data/lib/simple_form/components/minlength.rb +2 -1
  22. data/lib/simple_form/components/pattern.rb +1 -0
  23. data/lib/simple_form/components/placeholders.rb +1 -0
  24. data/lib/simple_form/components/readonly.rb +1 -0
  25. data/lib/simple_form/error_notification.rb +1 -0
  26. data/lib/simple_form/form_builder.rb +9 -3
  27. data/lib/simple_form/helpers.rb +1 -0
  28. data/lib/simple_form/helpers/autofocus.rb +1 -0
  29. data/lib/simple_form/helpers/disabled.rb +1 -0
  30. data/lib/simple_form/helpers/readonly.rb +1 -0
  31. data/lib/simple_form/helpers/required.rb +1 -0
  32. data/lib/simple_form/helpers/validators.rb +2 -1
  33. data/lib/simple_form/i18n_cache.rb +1 -0
  34. data/lib/simple_form/inputs.rb +1 -0
  35. data/lib/simple_form/inputs/base.rb +2 -1
  36. data/lib/simple_form/inputs/block_input.rb +1 -0
  37. data/lib/simple_form/inputs/boolean_input.rb +3 -2
  38. data/lib/simple_form/inputs/collection_check_boxes_input.rb +2 -1
  39. data/lib/simple_form/inputs/collection_input.rb +3 -2
  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/date_time_input.rb +1 -0
  43. data/lib/simple_form/inputs/file_input.rb +1 -0
  44. data/lib/simple_form/inputs/grouped_collection_select_input.rb +1 -0
  45. data/lib/simple_form/inputs/hidden_input.rb +1 -0
  46. data/lib/simple_form/inputs/numeric_input.rb +1 -0
  47. data/lib/simple_form/inputs/password_input.rb +1 -0
  48. data/lib/simple_form/inputs/priority_input.rb +1 -0
  49. data/lib/simple_form/inputs/range_input.rb +1 -0
  50. data/lib/simple_form/inputs/string_input.rb +1 -0
  51. data/lib/simple_form/inputs/text_input.rb +1 -0
  52. data/lib/simple_form/map_type.rb +1 -0
  53. data/lib/simple_form/railtie.rb +1 -0
  54. data/lib/simple_form/tags.rb +1 -0
  55. data/lib/simple_form/version.rb +2 -1
  56. data/lib/simple_form/wrappers.rb +1 -0
  57. data/lib/simple_form/wrappers/builder.rb +1 -0
  58. data/lib/simple_form/wrappers/leaf.rb +2 -1
  59. data/lib/simple_form/wrappers/many.rb +1 -0
  60. data/lib/simple_form/wrappers/root.rb +1 -0
  61. data/lib/simple_form/wrappers/single.rb +2 -1
  62. data/test/action_view_extensions/builder_test.rb +6 -5
  63. data/test/action_view_extensions/form_helper_test.rb +3 -2
  64. data/test/components/label_test.rb +5 -4
  65. data/test/form_builder/association_test.rb +27 -2
  66. data/test/form_builder/button_test.rb +1 -0
  67. data/test/form_builder/error_notification_test.rb +1 -0
  68. data/test/form_builder/error_test.rb +6 -0
  69. data/test/form_builder/general_test.rb +10 -3
  70. data/test/form_builder/hint_test.rb +6 -0
  71. data/test/form_builder/input_field_test.rb +2 -1
  72. data/test/form_builder/label_test.rb +9 -3
  73. data/test/form_builder/wrapper_test.rb +3 -2
  74. data/test/generators/simple_form_generator_test.rb +4 -3
  75. data/test/inputs/boolean_input_test.rb +9 -0
  76. data/test/inputs/collection_check_boxes_input_test.rb +30 -14
  77. data/test/inputs/collection_radio_buttons_input_test.rb +40 -24
  78. data/test/inputs/collection_select_input_test.rb +40 -39
  79. data/test/inputs/datetime_input_test.rb +5 -4
  80. data/test/inputs/disabled_test.rb +1 -0
  81. data/test/inputs/discovery_test.rb +1 -0
  82. data/test/inputs/file_input_test.rb +1 -0
  83. data/test/inputs/general_test.rb +3 -2
  84. data/test/inputs/grouped_collection_select_input_test.rb +11 -10
  85. data/test/inputs/hidden_input_test.rb +1 -0
  86. data/test/inputs/numeric_input_test.rb +2 -1
  87. data/test/inputs/priority_input_test.rb +1 -0
  88. data/test/inputs/readonly_test.rb +1 -0
  89. data/test/inputs/required_test.rb +1 -0
  90. data/test/inputs/string_input_test.rb +2 -1
  91. data/test/inputs/text_input_test.rb +1 -0
  92. data/test/simple_form_test.rb +1 -0
  93. data/test/support/discovery_inputs.rb +1 -0
  94. data/test/support/misc_helpers.rb +2 -1
  95. data/test/support/mock_controller.rb +4 -0
  96. data/test/support/models.rb +36 -12
  97. data/test/test_helper.rb +2 -0
  98. metadata +3 -3
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  # Tests for f.hint
@@ -18,6 +19,11 @@ class HintTest < ActionView::TestCase
18
19
  assert_select 'span.hint', 'Use with care...'
19
20
  end
20
21
 
22
+ test 'hint is generated with decorated object responsive to #to_model' do
23
+ with_hint_for @decorated_user, :name, hint: 'Use with care...'
24
+ assert_select 'span.hint', 'Use with care...'
25
+ end
26
+
21
27
  test 'hint does not modify the options hash' do
22
28
  options = { hint: 'Use with care...' }
23
29
  with_hint_for @user, :name, options
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  # Tests for f.input_field
@@ -112,7 +113,7 @@ class InputFieldTest < ActionView::TestCase
112
113
  end
113
114
 
114
115
  test 'builder collection input_field generates input tag with a clean HTML' do
115
- with_input_field_for @user, :status, collection: ['Open', 'Closed'],
116
+ with_input_field_for @user, :status, collection: %w[Open Closed],
116
117
  class: 'status', label_method: :to_s, value_method: :to_s
117
118
 
118
119
  assert_no_select 'select.status[input_html]'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: UTF-8
2
3
  require 'test_helper'
3
4
 
@@ -13,6 +14,11 @@ class LabelTest < ActionView::TestCase
13
14
  assert_select 'label.string[for=user_name]', /Name/
14
15
  end
15
16
 
17
+ test 'builder generates a label for the attribute with decorated object responsive to #to_model' do
18
+ with_label_for @decorated_user, :name
19
+ assert_select 'label.string[for=user_name]', /Name/
20
+ end
21
+
16
22
  test 'builder generates a label for the boolean attrbiute' do
17
23
  with_label_for @user, :name, as: :boolean
18
24
  assert_select 'label.boolean[for=user_name]', /Name/
@@ -108,21 +114,21 @@ class LabelTest < ActionView::TestCase
108
114
  end
109
115
 
110
116
  test 'builder allows custom formatting when label is explicitly specified' do
111
- swap SimpleForm, label_text: lambda { |l, r, explicit_label| explicit_label ? l : "#{l.titleize}:" } do
117
+ swap SimpleForm, label_text: ->(l, r, explicit_label) { explicit_label ? l : "#{l.titleize}:" } do
112
118
  with_label_for @user, :time_zone, 'What is your home time zone?'
113
119
  assert_select 'label[for=user_time_zone]', 'What is your home time zone?'
114
120
  end
115
121
  end
116
122
 
117
123
  test 'builder allows custom formatting when label is generated' do
118
- swap SimpleForm, label_text: lambda { |l, r, explicit_label| explicit_label ? l : "#{l.titleize}:" } do
124
+ swap SimpleForm, label_text: ->(l, r, explicit_label) { explicit_label ? l : "#{l.titleize}:" } do
119
125
  with_label_for @user, :time_zone
120
126
  assert_select 'label[for=user_time_zone]', 'Time Zone:'
121
127
  end
122
128
  end
123
129
 
124
130
  test 'builder allows label specific `label_text` option' do
125
- with_label_for @user, :time_zone, label_text: lambda { |l, _, _| "#{l.titleize}:" }
131
+ with_label_for @user, :time_zone, label_text: ->(l, _, _) { "#{l.titleize}:" }
126
132
 
127
133
  assert_no_select 'label[label_text]'
128
134
  assert_select 'label[for=user_time_zone]', 'Time Zone:'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  class WrapperTest < ActionView::TestCase
@@ -88,7 +89,7 @@ class WrapperTest < ActionView::TestCase
88
89
  end
89
90
 
90
91
  test 'wrapper skips additional classes when configured' do
91
- swap SimpleForm, generate_additional_classes_for: [:input, :label] do
92
+ swap SimpleForm, generate_additional_classes_for: %i[input label] do
92
93
  with_form_for @user, :name, wrapper_class: :wrapper
93
94
  assert_select 'form div.wrapper'
94
95
  assert_no_select 'div.required'
@@ -98,7 +99,7 @@ class WrapperTest < ActionView::TestCase
98
99
  end
99
100
 
100
101
  test 'wrapper does not generate empty css class' do
101
- swap SimpleForm, generate_additional_classes_for: [:input, :label] do
102
+ swap SimpleForm, generate_additional_classes_for: %i[input label] do
102
103
  swap_wrapper :default, custom_wrapper_without_class do
103
104
  with_form_for @user, :name
104
105
  assert_no_select 'div#custom_wrapper_without_class[class]'
@@ -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
 
@@ -145,6 +146,14 @@ class BooleanInputTest < ActionView::TestCase
145
146
  end
146
147
  end
147
148
 
149
+ test 'input with nested style does not include hidden field when unchecked_value is false' do
150
+ swap SimpleForm, boolean_style: :nested do
151
+ with_input_for @user, :active, :boolean, unchecked_value: false
152
+ assert_select "label.boolean > input.boolean"
153
+ assert_no_select "input[type=hidden] + label.boolean"
154
+ end
155
+ end
156
+
148
157
  test 'input boolean works using :input only in wrapper config (no label_input)' do
149
158
  swap_wrapper do
150
159
  with_input_for @user, :active, :boolean
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: UTF-8
2
3
  require 'test_helper'
3
4
 
@@ -7,33 +8,33 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
7
8
  end
8
9
 
9
10
  test 'input check boxes does not include for attribute by default' do
10
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
11
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
11
12
  assert_select 'label'
12
13
  assert_no_select 'label[for=user_gender]'
13
14
  end
14
15
 
15
16
  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' }
17
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female], label_html: { for: 'gender' }
17
18
  assert_select 'label[for=gender]'
18
19
  end
19
20
 
20
21
  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']
22
+ with_input_for @user, :name, :check_boxes, collection: %w[Jose Carlos]
22
23
  assert_select 'input.required'
23
24
  assert_no_select 'input[required]'
24
25
  end
25
26
 
26
27
  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']
28
+ with_input_for @user, :name, :check_boxes, collection: %w[Jose Carlos]
28
29
  assert_select 'input.required'
29
30
  assert_no_select 'input[aria-required]'
30
31
  end
31
32
 
32
33
  test 'input does automatic collection translation for check_box types using defaults key' do
33
34
  store_translations(:en, simple_form: { options: { defaults: {
34
- gender: { male: 'Male', female: 'Female'}
35
+ gender: { male: 'Male', female: 'Female' }
35
36
  } } } ) do
36
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
37
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
37
38
  assert_select 'input[type=checkbox][value=male]'
38
39
  assert_select 'input[type=checkbox][value=female]'
39
40
  assert_select 'label.collection_check_boxes', 'Male'
@@ -43,9 +44,9 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
43
44
 
44
45
  test 'input does automatic collection translation for check_box types using specific object key' do
45
46
  store_translations(:en, simple_form: { options: { user: {
46
- gender: { male: 'Male', female: 'Female'}
47
+ gender: { male: 'Male', female: 'Female' }
47
48
  } } } ) do
48
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
49
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
49
50
  assert_select 'input[type=checkbox][value=male]'
50
51
  assert_select 'input[type=checkbox][value=female]'
51
52
  assert_select 'label.collection_check_boxes', 'Male'
@@ -55,11 +56,11 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
55
56
 
56
57
  test 'input that uses automatic collection translation for check_boxes properly sets checked values' do
57
58
  store_translations(:en, simple_form: { options: { defaults: {
58
- gender: { male: 'Male', female: 'Female'}
59
+ gender: { male: 'Male', female: 'Female' }
59
60
  } } } ) do
60
61
  @user.gender = 'male'
61
62
 
62
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
63
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
63
64
  assert_select 'input[type=checkbox][value=male][checked=checked]'
64
65
  assert_select 'input[type=checkbox][value=female]'
65
66
  assert_select 'label.collection_check_boxes', 'Male'
@@ -264,7 +265,7 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
264
265
 
265
266
  test 'input check boxes wrapper class are not included when set to falsey' do
266
267
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
267
- with_input_for @user, :gender, :check_boxes, collection: [:male, :female]
268
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female]
268
269
 
269
270
  assert_no_select 'label.checkbox'
270
271
  end
@@ -272,7 +273,7 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
272
273
 
273
274
  test 'input check boxes custom wrapper class is included when include input wrapper class is falsey' do
274
275
  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'
276
+ with_input_for @user, :gender, :check_boxes, collection: %i[male female], item_wrapper_class: 'custom'
276
277
 
277
278
  assert_no_select 'label.checkbox'
278
279
  assert_select 'span.custom'
@@ -282,7 +283,7 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
282
283
  test 'input check boxes with nested style and namespace uses the right for attribute' do
283
284
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
284
285
  with_concat_form_for @user, namespace: :foo do |f|
285
- concat f.input :gender, as: :check_boxes, collection: [:male, :female]
286
+ concat f.input :gender, as: :check_boxes, collection: %i[male female]
286
287
  end
287
288
 
288
289
  assert_select 'label[for=foo_user_gender_male]'
@@ -293,11 +294,26 @@ class CollectionCheckBoxesInputTest < ActionView::TestCase
293
294
  test 'input check boxes with nested style and index uses the right for attribute' do
294
295
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
295
296
  with_concat_form_for @user, index: 1 do |f|
296
- concat f.input :gender, as: :check_boxes, collection: [:male, :female]
297
+ concat f.input :gender, as: :check_boxes, collection: %i[male female]
297
298
  end
298
299
 
299
300
  assert_select 'label[for=user_1_gender_male]'
300
301
  assert_select 'label[for=user_1_gender_female]'
301
302
  end
302
303
  end
304
+
305
+ test 'input check boxes with nested style accepts non-string attribute as label' do
306
+ swap SimpleForm, boolean_style: :nested do
307
+ with_input_for @user, :amount,
308
+ :check_boxes,
309
+ collection: { 100 => 'hundred', 200 => 'two_hundred' },
310
+ label_method: :first,
311
+ value_method: :second
312
+
313
+ assert_select 'input[type=checkbox][value=hundred]'
314
+ assert_select 'input[type=checkbox][value=two_hundred]'
315
+ assert_select 'span.checkbox > label', '100'
316
+ assert_select 'span.checkbox > label', '200'
317
+ end
318
+ end
303
319
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: UTF-8
2
3
  require 'test_helper'
3
4
 
@@ -43,13 +44,13 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
43
44
  end
44
45
 
45
46
  test 'input radio does not include for attribute by default' do
46
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
47
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
47
48
  assert_select 'label'
48
49
  assert_no_select 'label[for=user_gender]'
49
50
  end
50
51
 
51
52
  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' }
53
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female], label_html: { for: 'gender' }
53
54
  assert_select 'label[for=gender]'
54
55
  end
55
56
 
@@ -61,7 +62,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
61
62
  end
62
63
 
63
64
  test 'input allows overriding collection for radio types' do
64
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
65
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
65
66
  assert_select 'input[type=radio][value=Jose]'
66
67
  assert_select 'input[type=radio][value=Carlos]'
67
68
  assert_select 'label.collection_radio_buttons[for=user_name_jose]', 'Jose'
@@ -70,9 +71,9 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
70
71
 
71
72
  test 'input does automatic collection translation for radio types using defaults key' do
72
73
  store_translations(:en, simple_form: { options: { defaults: {
73
- gender: { male: 'Male', female: 'Female'}
74
+ gender: { male: 'Male', female: 'Female' }
74
75
  } } } ) do
75
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
76
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
76
77
  assert_select 'input[type=radio][value=male]'
77
78
  assert_select 'input[type=radio][value=female]'
78
79
  assert_select 'label.collection_radio_buttons[for=user_gender_male]', 'Male'
@@ -82,9 +83,9 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
82
83
 
83
84
  test 'input does automatic collection translation for radio types using specific object key' do
84
85
  store_translations(:en, simple_form: { options: { user: {
85
- gender: { male: 'Male', female: 'Female'}
86
+ gender: { male: 'Male', female: 'Female' }
86
87
  } } } ) do
87
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
88
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
88
89
  assert_select 'input[type=radio][value=male]'
89
90
  assert_select 'input[type=radio][value=female]'
90
91
  assert_select 'label.collection_radio_buttons[for=user_gender_male]', 'Male'
@@ -97,7 +98,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
97
98
  store_translations(:en, simple_form: { options: { user: {
98
99
  gender: { male_html: '<strong>Male</strong>', female_html: '<strong>Female</strong>' }
99
100
  } } } ) do
100
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
101
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
101
102
  assert_select 'input[type=radio][value=male]'
102
103
  assert_select 'input[type=radio][value=female]'
103
104
  assert_select 'label[for=user_gender_male] strong', 'Male'
@@ -111,7 +112,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
111
112
  store_translations(:en, simple_form: { options: { user: {
112
113
  gender: { male_html: 'Male', female_html: 'Female' }
113
114
  } } } ) do
114
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
115
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
115
116
  assert_select 'input[type=radio][value=male]'
116
117
  assert_select 'input[type=radio][value=female]'
117
118
  assert_select 'label[for=user_gender_male]', 'Male'
@@ -122,7 +123,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
122
123
 
123
124
  test 'input marks the current radio value by default' do
124
125
  @user.name = "Carlos"
125
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
126
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
126
127
  assert_select 'input[type=radio][value=Carlos][checked=checked]'
127
128
  end
128
129
 
@@ -132,7 +133,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
132
133
  end
133
134
 
134
135
  test 'input allows using a collection with text/value arrays' do
135
- with_input_for @user, :name, :radio_buttons, collection: [['Jose', 'jose'], ['Carlos', 'carlos']]
136
+ with_input_for @user, :name, :radio_buttons, collection: [%w[Jose jose], %w[Carlos carlos]]
136
137
  assert_select 'input[type=radio][value=jose]'
137
138
  assert_select 'input[type=radio][value=carlos]'
138
139
  assert_select 'label.collection_radio_buttons', 'Jose'
@@ -140,14 +141,14 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
140
141
  end
141
142
 
142
143
  test 'input allows using a collection with a Proc' do
143
- with_input_for @user, :name, :radio_buttons, collection: Proc.new { ['Jose', 'Carlos' ] }
144
+ with_input_for @user, :name, :radio_buttons, collection: proc { %w[Jose Carlos] }
144
145
  assert_select 'label.collection_radio_buttons', 'Jose'
145
146
  assert_select 'label.collection_radio_buttons', 'Carlos'
146
147
  end
147
148
 
148
149
  test 'input allows overriding only label method for collections' do
149
150
  with_input_for @user, :name, :radio_buttons,
150
- collection: ['Jose', 'Carlos'],
151
+ collection: %w[Jose Carlos],
151
152
  label_method: :upcase
152
153
  assert_select 'label.collection_radio_buttons', 'JOSE'
153
154
  assert_select 'label.collection_radio_buttons', 'CARLOS'
@@ -155,7 +156,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
155
156
 
156
157
  test 'input allows overriding only value method for collections' do
157
158
  with_input_for @user, :name, :radio_buttons,
158
- collection: ['Jose', 'Carlos'],
159
+ collection: %w[Jose Carlos],
159
160
  value_method: :upcase
160
161
  assert_select 'input[type=radio][value=JOSE]'
161
162
  assert_select 'input[type=radio][value=CARLOS]'
@@ -163,7 +164,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
163
164
 
164
165
  test 'input allows overriding label and value method for collections' do
165
166
  with_input_for @user, :name, :radio_buttons,
166
- collection: ['Jose', 'Carlos'],
167
+ collection: %w[Jose Carlos],
167
168
  label_method: :upcase,
168
169
  value_method: :downcase
169
170
  assert_select 'input[type=radio][value=jose]'
@@ -174,9 +175,9 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
174
175
 
175
176
  test 'input allows overriding label and value method using a lambda for collections' do
176
177
  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 }
178
+ collection: %w[Jose Carlos],
179
+ label_method: ->(i) { i.upcase },
180
+ value_method: ->(i) { i.downcase }
180
181
  assert_select 'input[type=radio][value=jose]'
181
182
  assert_select 'input[type=radio][value=carlos]'
182
183
  assert_select 'label.collection_radio_buttons', 'JOSE'
@@ -184,13 +185,13 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
184
185
  end
185
186
 
186
187
  test 'collection input with radio type generates required html attribute' do
187
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
188
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
188
189
  assert_select 'input[type=radio].required'
189
190
  assert_select 'input[type=radio][required]'
190
191
  end
191
192
 
192
193
  test 'collection input with radio type generates aria-required html attribute' do
193
- with_input_for @user, :name, :radio_buttons, collection: ['Jose', 'Carlos']
194
+ with_input_for @user, :name, :radio_buttons, collection: %w[Jose Carlos]
194
195
  assert_select 'input[type=radio].required'
195
196
  assert_select 'input[type=radio][aria-required=true]'
196
197
  end
@@ -387,7 +388,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
387
388
 
388
389
  test 'input radio wrapper class are not included when set to falsey' do
389
390
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
390
- with_input_for @user, :gender, :radio_buttons, collection: [:male, :female]
391
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female]
391
392
 
392
393
  assert_no_select 'label.radio'
393
394
  end
@@ -395,7 +396,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
395
396
 
396
397
  test 'input radio custom wrapper class is included when include input wrapper class is falsey' do
397
398
  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
+ with_input_for @user, :gender, :radio_buttons, collection: %i[male female], item_wrapper_class: 'custom'
399
400
 
400
401
  assert_no_select 'label.radio'
401
402
  assert_select 'span.custom'
@@ -405,7 +406,7 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
405
406
  test 'input radio with nested style and namespace uses the right for attribute' do
406
407
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
407
408
  with_concat_form_for @user, namespace: :foo do |f|
408
- concat f.input :gender, as: :radio_buttons, collection: [:male, :female]
409
+ concat f.input :gender, as: :radio_buttons, collection: %i[male female]
409
410
  end
410
411
 
411
412
  assert_select 'label[for=foo_user_gender_male]'
@@ -416,11 +417,26 @@ class CollectionRadioButtonsInputTest < ActionView::TestCase
416
417
  test 'input radio with nested style and index uses the right for attribute' do
417
418
  swap SimpleForm, include_default_input_wrapper_class: false, boolean_style: :nested do
418
419
  with_concat_form_for @user, index: 1 do |f|
419
- concat f.input :gender, as: :radio_buttons, collection: [:male, :female]
420
+ concat f.input :gender, as: :radio_buttons, collection: %i[male female]
420
421
  end
421
422
 
422
423
  assert_select 'label[for=user_1_gender_male]'
423
424
  assert_select 'label[for=user_1_gender_female]'
424
425
  end
425
426
  end
427
+
428
+ test 'input radio with nested style accetps non-string attribute as label' do
429
+ swap SimpleForm, boolean_style: :nested do
430
+ with_input_for @user, :amount,
431
+ :radio_buttons,
432
+ collection: { 100 => 'hundred', 200 => 'two_hundred' },
433
+ label_method: :first,
434
+ value_method: :second
435
+
436
+ assert_select 'input[type=radio][value=hundred]'
437
+ assert_select 'input[type=radio][value=two_hundred]'
438
+ assert_select 'span.radio > label', '100'
439
+ assert_select 'span.radio > label', '200'
440
+ end
441
+ end
426
442
  end