simple_form 3.1.0.rc2 → 3.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +42 -1
- data/MIT-LICENSE +1 -1
- data/README.md +76 -24
- data/lib/generators/simple_form/install_generator.rb +2 -2
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +4 -4
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +22 -2
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +85 -4
- data/lib/simple_form/action_view_extensions/builder.rb +1 -0
- data/lib/simple_form/action_view_extensions/form_helper.rb +5 -1
- data/lib/simple_form/components/errors.rb +3 -5
- data/lib/simple_form/components/html5.rb +4 -4
- data/lib/simple_form/components/labels.rb +1 -1
- data/lib/simple_form/form_builder.rb +9 -7
- data/lib/simple_form/inputs/boolean_input.rb +1 -1
- data/lib/simple_form/inputs/collection_input.rb +2 -4
- data/lib/simple_form/inputs/collection_radio_buttons_input.rb +1 -1
- data/lib/simple_form/inputs/date_time_input.rb +12 -8
- data/lib/simple_form/tags.rb +2 -4
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form.rb +13 -2
- data/test/action_view_extensions/builder_test.rb +31 -31
- data/test/action_view_extensions/form_helper_test.rb +20 -1
- data/test/components/label_test.rb +1 -1
- data/test/form_builder/association_test.rb +37 -37
- data/test/form_builder/button_test.rb +5 -5
- data/test/form_builder/error_test.rb +75 -16
- data/test/form_builder/general_test.rb +42 -11
- data/test/form_builder/hint_test.rb +3 -3
- data/test/form_builder/input_field_test.rb +59 -53
- data/test/form_builder/label_test.rb +13 -3
- data/test/form_builder/wrapper_test.rb +29 -14
- data/test/generators/simple_form_generator_test.rb +2 -2
- data/test/inputs/boolean_input_test.rb +9 -1
- data/test/inputs/collection_check_boxes_input_test.rb +22 -0
- data/test/inputs/collection_radio_buttons_input_test.rb +25 -3
- data/test/inputs/collection_select_input_test.rb +17 -17
- data/test/inputs/datetime_input_test.rb +6 -1
- data/test/inputs/grouped_collection_select_input_test.rb +8 -8
- data/test/inputs/numeric_input_test.rb +19 -19
- data/test/inputs/priority_input_test.rb +6 -6
- data/test/inputs/required_test.rb +12 -0
- data/test/inputs/string_input_test.rb +10 -10
- data/test/inputs/text_input_test.rb +10 -3
- data/test/support/misc_helpers.rb +14 -1
- data/test/support/models.rb +11 -1
- data/test/test_helper.rb +9 -1
- metadata +5 -5
|
@@ -14,16 +14,20 @@ module SimpleForm
|
|
|
14
14
|
private
|
|
15
15
|
|
|
16
16
|
def label_target
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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?
|
data/lib/simple_form/tags.rb
CHANGED
|
@@ -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 =
|
|
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
|
data/lib/simple_form/version.rb
CHANGED
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
|
|
100
|
-
|
|
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
|
|
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', "
|
|
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
|
-
|
|
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
|
|
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!
|
|
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
|
|
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!
|
|
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', "
|
|
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,
|
|
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,
|
|
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,
|
|
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!
|
|
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', "
|
|
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!
|
|
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,
|
|
173
|
-
error_text = "Super User Name!
|
|
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,
|
|
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'
|