formtastic-bootstrap 1.2.0 → 2.0.0
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.
- 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 'select 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 'explicit values' do
|
@@ -24,10 +23,10 @@ describe 'select input' do
|
|
24
23
|
|
25
24
|
it 'should have a option for each key and/or value' do
|
26
25
|
@array_with_values.each do |v|
|
27
|
-
output_buffer.should have_tag("form div.
|
26
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{v}']", /^#{v}$/)
|
28
27
|
end
|
29
28
|
@array_with_keys_and_values.each do |v|
|
30
|
-
output_buffer.should have_tag("form div.
|
29
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{v.second}']", /^#{v.first}$/)
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
@@ -41,9 +40,9 @@ describe 'select input' do
|
|
41
40
|
end
|
42
41
|
|
43
42
|
it 'should draw select options' do
|
44
|
-
output_buffer.should have_tag('form div.
|
45
|
-
output_buffer.should have_tag('form div.
|
46
|
-
output_buffer.should_not have_tag('form div.
|
43
|
+
output_buffer.should have_tag('form div.control-group div.controls select')
|
44
|
+
output_buffer.should have_tag('form div.control-group div.controls select#post_reviewer_id')
|
45
|
+
output_buffer.should_not have_tag('form div.control-group div.controls select#post_mongoid_reviewer_id')
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
@@ -57,14 +56,14 @@ describe 'select input' do
|
|
57
56
|
|
58
57
|
it 'should have an option for each value' do
|
59
58
|
@range_with_values.each do |v|
|
60
|
-
output_buffer.should have_tag("form div.
|
59
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{v}']", /^#{v}$/)
|
61
60
|
end
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
65
64
|
describe 'using a string' do
|
66
65
|
before do
|
67
|
-
@string ="<option value='0'>0</option><option value='1'>1</option>"
|
66
|
+
@string ="<option value='0'>0</option><option value='1'>1</option>".html_safe
|
68
67
|
concat(semantic_form_for(@new_post) do |builder|
|
69
68
|
concat(builder.input(:title, :as => :select, :collection => @string))
|
70
69
|
end)
|
@@ -72,18 +71,53 @@ describe 'select input' do
|
|
72
71
|
|
73
72
|
it 'should render select options using provided HTML string' do
|
74
73
|
2.times do |v|
|
75
|
-
output_buffer.should have_tag("form div.
|
74
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{v}']", /^#{v}$/)
|
76
75
|
end
|
77
76
|
end
|
78
77
|
end
|
78
|
+
|
79
|
+
describe 'using a nil name' do
|
80
|
+
before do
|
81
|
+
concat(semantic_form_for(@new_post) do |builder|
|
82
|
+
concat(builder.input(:title, :as => :select, :collection => [], :input_html => {:name => nil}))
|
83
|
+
end)
|
84
|
+
end
|
85
|
+
|
86
|
+
it_should_have_select_with_name("post[title]")
|
87
|
+
end
|
79
88
|
end
|
80
89
|
|
81
90
|
describe 'for boolean columns' do
|
91
|
+
pending
|
82
92
|
# describe 'default formtastic locale' do
|
83
93
|
# before do
|
84
94
|
# # Note: Works, but something like Formtastic.root.join(...) would probably be "safer".
|
85
|
-
# ::I18n.load_path = [File.join(File.dirname(__FILE__), *%w[.. .. lib locale en.yml])]
|
86
|
-
# ::I18n.backend.send(:init_translations)
|
95
|
+
# # ::I18n.load_path = [File.join(File.dirname(__FILE__), *%w[.. .. lib locale en.yml])]
|
96
|
+
# # ::I18n.backend.send(:init_translations)
|
97
|
+
#
|
98
|
+
# concat(semantic_form_for(@new_post) do |builder|
|
99
|
+
# concat(builder.input(:published, :as => :select))
|
100
|
+
# end)
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# after do
|
104
|
+
# # ::I18n.load_path = []
|
105
|
+
# # ::I18n.backend.store_translations :en, {}
|
106
|
+
# end
|
107
|
+
#
|
108
|
+
#
|
109
|
+
# it 'should render a select with at least options: true/false' do
|
110
|
+
# # I don't wanna deal with this right now.
|
111
|
+
# pending
|
112
|
+
# # output_buffer.should have_tag("form div.control-group div.controls select option[@value='true']", /^Yes$/)
|
113
|
+
# # output_buffer.should have_tag("form div.control-group div.controls select option[@value='false']", /^No$/)
|
114
|
+
# end
|
115
|
+
# end
|
116
|
+
#
|
117
|
+
# describe 'custom locale' do
|
118
|
+
# before do
|
119
|
+
# @boolean_select_labels = {:yes => 'Yep', :no => 'Nope'}
|
120
|
+
# ::I18n.backend.store_translations :en, :formtastic => @boolean_select_labels
|
87
121
|
#
|
88
122
|
# concat(semantic_form_for(@new_post) do |builder|
|
89
123
|
# concat(builder.input(:published, :as => :select))
|
@@ -95,30 +129,10 @@ describe 'select input' do
|
|
95
129
|
# end
|
96
130
|
#
|
97
131
|
# it 'should render a select with at least options: true/false' do
|
98
|
-
# output_buffer.should have_tag("form div.
|
99
|
-
# output_buffer.should have_tag("form div.
|
132
|
+
# output_buffer.should have_tag("form div.control-group div.controls select option[@value='true']", /#{@boolean_select_labels[:yes]}/)
|
133
|
+
# output_buffer.should have_tag("form div.control-group div.controls select option[@value='false']", /#{@boolean_select_labels[:no]}/)
|
100
134
|
# end
|
101
135
|
# end
|
102
|
-
|
103
|
-
describe 'custom locale' do
|
104
|
-
before do
|
105
|
-
@boolean_select_labels = {:yes => 'Yep', :no => 'Nope'}
|
106
|
-
::I18n.backend.store_translations :en, :formtastic => @boolean_select_labels
|
107
|
-
|
108
|
-
concat(semantic_form_for(@new_post) do |builder|
|
109
|
-
concat(builder.input(:published, :as => :select))
|
110
|
-
end)
|
111
|
-
end
|
112
|
-
|
113
|
-
after do
|
114
|
-
::I18n.backend.store_translations :en, {}
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'should render a select with at least options: true/false' do
|
118
|
-
output_buffer.should have_tag("form div.clearfix div.input select option[@value='true']", /#{@boolean_select_labels[:yes]}/)
|
119
|
-
output_buffer.should have_tag("form div.clearfix div.input select option[@value='false']", /#{@boolean_select_labels[:no]}/)
|
120
|
-
end
|
121
|
-
end
|
122
136
|
end
|
123
137
|
|
124
138
|
describe 'for a belongs_to association' do
|
@@ -129,9 +143,9 @@ describe 'select input' do
|
|
129
143
|
end)
|
130
144
|
end
|
131
145
|
|
146
|
+
it_should_have_bootstrap_horizontal_wrapping
|
132
147
|
it_should_have_input_wrapper_with_class("select")
|
133
|
-
it_should_have_input_wrapper_with_class(:
|
134
|
-
it_should_have_input_class_in_the_right_place
|
148
|
+
it_should_have_input_wrapper_with_class(:input)
|
135
149
|
it_should_have_input_wrapper_with_id("post_author_input")
|
136
150
|
it_should_have_label_with_text(/Author/)
|
137
151
|
it_should_have_label_for('post_author_id')
|
@@ -140,38 +154,42 @@ describe 'select input' do
|
|
140
154
|
it_should_use_the_collection_when_provided(:select, 'option')
|
141
155
|
|
142
156
|
it 'should have a select inside the wrapper' do
|
143
|
-
output_buffer.should have_tag('form div.
|
144
|
-
output_buffer.should have_tag('form div.
|
145
|
-
output_buffer.should have_tag('form div.
|
157
|
+
output_buffer.should have_tag('form div.control-group div.controls select')
|
158
|
+
output_buffer.should have_tag('form div.control-group div.controls select#post_author_id')
|
159
|
+
output_buffer.should have_tag('form div.control-group div.controls select#post_reviewer_id')
|
146
160
|
end
|
147
161
|
|
148
162
|
it 'should have a valid name' do
|
149
|
-
output_buffer.should have_tag("form div.
|
150
|
-
output_buffer.should_not have_tag("form div.
|
151
|
-
output_buffer.should_not have_tag("form div.
|
163
|
+
output_buffer.should have_tag("form div.control-group div.controls select[@name='post[author_id]']")
|
164
|
+
output_buffer.should_not have_tag("form div.control-group div.controls select[@name='post[author_id][]']")
|
165
|
+
output_buffer.should_not have_tag("form div.control-group div.controls select[@name='post[reviewer_id][]']")
|
152
166
|
end
|
153
167
|
|
154
168
|
it 'should not create a multi-select' do
|
155
|
-
output_buffer.should_not have_tag('form div.
|
169
|
+
output_buffer.should_not have_tag('form div.control-group div.controls select[@multiple]')
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'should not add a hidden input' do
|
173
|
+
output_buffer.should_not have_tag('form li input[@type="hidden"]')
|
156
174
|
end
|
157
175
|
|
158
176
|
it 'should create a select without size' do
|
159
|
-
output_buffer.should_not have_tag('form div.
|
177
|
+
output_buffer.should_not have_tag('form div.control-group div.controls select[@size]')
|
160
178
|
end
|
161
179
|
|
162
180
|
it 'should have a blank option' do
|
163
|
-
output_buffer.should have_tag("form div.
|
181
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']")
|
164
182
|
end
|
165
183
|
|
166
184
|
it 'should have a select option for each Author' do
|
167
|
-
output_buffer.should have_tag("form div.
|
185
|
+
output_buffer.should have_tag("form div.control-group div.controls select[@name='post[author_id]'] option", :count => ::Author.all.size + 1)
|
168
186
|
::Author.all.each do |author|
|
169
|
-
output_buffer.should have_tag("form div.
|
187
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{author.id}']", /#{author.to_label}/)
|
170
188
|
end
|
171
189
|
end
|
172
190
|
|
173
191
|
it 'should have one option with a "selected" attribute (bob)' do
|
174
|
-
output_buffer.should have_tag("form div.
|
192
|
+
output_buffer.should have_tag("form div.control-group div.controls select[@name='post[author_id]'] option[@selected]", :count => 1)
|
175
193
|
end
|
176
194
|
|
177
195
|
it 'should not singularize the association name' do
|
@@ -183,7 +201,7 @@ describe 'select input' do
|
|
183
201
|
concat(builder.input(:author_status, :as => :select))
|
184
202
|
end)
|
185
203
|
|
186
|
-
output_buffer.should have_tag('form div.
|
204
|
+
output_buffer.should have_tag('form div.control-group div.controls select#post_author_status_id')
|
187
205
|
end
|
188
206
|
end
|
189
207
|
|
@@ -194,9 +212,11 @@ describe 'select input' do
|
|
194
212
|
[@freds_post].each { |post| post.stub!(:to_label).and_return("Post - #{post.id}") }
|
195
213
|
@fred.should_receive(:posts)
|
196
214
|
|
197
|
-
|
198
|
-
concat(
|
199
|
-
|
215
|
+
with_deprecation_silenced do
|
216
|
+
concat(semantic_form_for(@new_post) do |builder|
|
217
|
+
concat(builder.input(:main_post, :as => :select, :group_by => :author ) )
|
218
|
+
end)
|
219
|
+
end
|
200
220
|
end
|
201
221
|
end
|
202
222
|
|
@@ -221,8 +241,10 @@ describe 'select input' do
|
|
221
241
|
::Author.should_receive(:scoped).with(:conditions => {:active => true})
|
222
242
|
::Author.should_receive(:where).with({:publisher => true})
|
223
243
|
|
224
|
-
|
225
|
-
|
244
|
+
with_deprecation_silenced do
|
245
|
+
semantic_form_for(@new_post) do |builder|
|
246
|
+
concat(builder.input(:author, :as => :select, :find_options => {:conditions => {:publisher => true}}))
|
247
|
+
end
|
226
248
|
end
|
227
249
|
end
|
228
250
|
end
|
@@ -245,12 +267,14 @@ describe 'select input' do
|
|
245
267
|
continent.stub!(:authors).and_return([@authors[i]])
|
246
268
|
end
|
247
269
|
|
248
|
-
|
249
|
-
concat(
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
270
|
+
with_deprecation_silenced do
|
271
|
+
concat(semantic_form_for(@new_post) do |builder|
|
272
|
+
concat(builder.input(:author, :as => :select, :group_by => :continent ) )
|
273
|
+
concat(builder.input(:author, :as => :select, :group_by => :continent, :group_label => :id ) )
|
274
|
+
concat(builder.input(:author, :as => :select, :group_by => :continent, :member_label => :login ) )
|
275
|
+
concat(builder.input(:author, :as => :select, :group_by => :continent, :member_label => :login, :group_label => :id ) )
|
276
|
+
end)
|
277
|
+
end
|
254
278
|
end
|
255
279
|
|
256
280
|
it_should_have_input_wrapper_with_class("select")
|
@@ -262,36 +286,38 @@ describe 'select input' do
|
|
262
286
|
|
263
287
|
0.upto(1) do |i|
|
264
288
|
it 'should have all option groups and the right values' do
|
265
|
-
output_buffer.should have_tag("form div.
|
289
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='#{@continent_names[i]}']", @authors[i].to_label)
|
266
290
|
end
|
267
291
|
|
268
292
|
it 'should have custom group labels' do
|
269
|
-
output_buffer.should have_tag("form div.
|
293
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='#{@continents[i].id}']", @authors[i].to_label)
|
270
294
|
end
|
271
295
|
|
272
296
|
it 'should have custom author labels' do
|
273
|
-
output_buffer.should have_tag("form div.
|
297
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='#{@continent_names[i]}']", @authors[i].login)
|
274
298
|
end
|
275
299
|
|
276
300
|
it 'should have custom author and group labels' do
|
277
|
-
output_buffer.should have_tag("form div.
|
301
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='#{@continents[i].id}']", @authors[i].login)
|
278
302
|
end
|
279
303
|
end
|
280
304
|
|
281
305
|
it 'should have no duplicate groups' do
|
282
|
-
output_buffer.should have_tag('form div.
|
306
|
+
output_buffer.should have_tag('form div.control-group div.controls select optgroup', :count => 8)
|
283
307
|
end
|
284
308
|
|
285
309
|
it 'should sort the groups on the label method' do
|
286
|
-
output_buffer.should have_tag("form div.
|
287
|
-
output_buffer.should have_tag("form div.
|
310
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='Africa']")
|
311
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='99']")
|
288
312
|
end
|
289
313
|
|
290
314
|
it 'should call find with :include for more optimized queries' do
|
291
315
|
Author.should_receive(:where).with(:include => :continent)
|
292
316
|
|
293
|
-
|
294
|
-
|
317
|
+
with_deprecation_silenced do
|
318
|
+
semantic_form_for(@new_post) do |builder|
|
319
|
+
concat(builder.input(:author, :as => :select, :group_by => :continent ) )
|
320
|
+
end
|
295
321
|
end
|
296
322
|
end
|
297
323
|
end
|
@@ -312,27 +338,31 @@ describe 'select input' do
|
|
312
338
|
it_should_use_the_collection_when_provided(:select, 'option')
|
313
339
|
|
314
340
|
it 'should have a select inside the wrapper' do
|
315
|
-
output_buffer.should have_tag('form div.
|
316
|
-
output_buffer.should have_tag('form div.
|
341
|
+
output_buffer.should have_tag('form div.control-group div.controls select')
|
342
|
+
output_buffer.should have_tag('form div.control-group div.controls select#author_post_ids')
|
317
343
|
end
|
318
344
|
|
319
345
|
it 'should have a multi-select select' do
|
320
|
-
output_buffer.should have_tag('form div.
|
346
|
+
output_buffer.should have_tag('form div.control-group div.controls select[@multiple="multiple"]')
|
321
347
|
end
|
322
|
-
|
348
|
+
|
323
349
|
it 'should append [] to the name attribute for multiple select' do
|
324
|
-
output_buffer.should have_tag('form div.
|
350
|
+
output_buffer.should have_tag('form div.control-group div.controls select[@multiple="multiple"][@name="author[post_ids][]"]')
|
351
|
+
end
|
352
|
+
|
353
|
+
it 'should have a hidden field' do
|
354
|
+
output_buffer.should have_tag('form div.control-group input[@type="hidden"][@name="author[post_ids][]"]')
|
325
355
|
end
|
326
356
|
|
327
357
|
it 'should have a select option for each Post' do
|
328
|
-
output_buffer.should have_tag('form div.
|
358
|
+
output_buffer.should have_tag('form div.control-group div.controls select option', :count => ::Post.all.size)
|
329
359
|
::Post.all.each do |post|
|
330
|
-
output_buffer.should have_tag("form div.
|
360
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{post.id}']", /#{post.to_label}/)
|
331
361
|
end
|
332
362
|
end
|
333
363
|
|
334
364
|
it 'should not have a blank option by default' do
|
335
|
-
output_buffer.should_not have_tag("form div.
|
365
|
+
output_buffer.should_not have_tag("form div.control-group div.controls select option[@value='']")
|
336
366
|
end
|
337
367
|
|
338
368
|
it 'should respect the :include_blank option for single selects' do
|
@@ -340,7 +370,7 @@ describe 'select input' do
|
|
340
370
|
concat(builder.input(:posts, :as => :select, :multiple => false, :include_blank => true))
|
341
371
|
end)
|
342
372
|
|
343
|
-
output_buffer.should have_tag("form div.
|
373
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']")
|
344
374
|
end
|
345
375
|
|
346
376
|
it 'should respect the :include_blank option for multiple selects' do
|
@@ -348,11 +378,11 @@ describe 'select input' do
|
|
348
378
|
concat(builder.input(:posts, :as => :select, :multiple => true, :include_blank => true))
|
349
379
|
end)
|
350
380
|
|
351
|
-
output_buffer.should have_tag("form div.
|
381
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']")
|
352
382
|
end
|
353
383
|
|
354
384
|
it 'should have one option with a "selected" attribute' do
|
355
|
-
output_buffer.should have_tag('form div.
|
385
|
+
output_buffer.should have_tag('form div.control-group div.controls select option[@selected]', :count => 1)
|
356
386
|
end
|
357
387
|
end
|
358
388
|
|
@@ -372,23 +402,23 @@ describe 'select input' do
|
|
372
402
|
it_should_use_the_collection_when_provided(:select, 'option')
|
373
403
|
|
374
404
|
it 'should have a select inside the wrapper' do
|
375
|
-
output_buffer.should have_tag('form div.
|
376
|
-
output_buffer.should have_tag('form div.
|
405
|
+
output_buffer.should have_tag('form div.control-group div.controls select')
|
406
|
+
output_buffer.should have_tag('form div.control-group div.controls select#post_author_ids')
|
377
407
|
end
|
378
408
|
|
379
409
|
it 'should have a multi-select select' do
|
380
|
-
output_buffer.should have_tag('form div.
|
410
|
+
output_buffer.should have_tag('form div.control-group div.controls select[@multiple="multiple"]')
|
381
411
|
end
|
382
412
|
|
383
413
|
it 'should have a select option for each Author' do
|
384
|
-
output_buffer.should have_tag('form div.
|
414
|
+
output_buffer.should have_tag('form div.control-group div.controls select option', :count => ::Author.all.size)
|
385
415
|
::Author.all.each do |author|
|
386
|
-
output_buffer.should have_tag("form div.
|
416
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{author.id}']", /#{author.to_label}/)
|
387
417
|
end
|
388
418
|
end
|
389
419
|
|
390
420
|
it 'should not have a blank option by default' do
|
391
|
-
output_buffer.should_not have_tag("form div.
|
421
|
+
output_buffer.should_not have_tag("form div.control-group div.controls select option[@value='']")
|
392
422
|
end
|
393
423
|
|
394
424
|
it 'should respect the :include_blank option for single selects' do
|
@@ -396,7 +426,7 @@ describe 'select input' do
|
|
396
426
|
concat(builder.input(:authors, :as => :select, :multiple => false, :include_blank => true))
|
397
427
|
end)
|
398
428
|
|
399
|
-
output_buffer.should have_tag("form div.
|
429
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']")
|
400
430
|
end
|
401
431
|
|
402
432
|
it 'should respect the :include_blank option for multiple selects' do
|
@@ -404,11 +434,11 @@ describe 'select input' do
|
|
404
434
|
concat(builder.input(:authors, :as => :select, :multiple => true, :include_blank => true))
|
405
435
|
end)
|
406
436
|
|
407
|
-
output_buffer.should have_tag("form div.
|
437
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']")
|
408
438
|
end
|
409
439
|
|
410
440
|
it 'should have one option with a "selected" attribute' do
|
411
|
-
output_buffer.should have_tag('form div.
|
441
|
+
output_buffer.should have_tag('form div.control-group div.controls select option[@selected]', :count => 1)
|
412
442
|
end
|
413
443
|
end
|
414
444
|
|
@@ -421,11 +451,11 @@ describe 'select input' do
|
|
421
451
|
end
|
422
452
|
|
423
453
|
it 'should have a select with prompt' do
|
424
|
-
output_buffer.should have_tag("form div.
|
454
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']", /choose author/, :count => 1)
|
425
455
|
end
|
426
456
|
|
427
|
-
it 'should not have a blank select option' do
|
428
|
-
output_buffer.
|
457
|
+
it 'should not have a second blank select option' do
|
458
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='']", :count => 1)
|
429
459
|
end
|
430
460
|
end
|
431
461
|
|
@@ -437,18 +467,18 @@ describe 'select input' do
|
|
437
467
|
end
|
438
468
|
|
439
469
|
it 'should generate label' do
|
440
|
-
output_buffer.should have_tag('form div.
|
441
|
-
output_buffer.should have_tag("form div.
|
470
|
+
output_buffer.should have_tag('form div.control-group label.control-label', /Author/)
|
471
|
+
output_buffer.should have_tag("form div.control-group label.control-label[@for='project_author']")
|
442
472
|
end
|
443
473
|
|
444
474
|
it 'should generate select inputs' do
|
445
|
-
output_buffer.should have_tag('form div.
|
446
|
-
output_buffer.should have_tag('form div.
|
475
|
+
output_buffer.should have_tag('form div.control-group div.controls select#project_author')
|
476
|
+
output_buffer.should have_tag('form div.control-group div.controls select option', :count => ::Author.all.size + 1)
|
447
477
|
end
|
448
478
|
|
449
479
|
it 'should generate an option to each item' do
|
450
480
|
::Author.all.each do |author|
|
451
|
-
output_buffer.should have_tag("form div.
|
481
|
+
output_buffer.should have_tag("form div.control-group div.controls select option[@value='#{author.id}']", /#{author.to_label}/)
|
452
482
|
end
|
453
483
|
end
|
454
484
|
end
|
@@ -459,27 +489,27 @@ describe 'select input' do
|
|
459
489
|
concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
460
490
|
concat(builder.input(:author_name, :as => :select, :collection => ::Author.all))
|
461
491
|
end)
|
462
|
-
output_buffer.should have_tag("form div.
|
492
|
+
output_buffer.should have_tag("form div.control-group div.controls select[@name='project[author_name]']")
|
463
493
|
end
|
464
|
-
|
494
|
+
|
465
495
|
describe 'and :multiple is set to true through :input_html' do
|
466
496
|
it "should make the select a multi-select" do
|
467
497
|
concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
468
498
|
concat(builder.input(:author_name, :as => :select, :input_html => {:multiple => true} ))
|
469
499
|
end)
|
470
|
-
output_buffer.should have_tag("form div.
|
500
|
+
output_buffer.should have_tag("form div.control-group div.controls select[@multiple]")
|
471
501
|
end
|
472
502
|
end
|
473
|
-
|
503
|
+
|
474
504
|
describe 'and :multiple is set to true' do
|
475
505
|
it "should make the select a multi-select" do
|
476
506
|
concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
477
507
|
concat(builder.input(:author_name, :as => :select, :multiple => true, :collection => ["Fred", "Bob"]))
|
478
508
|
end)
|
479
|
-
output_buffer.should have_tag("form div.
|
509
|
+
output_buffer.should have_tag("form div.control-group div.controls select[@multiple]")
|
480
510
|
end
|
481
511
|
end
|
482
|
-
|
512
|
+
|
483
513
|
end
|
484
514
|
|
485
515
|
describe 'when a grouped collection collection is given' do
|
@@ -494,12 +524,12 @@ describe 'select input' do
|
|
494
524
|
|
495
525
|
it 'should generate an option to each item' do
|
496
526
|
@grouped_opts.each do |opt_pair|
|
497
|
-
output_buffer.should have_tag("form div.
|
527
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='#{opt_pair[0]}']")
|
498
528
|
opt_pair[1].each do |v|
|
499
|
-
output_buffer.should have_tag("form div.
|
529
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup[@label='#{opt_pair[0]}'] option[@value='#{v}']")
|
500
530
|
end
|
501
531
|
end
|
502
|
-
output_buffer.should have_tag("form div.
|
532
|
+
output_buffer.should have_tag("form div.control-group div.controls select optgroup option[@selected]","hands")
|
503
533
|
end
|
504
534
|
end
|
505
535
|
|
@@ -521,7 +551,7 @@ describe 'select input' do
|
|
521
551
|
end
|
522
552
|
|
523
553
|
it "should render a select field" do
|
524
|
-
output_buffer.should have_tag("form div.
|
554
|
+
output_buffer.should have_tag("form div.control-group div.controls select", :count => 2)
|
525
555
|
end
|
526
556
|
end
|
527
557
|
|
@@ -537,7 +567,7 @@ describe 'select input' do
|
|
537
567
|
end
|
538
568
|
|
539
569
|
it "should render a text field" do
|
540
|
-
output_buffer.should have_tag("form div.
|
570
|
+
output_buffer.should have_tag("form div.control-group div.controls input[@type='text']", :count => 2)
|
541
571
|
end
|
542
572
|
end
|
543
573
|
end
|
@@ -552,6 +582,33 @@ describe 'select input' do
|
|
552
582
|
it_should_have_select_with_id("context2_post_author_ids")
|
553
583
|
it_should_have_label_for("context2_post_author_ids")
|
554
584
|
end
|
585
|
+
|
586
|
+
describe "when index is provided" do
|
587
|
+
|
588
|
+
before do
|
589
|
+
@output_buffer = ''
|
590
|
+
mock_everything
|
591
|
+
|
592
|
+
concat(semantic_form_for(@new_post) do |builder|
|
593
|
+
concat(builder.fields_for(:author, :index => 3) do |author|
|
594
|
+
concat(author.input(:name, :as => :select))
|
595
|
+
end)
|
596
|
+
end)
|
597
|
+
end
|
598
|
+
|
599
|
+
it 'should index the id of the control-group' do
|
600
|
+
output_buffer.should have_tag("div.control-group#post_author_attributes_3_name_input")
|
601
|
+
end
|
602
|
+
|
603
|
+
it 'should index the id of the select tag' do
|
604
|
+
output_buffer.should have_tag("select#post_author_attributes_3_name")
|
605
|
+
end
|
606
|
+
|
607
|
+
it 'should index the name of the select' do
|
608
|
+
output_buffer.should have_tag("select[@name='post[author_attributes][3][name]']")
|
609
|
+
end
|
610
|
+
|
611
|
+
end
|
555
612
|
|
556
613
|
context "when required" do
|
557
614
|
it "should add the required attribute to the select's html options" do
|
@@ -8,7 +8,6 @@ describe 'string 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
|
@@ -17,11 +16,11 @@ describe 'string input' do
|
|
17
16
|
concat(builder.input(:title, :as => :string))
|
18
17
|
end)
|
19
18
|
end
|
20
|
-
|
19
|
+
|
20
|
+
it_should_have_bootstrap_horizontal_wrapping
|
21
21
|
it_should_have_input_wrapper_with_class(:string)
|
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_title_input")
|
26
25
|
it_should_have_label_with_text(/Title/)
|
27
26
|
it_should_have_label_for("post_title")
|
@@ -35,6 +34,7 @@ describe 'string input' do
|
|
35
34
|
it_should_apply_custom_for_to_label_when_input_html_id_provided(:string)
|
36
35
|
it_should_apply_error_logic_for_input_type(:string)
|
37
36
|
|
37
|
+
# This doesn't get called anywhere!
|
38
38
|
def input_field_for_method_should_have_maxlength(method, maxlength)
|
39
39
|
concat(semantic_form_for(@new_post) do |builder|
|
40
40
|
concat(builder.input(method))
|
@@ -63,7 +63,7 @@ describe 'string input' do
|
|
63
63
|
concat(builder.input(:title))
|
64
64
|
end)
|
65
65
|
|
66
|
-
output_buffer.should have_tag("form div.
|
66
|
+
output_buffer.should have_tag("form div.control-group div.controls input##{@new_post.class.name.underscore}_title[@maxlength='#{maxlength}']")
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'should have maxlength if the optional :if or :unless options are not supplied' do
|
@@ -126,6 +126,34 @@ describe 'string input' do
|
|
126
126
|
|
127
127
|
end
|
128
128
|
|
129
|
+
describe "when index is provided" do
|
130
|
+
|
131
|
+
before do
|
132
|
+
@output_buffer = ''
|
133
|
+
mock_everything
|
134
|
+
|
135
|
+
concat(semantic_form_for(@new_post) do |builder|
|
136
|
+
concat(builder.fields_for(:author, :index => 3) do |author|
|
137
|
+
concat(author.input(:name, :as => :string))
|
138
|
+
end)
|
139
|
+
end)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should index the id of the wrapper' do
|
143
|
+
output_buffer.should have_tag("div#post_author_attributes_3_name_input")
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should index the id of the select tag' do
|
147
|
+
output_buffer.should have_tag("input#post_author_attributes_3_name")
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should index the name of the select tag' do
|
151
|
+
output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
|
129
157
|
describe "when no object is provided" do
|
130
158
|
before do
|
131
159
|
concat(semantic_form_for(:project, :url => 'http://test.host/') do |builder|
|
@@ -178,22 +206,5 @@ describe 'string input' do
|
|
178
206
|
|
179
207
|
end
|
180
208
|
|
181
|
-
describe "with string prepended", :now => true do
|
182
|
-
|
183
|
-
before do
|
184
|
-
concat(semantic_form_for(:user) do |builder|
|
185
|
-
concat(builder.input(:handle, :as => :string, :prepend => '@'))
|
186
|
-
end)
|
187
|
-
end
|
188
|
-
|
189
|
-
it "should generate span with desired prepend string" do
|
190
|
-
output_buffer.should have_tag('form div.input div.input-prepend span.add-on', '@')
|
191
|
-
end
|
192
|
-
|
193
|
-
it "should wrap input in div.input-prepend" do
|
194
|
-
output_buffer.should have_tag('form div.input div.input-prepend input[name="user[handle]"]')
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
209
|
end
|
199
210
|
|