simple_form 5.0.0 → 5.3.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +49 -8
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +96 -51
  5. data/lib/generators/simple_form/install_generator.rb +2 -2
  6. data/lib/generators/simple_form/templates/README +2 -3
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +2 -2
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +127 -195
  9. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +1 -1
  10. data/lib/simple_form/components/label_input.rb +1 -1
  11. data/lib/simple_form/components/labels.rb +3 -5
  12. data/lib/simple_form/components/maxlength.rb +0 -4
  13. data/lib/simple_form/components/minlength.rb +0 -4
  14. data/lib/simple_form/form_builder.rb +7 -10
  15. data/lib/simple_form/inputs/base.rb +0 -3
  16. data/lib/simple_form/inputs/boolean_input.rb +6 -2
  17. data/lib/simple_form/inputs/collection_check_boxes_input.rb +1 -1
  18. data/lib/simple_form/inputs/collection_input.rb +3 -5
  19. data/lib/simple_form/inputs/grouped_collection_select_input.rb +1 -1
  20. data/lib/simple_form/inputs/priority_input.rb +16 -2
  21. data/lib/simple_form/inputs/rich_text_area_input.rb +12 -0
  22. data/lib/simple_form/inputs.rb +1 -0
  23. data/lib/simple_form/railtie.rb +4 -0
  24. data/lib/simple_form/version.rb +1 -1
  25. data/lib/simple_form/wrappers/leaf.rb +1 -1
  26. data/lib/simple_form/wrappers/root.rb +8 -3
  27. data/lib/simple_form.rb +10 -6
  28. metadata +22 -93
  29. data/lib/simple_form/i18n_cache.rb +0 -23
  30. data/test/action_view_extensions/builder_test.rb +0 -634
  31. data/test/action_view_extensions/form_helper_test.rb +0 -172
  32. data/test/components/custom_components_test.rb +0 -62
  33. data/test/components/label_test.rb +0 -356
  34. data/test/form_builder/association_test.rb +0 -252
  35. data/test/form_builder/button_test.rb +0 -48
  36. data/test/form_builder/error_notification_test.rb +0 -80
  37. data/test/form_builder/error_test.rb +0 -281
  38. data/test/form_builder/general_test.rb +0 -534
  39. data/test/form_builder/hint_test.rb +0 -150
  40. data/test/form_builder/input_field_test.rb +0 -195
  41. data/test/form_builder/label_test.rb +0 -136
  42. data/test/form_builder/wrapper_test.rb +0 -371
  43. data/test/generators/simple_form_generator_test.rb +0 -43
  44. data/test/inputs/boolean_input_test.rb +0 -243
  45. data/test/inputs/collection_check_boxes_input_test.rb +0 -327
  46. data/test/inputs/collection_radio_buttons_input_test.rb +0 -450
  47. data/test/inputs/collection_select_input_test.rb +0 -378
  48. data/test/inputs/color_input_test.rb +0 -10
  49. data/test/inputs/datetime_input_test.rb +0 -176
  50. data/test/inputs/disabled_test.rb +0 -92
  51. data/test/inputs/discovery_test.rb +0 -142
  52. data/test/inputs/file_input_test.rb +0 -17
  53. data/test/inputs/general_test.rb +0 -133
  54. data/test/inputs/grouped_collection_select_input_test.rb +0 -183
  55. data/test/inputs/hidden_input_test.rb +0 -32
  56. data/test/inputs/numeric_input_test.rb +0 -177
  57. data/test/inputs/priority_input_test.rb +0 -50
  58. data/test/inputs/readonly_test.rb +0 -102
  59. data/test/inputs/required_test.rb +0 -158
  60. data/test/inputs/string_input_test.rb +0 -158
  61. data/test/inputs/text_input_test.rb +0 -37
  62. data/test/simple_form_test.rb +0 -18
  63. data/test/support/discovery_inputs.rb +0 -65
  64. data/test/support/misc_helpers.rb +0 -274
  65. data/test/support/mock_controller.rb +0 -30
  66. data/test/support/models.rb +0 -353
  67. data/test/test_helper.rb +0 -95
@@ -1,172 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'test_helper'
3
-
4
- class FormHelperTest < ActionView::TestCase
5
-
6
- test 'SimpleForm for yields an instance of FormBuilder' do
7
- simple_form_for :user do |f|
8
- assert f.instance_of?(SimpleForm::FormBuilder)
9
- end
10
- end
11
-
12
- test 'SimpleForm adds default class to form' do
13
- with_concat_form_for(:user)
14
- assert_select 'form.simple_form'
15
- end
16
-
17
- test 'SimpleForm allows overriding default form class' do
18
- swap SimpleForm, default_form_class: "my_custom_class" do
19
- with_concat_form_for :user, html: { class: "override_class" }
20
- assert_no_select 'form.my_custom_class'
21
- assert_select 'form.override_class'
22
- end
23
- end
24
-
25
- # Remove this test when SimpleForm.form_class is removed in 4.x
26
- test 'SimpleForm allows overriding default form class, but not form class' do
27
- ActiveSupport::Deprecation.silence do
28
- swap SimpleForm, form_class: "fixed_class", default_form_class: "my_custom_class" do
29
- with_concat_form_for :user, html: { class: "override_class" }
30
- assert_no_select 'form.my_custom_class'
31
- assert_select 'form.fixed_class.override_class'
32
- end
33
- end
34
- end
35
-
36
- test 'SimpleForm uses default browser validations by default' do
37
- with_concat_form_for(:user)
38
- assert_no_select 'form[novalidate]'
39
- end
40
-
41
- test 'SimpleForm does not use default browser validations if specified in the configuration options' do
42
- swap SimpleForm, browser_validations: false do
43
- with_concat_form_for(:user)
44
- assert_select 'form[novalidate="novalidate"]'
45
- end
46
- end
47
-
48
- test 'disabled browser validations overrides default configuration' do
49
- with_concat_form_for(:user, html: { novalidate: true })
50
- assert_select 'form[novalidate="novalidate"]'
51
- end
52
-
53
- test 'enabled browser validations overrides disabled configuration' do
54
- swap SimpleForm, browser_validations: false do
55
- with_concat_form_for(:user, html: { novalidate: false })
56
- assert_no_select 'form[novalidate]'
57
- end
58
- end
59
-
60
- test 'SimpleForm adds object name as css class to form when object is not present' do
61
- with_concat_form_for(:user, html: { novalidate: true })
62
- assert_select 'form.simple_form.user'
63
- end
64
-
65
- test 'SimpleForm adds :as option as css class to form when object is not present' do
66
- with_concat_form_for(:user, as: 'superuser')
67
- assert_select 'form.simple_form.superuser'
68
- end
69
-
70
- test 'SimpleForm adds object class name with new prefix as css class to form if record is not persisted' do
71
- @user.new_record!
72
- with_concat_form_for(@user)
73
- assert_select 'form.simple_form.new_user'
74
- end
75
-
76
- test 'SimpleForm adds :as option with new prefix as css class to form if record is not persisted' do
77
- @user.new_record!
78
- with_concat_form_for(@user, as: 'superuser')
79
- assert_select 'form.simple_form.new_superuser'
80
- end
81
-
82
- test 'SimpleForm adds edit class prefix as css class to form if record is persisted' do
83
- with_concat_form_for(@user)
84
- assert_select 'form.simple_form.edit_user'
85
- end
86
-
87
- test 'SimpleForm adds :as options with edit prefix as css class to form if record is persisted' do
88
- with_concat_form_for(@user, as: 'superuser')
89
- assert_select 'form.simple_form.edit_superuser'
90
- end
91
-
92
- test 'SimpleForm adds last object name as css class to form when there is array of objects' do
93
- with_concat_form_for([Company.new, @user])
94
- assert_select 'form.simple_form.edit_user'
95
- end
96
-
97
- test 'SimpleForm does not add object class to form if css_class is specified' do
98
- with_concat_form_for(:user, html: { class: nil })
99
- assert_no_select 'form.user'
100
- end
101
-
102
- test 'SimpleForm adds custom class to form if css_class is specified' do
103
- with_concat_form_for(:user, html: { class: 'my_class' })
104
- assert_select 'form.my_class'
105
- end
106
-
107
- test 'passes options to SimpleForm' do
108
- with_concat_form_for(:user, url: '/account', html: { id: 'my_form' })
109
- assert_select 'form#my_form'
110
- assert_select 'form[action="/account"]'
111
- end
112
-
113
- test 'form_for yields an instance of FormBuilder' do
114
- with_concat_form_for(:user) do |f|
115
- assert f.instance_of?(SimpleForm::FormBuilder)
116
- end
117
- end
118
-
119
- test 'fields_for with a hash like model yields an instance of FormBuilder' do
120
- with_concat_fields_for(:author, HashBackedAuthor.new) do |f|
121
- assert f.instance_of?(SimpleForm::FormBuilder)
122
- f.input :name
123
- end
124
-
125
- assert_select "input[name='author[name]'][value='hash backed author']"
126
- end
127
-
128
- test 'custom error proc is not destructive' do
129
- swap_field_error_proc do
130
- result = nil
131
- simple_form_for :user do |f|
132
- result = simple_fields_for 'address' do
133
- 'hello'
134
- end
135
- end
136
-
137
- assert_equal 'hello', result
138
- end
139
- end
140
-
141
- test 'custom error proc survives an exception' do
142
- swap_field_error_proc do
143
- begin
144
- simple_form_for :user do |f|
145
- simple_fields_for 'address' do
146
- raise 'an exception'
147
- end
148
- end
149
- rescue StandardError
150
- end
151
- end
152
- end
153
-
154
- test 'SimpleForm for swaps default action view field_error_proc' do
155
- expected_error_proc = -> {}
156
- swap SimpleForm, field_error_proc: expected_error_proc do
157
- simple_form_for :user do |f|
158
- assert_equal expected_error_proc, ::ActionView::Base.field_error_proc
159
- end
160
- end
161
- end
162
-
163
- private
164
-
165
- def swap_field_error_proc(expected_error_proc = -> {})
166
- swap ActionView::Base, field_error_proc: expected_error_proc do
167
- yield
168
-
169
- assert_equal expected_error_proc, ActionView::Base.field_error_proc
170
- end
171
- end
172
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- # Module that represents a custom component.
6
- module Numbers
7
- def number(wrapper_options = nil)
8
- @number ||= options[:number].to_s.html_safe
9
- end
10
- end
11
-
12
- # Module that represents a custom component.
13
- module InputGroup
14
- def prepend(wrapper_options = nil)
15
- span_tag = content_tag(:span, options[:prepend], class: 'input-group-text')
16
- template.content_tag(:div, span_tag, class: 'input-group-prepend')
17
- end
18
-
19
- def append(wrapper_options = nil)
20
- span_tag = content_tag(:span, options[:append], class: 'input-group-text')
21
- template.content_tag(:div, span_tag, class: 'input-group-append')
22
- end
23
- end
24
-
25
- class CustomComponentsTest < ActionView::TestCase
26
- test 'includes the custom components' do
27
- SimpleForm.include_component Numbers
28
-
29
- custom_wrapper = SimpleForm.build tag: :div, class: "custom_wrapper" do |b|
30
- b.use :number, wrap_with: { tag: 'div', class: 'number' }
31
- end
32
-
33
- with_form_for @user, :name, number: 1, wrapper: custom_wrapper
34
-
35
- assert_select 'div.number', text: '1'
36
- end
37
-
38
- test 'includes custom components and use it as optional in the wrapper' do
39
- SimpleForm.include_component InputGroup
40
-
41
- custom_wrapper = SimpleForm.build tag: :div, class: 'custom_wrapper' do |b|
42
- b.use :label
43
- b.optional :prepend
44
- b.use :input
45
- b.use :append
46
- end
47
-
48
- with_form_for @user, :name, prepend: true, wrapper: custom_wrapper
49
-
50
- assert_select 'div.input-group-prepend > span.input-group-text'
51
- assert_select 'div.input-group-append > span.input-group-text'
52
- end
53
-
54
- test 'raises a TypeError when the component is not a Module' do
55
- component = 'MyComponent'
56
-
57
- exception = assert_raises TypeError do
58
- SimpleForm.include_component(component)
59
- end
60
- assert_equal exception.message, "SimpleForm.include_component expects a module but got: String"
61
- end
62
- end
@@ -1,356 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: UTF-8
3
- require 'test_helper'
4
-
5
- # Isolated tests for label without triggering f.label.
6
- class IsolatedLabelTest < ActionView::TestCase
7
- setup do
8
- SimpleForm::Inputs::Base.reset_i18n_cache :translate_required_html
9
- end
10
-
11
- def with_label_for(object, attribute_name, type, options = {})
12
- with_concat_form_for(object) do |f|
13
- options[:reflection] = Association.new(Company, :company, {}) if options.delete(:setup_association)
14
- SimpleForm::Inputs::Base.new(f, attribute_name, nil, type, options).label
15
- end
16
- end
17
-
18
- test 'label generates a default humanized description' do
19
- with_label_for @user, :name, :string
20
- assert_select 'label[for=user_name]', /Name/
21
- end
22
-
23
- test 'label allows a customized description' do
24
- with_label_for @user, :name, :string, label: 'My label!'
25
- assert_select 'label[for=user_name]', /My label!/
26
- end
27
-
28
- test 'label uses human attribute name from object when available' do
29
- with_label_for @user, :description, :text
30
- assert_select 'label[for=user_description]', /User Description!/
31
- end
32
-
33
- test 'label uses human attribute name based on association name' do
34
- with_label_for @user, :company_id, :string, setup_association: true
35
- assert_select 'label', /Company Human Name!/
36
- end
37
-
38
- test 'label uses i18n based on model, action, and attribute to lookup translation' do
39
- @controller.action_name = "new"
40
- store_translations(:en, simple_form: { labels: { user: {
41
- new: { description: 'Nova descrição' }
42
- } } }) do
43
- with_label_for @user, :description, :text
44
- assert_select 'label[for=user_description]', /Nova descrição/
45
- end
46
- end
47
-
48
- test 'label fallbacks to new when action is create' do
49
- @controller.action_name = "create"
50
- store_translations(:en, simple_form: { labels: { user: {
51
- new: { description: 'Nova descrição' }
52
- } } }) do
53
- with_label_for @user, :description, :text
54
- assert_select 'label[for=user_description]', /Nova descrição/
55
- end
56
- end
57
-
58
- test 'label does not explode while looking for i18n translation when action is not set' do
59
- def @controller.action_name; nil; end
60
-
61
- assert_nothing_raised do
62
- with_label_for @user, :description, :text
63
- end
64
- assert_select 'label[for=user_description]'
65
- end
66
-
67
- test 'label uses i18n based on model and attribute to lookup translation' do
68
- store_translations(:en, simple_form: { labels: { user: {
69
- description: 'Descrição'
70
- } } }) do
71
- with_label_for @user, :description, :text
72
- assert_select 'label[for=user_description]', /Descrição/
73
- end
74
- end
75
-
76
- test 'label uses i18n under defaults to lookup translation' do
77
- store_translations(:en, simple_form: { labels: { defaults: { age: 'Idade' } } }) do
78
- with_label_for @user, :age, :integer
79
- assert_select 'label[for=user_age]', /Idade/
80
- end
81
- end
82
-
83
- test 'label does not use i18n label if translate is false' do
84
- swap SimpleForm, translate_labels: false do
85
- store_translations(:en, simple_form: { labels: { defaults: { age: 'Idade' } } }) do
86
- with_label_for @user, :age, :integer
87
- assert_select 'label[for=user_age]', /Age/
88
- end
89
- end
90
- end
91
-
92
- test 'label uses i18n with lookup for association name' do
93
- store_translations(:en, simple_form: { labels: {
94
- user: { company: 'My company!' }
95
- } }) do
96
- with_label_for @user, :company_id, :string, setup_association: true
97
- assert_select 'label[for=user_company_id]', /My company!/
98
- end
99
- end
100
-
101
- test 'label uses i18n under defaults namespace to lookup for association name' do
102
- store_translations(:en, simple_form: { labels: {
103
- defaults: { company: 'Plataformatec' }
104
- } }) do
105
- with_label_for @user, :company, :string, setup_association: true
106
-
107
- assert_select 'form label', /Plataformatec/
108
- end
109
- end
110
-
111
- test 'label does correct i18n lookup for nested models with nested translation' do
112
- @user.company = Company.new(1, 'Empresa')
113
-
114
- store_translations(:en, simple_form: { labels: {
115
- user: { name: 'Usuario', company: { name: 'Nome da empresa' } }
116
- } }) do
117
- with_concat_form_for @user do |f|
118
- concat f.input :name
119
- concat(f.simple_fields_for(:company) do |company_form|
120
- concat(company_form.input :name)
121
- end)
122
- end
123
-
124
- assert_select 'label[for=user_name]', /Usuario/
125
- assert_select 'label[for=user_company_attributes_name]', /Nome da empresa/
126
- end
127
- end
128
-
129
- test 'label does correct i18n lookup for nested models with no nested translation' do
130
- @user.company = Company.new(1, 'Empresa')
131
-
132
- store_translations(:en, simple_form: { labels: {
133
- user: { name: 'Usuario' },
134
- company: { name: 'Nome da empresa' }
135
- } }) do
136
- with_concat_form_for @user do |f|
137
- concat f.input :name
138
- concat(f.simple_fields_for(:company) do |company_form|
139
- concat(company_form.input :name)
140
- end)
141
- end
142
-
143
- assert_select 'label[for=user_name]', /Usuario/
144
- assert_select 'label[for=user_company_attributes_name]', /Nome da empresa/
145
- end
146
- end
147
-
148
- test 'label does correct i18n lookup for nested has_many models with no nested translation' do
149
- @user.tags = [Tag.new(1, 'Empresa')]
150
-
151
- store_translations(:en, simple_form: { labels: {
152
- user: { name: 'Usuario' },
153
- tags: { name: 'Nome da empresa' }
154
- } }) do
155
- with_concat_form_for @user do |f|
156
- concat f.input :name
157
- concat(f.simple_fields_for(:tags, child_index: "new_index") do |tags_form|
158
- concat(tags_form.input :name)
159
- end)
160
- end
161
-
162
- assert_select 'label[for=user_name]', /Usuario/
163
- assert_select 'label[for=user_tags_attributes_new_index_name]', /Nome da empresa/
164
- end
165
- end
166
-
167
- test 'label has css class from type' do
168
- with_label_for @user, :name, :string
169
- assert_select 'label.string'
170
- with_label_for @user, :description, :text
171
- assert_select 'label.text'
172
- with_label_for @user, :age, :integer
173
- assert_select 'label.integer'
174
- with_label_for @user, :born_at, :date
175
- assert_select 'label.date'
176
- with_label_for @user, :created_at, :datetime
177
- assert_select 'label.datetime'
178
- end
179
-
180
- test 'label does not have css class from type when generate_additional_classes_for does not include :label' do
181
- swap SimpleForm, generate_additional_classes_for: %i[wrapper input] do
182
- with_label_for @user, :name, :string
183
- assert_no_select 'label.string'
184
- with_label_for @user, :description, :text
185
- assert_no_select 'label.text'
186
- with_label_for @user, :age, :integer
187
- assert_no_select 'label.integer'
188
- with_label_for @user, :born_at, :date
189
- assert_no_select 'label.date'
190
- with_label_for @user, :created_at, :datetime
191
- assert_no_select 'label.datetime'
192
- end
193
- end
194
-
195
- test 'label does not generate empty css class' do
196
- swap SimpleForm, generate_additional_classes_for: %i[wrapper input] do
197
- with_label_for @user, :name, :string
198
- assert_no_select 'label[class]'
199
- end
200
- end
201
-
202
- test 'label obtains required from ActiveModel::Validations when it is included' do
203
- with_label_for @validating_user, :name, :string
204
- assert_select 'label.required'
205
- with_label_for @validating_user, :status, :string
206
- assert_select 'label.optional'
207
- end
208
-
209
- test 'label does not obtain required from ActiveModel::Validations when generate_additional_classes_for does not include :label' do
210
- swap SimpleForm, generate_additional_classes_for: %i[wrapper input] do
211
- with_label_for @validating_user, :name, :string
212
- assert_no_select 'label.required'
213
- with_label_for @validating_user, :status, :string
214
- assert_no_select 'label.optional'
215
- end
216
- end
217
-
218
- test 'label allows overriding required when ActiveModel::Validations is included' do
219
- with_label_for @validating_user, :name, :string, required: false
220
- assert_select 'label.optional'
221
- with_label_for @validating_user, :status, :string, required: true
222
- assert_select 'label.required'
223
- end
224
-
225
- test 'label is required by default when ActiveModel::Validations is not included' do
226
- with_label_for @user, :name, :string
227
- assert_select 'label.required'
228
- end
229
-
230
- test 'label is able to disable required when ActiveModel::Validations is not included' do
231
- with_label_for @user, :name, :string, required: false
232
- assert_no_select 'label.required'
233
- end
234
-
235
- test 'label adds required text when required' do
236
- with_label_for @user, :name, :string
237
- assert_select 'label.required abbr[title=required]', '*'
238
- end
239
-
240
- test 'label does not have required text in no required inputs' do
241
- with_label_for @user, :name, :string, required: false
242
- assert_no_select 'form label abbr'
243
- end
244
-
245
- test 'label uses i18n to find required text' do
246
- store_translations(:en, simple_form: { required: { text: 'campo requerido' } }) do
247
- with_label_for @user, :name, :string
248
- assert_select 'form label abbr[title="campo requerido"]', '*'
249
- end
250
- end
251
-
252
- test 'label uses custom i18n scope to find required text' do
253
- store_translations(:en, my_scope: { required: { text: 'Pflichtfeld' } }) do
254
- swap SimpleForm, i18n_scope: :my_scope do
255
- with_label_for @user, :name, :string
256
- assert_select 'form label abbr[title="Pflichtfeld"]', '*'
257
- end
258
- end
259
- end
260
-
261
- test 'label uses i18n to find required mark' do
262
- store_translations(:en, simple_form: { required: { mark: '*-*' } }) do
263
- with_label_for @user, :name, :string
264
- assert_select 'form label abbr', '*-*'
265
- end
266
- end
267
-
268
- test 'label uses custom i18n scope to find required mark' do
269
- store_translations(:en, my_scope: { required: { mark: '!!' } }) do
270
- swap SimpleForm, i18n_scope: :my_scope do
271
- with_label_for @user, :name, :string
272
- assert_select 'form label abbr', '!!'
273
- end
274
- end
275
- end
276
-
277
- test 'label uses i18n to find required string tag' do
278
- store_translations(:en, simple_form: { required: { html: '<span class="required" title="requerido">*</span>' } }) do
279
- with_label_for @user, :name, :string
280
- assert_no_select 'form label abbr'
281
- assert_select 'form label span.required[title=requerido]', '*'
282
- end
283
- end
284
-
285
- test 'label uses custom i18n scope to find required string tag' do
286
- store_translations(:en, my_scope: { required: { html: '<span class="mandatory" title="Pflichtfeld">!!</span>' } }) do
287
- swap SimpleForm, i18n_scope: :my_scope do
288
- with_label_for @user, :name, :string
289
- assert_no_select 'form label abbr'
290
- assert_select 'form label span.mandatory[title=Pflichtfeld]', '!!'
291
- end
292
- end
293
- end
294
-
295
- test 'label allows overwriting input id' do
296
- with_label_for @user, :name, :string, input_html: { id: 'my_new_id' }
297
- assert_select 'label[for=my_new_id]'
298
- end
299
-
300
- test 'label allows overwriting of for attribute' do
301
- with_label_for @user, :name, :string, label_html: { for: 'my_new_id' }
302
- assert_select 'label[for=my_new_id]'
303
- end
304
-
305
- test 'label allows overwriting of for attribute with input_html not containing id' do
306
- with_label_for @user, :name, :string, label_html: { for: 'my_new_id' }, input_html: { class: 'foo' }
307
- assert_select 'label[for=my_new_id]'
308
- end
309
-
310
- test 'label uses default input id when it was not overridden' do
311
- with_label_for @user, :name, :string, input_html: { class: 'my_new_id' }
312
- assert_select 'label[for=user_name]'
313
- end
314
-
315
- test 'label is generated properly when object is not present' do
316
- with_label_for :project, :name, :string
317
- assert_select 'label[for=project_name]', /Name/
318
- end
319
-
320
- test 'label includes for attribute for select collection' do
321
- with_label_for @user, :sex, :select, collection: %i[male female]
322
- assert_select 'label[for=user_sex]'
323
- end
324
-
325
- test 'label uses i18n properly when object is not present' do
326
- store_translations(:en, simple_form: { labels: {
327
- project: { name: 'Nome' }
328
- } }) do
329
- with_label_for :project, :name, :string
330
- assert_select 'label[for=project_name]', /Nome/
331
- end
332
- end
333
-
334
- test 'label adds required by default when object is not present' do
335
- with_label_for :project, :name, :string
336
- assert_select 'label.required[for=project_name]'
337
- with_label_for :project, :description, :string, required: false
338
- assert_no_select 'label.required[for=project_description]'
339
- end
340
-
341
- test 'label adds chosen label class' do
342
- swap SimpleForm, label_class: :my_custom_class do
343
- with_label_for @user, :name, :string
344
- assert_select 'label.my_custom_class'
345
- end
346
- end
347
-
348
- test 'label strips extra classes even when label_class is nil' do
349
- swap SimpleForm, label_class: nil do
350
- with_label_for @user, :name, :string
351
- assert_select "label[class='string required']"
352
- assert_no_select "label[class='string required ']"
353
- assert_no_select "label[class=' string required']"
354
- end
355
- end
356
- end