simple_form 3.1.0.rc2 → 3.2.1

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -1
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +76 -24
  5. data/lib/generators/simple_form/install_generator.rb +2 -2
  6. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +4 -4
  7. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +22 -2
  8. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +85 -4
  9. data/lib/simple_form/action_view_extensions/builder.rb +1 -0
  10. data/lib/simple_form/action_view_extensions/form_helper.rb +5 -1
  11. data/lib/simple_form/components/errors.rb +3 -5
  12. data/lib/simple_form/components/html5.rb +4 -4
  13. data/lib/simple_form/components/labels.rb +1 -1
  14. data/lib/simple_form/form_builder.rb +9 -7
  15. data/lib/simple_form/inputs/base.rb +1 -5
  16. data/lib/simple_form/inputs/boolean_input.rb +1 -1
  17. data/lib/simple_form/inputs/collection_input.rb +2 -4
  18. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +1 -1
  19. data/lib/simple_form/inputs/date_time_input.rb +12 -8
  20. data/lib/simple_form/tags.rb +2 -4
  21. data/lib/simple_form/version.rb +1 -1
  22. data/lib/simple_form.rb +13 -2
  23. data/test/action_view_extensions/builder_test.rb +31 -31
  24. data/test/action_view_extensions/form_helper_test.rb +20 -1
  25. data/test/components/label_test.rb +1 -1
  26. data/test/form_builder/association_test.rb +37 -37
  27. data/test/form_builder/button_test.rb +5 -5
  28. data/test/form_builder/error_test.rb +75 -16
  29. data/test/form_builder/general_test.rb +42 -11
  30. data/test/form_builder/hint_test.rb +3 -3
  31. data/test/form_builder/input_field_test.rb +59 -53
  32. data/test/form_builder/label_test.rb +13 -3
  33. data/test/form_builder/wrapper_test.rb +29 -14
  34. data/test/generators/simple_form_generator_test.rb +2 -2
  35. data/test/inputs/boolean_input_test.rb +9 -1
  36. data/test/inputs/collection_check_boxes_input_test.rb +22 -0
  37. data/test/inputs/collection_radio_buttons_input_test.rb +25 -3
  38. data/test/inputs/collection_select_input_test.rb +17 -17
  39. data/test/inputs/datetime_input_test.rb +6 -1
  40. data/test/inputs/grouped_collection_select_input_test.rb +8 -8
  41. data/test/inputs/numeric_input_test.rb +19 -19
  42. data/test/inputs/priority_input_test.rb +6 -6
  43. data/test/inputs/required_test.rb +12 -0
  44. data/test/inputs/string_input_test.rb +10 -19
  45. data/test/inputs/text_input_test.rb +10 -3
  46. data/test/support/misc_helpers.rb +14 -1
  47. data/test/support/models.rb +11 -1
  48. data/test/test_helper.rb +9 -1
  49. metadata +25 -13
@@ -14,16 +14,20 @@ module SimpleForm
14
14
  private
15
15
 
16
16
  def label_target
17
- position = case input_type
18
- when :date, :datetime
19
- date_order = input_options[:order] || I18n.t('date.order')
20
- date_order.first.to_sym
17
+ if use_html5_inputs?
18
+ attribute_name
21
19
  else
22
- :hour
23
- end
20
+ position = case input_type
21
+ when :date, :datetime
22
+ date_order = input_options[:order] || I18n.t('date.order')
23
+ date_order.first.to_sym
24
+ else
25
+ :hour
26
+ end
24
27
 
25
- position = ActionView::Helpers::DateTimeSelector::POSITION[position]
26
- "#{attribute_name}_#{position}i"
28
+ position = ActionView::Helpers::DateTimeSelector::POSITION[position]
29
+ "#{attribute_name}_#{position}i"
30
+ end
27
31
  end
28
32
 
29
33
  def use_html5_inputs?
@@ -16,11 +16,9 @@ module SimpleForm
16
16
  rendered_item = yield item, value, text, default_html_options.merge(additional_html_options)
17
17
 
18
18
  if @options.fetch(:boolean_style, SimpleForm.boolean_style) == :nested
19
- label_options = {}
20
- add_default_name_and_id_for_value(value, label_options)
21
- label_options['for'] = label_options.delete('id')
19
+ label_options = default_html_options.slice(:index, :namespace)
22
20
  label_options['class'] = @options[:item_label_class]
23
- rendered_item = content_tag(:label, rendered_item, label_options)
21
+ rendered_item = @template_object.label(@object_name, sanitize_attribute_name(value), rendered_item, label_options)
24
22
  end
25
23
 
26
24
  item_wrapper_tag ? @template_object.content_tag(item_wrapper_tag, rendered_item, class: item_wrapper_class) : rendered_item
@@ -1,3 +1,3 @@
1
1
  module SimpleForm
2
- VERSION = "3.1.0.rc2".freeze
2
+ VERSION = "3.2.1".freeze
3
3
  end
data/lib/simple_form.rb CHANGED
@@ -96,10 +96,16 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
96
96
  mattr_accessor :boolean_style
97
97
  @@boolean_style = :inline
98
98
 
99
- # You can define the class to be used on all forms. Default is simple_form.
100
- mattr_accessor :form_class
99
+ # DEPRECATED: You can define the class to be used on all forms. Default is
100
+ # simple_form.
101
+ mattr_reader :form_class
101
102
  @@form_class = :simple_form
102
103
 
104
+ # You can define the default class to be used on all forms. Can be overriden
105
+ # with `html: { :class }`. Defaults to none.
106
+ mattr_accessor :default_form_class
107
+ @@default_form_class = nil
108
+
103
109
  # You can define which elements should obtain additional classes.
104
110
  mattr_accessor :generate_additional_classes_for
105
111
  @@generate_additional_classes_for = [:wrapper, :label, :input]
@@ -249,6 +255,11 @@ See https://github.com/plataformatec/simple_form/pull/997 for more information.
249
255
  ActiveSupport::Deprecation.warn "[SIMPLE_FORM] SimpleForm.default_input_size= is deprecated and has no effect", caller
250
256
  end
251
257
 
258
+ def self.form_class=(value)
259
+ ActiveSupport::Deprecation.warn "[SIMPLE_FORM] SimpleForm.form_class= is deprecated and will be removed in 4.x. Use SimpleForm.default_form_class= instead", caller
260
+ @@form_class = value
261
+ end
262
+
252
263
  # Default way to setup Simple Form. Run rails generate simple_form:install
253
264
  # to create a fresh initializer with all configuration values.
254
265
  def self.setup
@@ -263,15 +263,15 @@ class BuilderTest < ActionView::TestCase
263
263
  collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')]
264
264
  with_collection_check_boxes @user, :tag_ids, collection, :id, :name
265
265
 
266
- assert_select 'form input#user_tag_ids_1[type=checkbox][value=1]'
267
- assert_select 'form input#user_tag_ids_2[type=checkbox][value=2]'
266
+ assert_select 'form input#user_tag_ids_1[type=checkbox][value="1"]'
267
+ assert_select 'form input#user_tag_ids_2[type=checkbox][value="2"]'
268
268
  end
269
269
 
270
270
  test "collection check box generates only one hidden field for the entire collection, to ensure something will be sent back to the server when posting an empty collection" do
271
271
  collection = [Tag.new(1, 'Tag 1'), Tag.new(2, 'Tag 2')]
272
272
  with_collection_check_boxes @user, :tag_ids, collection, :id, :name
273
273
 
274
- assert_select "form input[type=hidden][name='user[tag_ids][]'][value=]", count: 1
274
+ assert_select "form input[type=hidden][name='user[tag_ids][]'][value='']", count: 1
275
275
  end
276
276
 
277
277
  test "collection check box accepts a collection and generate a serie of checkboxes with labels for label method" do
@@ -301,36 +301,36 @@ class BuilderTest < ActionView::TestCase
301
301
 
302
302
  with_collection_check_boxes user, :tag_ids, collection, :first, :last
303
303
 
304
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
305
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
306
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
304
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
305
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
306
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
307
307
  end
308
308
 
309
309
  test "collection check box accepts selected values as :checked option" do
310
310
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
311
311
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, checked: [1, 3]
312
312
 
313
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
314
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
315
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
313
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
314
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
315
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
316
316
  end
317
317
 
318
318
  test "collection check boxes accepts selected string values as :checked option" do
319
319
  collection = (1..3).map { |i| [i, "Category #{i}"] }
320
320
  with_collection_check_boxes :user, :category_ids, collection, :first, :last, checked: ['1', '3']
321
321
 
322
- assert_select 'input[type=checkbox][value=1][checked=checked]'
323
- assert_select 'input[type=checkbox][value=3][checked=checked]'
324
- assert_no_select 'input[type=checkbox][value=2][checked=checked]'
322
+ assert_select 'input[type=checkbox][value="1"][checked=checked]'
323
+ assert_select 'input[type=checkbox][value="3"][checked=checked]'
324
+ assert_no_select 'input[type=checkbox][value="2"][checked=checked]'
325
325
  end
326
326
 
327
327
  test "collection check box accepts a single checked value" do
328
328
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
329
329
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, checked: 3
330
330
 
331
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
332
- assert_no_select 'form input[type=checkbox][value=1][checked=checked]'
333
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
331
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
332
+ assert_no_select 'form input[type=checkbox][value="1"][checked=checked]'
333
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
334
334
  end
335
335
 
336
336
  test "collection check box accepts selected values as :checked option and override the model values" do
@@ -338,44 +338,44 @@ class BuilderTest < ActionView::TestCase
338
338
  @user.tag_ids = [2]
339
339
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, checked: [1, 3]
340
340
 
341
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
342
- assert_select 'form input[type=checkbox][value=3][checked=checked]'
343
- assert_no_select 'form input[type=checkbox][value=2][checked=checked]'
341
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
342
+ assert_select 'form input[type=checkbox][value="3"][checked=checked]'
343
+ assert_no_select 'form input[type=checkbox][value="2"][checked=checked]'
344
344
  end
345
345
 
346
346
  test "collection check box accepts multiple disabled items" do
347
347
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
348
348
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, disabled: [1, 3]
349
349
 
350
- assert_select 'form input[type=checkbox][value=1][disabled=disabled]'
351
- assert_select 'form input[type=checkbox][value=3][disabled=disabled]'
352
- assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]'
350
+ assert_select 'form input[type=checkbox][value="1"][disabled=disabled]'
351
+ assert_select 'form input[type=checkbox][value="3"][disabled=disabled]'
352
+ assert_no_select 'form input[type=checkbox][value="2"][disabled=disabled]'
353
353
  end
354
354
 
355
355
  test "collection check box accepts single disable item" do
356
356
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
357
357
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, disabled: 1
358
358
 
359
- assert_select 'form input[type=checkbox][value=1][disabled=disabled]'
360
- assert_no_select 'form input[type=checkbox][value=3][disabled=disabled]'
361
- assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]'
359
+ assert_select 'form input[type=checkbox][value="1"][disabled=disabled]'
360
+ assert_no_select 'form input[type=checkbox][value="3"][disabled=disabled]'
361
+ assert_no_select 'form input[type=checkbox][value="2"][disabled=disabled]'
362
362
  end
363
363
 
364
364
  test "collection check box accepts a proc to disabled items" do
365
365
  collection = (1..3).map { |i| [i, "Tag #{i}"] }
366
366
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, disabled: proc { |i| i.first == 1 }
367
367
 
368
- assert_select 'form input[type=checkbox][value=1][disabled=disabled]'
369
- assert_no_select 'form input[type=checkbox][value=3][disabled=disabled]'
370
- assert_no_select 'form input[type=checkbox][value=2][disabled=disabled]'
368
+ assert_select 'form input[type=checkbox][value="1"][disabled=disabled]'
369
+ assert_no_select 'form input[type=checkbox][value="3"][disabled=disabled]'
370
+ assert_no_select 'form input[type=checkbox][value="2"][disabled=disabled]'
371
371
  end
372
372
 
373
373
  test "collection check box accepts html options" do
374
374
  collection = [[1, 'Tag 1'], [2, 'Tag 2']]
375
375
  with_collection_check_boxes @user, :tag_ids, collection, :first, :last, {}, class: 'check'
376
376
 
377
- assert_select 'form input.check[type=checkbox][value=1]'
378
- assert_select 'form input.check[type=checkbox][value=2]'
377
+ assert_select 'form input.check[type=checkbox][value="1"]'
378
+ assert_select 'form input.check[type=checkbox][value="2"]'
379
379
  end
380
380
 
381
381
  test "collection check box with fields for" do
@@ -386,8 +386,8 @@ class BuilderTest < ActionView::TestCase
386
386
  end
387
387
  end
388
388
 
389
- assert_select 'form input#user_post_tag_ids_1[type=checkbox][value=1]'
390
- assert_select 'form input#user_post_tag_ids_2[type=checkbox][value=2]'
389
+ assert_select 'form input#user_post_tag_ids_1[type=checkbox][value="1"]'
390
+ assert_select 'form input#user_post_tag_ids_2[type=checkbox][value="2"]'
391
391
 
392
392
  assert_select 'form label.collection_check_boxes[for=user_post_tag_ids_1]', 'Tag 1'
393
393
  assert_select 'form label.collection_check_boxes[for=user_post_tag_ids_2]', 'Tag 2'
@@ -13,6 +13,25 @@ class FormHelperTest < ActionView::TestCase
13
13
  assert_select 'form.simple_form'
14
14
  end
15
15
 
16
+ test 'SimpleForm allows overriding default form class' do
17
+ swap SimpleForm, default_form_class: "my_custom_class" do
18
+ with_concat_form_for :user, html: { class: "override_class" }
19
+ assert_no_select 'form.my_custom_class'
20
+ assert_select 'form.override_class'
21
+ end
22
+ end
23
+
24
+ # Remove this test when SimpleForm.form_class is removed in 4.x
25
+ test 'SimpleForm allows overriding default form class, but not form class' do
26
+ ActiveSupport::Deprecation.silence do
27
+ swap SimpleForm, form_class: "fixed_class", default_form_class: "my_custom_class" do
28
+ with_concat_form_for :user, html: { class: "override_class" }
29
+ assert_no_select 'form.my_custom_class'
30
+ assert_select 'form.fixed_class.override_class'
31
+ end
32
+ end
33
+ end
34
+
16
35
  test 'SimpleForm uses default browser validations by default' do
17
36
  with_concat_form_for(:user)
18
37
  assert_no_select 'form[novalidate]'
@@ -87,7 +106,7 @@ class FormHelperTest < ActionView::TestCase
87
106
  test 'passes options to SimpleForm' do
88
107
  with_concat_form_for(:user, url: '/account', html: { id: 'my_form' })
89
108
  assert_select 'form#my_form'
90
- assert_select 'form[action=/account]'
109
+ assert_select 'form[action="/account"]'
91
110
  end
92
111
 
93
112
  test 'form_for yields an instance of FormBuilder' do
@@ -244,7 +244,7 @@ class IsolatedLabelTest < ActionView::TestCase
244
244
  test 'label uses i18n to find required text' do
245
245
  store_translations(:en, simple_form: { required: { text: 'campo requerido' } }) do
246
246
  with_label_for @user, :name, :string
247
- assert_select 'form label abbr[title=campo requerido]', '*'
247
+ assert_select 'form label abbr[title="campo requerido"]', '*'
248
248
  end
249
249
  end
250
250
 
@@ -46,9 +46,9 @@ class AssociationTest < ActionView::TestCase
46
46
 
47
47
  with_association_for @user, :tags
48
48
  assert_select 'form select.select#user_tag_ids'
49
- assert_select 'form select option[value=1]', 'Tag 1'
50
- assert_select 'form select option[value=2]', 'Tag 2'
51
- assert_select 'form select option[value=3]', 'Tag 3'
49
+ assert_select 'form select option[value="1"]', 'Tag 1'
50
+ assert_select 'form select option[value="2"]', 'Tag 2'
51
+ assert_select 'form select option[value="3"]', 'Tag 3'
52
52
 
53
53
  value.verify
54
54
  end
@@ -59,9 +59,9 @@ class AssociationTest < ActionView::TestCase
59
59
 
60
60
  with_association_for @user, :tags, preload: false
61
61
  assert_select 'form select.select#user_tag_ids'
62
- assert_select 'form select option[value=1]', 'Tag 1'
63
- assert_select 'form select option[value=2]', 'Tag 2'
64
- assert_select 'form select option[value=3]', 'Tag 3'
62
+ assert_select 'form select option[value="1"]', 'Tag 1'
63
+ assert_select 'form select option[value="2"]', 'Tag 2'
64
+ assert_select 'form select option[value="3"]', 'Tag 3'
65
65
 
66
66
  assert_raises MockExpectationError do
67
67
  value.verify
@@ -74,9 +74,9 @@ class AssociationTest < ActionView::TestCase
74
74
 
75
75
  with_association_for @user, :company
76
76
  assert_select 'form select.select#user_company_id'
77
- assert_select 'form select option[value=1]', 'Company 1'
78
- assert_select 'form select option[value=2]', 'Company 2'
79
- assert_select 'form select option[value=3]', 'Company 3'
77
+ assert_select 'form select option[value="1"]', 'Company 1'
78
+ assert_select 'form select option[value="2"]', 'Company 2'
79
+ assert_select 'form select option[value="3"]', 'Company 3'
80
80
 
81
81
  assert_raises MockExpectationError do
82
82
  value.verify
@@ -87,15 +87,15 @@ class AssociationTest < ActionView::TestCase
87
87
  test 'builder creates a select for belongs_to associations' do
88
88
  with_association_for @user, :company
89
89
  assert_select 'form select.select#user_company_id'
90
- assert_select 'form select option[value=1]', 'Company 1'
91
- assert_select 'form select option[value=2]', 'Company 2'
92
- assert_select 'form select option[value=3]', 'Company 3'
90
+ assert_select 'form select option[value="1"]', 'Company 1'
91
+ assert_select 'form select option[value="2"]', 'Company 2'
92
+ assert_select 'form select option[value="3"]', 'Company 3'
93
93
  end
94
94
 
95
95
  test 'builder creates blank select if collection is nil' do
96
96
  with_association_for @user, :company, collection: nil
97
97
  assert_select 'form select.select#user_company_id'
98
- assert_no_select 'form select option[value=1]', 'Company 1'
98
+ assert_no_select 'form select option[value="1"]', 'Company 1'
99
99
  end
100
100
 
101
101
  test 'builder allows collection radio for belongs_to associations' do
@@ -108,17 +108,17 @@ class AssociationTest < ActionView::TestCase
108
108
  test 'builder allows collection to have a proc as a condition' do
109
109
  with_association_for @user, :extra_special_company
110
110
  assert_select 'form select.select#user_extra_special_company_id'
111
- assert_select 'form select option[value=1]'
112
- assert_no_select 'form select option[value=2]'
113
- assert_no_select 'form select option[value=3]'
111
+ assert_select 'form select option[value="1"]'
112
+ assert_no_select 'form select option[value="2"]'
113
+ assert_no_select 'form select option[value="3"]'
114
114
  end
115
115
 
116
116
  test 'builder allows collection to have a scope' do
117
117
  with_association_for @user, :special_pictures
118
118
  assert_select 'form select.select#user_special_picture_ids'
119
- assert_select 'form select option[value=3]', '3'
120
- assert_no_select 'form select option[value=1]'
121
- assert_no_select 'form select option[value=2]'
119
+ assert_select 'form select option[value="3"]', '3'
120
+ assert_no_select 'form select option[value="1"]'
121
+ assert_no_select 'form select option[value="2"]'
122
122
  end
123
123
 
124
124
  test 'builder marks the record which already belongs to the user' do
@@ -133,17 +133,17 @@ class AssociationTest < ActionView::TestCase
133
133
  test 'builder uses reflection conditions to find collection' do
134
134
  with_association_for @user, :special_company
135
135
  assert_select 'form select.select#user_special_company_id'
136
- assert_select 'form select option[value=1]'
137
- assert_no_select 'form select option[value=2]'
138
- assert_no_select 'form select option[value=3]'
136
+ assert_select 'form select option[value="1"]'
137
+ assert_no_select 'form select option[value="2"]'
138
+ assert_no_select 'form select option[value="3"]'
139
139
  end
140
140
 
141
141
  test 'builder allows overriding collection to association input' do
142
142
  with_association_for @user, :company, include_blank: false,
143
143
  collection: [Company.new(999, 'Teste')]
144
144
  assert_select 'form select.select#user_company_id'
145
- assert_no_select 'form select option[value=1]'
146
- assert_select 'form select option[value=999]', 'Teste'
145
+ assert_no_select 'form select option[value="1"]'
146
+ assert_select 'form select option[value="999"]', 'Teste'
147
147
  assert_select 'form select option', count: 1
148
148
  end
149
149
 
@@ -158,31 +158,31 @@ class AssociationTest < ActionView::TestCase
158
158
  with_association_for @user, :pictures
159
159
  assert_select 'form select.select#user_picture_ids'
160
160
  assert_select 'form select[multiple=multiple]'
161
- assert_select 'form select option[value=1]', 'Picture 1'
162
- assert_select 'form select option[value=2]', 'Picture 2'
163
- assert_select 'form select option[value=3]', 'Picture 3'
161
+ assert_select 'form select option[value="1"]', 'Picture 1'
162
+ assert_select 'form select option[value="2"]', 'Picture 2'
163
+ assert_select 'form select option[value="3"]', 'Picture 3'
164
164
  end
165
165
 
166
166
  test 'builder creates a select with multiple options for collection associations' do
167
167
  with_association_for @user, :tags
168
168
  assert_select 'form select.select#user_tag_ids'
169
169
  assert_select 'form select[multiple=multiple]'
170
- assert_select 'form select option[value=1]', 'Tag 1'
171
- assert_select 'form select option[value=2]', 'Tag 2'
172
- assert_select 'form select option[value=3]', 'Tag 3'
170
+ assert_select 'form select option[value="1"]', 'Tag 1'
171
+ assert_select 'form select option[value="2"]', 'Tag 2'
172
+ assert_select 'form select option[value="3"]', 'Tag 3'
173
173
  end
174
174
 
175
175
  test 'builder allows size to be overwritten for collection associations' do
176
176
  with_association_for @user, :tags, input_html: { size: 10 }
177
- assert_select 'form select[multiple=multiple][size=10]'
177
+ assert_select 'form select[multiple=multiple][size="10"]'
178
178
  end
179
179
 
180
180
  test 'builder marks all selected records which already belongs to user' do
181
181
  @user.tag_ids = [1, 2]
182
182
  with_association_for @user, :tags
183
- assert_select 'form select option[value=1][selected=selected]'
184
- assert_select 'form select option[value=2][selected=selected]'
185
- assert_no_select 'form select option[value=3][selected=selected]'
183
+ assert_select 'form select option[value="1"][selected=selected]'
184
+ assert_select 'form select option[value="2"][selected=selected]'
185
+ assert_no_select 'form select option[value="3"][selected=selected]'
186
186
  end
187
187
 
188
188
  test 'builder allows a collection of check boxes for collection associations' do
@@ -196,9 +196,9 @@ class AssociationTest < ActionView::TestCase
196
196
  test 'builder marks all selected records for collection boxes' do
197
197
  @user.tag_ids = [1, 2]
198
198
  with_association_for @user, :tags, as: :check_boxes
199
- assert_select 'form input[type=checkbox][value=1][checked=checked]'
200
- assert_select 'form input[type=checkbox][value=2][checked=checked]'
201
- assert_no_select 'form input[type=checkbox][value=3][checked=checked]'
199
+ assert_select 'form input[type=checkbox][value="1"][checked=checked]'
200
+ assert_select 'form input[type=checkbox][value="2"][checked=checked]'
201
+ assert_no_select 'form input[type=checkbox][value="3"][checked=checked]'
202
202
  end
203
203
 
204
204
  test 'builder with collection support giving collection and item wrapper tags' do
@@ -10,31 +10,31 @@ class ButtonTest < ActionView::TestCase
10
10
 
11
11
  test 'builder creates buttons' do
12
12
  with_button_for :post, :submit
13
- assert_select 'form input.button[type=submit][value=Save Post]'
13
+ assert_select 'form input.button[type=submit][value="Save Post"]'
14
14
  end
15
15
 
16
16
  test 'builder creates buttons with options' do
17
17
  with_button_for :post, :submit, class: 'my_button'
18
- assert_select 'form input.button.my_button[type=submit][value=Save Post]'
18
+ assert_select 'form input.button.my_button[type=submit][value="Save Post"]'
19
19
  end
20
20
 
21
21
  test 'builder does not modify the options hash' do
22
22
  options = { class: 'my_button' }
23
23
  with_button_for :post, :submit, options
24
- assert_select 'form input.button.my_button[type=submit][value=Save Post]'
24
+ assert_select 'form input.button.my_button[type=submit][value="Save Post"]'
25
25
  assert_equal({ class: 'my_button' }, options)
26
26
  end
27
27
 
28
28
  test 'builder creates buttons for records' do
29
29
  @user.new_record!
30
30
  with_button_for @user, :submit
31
- assert_select 'form input.button[type=submit][value=Create User]'
31
+ assert_select 'form input.button[type=submit][value="Create User"]'
32
32
  end
33
33
 
34
34
  test "builder uses the default class from the configuration" do
35
35
  swap SimpleForm, button_class: 'btn' do
36
36
  with_button_for :post, :submit
37
- assert_select 'form input.btn[type=submit][value=Save Post]'
37
+ assert_select 'form input.btn[type=submit][value="Save Post"]'
38
38
  end
39
39
  end
40
40
 
@@ -32,7 +32,7 @@ class ErrorTest < ActionView::TestCase
32
32
 
33
33
  test 'error generates messages for attribute with single error' do
34
34
  with_error_for @user, :name
35
- assert_select 'span.error', "can't be blank"
35
+ assert_select 'span.error', "cannot be blank"
36
36
  end
37
37
 
38
38
  test 'error generates messages for attribute with one error when using first' do
@@ -82,12 +82,22 @@ class ErrorTest < ActionView::TestCase
82
82
 
83
83
  test 'error escapes error prefix text' do
84
84
  with_error_for @user, :name, error_prefix: '<b>Name</b>'
85
- assert_select 'span.error', "&lt;b&gt;Name&lt;/b&gt; can't be blank"
85
+ assert_no_select 'span.error b'
86
86
  end
87
87
 
88
+ test 'error escapes error text' do
89
+ @user.errors.add(:action, 'must not contain <b>markup</b>')
90
+
91
+ with_error_for @user, :action
92
+
93
+ assert_select 'span.error'
94
+ assert_no_select 'span.error b', 'markup'
95
+ end
96
+
97
+
88
98
  test 'error generates an error message with raw HTML tags' do
89
99
  with_error_for @user, :name, error_prefix: '<b>Name</b>'.html_safe
90
- assert_select 'span.error', "Name can't be blank"
100
+ assert_select 'span.error', "Name cannot be blank"
91
101
  assert_select 'span.error b', "Name"
92
102
  end
93
103
 
@@ -95,7 +105,7 @@ class ErrorTest < ActionView::TestCase
95
105
 
96
106
  test 'full error generates a full error tag for the attribute' do
97
107
  with_full_error_for @user, :name
98
- assert_select 'span.error', "Super User Name! can't be blank"
108
+ assert_select 'span.error', "Super User Name! cannot be blank"
99
109
  end
100
110
 
101
111
  test 'full error generates a full error tag with a clean HTML' do
@@ -105,43 +115,60 @@ class ErrorTest < ActionView::TestCase
105
115
 
106
116
  test 'full error allows passing options to full error tag' do
107
117
  with_full_error_for @user, :name, id: 'name_error', error_prefix: "Your name"
108
- assert_select 'span.error#name_error', "Your name can't be blank"
118
+ assert_select 'span.error#name_error', "Your name cannot be blank"
109
119
  end
110
120
 
111
121
  test 'full error does not modify the options hash' do
112
122
  options = { id: 'name_error' }
113
123
  with_full_error_for @user, :name, options
114
- assert_select 'span.error#name_error', "Super User Name! can't be blank"
124
+ assert_select 'span.error#name_error', "Super User Name! cannot be blank"
115
125
  assert_equal({ id: 'name_error' }, options)
116
126
  end
117
127
 
128
+ test 'full error escapes error text' do
129
+ @user.errors.add(:action, 'must not contain <b>markup</b>')
130
+
131
+ with_full_error_for @user, :action
132
+
133
+ assert_select 'span.error'
134
+ assert_no_select 'span.error b', 'markup'
135
+ end
136
+
118
137
  # CUSTOM WRAPPERS
119
138
 
120
139
  test 'error with custom wrappers works' do
121
140
  swap_wrapper do
122
141
  with_error_for @user, :name
123
- assert_select 'span.omg_error', "can't be blank"
142
+ assert_select 'span.omg_error', "cannot be blank"
124
143
  end
125
144
  end
126
145
 
127
146
  # FULL_ERROR_WRAPPER
128
147
 
129
148
  test 'full error finds errors on association' do
130
- swap_wrapper :default, self.custom_wrapper_with_full_error do
149
+ swap_wrapper :default, custom_wrapper_with_full_error do
131
150
  with_form_for @user, :company_id, as: :select
132
151
  assert_select 'span.error', 'Company must be valid'
133
152
  end
134
153
  end
135
154
 
155
+ test 'full error finds errors on association with reflection' do
156
+ swap_wrapper :default, custom_wrapper_with_full_error do
157
+ with_form_for @user, :company_id, as: :select,
158
+ reflection: Association.new(Company, :company, {})
159
+ assert_select 'span.error', 'Company must be valid'
160
+ end
161
+ end
162
+
136
163
  test 'full error can be disabled' do
137
- swap_wrapper :default, self.custom_wrapper_with_full_error do
164
+ swap_wrapper :default, custom_wrapper_with_full_error do
138
165
  with_form_for @user, :company_id, as: :select, full_error: false
139
166
  assert_no_select 'span.error'
140
167
  end
141
168
  end
142
169
 
143
170
  test 'full error can be disabled setting error to false' do
144
- swap_wrapper :default, self.custom_wrapper_with_full_error do
171
+ swap_wrapper :default, custom_wrapper_with_full_error do
145
172
  with_form_for @user, :company_id, as: :select, error: false
146
173
  assert_no_select 'span.error'
147
174
  end
@@ -150,7 +177,7 @@ class ErrorTest < ActionView::TestCase
150
177
  # CUSTOM ERRORS
151
178
 
152
179
  test 'input with custom error works' do
153
- error_text = "Super User Name! can't be blank"
180
+ error_text = "Super User Name! cannot be blank"
154
181
  with_form_for @user, :name, error: error_text
155
182
 
156
183
  assert_select 'span.error', error_text
@@ -159,26 +186,58 @@ class ErrorTest < ActionView::TestCase
159
186
  test 'input with error option as true does not use custom error' do
160
187
  with_form_for @user, :name, error: true
161
188
 
162
- assert_select 'span.error', "can't be blank"
189
+ assert_select 'span.error', "cannot be blank"
163
190
  end
164
191
 
165
192
  test 'input with custom error does not generate the error if there is no error on the attribute' do
166
- with_form_for @user, :active, error: "Super User Active! can't be blank"
193
+ with_form_for @user, :active, error: "Super User Active! cannot be blank"
167
194
 
168
195
  assert_no_select 'span.error'
169
196
  end
170
197
 
171
198
  test 'input with custom error works when using full_error component' do
172
- swap_wrapper :default, self.custom_wrapper_with_full_error do
173
- error_text = "Super User Name! can't be blank"
199
+ swap_wrapper :default, custom_wrapper_with_full_error do
200
+ error_text = "Super User Name! cannot be blank"
174
201
  with_form_for @user, :name, error: error_text
175
202
 
176
203
  assert_select 'span.error', error_text
177
204
  end
178
205
  end
179
206
 
207
+ test 'input with custom error escapes the error text' do
208
+ with_form_for @user, :name, error: 'error must not contain <b>markup</b>'
209
+
210
+ assert_select 'span.error'
211
+ assert_no_select 'span.error b', 'markup'
212
+ end
213
+
214
+ test 'input with custom error does not escape the error text if it is safe' do
215
+ with_form_for @user, :name, error: 'error must contain <b>markup</b>'.html_safe
216
+
217
+ assert_select 'span.error'
218
+ assert_select 'span.error b', 'markup'
219
+ end
220
+
221
+ test 'input with custom error escapes the error text using full_error component' do
222
+ swap_wrapper :default, custom_wrapper_with_full_error do
223
+ with_form_for @user, :name, error: 'error must not contain <b>markup</b>'
224
+
225
+ assert_select 'span.error'
226
+ assert_no_select 'span.error b', 'markup'
227
+ end
228
+ end
229
+
230
+ test 'input with custom error does not escape the error text if it is safe using full_error component' do
231
+ swap_wrapper :default, custom_wrapper_with_full_error do
232
+ with_form_for @user, :name, error: 'error must contain <b>markup</b>'.html_safe
233
+
234
+ assert_select 'span.error'
235
+ assert_select 'span.error b', 'markup'
236
+ end
237
+ end
238
+
180
239
  test 'input with custom error when using full_error component does not generate the error if there is no error on the attribute' do
181
- swap_wrapper :default, self.custom_wrapper_with_full_error do
240
+ swap_wrapper :default, custom_wrapper_with_full_error do
182
241
  with_form_for @user, :active, error: "Super User Active! can't be blank"
183
242
 
184
243
  assert_no_select 'span.error'