Skip to content

Commit 7c4b2cd

Browse files
authored
Add specs for multiple file input (#988)
Ref: #987, rails/rails#55619
1 parent 1c75735 commit 7c4b2cd

File tree

5 files changed

+63
-28
lines changed

5 files changed

+63
-28
lines changed

test/action_view/cases/helper.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ def autocomplete_attribute
8181
end
8282
end
8383

84-
def hidden_input_for_select(name)
85-
%(<input name="#{name}" type="hidden" value="" #{autocomplete_attribute} />)
84+
def hidden_input(name, value = '')
85+
%(<input name="#{name}" type="hidden" value="#{value}" #{autocomplete_attribute} />)
8686
end
8787

8888
def hidden_input_for_checkbox(name)
89-
%(<input name="#{name}" type="hidden" value="0" #{autocomplete_attribute} />)
89+
hidden_input(name, '0')
9090
end
9191

9292
def setup
@@ -140,9 +140,9 @@ def setup
140140
def snowman(method = nil)
141141
txt = +''
142142

143-
txt << %(<input name="utf8" type="hidden" value="&#x2713;" />) if default_enforce_utf8
143+
txt << hidden_input('utf8', '&#x2713;') if default_enforce_utf8
144144

145-
txt << %(<input type="hidden" name="_method" value="#{method}" #{autocomplete_attribute} />) if method
145+
txt << hidden_input('_method', method) if method
146146

147147
txt
148148
end
@@ -152,7 +152,7 @@ def form_field(tag, id: nil, name: nil, type: nil, value: nil, multiple: false,
152152

153153
txt << %( name="#{custom_name}") if custom_name
154154
txt << %( type="#{type}") if type
155-
txt << %( #{autocomplete_attribute}) if %w[hidden].include?(type)
155+
txt << %( #{autocomplete_attribute}) if %w[hidden].include?(type) && autocomplete_attribute.present?
156156
txt << %( value="#{value}") if value
157157
txt << %( multiple="multiple") if multiple
158158
txt << %( name="#{name}") if name

test/action_view/cases/test_form_for_helpers.rb

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_http_method
5050

5151
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
5252
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
53-
form_field('input', name: '_method', type: 'hidden', value: 'patch') +
53+
hidden_input('_method', 'patch') +
5454
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'text')
5555
end
5656

@@ -105,7 +105,7 @@ def test_check_box
105105

106106
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
107107
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
108-
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
108+
hidden_input_for_checkbox('post[cost]') +
109109
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
110110
end
111111

@@ -120,7 +120,7 @@ def test_checkbox
120120

121121
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
122122
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
123-
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
123+
hidden_input_for_checkbox('post[cost]') +
124124
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
125125
end
126126

@@ -135,7 +135,7 @@ def test_check_box_ensure_no_validate_attribute
135135

136136
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
137137
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
138-
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
138+
hidden_input_for_checkbox('post[cost]') +
139139
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
140140
end
141141

@@ -349,7 +349,8 @@ def test_select_multiple
349349

350350
validators = { 'post[cost][]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
351351
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
352-
%(#{hidden_input_for_select('post[cost][]')}#{form_field('select', id: 'post_cost', name: 'post[cost][]', multiple: true)})
352+
hidden_input('post[cost][]') +
353+
form_field('select', id: 'post_cost', name: 'post[cost][]', multiple: true)
353354
end
354355

355356
assert_dom_equal expected, output_buffer
@@ -400,7 +401,7 @@ def test_collection_check_boxes_with_many_association
400401
}
401402

402403
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
403-
form_field('input', name: 'post[tag_ids][]', type: 'hidden', value: '')
404+
hidden_input('post[tag_ids][]')
404405
end
405406

406407
assert_dom_equal expected, output_buffer
@@ -450,7 +451,7 @@ def test_collection_check_boxes
450451

451452
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
452453
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
453-
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
454+
hidden_input('post[cost][]')
454455
end
455456

456457
assert_dom_equal expected, output_buffer
@@ -464,7 +465,7 @@ def test_collection_checkboxes
464465

465466
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
466467
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
467-
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
468+
hidden_input('post[cost][]')
468469
end
469470

470471
assert_dom_equal expected, output_buffer
@@ -477,7 +478,7 @@ def test_collection_check_boxes_with_validate_options
477478
end
478479

479480
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: {}) do
480-
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
481+
hidden_input('post[cost][]')
481482
end
482483

483484
assert_dom_equal expected, output_buffer
@@ -490,7 +491,7 @@ def test_collection_radio_buttons
490491

491492
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
492493
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: validators) do
493-
form_field('input', name: 'post[cost]', type: 'hidden', value: '')
494+
hidden_input('post[cost]')
494495
end
495496

496497
assert_dom_equal expected, output_buffer
@@ -502,7 +503,7 @@ def test_collection_radio_buttons_with_validate_options
502503
end
503504

504505
expected = whole_form_for('/posts', 'new_post', 'new_post', validators: {}) do
505-
form_field('input', name: 'post[cost]', type: 'hidden', value: '')
506+
hidden_input('post[cost]')
506507
end
507508

508509
assert_dom_equal expected, output_buffer

test/action_view/cases/test_form_with_helpers.rb

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,30 @@ def test_form_with_file_field
131131
assert_dom_equal expected, output_buffer
132132
end
133133

134+
if Rails.version >= '7.0'
135+
def test_form_with_file_multiple_include_hidden
136+
form_with(model: @post, validate: true) do |f|
137+
concat f.file_field(:cost, multiple: true, include_hidden: true)
138+
end
139+
140+
validators = { 'post[cost][]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
141+
expected = whole_form_with('/posts', validators: validators, file: true) do
142+
hidden_input('post[cost][]') +
143+
form_field('input', id: 'post_cost', name: 'post[cost][]', type: 'file', multiple: 'multiple')
144+
end
145+
146+
assert_dom_equal expected, output_buffer
147+
end
148+
end
149+
134150
def test_form_with_check_box
135151
form_with(model: @post, validate: true) do |f|
136152
concat f.check_box(:cost)
137153
end
138154

139155
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
140156
expected = whole_form_with('/posts', validators: validators) do
141-
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
157+
hidden_input_for_checkbox('post[cost]') +
142158
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
143159
end
144160

@@ -153,7 +169,7 @@ def test_form_with_checkbox
153169

154170
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
155171
expected = whole_form_with('/posts', validators: validators) do
156-
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
172+
hidden_input_for_checkbox('post[cost]') +
157173
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
158174
end
159175

@@ -168,7 +184,7 @@ def test_form_with_check_box_ensure_no_validate_attribute
168184

169185
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
170186
expected = whole_form_with('/posts', validators: validators) do
171-
form_field('input', name: 'post[cost]', type: 'hidden', value: '0') +
187+
hidden_input_for_checkbox('post[cost]') +
172188
form_field('input', id: 'post_cost', name: 'post[cost]', type: 'checkbox', value: '1')
173189
end
174190

@@ -397,7 +413,8 @@ def test_form_with_select_multiple
397413

398414
validators = { 'post[cost][]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
399415
expected = whole_form_with('/posts', validators: validators) do
400-
%(#{hidden_input_for_select('post[cost][]')}#{form_field('select', id: 'post_cost', name: 'post[cost][]', multiple: true)})
416+
hidden_input('post[cost][]') +
417+
form_field('select', id: 'post_cost', name: 'post[cost][]', multiple: true)
401418
end
402419

403420
assert_dom_equal expected, output_buffer
@@ -473,7 +490,7 @@ def test_form_with_collection_check_boxes
473490

474491
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
475492
expected = whole_form_with('/posts', validators: validators) do
476-
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
493+
hidden_input('post[cost][]')
477494
end
478495

479496
assert_dom_equal expected, output_buffer
@@ -487,7 +504,7 @@ def test_form_with_collection_checkboxes
487504

488505
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
489506
expected = whole_form_with('/posts', validators: validators) do
490-
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
507+
hidden_input('post[cost][]')
491508
end
492509

493510
assert_dom_equal expected, output_buffer
@@ -500,7 +517,7 @@ def test_form_with_collection_check_boxes_with_validate_options
500517
end
501518

502519
expected = whole_form_with('/posts', validators: {}) do
503-
form_field('input', name: 'post[cost][]', type: 'hidden', value: '')
520+
hidden_input('post[cost][]')
504521
end
505522

506523
assert_dom_equal expected, output_buffer
@@ -513,7 +530,7 @@ def test_form_with_collection_radio_buttons
513530

514531
validators = { 'post[cost]' => { presence: [{ message: I18n.t('errors.messages.blank') }] } }
515532
expected = whole_form_with('/posts', validators: validators) do
516-
form_field('input', name: 'post[cost]', type: 'hidden', value: '')
533+
hidden_input('post[cost]')
517534
end
518535

519536
assert_dom_equal expected, output_buffer
@@ -525,7 +542,7 @@ def test_form_with_collection_radio_buttons_with_validate_options
525542
end
526543

527544
expected = whole_form_with('/posts', validators: {}) do
528-
form_field('input', name: 'post[cost]', type: 'hidden', value: '')
545+
hidden_input('post[cost]')
529546
end
530547

531548
assert_dom_equal expected, output_buffer

test/action_view/cases/test_legacy_form_for_helpers.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ def test_select_multiple
126126
end
127127

128128
expected = whole_form_for('/posts', 'new_post', 'new_post') do
129-
%(#{hidden_input_for_select('post[cost][]')}#{form_field('select', id: 'post_cost', name: 'post[cost][]', multiple: true)})
129+
hidden_input('post[cost][]') +
130+
form_field('select', id: 'post_cost', name: 'post[cost][]', multiple: true)
130131
end
131132

132133
assert_dom_equal expected, output_buffer

test/action_view/cases/test_legacy_form_with_helpers.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,21 @@ def test_form_with_file_field
5959
assert_dom_equal expected, output_buffer
6060
end
6161

62+
if Rails.version >= '7.0'
63+
def test_form_with_file_multiple_include_hidden
64+
form_with(model: @post) do |f|
65+
concat f.file_field(:cost, multiple: true, include_hidden: true)
66+
end
67+
68+
expected = whole_form_with('/posts', file: true) do
69+
hidden_input('post[cost][]') +
70+
form_field('input', id: 'post_cost', name: 'post[cost][]', type: 'file', multiple: 'multiple')
71+
end
72+
73+
assert_dom_equal expected, output_buffer
74+
end
75+
end
76+
6277
def test_form_with_check_box
6378
form_with(model: @post) do |f|
6479
concat f.check_box(:cost)
@@ -137,7 +152,8 @@ def test_form_with_select_multiple
137152
end
138153

139154
expected = whole_form_with('/posts') do
140-
%(#{hidden_input_for_select('post[cost][]')}#{form_field('select', name: 'post[cost][]', id: 'post_cost', multiple: true)})
155+
hidden_input('post[cost][]') +
156+
form_field('select', name: 'post[cost][]', id: 'post_cost', multiple: true)
141157
end
142158

143159
assert_dom_equal expected, output_buffer

0 commit comments

Comments
 (0)