formtastic-bootstrap 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -3
- data/Gemfile.lock +72 -60
- data/README.md +4 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/formtastic-bootstrap.gemspec +49 -16
- data/lib/formtastic-bootstrap/actions/base.rb +22 -0
- data/lib/formtastic-bootstrap/actions/button_action.rb +13 -0
- data/lib/formtastic-bootstrap/actions/input_action.rb +13 -0
- data/lib/formtastic-bootstrap/actions/link_action.rb +12 -0
- data/lib/formtastic-bootstrap/actions.rb +10 -0
- data/lib/formtastic-bootstrap/form_builder.rb +4 -2
- data/lib/formtastic-bootstrap/helpers/action_helper.rb +12 -0
- data/lib/formtastic-bootstrap/helpers/actions_helper.rb +24 -0
- data/lib/formtastic-bootstrap/helpers/fieldset_wrapper.rb +2 -4
- data/lib/formtastic-bootstrap/helpers/inputs_helper.rb +0 -2
- data/lib/formtastic-bootstrap/helpers.rb +6 -8
- data/lib/formtastic-bootstrap/inputs/base/choices.rb +6 -35
- data/lib/formtastic-bootstrap/inputs/base/collections.rb +9 -0
- data/lib/formtastic-bootstrap/inputs/base/grouped_collections.rb +9 -0
- data/lib/formtastic-bootstrap/inputs/base/hints.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/base/labelling.rb +14 -3
- data/lib/formtastic-bootstrap/inputs/base/numeric.rb +9 -0
- data/lib/formtastic-bootstrap/inputs/base/stringish.rb +4 -5
- data/lib/formtastic-bootstrap/inputs/base/timeish.rb +38 -18
- data/lib/formtastic-bootstrap/inputs/base/wrapping.rb +22 -34
- data/lib/formtastic-bootstrap/inputs/base.rb +29 -6
- data/lib/formtastic-bootstrap/inputs/boolean_input.rb +14 -18
- data/lib/formtastic-bootstrap/inputs/check_boxes_input.rb +16 -11
- data/lib/formtastic-bootstrap/inputs/date_input.rb +3 -9
- data/lib/formtastic-bootstrap/inputs/date_select_input.rb +8 -0
- data/lib/formtastic-bootstrap/inputs/datetime_input.rb +3 -12
- data/lib/formtastic-bootstrap/inputs/datetime_select_input.rb +8 -0
- data/lib/formtastic-bootstrap/inputs/email_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/file_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/hidden_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/number_input.rb +3 -3
- data/lib/formtastic-bootstrap/inputs/password_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/phone_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/radio_input.rb +28 -14
- data/lib/formtastic-bootstrap/inputs/range_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/search_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/select_input.rb +3 -1
- data/lib/formtastic-bootstrap/inputs/string_input.rb +0 -7
- data/lib/formtastic-bootstrap/inputs/text_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/time_input.rb +3 -9
- data/lib/formtastic-bootstrap/inputs/time_select_input.rb +8 -0
- data/lib/formtastic-bootstrap/inputs/time_zone_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs/url_input.rb +1 -1
- data/lib/formtastic-bootstrap/inputs.rb +30 -23
- data/lib/formtastic-bootstrap.rb +16 -1
- data/spec/actions/button_action_spec.rb +63 -0
- data/spec/actions/input_action_spec.rb +59 -0
- data/spec/actions/link_action_spec.rb +92 -0
- data/spec/helpers/action_helper_spec.rb +368 -0
- data/spec/helpers/actions_helper_spec.rb +147 -0
- data/spec/helpers/input_helper_spec.rb +238 -259
- data/spec/helpers/inputs_helper_spec.rb +84 -25
- data/spec/inputs/boolean_input_spec.rb +108 -75
- data/spec/inputs/check_boxes_input_spec.rb +106 -91
- data/spec/inputs/date_select_input_spec.rb +164 -0
- data/spec/inputs/datetime_select_input_spec.rb +112 -0
- data/spec/inputs/deprecated_time_date_datetime_inputs_spec.rb +48 -0
- data/spec/inputs/email_input_spec.rb +30 -3
- data/spec/inputs/file_input_spec.rb +31 -4
- data/spec/inputs/hidden_input_spec.rb +63 -32
- data/spec/inputs/number_input_spec.rb +37 -8
- data/spec/inputs/password_input_spec.rb +30 -3
- data/spec/inputs/phone_input_spec.rb +30 -3
- data/spec/inputs/radio_input_spec.rb +87 -60
- data/spec/inputs/range_input_spec.rb +32 -5
- data/spec/inputs/search_input_spec.rb +29 -3
- data/spec/inputs/select_input_spec.rb +164 -107
- data/spec/inputs/string_input_spec.rb +33 -22
- data/spec/inputs/text_input_spec.rb +39 -14
- data/spec/inputs/time_select_input_spec.rb +191 -0
- data/spec/inputs/time_zone_input_spec.rb +17 -19
- data/spec/inputs/url_input_spec.rb +30 -3
- data/spec/spec_helper.rb +21 -15
- data/spec/support/custom_macros.rb +61 -228
- data/spec/support/fb_custom_macros.rb +23 -0
- metadata +109 -28
- data/lib/formtastic-bootstrap/helpers/buttons_helper.rb +0 -52
- data/spec/builder/errors_spec.rb +0 -214
- data/spec/helpers/buttons_helper_spec.rb +0 -149
- data/spec/inputs/date_input_spec.rb +0 -147
- data/spec/inputs/datetime_input_spec.rb +0 -101
- data/spec/inputs/time_input_spec.rb +0 -206
- data/spec/support/depracation.rb +0 -6
- data/spec/support/formtastic_spec_helper.rb +0 -382
@@ -8,7 +8,6 @@ describe 'radio input' do
|
|
8
8
|
before do
|
9
9
|
@output_buffer = ''
|
10
10
|
mock_everything
|
11
|
-
Formtastic::Helpers::FormHelper.builder = FormtasticBootstrap::FormBuilder
|
12
11
|
end
|
13
12
|
|
14
13
|
describe 'for belongs_to association' do
|
@@ -18,64 +17,55 @@ describe 'radio input' do
|
|
18
17
|
end)
|
19
18
|
end
|
20
19
|
|
21
|
-
|
22
|
-
it_should_have_input_wrapper_with_class(
|
23
|
-
|
20
|
+
it_should_have_bootstrap_horizontal_wrapping
|
21
|
+
it_should_have_input_wrapper_with_class("radio_buttons")
|
22
|
+
it_should_have_input_wrapper_with_class(:input)
|
24
23
|
it_should_have_input_wrapper_with_id("post_author_input")
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
it_should_apply_error_logic_for_input_type(:radio
|
24
|
+
# it_should_have_a_nested_fieldset
|
25
|
+
# it_should_have_a_nested_fieldset_with_class('choices')
|
26
|
+
# it_should_have_a_nested_ordered_list_with_class('choices-group')
|
27
|
+
it_should_apply_error_logic_for_input_type(:radio)
|
29
28
|
it_should_use_the_collection_when_provided(:radio, 'input')
|
30
29
|
|
31
|
-
it 'should generate a
|
32
|
-
output_buffer.should have_tag('form div.
|
33
|
-
output_buffer.should have_tag('form div.
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should not link the \'legend\' label to any input' do
|
37
|
-
output_buffer.should_not have_tag('form div.clearfix > label[@for]')
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should generate an unordered list with a list item for each choice' do
|
41
|
-
output_buffer.should have_tag('form div.clearfix div.input ul')
|
42
|
-
output_buffer.should have_tag('form div.clearfix div.input ul li.choice', :count => ::Author.all.size)
|
30
|
+
it 'should generate a control label with text for the input' do
|
31
|
+
output_buffer.should have_tag('form div.control-group > label.control-label')
|
32
|
+
output_buffer.should have_tag('form div.control-group > label.control-label', /Author/)
|
43
33
|
end
|
44
34
|
|
45
35
|
it 'should have one option with a "checked" attribute' do
|
46
|
-
output_buffer.should have_tag('form
|
36
|
+
output_buffer.should have_tag('form div.control-group div.controls input[@checked]', :count => 1)
|
47
37
|
end
|
48
38
|
|
49
39
|
describe "each choice" do
|
50
|
-
|
40
|
+
|
51
41
|
it 'should not give the choice label the .label class' do
|
52
|
-
output_buffer.should_not have_tag('
|
42
|
+
output_buffer.should_not have_tag('div.controls label.label')
|
53
43
|
end
|
54
|
-
|
44
|
+
|
55
45
|
it 'should not add the required attribute to each input' do
|
56
|
-
output_buffer.should_not have_tag('
|
46
|
+
output_buffer.should_not have_tag('div.controls input[@required]')
|
57
47
|
end
|
58
|
-
|
59
|
-
|
48
|
+
|
49
|
+
|
60
50
|
it 'should contain a label for the radio input with a nested input and label text' do
|
61
51
|
::Author.all.each do |author|
|
62
|
-
output_buffer.should have_tag('form div.
|
63
|
-
output_buffer.should have_tag("form div.
|
52
|
+
output_buffer.should have_tag('form div.control-group div.controls label', /#{author.to_label}/)
|
53
|
+
output_buffer.should have_tag("form div.control-group div.controls label[@for='post_author_id_#{author.id}']")
|
64
54
|
end
|
65
55
|
end
|
66
56
|
|
67
57
|
it 'should use values as li.class when value_as_class is true' do
|
68
58
|
::Author.all.each do |author|
|
69
|
-
output_buffer.should have_tag("form div.
|
59
|
+
output_buffer.should have_tag("form div.control-group div.controls label.author_#{author.id}")
|
70
60
|
end
|
71
61
|
end
|
72
62
|
|
73
63
|
it "should have a radio input" do
|
74
64
|
::Author.all.each do |author|
|
75
|
-
output_buffer.should have_tag("form div.
|
76
|
-
output_buffer.should have_tag("form div.
|
77
|
-
output_buffer.should have_tag("form div.
|
78
|
-
output_buffer.should have_tag("form div.
|
65
|
+
output_buffer.should have_tag("form div.control-group div.controls label input#post_author_id_#{author.id}")
|
66
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@type='radio']")
|
67
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@value='#{author.id}']")
|
68
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@name='post[author_id]']")
|
79
69
|
end
|
80
70
|
end
|
81
71
|
|
@@ -88,7 +78,7 @@ describe 'radio input' do
|
|
88
78
|
concat(builder.input(:author, :as => :radio))
|
89
79
|
end)
|
90
80
|
|
91
|
-
output_buffer.should have_tag("form div.
|
81
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@checked='checked']")
|
92
82
|
end
|
93
83
|
|
94
84
|
it "should mark the input as disabled if options attached for disabling" do
|
@@ -96,8 +86,8 @@ describe 'radio input' do
|
|
96
86
|
concat(builder.input(:author, :as => :radio, :collection => [["Test", 'test'], ["Try", "try", {:disabled => true}]]))
|
97
87
|
end)
|
98
88
|
|
99
|
-
output_buffer.should_not have_tag("form div.
|
100
|
-
output_buffer.should have_tag("form div.
|
89
|
+
output_buffer.should_not have_tag("form div.control-group div.controls label input[@value='test'][@disabled='disabled']")
|
90
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@value='try'][@disabled='disabled']")
|
101
91
|
end
|
102
92
|
|
103
93
|
it "should not contain invalid HTML attributes" do
|
@@ -106,7 +96,7 @@ describe 'radio input' do
|
|
106
96
|
concat(builder.input(:author, :as => :radio))
|
107
97
|
end)
|
108
98
|
|
109
|
-
output_buffer.should_not have_tag("form
|
99
|
+
output_buffer.should_not have_tag("form li fieldset ol li input[@find_options]")
|
110
100
|
end
|
111
101
|
|
112
102
|
end
|
@@ -119,18 +109,10 @@ describe 'radio input' do
|
|
119
109
|
end)
|
120
110
|
end
|
121
111
|
|
122
|
-
it 'should generate a div with a label' do
|
123
|
-
output_buffer.should have_tag('form div.clearfix label', /Author/)
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'should generate an li tag for each item in the collection' do
|
127
|
-
output_buffer.should have_tag('form div.clearfix div ul li', :count => ::Author.all.size)
|
128
|
-
end
|
129
|
-
|
130
112
|
it 'should generate labels for each item' do
|
131
113
|
::Author.all.each do |author|
|
132
|
-
output_buffer.should have_tag('form div div
|
133
|
-
output_buffer.should have_tag("form div div
|
114
|
+
output_buffer.should have_tag('form div.control-group div.controls label', /#{author.to_label}/)
|
115
|
+
output_buffer.should have_tag("form div.control-group div.controls label[@for='project_author_id_#{author.id}']")
|
134
116
|
end
|
135
117
|
end
|
136
118
|
|
@@ -138,18 +120,17 @@ describe 'radio input' do
|
|
138
120
|
concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
139
121
|
concat(builder.input(:author_id, :as => :radio, :collection => [["<b>Item 1</b>", 1], ["<b>Item 2</b>", 2]]))
|
140
122
|
end)
|
141
|
-
output_buffer.should have_tag('form div div
|
142
|
-
|
143
|
-
label.body.should match /<b>Item [12]<\/b>/
|
123
|
+
output_buffer.should have_tag('form div.control-group div.controls label') do |label|
|
124
|
+
label.body.should match /<b>Item [12]<\/b>$/
|
144
125
|
end
|
145
126
|
end
|
146
127
|
|
147
128
|
it 'should generate inputs for each item' do
|
148
129
|
::Author.all.each do |author|
|
149
|
-
output_buffer.should have_tag("form div div
|
150
|
-
output_buffer.should have_tag("form div div
|
151
|
-
output_buffer.should have_tag("form div div
|
152
|
-
output_buffer.should have_tag("form div div
|
130
|
+
output_buffer.should have_tag("form div.control-group div.controls label input#project_author_id_#{author.id}")
|
131
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@type='radio']")
|
132
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@value='#{author.id}']")
|
133
|
+
output_buffer.should have_tag("form div.control-group div.controls label input[@name='project[author_id]']")
|
153
134
|
end
|
154
135
|
end
|
155
136
|
end
|
@@ -173,7 +154,7 @@ describe 'radio input' do
|
|
173
154
|
end
|
174
155
|
|
175
156
|
it "should do foo" do
|
176
|
-
output_buffer.should have_tag("
|
157
|
+
output_buffer.should have_tag("label.control-label", /Translated/)
|
177
158
|
end
|
178
159
|
|
179
160
|
end
|
@@ -187,7 +168,7 @@ describe 'radio input' do
|
|
187
168
|
end
|
188
169
|
|
189
170
|
it "should output the correct label title" do
|
190
|
-
output_buffer.should have_tag("
|
171
|
+
output_buffer.should have_tag("label.control-label", /The authors/)
|
191
172
|
end
|
192
173
|
end
|
193
174
|
|
@@ -201,10 +182,11 @@ describe 'radio input' do
|
|
201
182
|
end
|
202
183
|
|
203
184
|
it "should not output the legend" do
|
204
|
-
|
185
|
+
# TODO I think this is not supported in FB.
|
186
|
+
output_buffer.should_not have_tag("label.control-label")
|
205
187
|
output_buffer.should_not include(">")
|
206
188
|
end
|
207
|
-
|
189
|
+
|
208
190
|
it "should not cause escaped HTML" do
|
209
191
|
output_buffer.should_not include(">")
|
210
192
|
end
|
@@ -219,7 +201,7 @@ describe 'radio input' do
|
|
219
201
|
end
|
220
202
|
|
221
203
|
it "should output the correct label title" do
|
222
|
-
output_buffer.should have_tag("
|
204
|
+
output_buffer.should have_tag("label.control-label abbr")
|
223
205
|
end
|
224
206
|
end
|
225
207
|
|
@@ -237,4 +219,49 @@ describe 'radio input' do
|
|
237
219
|
it_should_have_input_wrapper_with_id("custom_prefix_post_authors_input")
|
238
220
|
end
|
239
221
|
|
222
|
+
describe "when index is provided" do
|
223
|
+
|
224
|
+
before do
|
225
|
+
@output_buffer = ''
|
226
|
+
mock_everything
|
227
|
+
|
228
|
+
concat(semantic_form_for(@new_post) do |builder|
|
229
|
+
concat(builder.fields_for(:author, :index => 3) do |author|
|
230
|
+
concat(author.input(:name, :as => :radio))
|
231
|
+
end)
|
232
|
+
end)
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'should index the id of the control-group' do
|
236
|
+
output_buffer.should have_tag("div.control-group#post_author_attributes_3_name_input")
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'should index the id of the select tag' do
|
240
|
+
output_buffer.should have_tag("input#post_author_attributes_3_name_true")
|
241
|
+
output_buffer.should have_tag("input#post_author_attributes_3_name_false")
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'should index the name of the select tag' do
|
245
|
+
output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
249
|
+
|
250
|
+
describe "when collection contains integers" do
|
251
|
+
before do
|
252
|
+
@output_buffer = ''
|
253
|
+
mock_everything
|
254
|
+
|
255
|
+
concat(semantic_form_for(:project) do |builder|
|
256
|
+
concat(builder.input(:author_id, :as => :radio, :collection => [1, 2, 3]))
|
257
|
+
end)
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'should output the correct labels' do
|
261
|
+
output_buffer.should have_tag("div.controls label", /1/)
|
262
|
+
output_buffer.should have_tag("div.controls label", /2/)
|
263
|
+
output_buffer.should have_tag("div.controls label", /3/)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
240
267
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'spec_helper'
|
3
|
-
require 'active_record'
|
4
3
|
|
5
4
|
describe 'range input' do
|
6
5
|
|
@@ -9,7 +8,6 @@ describe 'range input' do
|
|
9
8
|
before do
|
10
9
|
@output_buffer = ''
|
11
10
|
mock_everything
|
12
|
-
Formtastic::Helpers::FormHelper.builder = FormtasticBootstrap::FormBuilder
|
13
11
|
end
|
14
12
|
|
15
13
|
describe "when object is provided" do
|
@@ -19,10 +17,11 @@ describe 'range input' do
|
|
19
17
|
end)
|
20
18
|
end
|
21
19
|
|
20
|
+
it_should_have_bootstrap_horizontal_wrapping
|
22
21
|
it_should_have_input_wrapper_with_class(:range)
|
23
|
-
it_should_have_input_wrapper_with_class(:
|
24
|
-
it_should_have_input_wrapper_with_class(:
|
25
|
-
|
22
|
+
it_should_have_input_wrapper_with_class(:input)
|
23
|
+
it_should_have_input_wrapper_with_class(:numeric)
|
24
|
+
it_should_have_input_wrapper_with_class(:stringish)
|
26
25
|
it_should_have_input_wrapper_with_id("author_age_input")
|
27
26
|
it_should_have_label_with_text(/Age/)
|
28
27
|
it_should_have_label_for("author_age")
|
@@ -44,6 +43,34 @@ describe 'range input' do
|
|
44
43
|
it_should_have_label_and_input_with_id("context2_author_age")
|
45
44
|
|
46
45
|
end
|
46
|
+
|
47
|
+
describe "when index is provided" do
|
48
|
+
|
49
|
+
before do
|
50
|
+
@output_buffer = ''
|
51
|
+
mock_everything
|
52
|
+
|
53
|
+
concat(semantic_form_for(@new_post) do |builder|
|
54
|
+
concat(builder.fields_for(:author, :index => 3) do |author|
|
55
|
+
concat(author.input(:name, :as => :range))
|
56
|
+
end)
|
57
|
+
end)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should index the id of the control-group' do
|
61
|
+
output_buffer.should have_tag("div.control-group#post_author_attributes_3_name_input")
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should index the id of the select tag' do
|
65
|
+
output_buffer.should have_tag("input#post_author_attributes_3_name")
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should index the name of the select tag' do
|
69
|
+
output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
47
74
|
|
48
75
|
describe "when validations require a minimum value (:greater_than)" do
|
49
76
|
before do
|
@@ -8,7 +8,6 @@ describe 'search input' do
|
|
8
8
|
before do
|
9
9
|
@output_buffer = ''
|
10
10
|
mock_everything
|
11
|
-
Formtastic::Helpers::FormHelper.builder = FormtasticBootstrap::FormBuilder
|
12
11
|
end
|
13
12
|
|
14
13
|
describe "when object is provided" do
|
@@ -18,10 +17,10 @@ describe 'search input' do
|
|
18
17
|
end)
|
19
18
|
end
|
20
19
|
|
20
|
+
it_should_have_bootstrap_horizontal_wrapping
|
21
21
|
it_should_have_input_wrapper_with_class(:search)
|
22
|
-
it_should_have_input_wrapper_with_class(:
|
22
|
+
it_should_have_input_wrapper_with_class(:input)
|
23
23
|
it_should_have_input_wrapper_with_class(:stringish)
|
24
|
-
it_should_have_input_class_in_the_right_place
|
25
24
|
it_should_have_input_wrapper_with_id("post_search_input")
|
26
25
|
it_should_have_label_with_text(/Search/)
|
27
26
|
it_should_have_label_for("post_search")
|
@@ -44,6 +43,33 @@ describe 'search input' do
|
|
44
43
|
|
45
44
|
end
|
46
45
|
|
46
|
+
describe "when index is provided" do
|
47
|
+
|
48
|
+
before do
|
49
|
+
@output_buffer = ''
|
50
|
+
mock_everything
|
51
|
+
|
52
|
+
concat(semantic_form_for(@new_post) do |builder|
|
53
|
+
concat(builder.fields_for(:author, :index => 3) do |author|
|
54
|
+
concat(author.input(:name, :as => :search))
|
55
|
+
end)
|
56
|
+
end)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should index the id of the control-group' do
|
60
|
+
output_buffer.should have_tag("div.control-group#post_author_attributes_3_name_input")
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should index the id of the select tag' do
|
64
|
+
output_buffer.should have_tag("input#post_author_attributes_3_name")
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should index the name of the select tag' do
|
68
|
+
output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
47
73
|
describe "when required" do
|
48
74
|
it "should add the required attribute to the input's html options" do
|
49
75
|
with_config :use_required_attribute, true do
|