Skip to content

Commit df38405

Browse files
committed
Test for custom ID
1 parent 67ed7cf commit df38405

File tree

5 files changed

+292
-0
lines changed

5 files changed

+292
-0
lines changed

test/bootstrap_checkbox_test.rb

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,35 @@ class BootstrapCheckboxTest < ActionView::TestCase
562562
assert_equivalent_html expected, actual
563563
end
564564

565+
test "collection_check_boxes renders error after last check box with specified id:" do
566+
collection = [Address.new(id: 1, street: "Foo"), Address.new(id: 2, street: "Bar")]
567+
@user.errors.add(:misc, "a box must be checked")
568+
569+
expected = <<~HTML
570+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
571+
<input #{autocomplete_attr_55336} id="user_misc" name="user[misc][]" type="hidden" value="" />
572+
<div class="mb-3">
573+
<label class="form-label" for="user_misc">Misc</label>
574+
<div class="form-check">
575+
<input class="form-check-input is-invalid" id="user_misc_1" aria-labelledby="user_misc_feedback" name="user[misc][]" type="checkbox" value="1" />
576+
<label class="form-check-label" for="user_misc_1">Foo</label>
577+
</div>
578+
<div class="form-check">
579+
<input class="form-check-input is-invalid" id="user_misc_2" aria-labelledby="user_misc_feedback" name="user[misc][]" type="checkbox" value="2" />
580+
<label class="form-check-label" for="user_misc_2">Bar</label>
581+
<div class="invalid-feedback" id="user_misc_feedback">a box must be checked</div>
582+
</div>
583+
</div>
584+
</form>
585+
HTML
586+
587+
actual = bootstrap_form_for(@user) do |f|
588+
f.collection_check_boxes(:misc, collection, :id, :street, { id: "custom-id" })
589+
end
590+
591+
assert_equivalent_html expected, actual
592+
end
593+
565594
test "collection_check_boxes renders data attributes" do
566595
collection = [
567596
["1", "Foo", { "data-city": "east" }],
@@ -611,6 +640,33 @@ class BootstrapCheckboxTest < ActionView::TestCase
611640
assert_equivalent_html expected, actual
612641
end
613642

643+
test "collection_check_boxes renders multiple check boxes with error correctly with specified id:" do
644+
@user.errors.add(:misc, "error for test")
645+
collection = [Address.new(id: 1, street: "Foo"), Address.new(id: 2, street: "Bar")]
646+
expected = <<~HTML
647+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
648+
<input #{autocomplete_attr_55336} id="user_misc" name="user[misc][]" type="hidden" value="" />
649+
<div class="mb-3">
650+
<label class="form-label" for="user_misc">Misc</label>
651+
<div class="form-check">
652+
<input checked="checked" class="form-check-input is-invalid" id="user_misc_1" aria-labelledby="user_misc_feedback" name="user[misc][]" type="checkbox" value="1" />
653+
<label class="form-check-label" for="user_misc_1"> Foo</label>
654+
</div>
655+
<div class="form-check">
656+
<input checked="checked" class="form-check-input is-invalid" id="user_misc_2" aria-labelledby="user_misc_feedback" name="user[misc][]" type="checkbox" value="2" />
657+
<label class="form-check-label" for="user_misc_2"> Bar</label>
658+
<div class="invalid-feedback" id="user_misc_feedback">error for test</div>
659+
</div>
660+
</div>
661+
</form>
662+
HTML
663+
664+
actual = bootstrap_form_for(@user) do |f|
665+
f.collection_check_boxes(:misc, collection, :id, :street, checked: collection, id: "custom-id")
666+
end
667+
assert_equivalent_html expected, actual
668+
end
669+
614670
test "check_box renders error when asked" do
615671
@user.errors.add(:terms, "You must accept the terms.")
616672
expected = <<~HTML
@@ -631,6 +687,26 @@ class BootstrapCheckboxTest < ActionView::TestCase
631687
assert_equivalent_html expected, actual
632688
end
633689

690+
test "check_box renders error when asked with specified id:" do
691+
@user.errors.add(:terms, "You must accept the terms.")
692+
expected = <<~HTML
693+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
694+
<div class="form-check mb-3">
695+
<input #{autocomplete_attr} name="user[terms]" type="hidden" value="0" />
696+
<input class="form-check-input is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="user[terms]" type="checkbox" value="1" />
697+
<label class="form-check-label" for="custom-id">
698+
I agree to the terms
699+
</label>
700+
<div class="invalid-feedback" id="custom-id_feedback">You must accept the terms.</div>
701+
</div>
702+
</form>
703+
HTML
704+
actual = bootstrap_form_for(@user) do |f|
705+
f.check_box(:terms, label: "I agree to the terms", error_message: true, id: "custom-id")
706+
end
707+
assert_equivalent_html expected, actual
708+
end
709+
634710
test "check box with custom wrapper class" do
635711
expected = <<~HTML
636712
<div class="form-check mb-3 custom-class">

test/bootstrap_fields_test.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,20 @@ class BootstrapFieldsTest < ActionView::TestCase
101101
assert_equivalent_html expected, bootstrap_form_for(@user) { |f| f.file_field(:misc) }
102102
end
103103

104+
test "file fields are wrapped correctly with error with specified id:" do
105+
@user.errors.add(:misc, "error for test")
106+
expected = <<~HTML
107+
<form accept-charset="UTF-8" action="/users" class="new_user" enctype="multipart/form-data" id="new_user" method="post">
108+
<div class="mb-3">
109+
<label class="form-label" for="custom-id">Misc</label>
110+
<input class="form-control is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="user[misc]" type="file"/>
111+
<div class="invalid-feedback" id="custom-id_feedback">error for test</div>
112+
</div>
113+
</form>
114+
HTML
115+
assert_equivalent_html expected, bootstrap_form_for(@user) { |f| f.file_field(:misc, id: "custom-id") }
116+
end
117+
104118
test "errors are correctly displayed for belongs_to association fields" do
105119
@address.valid?
106120

@@ -116,6 +130,21 @@ class BootstrapFieldsTest < ActionView::TestCase
116130
assert_equivalent_html expected, bootstrap_form_for(@address, url: users_path) { |f| f.text_field(:user_id) }
117131
end
118132

133+
test "errors are correctly displayed for belongs_to association fields with specified id:" do
134+
@address.valid?
135+
136+
expected = <<~HTML
137+
<form accept-charset="UTF-8" action="/users" class="new_address" id="new_address" method="post">
138+
<div class="mb-3">
139+
<label class="form-label required" for="custom-id">User</label>
140+
<input class="form-control is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="address[user_id]" required="required" type="text"/>
141+
<div class="invalid-feedback" id="custom-id_feedback">must exist</div>
142+
</div>
143+
</form>
144+
HTML
145+
assert_equivalent_html expected, bootstrap_form_for(@address, url: users_path) { |f| f.text_field(:user_id, id: "custom-id") }
146+
end
147+
119148
test "hidden fields are supported" do
120149
expected = <<~HTML
121150
<input #{autocomplete_attr_55336} id="user_misc" name="user[misc]" type="hidden" />

test/bootstrap_form_test.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,21 @@ def warn(message, ...)
459459
assert_equivalent_html expected, bootstrap_form_for(@user, label_errors: true) { |f| f.text_field :email }
460460
end
461461

462+
test "errors display correctly and inline_errors are turned off by default when label_errors is true with specified id:" do
463+
@user.email = nil
464+
assert @user.invalid?
465+
466+
expected = <<~HTML
467+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
468+
<div class="mb-3">
469+
<label class="form-label required text-danger" for="custom-id" id="custom-id_feedback">Email can't be blank, is too short (minimum is 5 characters)</label>
470+
<input required="required" class="form-control is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="user[email]" type="text" />
471+
</div>
472+
</form>
473+
HTML
474+
assert_equivalent_html expected, bootstrap_form_for(@user, label_errors: true) { |f| f.text_field :email, id: "custom-id" }
475+
end
476+
462477
test "errors display correctly and inline_errors can also be on when label_errors is true" do
463478
@user.email = nil
464479
assert @user.invalid?
@@ -475,6 +490,24 @@ def warn(message, ...)
475490
assert_equivalent_html expected, bootstrap_form_for(@user, label_errors: true, inline_errors: true) { |f| f.text_field :email }
476491
end
477492

493+
test "errors display correctly and inline_errors can also be on when label_errors is true with specified id:" do
494+
@user.email = nil
495+
assert @user.invalid?
496+
497+
expected = <<~HTML
498+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
499+
<div class="mb-3">
500+
<label class="form-label required text-danger" for="custom-id" id="custom-id_feedback">Email can't be blank, is too short (minimum is 5 characters)</label>
501+
<input required="required" class="form-control is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="user[email]" type="text" />
502+
<div class="invalid-feedback" id="custom-id_feedback">can't be blank, is too short (minimum is 5 characters)</span>
503+
</div>
504+
</form>
505+
HTML
506+
assert_equivalent_html expected, bootstrap_form_for(@user, label_errors: true, inline_errors: true) { |f|
507+
f.text_field :email, id: "custom-id"
508+
}
509+
end
510+
478511
test "label error messages use humanized attribute names" do
479512
I18n.backend.store_translations(:en, activerecord: { attributes: { user: { email: "Your e-mail address" } } })
480513

@@ -495,6 +528,28 @@ def warn(message, ...)
495528
I18n.backend.store_translations(:en, activerecord: { attributes: { user: { email: nil } } })
496529
end
497530

531+
test "label error messages use humanized attribute names with specified id:" do
532+
I18n.backend.store_translations(:en, activerecord: { attributes: { user: { email: "Your e-mail address" } } })
533+
534+
@user.email = nil
535+
assert @user.invalid?
536+
537+
expected = <<~HTML
538+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
539+
<div class="mb-3">
540+
<label class="form-label required text-danger" for="custom-id"id="custom-id_feedback">Your e-mail address can't be blank, is too short (minimum is 5 characters)</label>
541+
<input required="required" class="form-control is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="user[email]" type="text" />
542+
<div class="invalid-feedback" id="custom-id_feedback">can't be blank, is too short (minimum is 5 characters)</div>
543+
</div>
544+
</form>
545+
HTML
546+
assert_equivalent_html expected, bootstrap_form_for(@user, label_errors: true, inline_errors: true) { |f|
547+
f.text_field :email, id: "custom-id"
548+
}
549+
ensure
550+
I18n.backend.store_translations(:en, activerecord: { attributes: { user: { email: nil } } })
551+
end
552+
498553
test "alert message is wrapped correctly" do
499554
@user.email = nil
500555
assert @user.invalid?

test/bootstrap_radio_button_test.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,25 @@ class BootstrapRadioButtonTest < ActionView::TestCase
4949
assert_equivalent_html expected, actual
5050
end
5151

52+
test "radio_button with error is wrapped correctly with specified id:" do
53+
@user.errors.add(:misc, "error for test")
54+
expected = <<~HTML
55+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
56+
<div class="form-check">
57+
<input class="form-check-input is-invalid" id="custom-id" aria-labelledby="custom-id_feedback" name="user[misc]" type="radio" value="1" />
58+
<label class="form-check-label" for="custom-id">
59+
This is a radio button
60+
</label>
61+
<div class="invalid-feedback" id="custom-id_feedback">error for test</div>
62+
</div>
63+
</form>
64+
HTML
65+
actual = bootstrap_form_for(@user) do |f|
66+
f.radio_button(:misc, "1", label: "This is a radio button", error_message: true, id: "custom-id")
67+
end
68+
assert_equivalent_html expected, actual
69+
end
70+
5271
test "radio_button disabled label is set correctly" do
5372
expected = <<~HTML
5473
<div class="form-check disabled">
@@ -205,6 +224,32 @@ class BootstrapRadioButtonTest < ActionView::TestCase
205224
assert_equivalent_html expected, actual
206225
end
207226

227+
test "collection_radio_buttons renders multiple radios with error correctly with specified id:" do
228+
@user.errors.add(:misc, "error for test")
229+
collection = [Address.new(id: 1, street: "Foo"), Address.new(id: 2, street: "Bar")]
230+
expected = <<~HTML
231+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
232+
<div class="mb-3">
233+
<label class="form-label" for="user_misc">Misc</label>
234+
<div class="form-check">
235+
<input class="form-check-input is-invalid" id="user_misc_1" aria-labelledby="user_misc_feedback" name="user[misc]" type="radio" value="1" />
236+
<label class="form-check-label" for="user_misc_1"> Foo</label>
237+
</div>
238+
<div class="form-check">
239+
<input class="form-check-input is-invalid" id="user_misc_2" aria-labelledby="user_misc_feedback" name="user[misc]" type="radio" value="2" />
240+
<label class="form-check-label" for="user_misc_2"> Bar</label>
241+
<div class="invalid-feedback" id="user_misc_feedback">error for test</div>
242+
</div>
243+
</div>
244+
</form>
245+
HTML
246+
247+
actual = bootstrap_form_for(@user) do |f|
248+
f.collection_radio_buttons(:misc, collection, :id, :street, { id: "custom-id" })
249+
end
250+
assert_equivalent_html expected, actual
251+
end
252+
208253
test "collection_radio_buttons renders inline radios correctly" do
209254
collection = [Address.new(id: 1, street: "Foo"), Address.new(id: 2, street: "Bar")]
210255
expected = <<~HTML

test/bootstrap_selects_test.rb

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,32 @@ def options_range(start: 1, stop: 31, selected: nil, months: false)
435435
end
436436
end
437437

438+
test "date selects are wrapped correctly with error with specified id:" do
439+
@user.errors.add(:misc, "error for test")
440+
travel_to(Time.utc(2012, 2, 3)) do
441+
expected = <<~HTML
442+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
443+
<div class="mb-3">
444+
<label class="form-label" for="user_misc">Misc</label>
445+
<div class="rails-bootstrap-forms-date-select">
446+
<select class="form-select is-invalid" id="user_misc_1i" aria-labelledby="user_misc_feedback" name="user[misc(1i)]">
447+
#{options_range(start: 2007, stop: 2017, selected: 2012)}
448+
</select>
449+
<select class="form-select is-invalid" id="user_misc_2i" aria-labelledby="user_misc_feedback" name="user[misc(2i)]">
450+
#{options_range(start: 1, stop: 12, selected: 2, months: true)}
451+
</select>
452+
<select class="form-select is-invalid" id="user_misc_3i" aria-labelledby="user_misc_feedback" name="user[misc(3i)]">
453+
#{options_range(start: 1, stop: 31, selected: 3)}
454+
</select>
455+
<div class="invalid-feedback" id="user_misc_feedback">error for test</div>
456+
</div>
457+
</div>
458+
</form>
459+
HTML
460+
assert_equivalent_html expected, bootstrap_form_for(@user) { |f| f.date_select(:misc, id: "custom-id") }
461+
end
462+
end
463+
438464
test "date selects with options are wrapped correctly" do
439465
travel_to(Time.utc(2012, 2, 3)) do
440466
expected = <<~HTML
@@ -536,6 +562,33 @@ def options_range(start: 1, stop: 31, selected: nil, months: false)
536562
end
537563
end
538564

565+
test "time selects are wrapped correctly with error with specified id:" do
566+
@user.errors.add(:misc, "error for test")
567+
travel_to(Time.utc(2012, 2, 3, 12, 0, 0)) do
568+
expected = <<~HTML
569+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
570+
<div class="mb-3">
571+
<label class="form-label" for="user_misc">Misc</label>
572+
<div class="rails-bootstrap-forms-time-select">
573+
<input #{autocomplete_attr_time_selects} id="user_misc_1i" name="user[misc(1i)]" type="hidden" value="2012" />
574+
<input #{autocomplete_attr_time_selects} id="user_misc_2i" name="user[misc(2i)]" type="hidden" value="2" />
575+
<input #{autocomplete_attr_time_selects} id="user_misc_3i" name="user[misc(3i)]" type="hidden" value="3" />
576+
<select class="form-select is-invalid" id="user_misc_4i" aria-labelledby="user_misc_feedback" name="user[misc(4i)]">
577+
#{options_range(start: '00', stop: '23', selected: '12')}
578+
</select>
579+
:
580+
<select class="form-select is-invalid" id="user_misc_5i" aria-labelledby="user_misc_feedback" name="user[misc(5i)]">
581+
#{options_range(start: '00', stop: '59', selected: '00')}
582+
</select>
583+
<div class="invalid-feedback" id="user_misc_feedback">error for test</div>
584+
</div>
585+
</div>
586+
</form>
587+
HTML
588+
assert_equivalent_html expected, bootstrap_form_for(@user) { |f| f.time_select(:misc, id: "custom-id") }
589+
end
590+
end
591+
539592
test "time selects with options are wrapped correctly" do
540593
travel_to(Time.utc(2012, 2, 3, 12, 0, 0)) do
541594
expected = <<~HTML
@@ -650,6 +703,40 @@ def options_range(start: 1, stop: 31, selected: nil, months: false)
650703
end
651704
end
652705

706+
test "datetime selects are wrapped correctly with error with specified id:" do
707+
@user.errors.add(:misc, "error for test")
708+
travel_to(Time.utc(2012, 2, 3, 12, 0, 0)) do
709+
expected = <<~HTML
710+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
711+
<div class="mb-3">
712+
<label class="form-label" for="user_misc">Misc</label>
713+
<div class="rails-bootstrap-forms-datetime-select">
714+
<select class="form-select is-invalid" id="user_misc_1i" aria-labelledby="user_misc_feedback" name="user[misc(1i)]">
715+
#{options_range(start: 2007, stop: 2017, selected: 2012)}
716+
</select>
717+
<select class="form-select is-invalid" id="user_misc_2i" aria-labelledby="user_misc_feedback" name="user[misc(2i)]">
718+
#{options_range(start: 1, stop: 12, selected: 2, months: true)}
719+
</select>
720+
<select class="form-select is-invalid" id="user_misc_3i" aria-labelledby="user_misc_feedback" name="user[misc(3i)]">
721+
#{options_range(start: 1, stop: 31, selected: 3)}
722+
</select>
723+
&mdash;
724+
<select class="form-select is-invalid" id="user_misc_4i" aria-labelledby="user_misc_feedback" name="user[misc(4i)]">
725+
#{options_range(start: '00', stop: '23', selected: '12')}
726+
</select>
727+
:
728+
<select class="form-select is-invalid" id="user_misc_5i" aria-labelledby="user_misc_feedback" name="user[misc(5i)]">
729+
#{options_range(start: '00', stop: '59', selected: '00')}
730+
</select>
731+
<div class="invalid-feedback" id="user_misc_feedback">error for test</div>
732+
</div>
733+
</div>
734+
</form>
735+
HTML
736+
assert_equivalent_html expected, bootstrap_form_for(@user) { |f| f.datetime_select(:misc, id: "custom-id") }
737+
end
738+
end
739+
653740
test "datetime selects with options are wrapped correctly" do
654741
travel_to(Time.utc(2012, 2, 3, 12, 0, 0)) do
655742
expected = <<~HTML

0 commit comments

Comments
 (0)