simple_form 3.0.4 → 5.0.3
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 +5 -5
- data/CHANGELOG.md +199 -33
- data/MIT-LICENSE +2 -1
- data/README.md +453 -128
- data/lib/generators/simple_form/install_generator.rb +4 -3
- data/lib/generators/simple_form/templates/README +3 -5
- data/lib/generators/simple_form/templates/_form.html.erb +2 -0
- data/lib/generators/simple_form/templates/_form.html.haml +2 -0
- data/lib/generators/simple_form/templates/_form.html.slim +1 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +47 -16
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +418 -23
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +101 -5
- data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +7 -2
- data/lib/simple_form/action_view_extensions/builder.rb +2 -0
- data/lib/simple_form/action_view_extensions/form_helper.rb +10 -3
- data/lib/simple_form/components/errors.rb +39 -6
- data/lib/simple_form/components/hints.rb +3 -2
- data/lib/simple_form/components/html5.rb +16 -5
- data/lib/simple_form/components/label_input.rb +21 -2
- data/lib/simple_form/components/labels.rb +22 -11
- data/lib/simple_form/components/maxlength.rb +9 -5
- data/lib/simple_form/components/min_max.rb +2 -1
- data/lib/simple_form/components/minlength.rb +38 -0
- data/lib/simple_form/components/pattern.rb +2 -1
- data/lib/simple_form/components/placeholders.rb +4 -3
- data/lib/simple_form/components/readonly.rb +2 -1
- data/lib/simple_form/components.rb +2 -0
- data/lib/simple_form/error_notification.rb +1 -0
- data/lib/simple_form/form_builder.rb +220 -89
- data/lib/simple_form/helpers/autofocus.rb +1 -0
- data/lib/simple_form/helpers/disabled.rb +1 -0
- data/lib/simple_form/helpers/readonly.rb +1 -0
- data/lib/simple_form/helpers/required.rb +1 -0
- data/lib/simple_form/helpers/validators.rb +2 -1
- data/lib/simple_form/helpers.rb +6 -5
- data/lib/simple_form/i18n_cache.rb +1 -0
- data/lib/simple_form/inputs/base.rb +62 -16
- data/lib/simple_form/inputs/block_input.rb +2 -1
- data/lib/simple_form/inputs/boolean_input.rb +40 -16
- data/lib/simple_form/inputs/collection_check_boxes_input.rb +3 -2
- data/lib/simple_form/inputs/collection_input.rb +37 -14
- data/lib/simple_form/inputs/collection_radio_buttons_input.rb +9 -13
- data/lib/simple_form/inputs/collection_select_input.rb +5 -2
- data/lib/simple_form/inputs/color_input.rb +14 -0
- data/lib/simple_form/inputs/date_time_input.rb +24 -9
- data/lib/simple_form/inputs/file_input.rb +5 -2
- data/lib/simple_form/inputs/grouped_collection_select_input.rb +16 -3
- data/lib/simple_form/inputs/hidden_input.rb +5 -2
- data/lib/simple_form/inputs/numeric_input.rb +6 -4
- data/lib/simple_form/inputs/password_input.rb +6 -3
- data/lib/simple_form/inputs/priority_input.rb +5 -6
- data/lib/simple_form/inputs/range_input.rb +2 -1
- data/lib/simple_form/inputs/rich_text_area_input.rb +12 -0
- data/lib/simple_form/inputs/string_input.rb +7 -4
- data/lib/simple_form/inputs/text_input.rb +6 -3
- data/lib/simple_form/inputs.rb +3 -0
- data/lib/simple_form/map_type.rb +1 -0
- data/lib/simple_form/railtie.rb +8 -0
- data/lib/simple_form/tags.rb +13 -2
- data/lib/simple_form/version.rb +2 -1
- data/lib/simple_form/wrappers/builder.rb +7 -6
- data/lib/simple_form/wrappers/leaf.rb +29 -0
- data/lib/simple_form/wrappers/many.rb +7 -6
- data/lib/simple_form/wrappers/root.rb +10 -3
- data/lib/simple_form/wrappers/single.rb +7 -4
- data/lib/simple_form/wrappers.rb +2 -0
- data/lib/simple_form.rb +137 -21
- data/test/action_view_extensions/builder_test.rb +64 -45
- data/test/action_view_extensions/form_helper_test.rb +36 -16
- data/test/components/custom_components_test.rb +62 -0
- data/test/components/label_test.rb +70 -41
- data/test/form_builder/association_test.rb +85 -37
- data/test/form_builder/button_test.rb +11 -10
- data/test/form_builder/error_notification_test.rb +2 -1
- data/test/form_builder/error_test.rb +146 -33
- data/test/form_builder/general_test.rb +183 -81
- data/test/form_builder/hint_test.rb +24 -18
- data/test/form_builder/input_field_test.rb +105 -75
- data/test/form_builder/label_test.rb +68 -13
- data/test/form_builder/wrapper_test.rb +197 -22
- data/test/generators/simple_form_generator_test.rb +8 -7
- data/test/inputs/boolean_input_test.rb +97 -6
- data/test/inputs/collection_check_boxes_input_test.rb +117 -25
- data/test/inputs/collection_radio_buttons_input_test.rb +176 -54
- data/test/inputs/collection_select_input_test.rb +189 -77
- data/test/inputs/color_input_test.rb +10 -0
- data/test/inputs/datetime_input_test.rb +121 -50
- data/test/inputs/disabled_test.rb +29 -15
- data/test/inputs/discovery_test.rb +79 -6
- data/test/inputs/file_input_test.rb +3 -2
- data/test/inputs/general_test.rb +23 -22
- data/test/inputs/grouped_collection_select_input_test.rb +54 -17
- data/test/inputs/hidden_input_test.rb +5 -4
- data/test/inputs/numeric_input_test.rb +48 -44
- data/test/inputs/priority_input_test.rb +17 -16
- data/test/inputs/readonly_test.rb +20 -19
- data/test/inputs/required_test.rb +58 -13
- data/test/inputs/rich_text_area_input_test.rb +15 -0
- data/test/inputs/string_input_test.rb +58 -36
- data/test/inputs/text_input_test.rb +20 -7
- data/test/simple_form_test.rb +9 -0
- data/test/support/discovery_inputs.rb +40 -2
- data/test/support/misc_helpers.rb +113 -5
- data/test/support/mock_controller.rb +7 -1
- data/test/support/models.rb +162 -39
- data/test/test_helper.rb +19 -4
- metadata +51 -43
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# encoding: UTF-8
|
2
3
|
require 'test_helper'
|
3
4
|
|
@@ -8,7 +9,7 @@ class FormBuilderTest < ActionView::TestCase
|
|
8
9
|
end
|
9
10
|
end
|
10
11
|
|
11
|
-
test 'nested simple fields
|
12
|
+
test 'nested simple fields yields an instance of FormBuilder' do
|
12
13
|
simple_form_for :user do |f|
|
13
14
|
f.simple_fields_for :posts do |posts_form|
|
14
15
|
assert posts_form.instance_of?(SimpleForm::FormBuilder)
|
@@ -22,7 +23,7 @@ class FormBuilderTest < ActionView::TestCase
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
test 'builder
|
26
|
+
test 'builder works without controller' do
|
26
27
|
stub_any_instance ActionView::TestCase, :controller, nil do
|
27
28
|
simple_form_for @user do |f|
|
28
29
|
assert f.input(:name)
|
@@ -30,7 +31,13 @@ class FormBuilderTest < ActionView::TestCase
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
test 'builder
|
34
|
+
test 'builder works with decorated object responsive to #to_model' do
|
35
|
+
assert_nothing_raised do
|
36
|
+
with_form_for @decorated_user, :name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
test 'builder input allows a block to configure input' do
|
34
41
|
with_form_for @user, :name do
|
35
42
|
text_field_tag :foo, :bar, id: :cool
|
36
43
|
end
|
@@ -38,7 +45,7 @@ class FormBuilderTest < ActionView::TestCase
|
|
38
45
|
assert_select 'input#cool'
|
39
46
|
end
|
40
47
|
|
41
|
-
test 'builder
|
48
|
+
test 'builder allows adding custom input mappings for default input types' do
|
42
49
|
swap SimpleForm, input_mappings: { /count$/ => :integer } do
|
43
50
|
with_form_for @user, :post_count
|
44
51
|
assert_no_select 'form input#user_post_count.string'
|
@@ -46,15 +53,26 @@ class FormBuilderTest < ActionView::TestCase
|
|
46
53
|
end
|
47
54
|
end
|
48
55
|
|
49
|
-
test 'builder
|
50
|
-
swap SimpleForm,
|
56
|
+
test 'builder does not override custom input mappings for custom collection' do
|
57
|
+
swap SimpleForm, input_mappings: { /gender$/ => :check_boxes } do
|
58
|
+
with_concat_form_for @user do |f|
|
59
|
+
f.input :gender, collection: %i[male female]
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_no_select 'select option', 'Male'
|
63
|
+
assert_select 'input[type=checkbox][value=male]'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
test 'builder allows to skip input_type class' do
|
68
|
+
swap SimpleForm, generate_additional_classes_for: %i[label wrapper] do
|
51
69
|
with_form_for @user, :post_count
|
52
70
|
assert_no_select "form input#user_post_count.integer"
|
53
71
|
assert_select "form input#user_post_count"
|
54
72
|
end
|
55
73
|
end
|
56
74
|
|
57
|
-
test 'builder
|
75
|
+
test 'builder allows to add additional classes only for wrapper' do
|
58
76
|
swap SimpleForm, generate_additional_classes_for: [:wrapper] do
|
59
77
|
with_form_for @user, :post_count
|
60
78
|
assert_no_select "form input#user_post_count.string"
|
@@ -63,7 +81,7 @@ class FormBuilderTest < ActionView::TestCase
|
|
63
81
|
end
|
64
82
|
end
|
65
83
|
|
66
|
-
test 'builder
|
84
|
+
test 'builder allows adding custom input mappings for integer input types' do
|
67
85
|
swap SimpleForm, input_mappings: { /lock_version/ => :hidden } do
|
68
86
|
with_form_for @user, :lock_version
|
69
87
|
assert_no_select 'form input#user_lock_version.integer'
|
@@ -101,187 +119,271 @@ class FormBuilderTest < ActionView::TestCase
|
|
101
119
|
end
|
102
120
|
|
103
121
|
# INPUT TYPES
|
104
|
-
test 'builder
|
122
|
+
test 'builder generates text fields for string columns' do
|
105
123
|
with_form_for @user, :name
|
106
124
|
assert_select 'form input#user_name.string'
|
107
125
|
end
|
108
126
|
|
109
|
-
test 'builder
|
127
|
+
test 'builder generates text areas for text columns' do
|
110
128
|
with_form_for @user, :description
|
129
|
+
assert_no_select 'form input#user_description.string'
|
130
|
+
assert_select 'form textarea#user_description.text'
|
131
|
+
end
|
132
|
+
|
133
|
+
test 'builder generates text areas for text columns when hinted' do
|
134
|
+
with_form_for @user, :description, as: :text
|
135
|
+
assert_no_select 'form input#user_description.string'
|
111
136
|
assert_select 'form textarea#user_description.text'
|
112
137
|
end
|
113
138
|
|
114
|
-
test 'builder
|
139
|
+
test 'builder generates text field for text columns when hinted' do
|
140
|
+
with_form_for @user, :description, as: :string
|
141
|
+
assert_no_select 'form textarea#user_description.text'
|
142
|
+
assert_select 'form input#user_description.string'
|
143
|
+
end
|
144
|
+
|
145
|
+
test 'builder generates text areas for hstore columns' do
|
146
|
+
with_form_for @user, :hstore
|
147
|
+
assert_no_select 'form input#user_hstore.string'
|
148
|
+
assert_select 'form textarea#user_hstore.text'
|
149
|
+
end
|
150
|
+
|
151
|
+
test 'builder generates text areas for json columns' do
|
152
|
+
with_form_for @user, :json
|
153
|
+
assert_no_select 'form input#user_json.string'
|
154
|
+
assert_select 'form textarea#user_json.text'
|
155
|
+
end
|
156
|
+
|
157
|
+
test 'builder generates text areas for jsonb columns' do
|
158
|
+
with_form_for @user, :jsonb
|
159
|
+
assert_no_select 'form input#user_jsonb.string'
|
160
|
+
assert_select 'form textarea#user_jsonb.text'
|
161
|
+
end
|
162
|
+
|
163
|
+
test 'builder generates a checkbox for boolean columns' do
|
115
164
|
with_form_for @user, :active
|
116
165
|
assert_select 'form input[type=checkbox]#user_active.boolean'
|
117
166
|
end
|
118
167
|
|
119
|
-
test 'builder
|
168
|
+
test 'builder uses integer text field for integer columns' do
|
120
169
|
with_form_for @user, :age
|
121
170
|
assert_select 'form input#user_age.numeric.integer'
|
122
171
|
end
|
123
172
|
|
124
|
-
test 'builder
|
173
|
+
test 'builder generates decimal text field for decimal columns' do
|
125
174
|
with_form_for @user, :credit_limit
|
126
175
|
assert_select 'form input#user_credit_limit.numeric.decimal'
|
127
176
|
end
|
128
177
|
|
129
|
-
test 'builder
|
178
|
+
test 'builder generates uuid fields for uuid columns' do
|
179
|
+
with_form_for @user, :uuid
|
180
|
+
if defined? ActiveModel::Type
|
181
|
+
assert_select 'form input#user_uuid.string.string'
|
182
|
+
else
|
183
|
+
assert_select 'form input#user_uuid.string.uuid'
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
test 'builder generates string fields for citext columns' do
|
188
|
+
with_form_for @user, :citext
|
189
|
+
assert_select 'form input#user_citext.string'
|
190
|
+
end
|
191
|
+
|
192
|
+
test 'builder generates password fields for columns that matches password' do
|
130
193
|
with_form_for @user, :password
|
131
194
|
assert_select 'form input#user_password.password'
|
132
195
|
end
|
133
196
|
|
134
|
-
test 'builder
|
197
|
+
test 'builder generates country fields for columns that matches country' do
|
135
198
|
with_form_for @user, :residence_country
|
136
199
|
assert_select 'form select#user_residence_country.country'
|
137
200
|
end
|
138
201
|
|
139
|
-
test 'builder
|
202
|
+
test 'builder generates time_zone fields for columns that matches time_zone' do
|
140
203
|
with_form_for @user, :time_zone
|
141
204
|
assert_select 'form select#user_time_zone.time_zone'
|
142
205
|
end
|
143
206
|
|
144
|
-
test 'builder
|
207
|
+
test 'builder generates email fields for columns that matches email' do
|
145
208
|
with_form_for @user, :email
|
146
209
|
assert_select 'form input#user_email.string.email'
|
147
210
|
end
|
148
211
|
|
149
|
-
test 'builder
|
212
|
+
test 'builder generates tel fields for columns that matches phone' do
|
150
213
|
with_form_for @user, :phone_number
|
151
214
|
assert_select 'form input#user_phone_number.string.tel'
|
152
215
|
end
|
153
216
|
|
154
|
-
test 'builder
|
217
|
+
test 'builder generates url fields for columns that matches url' do
|
155
218
|
with_form_for @user, :url
|
156
219
|
assert_select 'form input#user_url.string.url'
|
157
220
|
end
|
158
221
|
|
159
|
-
test 'builder
|
222
|
+
test 'builder generates date select for date columns' do
|
160
223
|
with_form_for @user, :born_at
|
161
224
|
assert_select 'form select#user_born_at_1i.date'
|
162
225
|
end
|
163
226
|
|
164
|
-
test 'builder
|
227
|
+
test 'builder generates time select for time columns' do
|
165
228
|
with_form_for @user, :delivery_time
|
166
229
|
assert_select 'form select#user_delivery_time_4i.time'
|
167
230
|
end
|
168
231
|
|
169
|
-
test 'builder
|
232
|
+
test 'builder generates datetime select for datetime columns' do
|
170
233
|
with_form_for @user, :created_at
|
171
234
|
assert_select 'form select#user_created_at_1i.datetime'
|
172
235
|
end
|
173
236
|
|
174
|
-
test 'builder
|
237
|
+
test 'builder generates datetime select for timestamp columns' do
|
175
238
|
with_form_for @user, :updated_at
|
176
239
|
assert_select 'form select#user_updated_at_1i.datetime'
|
177
240
|
end
|
178
241
|
|
179
|
-
test 'builder
|
180
|
-
|
181
|
-
|
242
|
+
test 'builder generates file input for ActiveStorage >= 5.2 and Refile >= 0.2.0 <= 0.4.0' do
|
243
|
+
with_form_for UserWithAttachment.build, :avatar
|
244
|
+
assert_select 'form input#user_with_attachment_avatar.file'
|
245
|
+
end
|
246
|
+
|
247
|
+
test 'builder generates file input for ActiveStorage::Attached::Many' do
|
248
|
+
with_form_for UserWithAttachment.build, :avatars
|
249
|
+
assert_select 'form input#user_with_attachment_avatars.file'
|
250
|
+
end
|
182
251
|
|
183
|
-
|
184
|
-
|
252
|
+
test 'builder generates file input for Refile >= 0.3.0 and CarrierWave >= 0.2.2' do
|
253
|
+
with_form_for UserWithAttachment.build, :cover
|
254
|
+
assert_select 'form input#user_with_attachment_cover.file'
|
185
255
|
end
|
186
256
|
|
187
|
-
test 'builder
|
188
|
-
|
189
|
-
|
257
|
+
test 'builder generates file input for Refile >= 0.4.0 and Shrine >= 0.9.0' do
|
258
|
+
with_form_for UserWithAttachment.build, :profile_image
|
259
|
+
assert_select 'form input#user_with_attachment_profile_image.file'
|
260
|
+
end
|
190
261
|
|
191
|
-
|
192
|
-
|
262
|
+
test 'builder generates file input for Paperclip ~> 2.0' do
|
263
|
+
with_form_for UserWithAttachment.build, :portrait
|
264
|
+
assert_select 'form input#user_with_attachment_portrait.file'
|
193
265
|
end
|
194
266
|
|
195
|
-
test 'build
|
267
|
+
test 'build generates select if a collection is given' do
|
196
268
|
with_form_for @user, :age, collection: 1..60
|
197
269
|
assert_select 'form select#user_age.select'
|
198
270
|
end
|
199
271
|
|
200
|
-
test 'builder
|
272
|
+
test 'builder does not generate url fields for columns that contain only the letters url' do
|
273
|
+
with_form_for @user, :hourly
|
274
|
+
assert_no_select 'form input#user_url.string.url'
|
275
|
+
assert_select 'form input#user_hourly.string'
|
276
|
+
end
|
277
|
+
|
278
|
+
test 'builder allows overriding default input type for text' do
|
201
279
|
with_form_for @user, :name, as: :text
|
202
280
|
assert_no_select 'form input#user_name'
|
203
281
|
assert_select 'form textarea#user_name.text'
|
282
|
+
end
|
204
283
|
|
284
|
+
test 'builder allows overriding default input type for radio_buttons' do
|
205
285
|
with_form_for @user, :active, as: :radio_buttons
|
206
286
|
assert_no_select 'form input[type=checkbox]'
|
207
287
|
assert_select 'form input.radio_buttons[type=radio]', count: 2
|
288
|
+
end
|
208
289
|
|
290
|
+
test 'builder allows overriding default input type for string' do
|
209
291
|
with_form_for @user, :born_at, as: :string
|
210
292
|
assert_no_select 'form select'
|
211
293
|
assert_select 'form input#user_born_at.string'
|
212
294
|
end
|
213
295
|
|
214
296
|
# COMMON OPTIONS
|
215
|
-
test
|
216
|
-
|
297
|
+
# Remove this test when SimpleForm.form_class is removed in 4.x
|
298
|
+
test 'builder adds chosen form class' do
|
299
|
+
ActiveSupport::Deprecation.silence do
|
300
|
+
swap SimpleForm, form_class: :my_custom_class do
|
301
|
+
with_form_for @user, :name
|
302
|
+
assert_select 'form.my_custom_class'
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
# Remove this test when SimpleForm.form_class is removed in 4.x
|
308
|
+
test 'builder adds chosen form class and default form class' do
|
309
|
+
ActiveSupport::Deprecation.silence do
|
310
|
+
swap SimpleForm, form_class: "my_custom_class", default_form_class: "my_default_class" do
|
311
|
+
with_form_for @user, :name
|
312
|
+
assert_select 'form.my_custom_class.my_default_class'
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
test 'builder adds default form class' do
|
318
|
+
swap SimpleForm, default_form_class: "default_class" do
|
217
319
|
with_form_for @user, :name
|
218
|
-
assert_select 'form.
|
320
|
+
assert_select 'form.default_class'
|
219
321
|
end
|
220
322
|
end
|
221
323
|
|
222
|
-
test 'builder
|
324
|
+
test 'builder allows passing options to input' do
|
223
325
|
with_form_for @user, :name, input_html: { class: 'my_input', id: 'my_input' }
|
224
326
|
assert_select 'form input#my_input.my_input.string'
|
225
327
|
end
|
226
328
|
|
227
|
-
test 'builder
|
329
|
+
test 'builder does not propagate input options to wrapper' do
|
228
330
|
with_form_for @user, :name, input_html: { class: 'my_input', id: 'my_input' }
|
229
331
|
assert_no_select 'form div.input.my_input.string'
|
230
332
|
assert_select 'form input#my_input.my_input.string'
|
231
333
|
end
|
232
334
|
|
233
|
-
test 'builder
|
234
|
-
swap_wrapper :default,
|
335
|
+
test 'builder does not propagate input options to wrapper with custom wrapper' do
|
336
|
+
swap_wrapper :default, custom_wrapper_with_wrapped_input do
|
235
337
|
with_form_for @user, :name, input_html: { class: 'my_input' }
|
236
338
|
assert_no_select 'form div.input.my_input'
|
237
339
|
assert_select 'form input.my_input.string'
|
238
340
|
end
|
239
341
|
end
|
240
342
|
|
241
|
-
test 'builder
|
242
|
-
swap_wrapper :default,
|
343
|
+
test 'builder does not propagate label options to wrapper with custom wrapper' do
|
344
|
+
swap_wrapper :default, custom_wrapper_with_wrapped_label do
|
243
345
|
with_form_for @user, :name, label_html: { class: 'my_label' }
|
244
346
|
assert_no_select 'form div.label.my_label'
|
245
347
|
assert_select 'form label.my_label.string'
|
246
348
|
end
|
247
349
|
end
|
248
350
|
|
249
|
-
test 'builder
|
351
|
+
test 'builder generates an input with label' do
|
250
352
|
with_form_for @user, :name
|
251
353
|
assert_select 'form label.string[for=user_name]', /Name/
|
252
354
|
end
|
253
355
|
|
254
|
-
test 'builder
|
356
|
+
test 'builder is able to disable the label for an input' do
|
255
357
|
with_form_for @user, :name, label: false
|
256
358
|
assert_no_select 'form label'
|
257
359
|
end
|
258
360
|
|
259
|
-
test 'builder
|
361
|
+
test 'builder is able to disable the label for an input and return a html safe string' do
|
260
362
|
with_form_for @user, :name, label: false, wrapper: custom_wrapper_with_wrapped_label_input
|
261
363
|
assert_select 'form input#user_name'
|
262
364
|
end
|
263
365
|
|
264
|
-
test 'builder
|
366
|
+
test 'builder uses custom label' do
|
265
367
|
with_form_for @user, :name, label: 'Yay!'
|
266
368
|
assert_select 'form label', /Yay!/
|
267
369
|
end
|
268
370
|
|
269
|
-
test 'builder
|
371
|
+
test 'builder passes options to label' do
|
270
372
|
with_form_for @user, :name, label_html: { id: "cool" }
|
271
373
|
assert_select 'form label#cool', /Name/
|
272
374
|
end
|
273
375
|
|
274
|
-
test 'builder
|
376
|
+
test 'builder does not generate hints for an input' do
|
275
377
|
with_form_for @user, :name
|
276
378
|
assert_no_select 'span.hint'
|
277
379
|
end
|
278
380
|
|
279
|
-
test 'builder
|
381
|
+
test 'builder is able to add a hint for an input' do
|
280
382
|
with_form_for @user, :name, hint: 'test'
|
281
383
|
assert_select 'span.hint', 'test'
|
282
384
|
end
|
283
385
|
|
284
|
-
test 'builder
|
386
|
+
test 'builder is able to disable a hint even if it exists in i18n' do
|
285
387
|
store_translations(:en, simple_form: { hints: { name: 'Hint test' } }) do
|
286
388
|
stub_any_instance(SimpleForm::Inputs::Base, :hint, -> { raise 'Never' }) do
|
287
389
|
with_form_for @user, :name, hint: false
|
@@ -290,32 +392,32 @@ class FormBuilderTest < ActionView::TestCase
|
|
290
392
|
end
|
291
393
|
end
|
292
394
|
|
293
|
-
test 'builder
|
395
|
+
test 'builder passes options to hint' do
|
294
396
|
with_form_for @user, :name, hint: 'test', hint_html: { id: "cool" }
|
295
397
|
assert_select 'span.hint#cool', 'test'
|
296
398
|
end
|
297
399
|
|
298
|
-
test 'builder
|
400
|
+
test 'builder generates errors for attribute without errors' do
|
299
401
|
with_form_for @user, :credit_limit
|
300
402
|
assert_no_select 'span.errors'
|
301
403
|
end
|
302
404
|
|
303
|
-
test 'builder
|
405
|
+
test 'builder generates errors for attribute with errors' do
|
304
406
|
with_form_for @user, :name
|
305
|
-
assert_select 'span.error', "
|
407
|
+
assert_select 'span.error', "cannot be blank"
|
306
408
|
end
|
307
409
|
|
308
|
-
test 'builder
|
410
|
+
test 'builder is able to disable showing errors for an input' do
|
309
411
|
with_form_for @user, :name, error: false
|
310
412
|
assert_no_select 'span.error'
|
311
413
|
end
|
312
414
|
|
313
|
-
test 'builder
|
415
|
+
test 'builder passes options to errors' do
|
314
416
|
with_form_for @user, :name, error_html: { id: "cool" }
|
315
|
-
assert_select 'span.error#cool', "
|
417
|
+
assert_select 'span.error#cool', "cannot be blank"
|
316
418
|
end
|
317
419
|
|
318
|
-
test 'placeholder
|
420
|
+
test 'placeholder does not be generated when set to false' do
|
319
421
|
store_translations(:en, simple_form: { placeholders: { user: {
|
320
422
|
name: 'Name goes here'
|
321
423
|
} } }) do
|
@@ -325,31 +427,31 @@ class FormBuilderTest < ActionView::TestCase
|
|
325
427
|
end
|
326
428
|
|
327
429
|
# DEFAULT OPTIONS
|
328
|
-
[
|
329
|
-
test "builder
|
430
|
+
%i[input input_field].each do |method|
|
431
|
+
test "builder receives a default argument and pass it to the inputs when calling '#{method}'" do
|
330
432
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class' } } do |f|
|
331
|
-
f.
|
433
|
+
f.public_send(method, :name)
|
332
434
|
end
|
333
435
|
assert_select 'input.default_class'
|
334
436
|
end
|
335
437
|
|
336
|
-
test "builder
|
438
|
+
test "builder receives a default argument and pass it to the inputs without changing the defaults when calling '#{method}'" do
|
337
439
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class', id: 'default_id' } } do |f|
|
338
|
-
concat(f.
|
339
|
-
concat(f.
|
440
|
+
concat(f.public_send(method, :name))
|
441
|
+
concat(f.public_send(method, :credit_limit))
|
340
442
|
end
|
341
443
|
|
342
444
|
assert_select "input.string.default_class[name='user[name]']"
|
343
445
|
assert_no_select "input.string[name='user[credit_limit]']"
|
344
446
|
end
|
345
447
|
|
346
|
-
test "builder
|
448
|
+
test "builder receives a default argument and pass it to the inputs and nested form when calling '#{method}'" do
|
347
449
|
@user.company = Company.new(1, 'Empresa')
|
348
450
|
|
349
451
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class' } } do |f|
|
350
|
-
concat(f.
|
452
|
+
concat(f.public_send(method, :name))
|
351
453
|
concat(f.simple_fields_for(:company) do |company_form|
|
352
|
-
concat(company_form.
|
454
|
+
concat(company_form.public_send(method, :name))
|
353
455
|
end)
|
354
456
|
end
|
355
457
|
|
@@ -358,28 +460,28 @@ class FormBuilderTest < ActionView::TestCase
|
|
358
460
|
end
|
359
461
|
end
|
360
462
|
|
361
|
-
test "builder
|
463
|
+
test "builder receives a default argument and pass it to the inputs when calling 'input', respecting the specific options" do
|
362
464
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class' } } do |f|
|
363
465
|
f.input :name, input_html: { id: 'specific_id' }
|
364
466
|
end
|
365
467
|
assert_select 'input.default_class#specific_id'
|
366
468
|
end
|
367
469
|
|
368
|
-
test "builder
|
470
|
+
test "builder receives a default argument and pass it to the inputs when calling 'input_field', respecting the specific options" do
|
369
471
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class' } } do |f|
|
370
472
|
f.input_field :name, id: 'specific_id'
|
371
473
|
end
|
372
474
|
assert_select 'input.default_class#specific_id'
|
373
475
|
end
|
374
476
|
|
375
|
-
test "builder
|
477
|
+
test "builder receives a default argument and pass it to the inputs when calling 'input', overwriting the defaults with specific options" do
|
376
478
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class', id: 'default_id' } } do |f|
|
377
479
|
f.input :name, input_html: { id: 'specific_id' }
|
378
480
|
end
|
379
481
|
assert_select 'input.default_class#specific_id'
|
380
482
|
end
|
381
483
|
|
382
|
-
test "builder
|
484
|
+
test "builder receives a default argument and pass it to the inputs when calling 'input_field', overwriting the defaults with specific options" do
|
383
485
|
with_concat_form_for @user, defaults: { input_html: { class: 'default_class', id: 'default_id' } } do |f|
|
384
486
|
f.input_field :name, id: 'specific_id'
|
385
487
|
end
|
@@ -387,24 +489,24 @@ class FormBuilderTest < ActionView::TestCase
|
|
387
489
|
end
|
388
490
|
|
389
491
|
# WITHOUT OBJECT
|
390
|
-
test 'builder
|
492
|
+
test 'builder generates properly when object is not present' do
|
391
493
|
with_form_for :project, :name
|
392
494
|
assert_select 'form input.string#project_name'
|
393
495
|
end
|
394
496
|
|
395
|
-
test 'builder
|
497
|
+
test 'builder generates password fields based on attribute name when object is not present' do
|
396
498
|
with_form_for :project, :password_confirmation
|
397
499
|
assert_select 'form input[type=password].password#project_password_confirmation'
|
398
500
|
end
|
399
501
|
|
400
|
-
test 'builder
|
502
|
+
test 'builder generates text fields by default for all attributes when object is not present' do
|
401
503
|
with_form_for :project, :created_at
|
402
504
|
assert_select 'form input.string#project_created_at'
|
403
505
|
with_form_for :project, :budget
|
404
506
|
assert_select 'form input.string#project_budget'
|
405
507
|
end
|
406
508
|
|
407
|
-
test 'builder
|
509
|
+
test 'builder allows overriding input type when object is not present' do
|
408
510
|
with_form_for :project, :created_at, as: :datetime
|
409
511
|
assert_select 'form select.datetime#project_created_at_1i'
|
410
512
|
with_form_for :project, :budget, as: :decimal
|
@@ -412,24 +514,24 @@ class FormBuilderTest < ActionView::TestCase
|
|
412
514
|
end
|
413
515
|
|
414
516
|
# CUSTOM FORM BUILDER
|
415
|
-
test 'custom builder
|
517
|
+
test 'custom builder inherits mappings' do
|
416
518
|
with_custom_form_for @user, :email
|
417
519
|
assert_select 'form input[type=email]#user_email.custom'
|
418
520
|
end
|
419
521
|
|
420
|
-
test 'form with CustomMapTypeFormBuilder
|
522
|
+
test 'form with CustomMapTypeFormBuilder uses custom map type builder' do
|
421
523
|
with_concat_custom_mapping_form_for(:user) do |user|
|
422
524
|
assert user.instance_of?(CustomMapTypeFormBuilder)
|
423
525
|
end
|
424
526
|
end
|
425
527
|
|
426
|
-
test 'form with CustomMapTypeFormBuilder
|
528
|
+
test 'form with CustomMapTypeFormBuilder uses custom mapping' do
|
427
529
|
with_concat_custom_mapping_form_for(:user) do |user|
|
428
530
|
assert_equal SimpleForm::Inputs::StringInput, user.class.mappings[:custom_type]
|
429
531
|
end
|
430
532
|
end
|
431
533
|
|
432
|
-
test 'form without CustomMapTypeFormBuilder
|
534
|
+
test 'form without CustomMapTypeFormBuilder does not use custom mapping' do
|
433
535
|
with_concat_form_for(:user) do |user|
|
434
536
|
assert_nil user.class.mappings[:custom_type]
|
435
537
|
end
|