comfy_bootstrap_form 4.0.0.beta1
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +621 -0
- data/Rakefile +37 -0
- data/app/assets/stylesheets/rails_bootstrap_forms.css +10 -0
- data/lib/bootstrap_form.rb +13 -0
- data/lib/bootstrap_form/aliasing.rb +35 -0
- data/lib/bootstrap_form/form_builder.rb +460 -0
- data/lib/bootstrap_form/helper.rb +36 -0
- data/lib/bootstrap_form/helpers/bootstrap.rb +94 -0
- data/lib/bootstrap_form/helpers/nested_form.rb +33 -0
- data/lib/bootstrap_form/version.rb +3 -0
- data/lib/comfy_bootstrap_form.rb +1 -0
- data/test/bootstrap_checkbox_test.rb +144 -0
- data/test/bootstrap_fields_test.rb +152 -0
- data/test/bootstrap_form_group_test.rb +313 -0
- data/test/bootstrap_form_test.rb +276 -0
- data/test/bootstrap_other_components_test.rb +86 -0
- data/test/bootstrap_radio_button_test.rb +124 -0
- data/test/bootstrap_selects_test.rb +160 -0
- data/test/dummy/Gemfile +45 -0
- data/test/dummy/Gemfile.lock +120 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +10 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/address.rb +3 -0
- data/test/dummy/app/models/faux_user.rb +9 -0
- data/test/dummy/app/models/super_user.rb +2 -0
- data/test/dummy/app/models/user.rb +9 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +4 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +29 -0
- data/test/dummy/config/environments/production.rb +80 -0
- data/test/dummy/config/environments/test.rb +53 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/generic_migration.rb +6 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/db/migrate/20130703191909_create_users.rb +13 -0
- data/test/dummy/db/migrate/20130703191937_create_addresses.rb +13 -0
- data/test/dummy/db/migrate/20130912171202_add_preferences_to_user.rb +5 -0
- data/test/dummy/db/migrate/20140327190145_add_terms_to_user.rb +5 -0
- data/test/dummy/db/migrate/20140922133133_add_type_to_users.rb +5 -0
- data/test/dummy/db/schema.rb +38 -0
- data/test/dummy/db/seeds.rb +7 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +18394 -0
- data/test/dummy/public/404.html +58 -0
- data/test/dummy/public/422.html +58 -0
- data/test/dummy/public/500.html +57 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/robots.txt +5 -0
- data/test/dummy/test/fixtures/addresses.yml +15 -0
- data/test/dummy/test/fixtures/users.yml +15 -0
- data/test/dummy/test/models/address_test.rb +7 -0
- data/test/dummy/test/models/user_test.rb +7 -0
- data/test/dummy/test/test_helper.rb +15 -0
- data/test/special_form_class_models_test.rb +43 -0
- data/test/test_helper.rb +86 -0
- metadata +309 -0
@@ -0,0 +1,313 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BootstrapFormGroupTest < ActionView::TestCase
|
4
|
+
include BootstrapForm::Helper
|
5
|
+
|
6
|
+
def setup
|
7
|
+
setup_test_fixture
|
8
|
+
end
|
9
|
+
|
10
|
+
test "changing the label text via the label option parameter" do
|
11
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email Address</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
12
|
+
assert_equivalent_xml expected, @builder.text_field(:email, label: 'Email Address')
|
13
|
+
end
|
14
|
+
|
15
|
+
test "changing the label text via the html_options label hash" do
|
16
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email Address</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
17
|
+
assert_equivalent_xml expected, @builder.text_field(:email, label: {text: 'Email Address'})
|
18
|
+
end
|
19
|
+
|
20
|
+
test "hiding a label" do
|
21
|
+
expected = %{<div class="form-group"><label class="sr-only form-control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
22
|
+
assert_equivalent_xml expected, @builder.text_field(:email, hide_label: true)
|
23
|
+
end
|
24
|
+
|
25
|
+
test "adding a custom label class via the label_class parameter" do
|
26
|
+
expected = %{<div class="form-group"><label class="btn form-control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
27
|
+
assert_equivalent_xml expected, @builder.text_field(:email, label_class: 'btn')
|
28
|
+
end
|
29
|
+
|
30
|
+
test "adding a custom label class via the html_options label hash" do
|
31
|
+
expected = %{<div class="form-group"><label class="btn form-control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
32
|
+
assert_equivalent_xml expected, @builder.text_field(:email, label: {class: 'btn'})
|
33
|
+
end
|
34
|
+
|
35
|
+
test "adding a custom label and changing the label text via the html_options label hash" do
|
36
|
+
expected = %{<div class="form-group"><label class="btn form-control-label required" for="user_email">Email Address</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
37
|
+
assert_equivalent_xml expected, @builder.text_field(:email, label: {class: 'btn', text: "Email Address"})
|
38
|
+
end
|
39
|
+
|
40
|
+
test "skipping a label" do
|
41
|
+
expected = %{<div class="form-group"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
42
|
+
assert_equivalent_xml expected, @builder.text_field(:email, skip_label: true)
|
43
|
+
end
|
44
|
+
|
45
|
+
test "preventing a label from having the required class" do
|
46
|
+
expected = %{<div class="form-group"><label class="form-control-label" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
47
|
+
assert_equivalent_xml expected, @builder.text_field(:email, skip_required: true)
|
48
|
+
end
|
49
|
+
|
50
|
+
test "adding prepend text" do
|
51
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><div class="input-group"><span class="input-group-addon">@</span><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div></div>}
|
52
|
+
assert_equivalent_xml expected, @builder.text_field(:email, prepend: '@')
|
53
|
+
end
|
54
|
+
|
55
|
+
test "adding append text" do
|
56
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><div class="input-group"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="input-group-addon">.00</span></div></div>}
|
57
|
+
assert_equivalent_xml expected, @builder.text_field(:email, append: '.00')
|
58
|
+
end
|
59
|
+
|
60
|
+
test "append and prepend button" do
|
61
|
+
prefix = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><div class="input-group">}
|
62
|
+
field = %{<input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" />}
|
63
|
+
button = %{<span class="input-group-btn"><a class="btn btn-secondary" href="#">Click</a></span>}
|
64
|
+
suffix = %{</div></div>}
|
65
|
+
after_button = prefix + field + button + suffix
|
66
|
+
before_button = prefix + button + field + suffix
|
67
|
+
both_button = prefix + button + field + button + suffix
|
68
|
+
button_src = link_to("Click", "#", class: "btn btn-secondary")
|
69
|
+
assert_equivalent_xml after_button, @builder.text_field(:email, append: button_src)
|
70
|
+
assert_equivalent_xml before_button, @builder.text_field(:email, prepend: button_src)
|
71
|
+
assert_equivalent_xml both_button, @builder.text_field(:email, append: button_src, prepend: button_src)
|
72
|
+
end
|
73
|
+
|
74
|
+
test "adding both prepend and append text" do
|
75
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><div class="input-group"><span class="input-group-addon">$</span><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="input-group-addon">.00</span></div></div>}
|
76
|
+
assert_equivalent_xml expected, @builder.text_field(:email, prepend: '$', append: '.00')
|
77
|
+
end
|
78
|
+
|
79
|
+
test "help messages for default forms" do
|
80
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="form-text text-muted">This is required</span></div>}
|
81
|
+
assert_equivalent_xml expected, @builder.text_field(:email, help: 'This is required')
|
82
|
+
end
|
83
|
+
|
84
|
+
test "help messages for horizontal forms" do
|
85
|
+
expected = %{<div class="form-group row"><label class="form-control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /><span class="form-text text-muted">This is required</span></div></div>}
|
86
|
+
assert_equivalent_xml expected, @horizontal_builder.text_field(:email, help: "This is required")
|
87
|
+
end
|
88
|
+
|
89
|
+
test "help messages to look up I18n automatically" do
|
90
|
+
expected = %{<div class="form-group"><label class="form-control-label" for="user_password">Password</label><input class="form-control" id="user_password" name="user[password]" type="text" value="secret" /><span class="form-text text-muted">A good password should be at least six characters long</span></div>}
|
91
|
+
assert_equivalent_xml expected, @builder.text_field(:password)
|
92
|
+
end
|
93
|
+
|
94
|
+
test "help messages to warn about deprecated I18n key" do
|
95
|
+
super_user = SuperUser.new(@user.attributes)
|
96
|
+
builder = BootstrapForm::FormBuilder.new(:super_user, super_user, self, {})
|
97
|
+
|
98
|
+
I18n.backend.store_translations(:en, activerecord: {
|
99
|
+
help: {
|
100
|
+
superuser: {
|
101
|
+
password: 'A good password should be at least six characters long'
|
102
|
+
}
|
103
|
+
}
|
104
|
+
})
|
105
|
+
|
106
|
+
builder.stubs(:warn).returns(true)
|
107
|
+
builder.expects(:warn).at_least_once
|
108
|
+
|
109
|
+
builder.password_field(:password)
|
110
|
+
end
|
111
|
+
|
112
|
+
test "help messages to ignore translation when user disables help" do
|
113
|
+
expected = %{<div class="form-group"><label class="form-control-label" for="user_password">Password</label><input class="form-control" id="user_password" name="user[password]" type="text" value="secret" /></div>}
|
114
|
+
assert_equivalent_xml expected, @builder.text_field(:password, help: false)
|
115
|
+
end
|
116
|
+
|
117
|
+
test "form_group creates a valid structure and allows arbitrary html to be added via a block" do
|
118
|
+
output = @horizontal_builder.form_group :nil, label: { text: 'Foo' } do
|
119
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
120
|
+
end
|
121
|
+
|
122
|
+
expected = %{<div class="form-group row"><label class="form-control-label col-sm-2" for="user_nil">Foo</label><div class="col-sm-10"><p class="form-control-static">Bar</p></div></div>}
|
123
|
+
assert_equivalent_xml expected, output
|
124
|
+
end
|
125
|
+
|
126
|
+
test "form_group adds a spacer when no label exists for a horizontal form" do
|
127
|
+
output = @horizontal_builder.form_group do
|
128
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
129
|
+
end
|
130
|
+
|
131
|
+
expected = %{<div class="form-group row"><div class="col-sm-10 col-sm-offset-2"><p class="form-control-static">Bar</p></div></div>}
|
132
|
+
assert_equivalent_xml expected, output
|
133
|
+
end
|
134
|
+
|
135
|
+
test "form_group renders the label correctly" do
|
136
|
+
output = @horizontal_builder.form_group :email, label: { text: 'Custom Control' } do
|
137
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
138
|
+
end
|
139
|
+
|
140
|
+
expected = %{<div class="form-group row"><label class="form-control-label col-sm-2 required" for="user_email">Custom Control</label><div class="col-sm-10"><p class="form-control-static">Bar</p></div></div>}
|
141
|
+
assert_equivalent_xml expected, output
|
142
|
+
end
|
143
|
+
|
144
|
+
test "form_group accepts class thorugh options hash" do
|
145
|
+
output = @horizontal_builder.form_group :email, class: "foo" do
|
146
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
147
|
+
end
|
148
|
+
|
149
|
+
expected = %{<div class="form-group foo row"><div class="col-sm-10 col-sm-offset-2"><p class="form-control-static">Bar</p></div></div>}
|
150
|
+
assert_equivalent_xml expected, output
|
151
|
+
end
|
152
|
+
|
153
|
+
test "form_group accepts class thorugh options hash without needing a name" do
|
154
|
+
output = @horizontal_builder.form_group class: "foo" do
|
155
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
156
|
+
end
|
157
|
+
|
158
|
+
expected = %{<div class="form-group foo row"><div class="col-sm-10 col-sm-offset-2"><p class="form-control-static">Bar</p></div></div>}
|
159
|
+
assert_equivalent_xml expected, output
|
160
|
+
end
|
161
|
+
|
162
|
+
test "form_group overrides the label's 'class' and 'for' attributes if others are passed" do
|
163
|
+
output = @horizontal_builder.form_group nil, label: { text: 'Custom Control', class: 'foo', for: 'bar' } do
|
164
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
165
|
+
end
|
166
|
+
|
167
|
+
expected = %{<div class="form-group row"><label class="foo form-control-label col-sm-2" for="bar">Custom Control</label><div class="col-sm-10"><p class="form-control-static">Bar</p></div></div>}
|
168
|
+
assert_equivalent_xml expected, output
|
169
|
+
end
|
170
|
+
|
171
|
+
test 'form_group renders the "error" class and message corrrectly when object is invalid' do
|
172
|
+
@user.email = nil
|
173
|
+
@user.valid?
|
174
|
+
|
175
|
+
output = @builder.form_group :email do
|
176
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
177
|
+
end
|
178
|
+
|
179
|
+
expected = <<-HTML.strip_heredoc
|
180
|
+
<div class="form-group has-danger">
|
181
|
+
<p class="form-control-static">Bar</p>
|
182
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
183
|
+
</div>
|
184
|
+
HTML
|
185
|
+
assert_equivalent_xml expected, output
|
186
|
+
end
|
187
|
+
|
188
|
+
test "adds class to wrapped form_group by a field" do
|
189
|
+
expected = %{<div class="form-group none-margin"><label class="form-control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="search" /></div>}
|
190
|
+
assert_equivalent_xml expected, @builder.search_field(:misc, wrapper_class: 'none-margin')
|
191
|
+
end
|
192
|
+
|
193
|
+
test "adds class to wrapped form_group by a field with errors" do
|
194
|
+
@user.email = nil
|
195
|
+
@user.valid?
|
196
|
+
|
197
|
+
expected = <<-HTML.strip_heredoc
|
198
|
+
<div class="form-group none-margin has-danger">
|
199
|
+
<div class="field_with_errors">
|
200
|
+
<label class="form-control-label required" for="user_email">Email</label>
|
201
|
+
</div>
|
202
|
+
<div class="field_with_errors">
|
203
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="email" />
|
204
|
+
</div>
|
205
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
206
|
+
</div>
|
207
|
+
HTML
|
208
|
+
assert_equivalent_xml expected, @builder.email_field(:email, wrapper_class: 'none-margin')
|
209
|
+
end
|
210
|
+
|
211
|
+
test "adds class to wrapped form_group by a field with errors when bootstrap_form_for is used" do
|
212
|
+
@user.email = nil
|
213
|
+
@user.valid?
|
214
|
+
|
215
|
+
output = bootstrap_form_for(@user) do |f|
|
216
|
+
f.text_field(:email, help: 'This is required', wrapper_class: 'none-margin')
|
217
|
+
end
|
218
|
+
|
219
|
+
expected = <<-HTML.strip_heredoc
|
220
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form">
|
221
|
+
<input name="utf8" type="hidden" value="✓" />
|
222
|
+
<div class="form-group none-margin has-danger">
|
223
|
+
<label class="form-control-label required" for="user_email">Email</label>
|
224
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
225
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
226
|
+
</div>
|
227
|
+
</form>
|
228
|
+
HTML
|
229
|
+
assert_equivalent_xml expected, output
|
230
|
+
end
|
231
|
+
|
232
|
+
test "adds offset for form_group without label" do
|
233
|
+
output = @horizontal_builder.form_group do
|
234
|
+
@horizontal_builder.submit
|
235
|
+
end
|
236
|
+
|
237
|
+
expected = %{<div class="form-group row"><div class="col-sm-10 col-sm-offset-2"><input class="btn btn-secondary" name="commit" type="submit" value="Create User" /></div></div>}
|
238
|
+
assert_equivalent_xml expected, output
|
239
|
+
end
|
240
|
+
|
241
|
+
test "adds offset for form_group without label but specific label_col" do
|
242
|
+
output = @horizontal_builder.form_group label_col: 'col-sm-5', control_col: 'col-sm-8' do
|
243
|
+
@horizontal_builder.submit
|
244
|
+
end
|
245
|
+
|
246
|
+
expected = %{<div class="form-group row"><div class="col-sm-8 col-sm-offset-5"><input class="btn btn-secondary" name="commit" type="submit" value="Create User" /></div></div>}
|
247
|
+
assert_equivalent_xml expected, output
|
248
|
+
end
|
249
|
+
|
250
|
+
test "adding an icon to a field" do
|
251
|
+
expected = %{<div class="form-group has-feedback"><label class="form-control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="email" /><span class="glyphicon glyphicon-ok form-control-feedback"></span></div>}
|
252
|
+
assert_equivalent_xml expected, @builder.email_field(:misc, icon: 'ok')
|
253
|
+
end
|
254
|
+
|
255
|
+
test "single form_group call in horizontal form should not be smash design" do
|
256
|
+
output = ''
|
257
|
+
output = @horizontal_builder.form_group do
|
258
|
+
"Hallo"
|
259
|
+
end
|
260
|
+
|
261
|
+
output = output + @horizontal_builder.text_field(:email)
|
262
|
+
|
263
|
+
expected = %{<div class="form-group row"><div class="col-sm-10 col-sm-offset-2">Hallo</div></div><div class="form-group row"><label class="form-control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div></div>}
|
264
|
+
assert_equivalent_xml expected, output
|
265
|
+
end
|
266
|
+
|
267
|
+
test "adds data-attributes (or any other options) to wrapper" do
|
268
|
+
expected = %{<div class="form-group" data-foo="bar"><label class="form-control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="search" /></div>}
|
269
|
+
assert_equivalent_xml expected, @builder.search_field(:misc, wrapper: { data: { foo: 'bar' } })
|
270
|
+
end
|
271
|
+
|
272
|
+
test "passing options to a form control get passed through" do
|
273
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><input autofocus="autofocus" class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" /></div>}
|
274
|
+
assert_equivalent_xml expected, @builder.text_field(:email, autofocus: true)
|
275
|
+
end
|
276
|
+
|
277
|
+
test "doesn't throw undefined method error when the content block returns nil" do
|
278
|
+
output = @builder.form_group :nil, label: { text: 'Foo' } do
|
279
|
+
nil
|
280
|
+
end
|
281
|
+
|
282
|
+
expected = %{<div class="form-group"><label class="form-control-label" for="user_nil">Foo</label></div>}
|
283
|
+
assert_equivalent_xml expected, output
|
284
|
+
end
|
285
|
+
|
286
|
+
test "custom form group layout option" do
|
287
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group"><label class="form-control-label required" for="user_email">Email</label><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /></div></form>}
|
288
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal) { |f| f.email_field :email, layout: :inline }
|
289
|
+
end
|
290
|
+
|
291
|
+
test "non-default column span on form is reflected in form_group" do
|
292
|
+
non_default_horizontal_builder = BootstrapForm::FormBuilder.new(:user, @user, self, { layout: :horizontal, label_col: "col-sm-3", control_col: "col-sm-9" })
|
293
|
+
output = non_default_horizontal_builder.form_group do
|
294
|
+
%{<p class="form-control-static">Bar</p>}.html_safe
|
295
|
+
end
|
296
|
+
|
297
|
+
expected = %{<div class="form-group row"><div class="col-sm-9 col-sm-offset-3"><p class="form-control-static">Bar</p></div></div>}
|
298
|
+
assert_equivalent_xml expected, output
|
299
|
+
end
|
300
|
+
|
301
|
+
test "non-default column span on form isn't mutated" do
|
302
|
+
frozen_horizontal_builder = BootstrapForm::FormBuilder.new(:user, @user, self, { layout: :horizontal, label_col: "col-sm-3".freeze, control_col: "col-sm-9".freeze })
|
303
|
+
output = frozen_horizontal_builder.form_group { 'test' }
|
304
|
+
|
305
|
+
expected = %{<div class="form-group row"><div class="col-sm-9 col-sm-offset-3">test</div></div>}
|
306
|
+
assert_equivalent_xml expected, output
|
307
|
+
end
|
308
|
+
|
309
|
+
test ":input_group_class should apply to input-group" do
|
310
|
+
expected = %{<div class="form-group"><label class="form-control-label required" for="user_email">Email</label><div class="input-group input-group-lg"><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /><span class="input-group-btn"><input class="btn btn-primary" name="commit" type="submit" value="Subscribe" /></span></div></div>}
|
311
|
+
assert_equivalent_xml expected, @builder.email_field(:email, append: @builder.primary('Subscribe'), input_group_class: 'input-group-lg')
|
312
|
+
end
|
313
|
+
end
|
@@ -0,0 +1,276 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BootstrapFormTest < ActionView::TestCase
|
4
|
+
include BootstrapForm::Helper
|
5
|
+
|
6
|
+
def setup
|
7
|
+
setup_test_fixture
|
8
|
+
end
|
9
|
+
|
10
|
+
test "default-style forms" do
|
11
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div></form>}
|
12
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user) { |f| nil }
|
13
|
+
end
|
14
|
+
|
15
|
+
test "inline-style forms" do
|
16
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="form-inline" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div></form>}
|
17
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :inline) { |f| nil }
|
18
|
+
end
|
19
|
+
|
20
|
+
test "horizontal-style forms" do
|
21
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group row"><label class="form-control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /></div></div></form>}
|
22
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal) { |f| f.email_field :email }
|
23
|
+
end
|
24
|
+
|
25
|
+
test "existing styles aren't clobbered when specifying a form style" do
|
26
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="my-style" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group row"><label class="form-control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /></div></div></form>}
|
27
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal, html: { class: "my-style" }) { |f| f.email_field :email }
|
28
|
+
end
|
29
|
+
|
30
|
+
test "given role attribute should not be covered by default role attribute" do
|
31
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="not-a-form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div></form>}
|
32
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, html: { role: 'not-a-form'}) {|f| nil}
|
33
|
+
end
|
34
|
+
|
35
|
+
test "bootstrap_form_tag acts like a form tag" do
|
36
|
+
expected = %{<form accept-charset="UTF-8" action="/users" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group"><label class="form-control-label" for="email">Your Email</label><input class="form-control" id="email" name="email" type="text" /></div></form>}
|
37
|
+
assert_equivalent_xml expected, bootstrap_form_tag(url: '/users') { |f| f.text_field :email, label: "Your Email" }
|
38
|
+
end
|
39
|
+
|
40
|
+
test "bootstrap_form_tag does not clobber custom options" do
|
41
|
+
expected = %{<form accept-charset="UTF-8" action="/users" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group"><label class="form-control-label" for="ID">Email</label><input class="form-control" id="ID" name="NAME" type="text" /></div></form>}
|
42
|
+
assert_equivalent_xml expected, bootstrap_form_tag(url: '/users') { |f| f.text_field :email, name: 'NAME', id: "ID" }
|
43
|
+
end
|
44
|
+
|
45
|
+
test "bootstrap_form_tag allows an empty name for checkboxes" do
|
46
|
+
checkbox = if ::Rails::VERSION::STRING >= '5.1'
|
47
|
+
%{<div class="form-check"><label class="form-check-label" for="misc"><input name="misc" type="hidden" value="0" /><input class="form-check-input" id="misc" name="misc" type="checkbox" value="1" /> Misc</label></div>}
|
48
|
+
else
|
49
|
+
%{<div class="form-check"><label class="form-check-label" for="_misc"><input name="[misc]" type="hidden" value="0" /><input class="form-check-input" id="_misc" name="[misc]" type="checkbox" value="1" /> Misc</label></div>}
|
50
|
+
end
|
51
|
+
hidden = if ::Rails::VERSION::STRING >= '4.2'
|
52
|
+
%{<input name="utf8" type="hidden" value="✓" />}
|
53
|
+
else
|
54
|
+
%{<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div>}
|
55
|
+
end
|
56
|
+
expected = %{<form accept-charset="UTF-8" action="/users" method="post" role="form">#{hidden}#{checkbox}</form>}
|
57
|
+
assert_equivalent_xml expected, bootstrap_form_tag(url: '/users') { |f| f.check_box :misc }
|
58
|
+
end
|
59
|
+
|
60
|
+
test "errors display correctly and inline_errors are turned off by default when label_errors is true" do
|
61
|
+
@user.email = nil
|
62
|
+
@user.valid?
|
63
|
+
|
64
|
+
expected = <<-HTML.strip_heredoc
|
65
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form">
|
66
|
+
<input name="utf8" type="hidden" value="✓" />
|
67
|
+
<div class="form-group has-danger">
|
68
|
+
<label class="form-control-label required" for="user_email">Email can't be blank, is too short (minimum is 5 characters)</label>
|
69
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
70
|
+
</div>
|
71
|
+
</form>
|
72
|
+
HTML
|
73
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, label_errors: true) { |f| f.text_field :email }
|
74
|
+
end
|
75
|
+
|
76
|
+
test "errors display correctly and inline_errors can also be on when label_errors is true" do
|
77
|
+
@user.email = nil
|
78
|
+
@user.valid?
|
79
|
+
|
80
|
+
expected = <<-HTML.strip_heredoc
|
81
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form">
|
82
|
+
<input name="utf8" type="hidden" value="✓" />
|
83
|
+
<div class="form-group has-danger">
|
84
|
+
<label class="form-control-label required" for="user_email">Email can't be blank, is too short (minimum is 5 characters)</label>
|
85
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
86
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
87
|
+
</div>
|
88
|
+
</form>
|
89
|
+
HTML
|
90
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, label_errors: true, inline_errors: true) { |f| f.text_field :email }
|
91
|
+
end
|
92
|
+
|
93
|
+
test "label error messages use humanized attribute names" do
|
94
|
+
I18n.backend.store_translations(:en, {activerecord: {attributes: {user: {email: 'Your e-mail address'}}}})
|
95
|
+
|
96
|
+
@user.email = nil
|
97
|
+
@user.valid?
|
98
|
+
|
99
|
+
expected = <<-HTML.strip_heredoc
|
100
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form">
|
101
|
+
<input name="utf8" type="hidden" value="✓" />
|
102
|
+
<div class="form-group has-danger">
|
103
|
+
<label class="form-control-label required" for="user_email">Your e-mail address can't be blank, is too short (minimum is 5 characters)</label>
|
104
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
105
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
106
|
+
</div>
|
107
|
+
</form>
|
108
|
+
HTML
|
109
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, label_errors: true, inline_errors: true) { |f| f.text_field :email }
|
110
|
+
|
111
|
+
I18n.backend.store_translations(:en, {activerecord: {attributes: {user: {email: nil}}}})
|
112
|
+
end
|
113
|
+
|
114
|
+
test "alert message is wrapped correctly" do
|
115
|
+
@user.email = nil
|
116
|
+
@user.valid?
|
117
|
+
expected = %{<div class="alert alert-danger"><p>Please fix the following errors:</p><ul class="rails-bootstrap-forms-error-summary"><li>Email can't be blank</li><li>Email is too short (minimum is 5 characters)</li><li>Terms must be accepted</li></ul></div>}
|
118
|
+
assert_equivalent_xml expected, @builder.alert_message('Please fix the following errors:')
|
119
|
+
end
|
120
|
+
|
121
|
+
test "changing the class name for the alert message" do
|
122
|
+
@user.email = nil
|
123
|
+
@user.valid?
|
124
|
+
expected = %{<div class="my-css-class"><p>Please fix the following errors:</p><ul class="rails-bootstrap-forms-error-summary"><li>Email can't be blank</li><li>Email is too short (minimum is 5 characters)</li><li>Terms must be accepted</li></ul></div>}
|
125
|
+
assert_equivalent_xml expected, @builder.alert_message('Please fix the following errors:', class: 'my-css-class')
|
126
|
+
end
|
127
|
+
|
128
|
+
test "alert_message contains the error summary when inline_errors are turned off" do
|
129
|
+
@user.email = nil
|
130
|
+
@user.valid?
|
131
|
+
|
132
|
+
output = bootstrap_form_for(@user, inline_errors: false) do |f|
|
133
|
+
f.alert_message('Please fix the following errors:')
|
134
|
+
end
|
135
|
+
|
136
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="alert alert-danger"><p>Please fix the following errors:</p><ul class="rails-bootstrap-forms-error-summary"><li>Email can't be blank</li><li>Email is too short (minimum is 5 characters)</li><li>Terms must be accepted</li></ul></div></form>}
|
137
|
+
assert_equivalent_xml expected, output
|
138
|
+
end
|
139
|
+
|
140
|
+
test "alert_message allows the error_summary to be turned off" do
|
141
|
+
@user.email = nil
|
142
|
+
@user.valid?
|
143
|
+
|
144
|
+
output = bootstrap_form_for(@user, inline_errors: false) do |f|
|
145
|
+
f.alert_message('Please fix the following errors:', error_summary: false)
|
146
|
+
end
|
147
|
+
|
148
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="alert alert-danger"><p>Please fix the following errors:</p></div></form>}
|
149
|
+
assert_equivalent_xml expected, output
|
150
|
+
end
|
151
|
+
|
152
|
+
test "alert_message allows the error_summary to be turned on with inline_errors also turned on" do
|
153
|
+
@user.email = nil
|
154
|
+
@user.valid?
|
155
|
+
|
156
|
+
output = bootstrap_form_for(@user, inline_errors: true) do |f|
|
157
|
+
f.alert_message('Please fix the following errors:', error_summary: true)
|
158
|
+
end
|
159
|
+
|
160
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="alert alert-danger"><p>Please fix the following errors:</p><ul class="rails-bootstrap-forms-error-summary"><li>Email can't be blank</li><li>Email is too short (minimum is 5 characters)</li><li>Terms must be accepted</li></ul></div></form>}
|
161
|
+
assert_equivalent_xml expected, output
|
162
|
+
end
|
163
|
+
|
164
|
+
test "error_summary returns an unordered list of errors" do
|
165
|
+
@user.email = nil
|
166
|
+
@user.valid?
|
167
|
+
|
168
|
+
expected = %{<ul class="rails-bootstrap-forms-error-summary"><li>Email can't be blank</li><li>Email is too short (minimum is 5 characters)</li><li>Terms must be accepted</li></ul>}
|
169
|
+
assert_equivalent_xml expected, @builder.error_summary
|
170
|
+
end
|
171
|
+
|
172
|
+
test 'errors_on renders the errors for a specific attribute when invalid' do
|
173
|
+
@user.email = nil
|
174
|
+
@user.valid?
|
175
|
+
|
176
|
+
expected = %{<div class="alert alert-danger">Email can't be blank, Email is too short (minimum is 5 characters)</div>}
|
177
|
+
assert_equivalent_xml expected, @builder.errors_on(:email)
|
178
|
+
end
|
179
|
+
|
180
|
+
test "custom label width for horizontal forms" do
|
181
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group row"><label class="form-control-label col-sm-1 required" for="user_email">Email</label><div class="col-sm-10"><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /></div></div></form>}
|
182
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal) { |f| f.email_field :email, label_col: 'col-sm-1' }
|
183
|
+
end
|
184
|
+
|
185
|
+
test "offset for form group without label respects label width for horizontal forms" do
|
186
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group row"><div class="col-md-10 col-md-offset-2"><input class="btn btn-secondary" name="commit" type="submit" value="Create User" /></div></div></form>}
|
187
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal, label_col: 'col-md-2', control_col: 'col-md-10') { |f| f.form_group { f.submit } }
|
188
|
+
end
|
189
|
+
|
190
|
+
test "custom input width for horizontal forms" do
|
191
|
+
expected = %{<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div><div class="form-group row"><label class="form-control-label col-sm-2 required" for="user_email">Email</label><div class="col-sm-5"><input class="form-control" id="user_email" name="user[email]" type="email" value="steve@example.com" /></div></div></form>}
|
192
|
+
assert_equivalent_xml expected, bootstrap_form_for(@user, layout: :horizontal) { |f| f.email_field :email, control_col: 'col-sm-5' }
|
193
|
+
end
|
194
|
+
|
195
|
+
test "the field contains the error and is not wrapped in div.field_with_errors when bootstrap_form_for is used" do
|
196
|
+
@user.email = nil
|
197
|
+
@user.valid?
|
198
|
+
|
199
|
+
output = bootstrap_form_for(@user) do |f|
|
200
|
+
f.text_field(:email, help: 'This is required')
|
201
|
+
end
|
202
|
+
|
203
|
+
expected = <<-HTML.strip_heredoc
|
204
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form">
|
205
|
+
<input name="utf8" type="hidden" value="✓" />
|
206
|
+
<div class="form-group has-danger">
|
207
|
+
<label class="form-control-label required" for="user_email">Email</label>
|
208
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
209
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
210
|
+
</div>
|
211
|
+
</form>
|
212
|
+
HTML
|
213
|
+
assert_equivalent_xml expected, output
|
214
|
+
end
|
215
|
+
|
216
|
+
test "the field is wrapped with div.field_with_errors when form_for is used" do
|
217
|
+
@user.email = nil
|
218
|
+
@user.valid?
|
219
|
+
|
220
|
+
output = form_for(@user, builder: BootstrapForm::FormBuilder) do |f|
|
221
|
+
f.text_field(:email, help: 'This is required')
|
222
|
+
end
|
223
|
+
|
224
|
+
expected = <<-HTML.strip_heredoc
|
225
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
|
226
|
+
<input name="utf8" type="hidden" value="✓" />
|
227
|
+
<div class="form-group has-danger">
|
228
|
+
<div class="field_with_errors">
|
229
|
+
<label class="form-control-label required" for="user_email">Email</label>
|
230
|
+
</div>
|
231
|
+
<div class="field_with_errors">
|
232
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
233
|
+
</div>
|
234
|
+
<span class="invalid-feedback">can't be blank, is too short (minimum is 5 characters)</span>
|
235
|
+
</div>
|
236
|
+
</form>
|
237
|
+
HTML
|
238
|
+
assert_equivalent_xml expected, output
|
239
|
+
end
|
240
|
+
|
241
|
+
test "help is preserved when inline_errors: false is passed to bootstrap_form_for" do
|
242
|
+
@user.email = nil
|
243
|
+
@user.valid?
|
244
|
+
|
245
|
+
output = bootstrap_form_for(@user, inline_errors: false) do |f|
|
246
|
+
f.text_field(:email, help: 'This is required')
|
247
|
+
end
|
248
|
+
|
249
|
+
expected = <<-HTML.strip_heredoc
|
250
|
+
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post" role="form">
|
251
|
+
<input name="utf8" type="hidden" value="✓" />
|
252
|
+
<div class="form-group has-danger">
|
253
|
+
<label class="form-control-label required" for="user_email">Email</label>
|
254
|
+
<input class="form-control is-invalid" id="user_email" name="user[email]" type="text" />
|
255
|
+
<span class="form-text text-muted">This is required</span>
|
256
|
+
</div>
|
257
|
+
</form>
|
258
|
+
HTML
|
259
|
+
assert_equivalent_xml expected, output
|
260
|
+
end
|
261
|
+
|
262
|
+
test "allows the form object to be nil" do
|
263
|
+
builder = BootstrapForm::FormBuilder.new :other_model, nil, self, {}
|
264
|
+
expected = %{<div class="form-group"><label class="form-control-label" for="other_model_email">Email</label><input class="form-control" id="other_model_email" name="other_model[email]" type="text" /></div>}
|
265
|
+
assert_equivalent_xml expected, builder.text_field(:email)
|
266
|
+
end
|
267
|
+
|
268
|
+
test 'errors_on hide attribute name in message' do
|
269
|
+
@user.email = nil
|
270
|
+
@user.valid?
|
271
|
+
|
272
|
+
expected = %{<div class="alert alert-danger">can't be blank, is too short (minimum is 5 characters)</div>}
|
273
|
+
|
274
|
+
assert_equivalent_xml expected, @builder.errors_on(:email, hide_attribute_name: true)
|
275
|
+
end
|
276
|
+
end
|