forme 2.2.0 → 2.3.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/spec/bs3_spec.rb DELETED
@@ -1,751 +0,0 @@
1
- require_relative 'spec_helper'
2
- require_relative '../lib/forme/bs3'
3
-
4
- describe "Forme Bootstrap3 (BS3) forms" do
5
- def sel(opts, s)
6
- opts.map{|o| "<option #{'selected="selected" ' if o == s}value=\"#{o}\">#{sprintf("%02i", o)}</option>"}.join
7
- end
8
-
9
- before do
10
- @f = Forme::Form.new(:config=>:bs3)
11
- end
12
-
13
- it "should create a simple input tags" do
14
- @f.input(:text).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
15
- @f.input(:radio).must_equal '<div class="radio"><input type="radio"/></div>'
16
- @f.input(:password).must_equal '<div class="form-group"><input class="form-control" type="password"/></div>'
17
- @f.input(:checkbox).must_equal '<div class="checkbox"><input type="checkbox"/></div>'
18
- @f.input(:submit).must_equal '<input class="btn btn-default" type="submit"/>'
19
- end
20
-
21
- it "should remove form-control class from attributes for checkbox tag" do
22
- @f.tag(:input, :type=>:checkbox, :class=>'form-control').must_equal '<input type="checkbox"/>'
23
- end
24
-
25
- it "should use :name option as attribute" do
26
- @f.input(:text, :name=>"foo").must_equal '<div class="form-group"><input class="form-control" name="foo" type="text"/></div>'
27
- end
28
-
29
- it "should use :id option as attribute" do
30
- @f.input(:text, :id=>"foo").must_equal '<div class="form-group"><input class="form-control" id="foo" type="text"/></div>'
31
- end
32
-
33
- it "should use :class option as attribute" do
34
- @f.input(:text, :class=>"foo").must_equal '<div class="form-group"><input class="form-control foo" type="text"/></div>'
35
- end
36
-
37
- it "should use :value option as attribute" do
38
- @f.input(:text, :value=>"foo").must_equal '<div class="form-group"><input class="form-control" type="text" value="foo"/></div>'
39
- end
40
-
41
- it "should use :placeholder option as attribute" do
42
- @f.input(:text, :placeholder=>"foo").must_equal '<div class="form-group"><input class="form-control" placeholder="foo" type="text"/></div>'
43
- end
44
-
45
- it "should use :style option as attribute" do
46
- @f.input(:text, :style=>"foo").must_equal '<div class="form-group"><input class="form-control" style="foo" type="text"/></div>'
47
- end
48
-
49
- it "should use :key option as name and id attributes" do
50
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group"><input class="form-control" id="foo" name="foo" type="text"/></div>'
51
- end
52
-
53
- it "should use :key_id option as suffix for :key option id attributes" do
54
- @f.input(:text, :key=>"foo", :key_id=>'bar').must_equal '<div class="form-group"><input class="form-control" id="foo_bar" name="foo" type="text"/></div>'
55
- end
56
-
57
- it "should have :key option respect :multiple option" do
58
- @f.input(:text, :key=>"foo", :multiple=>true).must_equal '<div class="form-group"><input class="form-control" id="foo" name="foo[]" type="text"/></div>'
59
- end
60
-
61
- it "should use :key option respect form's current namespace" do
62
- @f.with_opts(:namespace=>['bar']) do
63
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text"/></div>'
64
- @f.input(:text, :key=>"foo", :multiple=>true).must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo][]" type="text"/></div>'
65
- @f.with_opts(:namespace=>['bar', 'baz']) do
66
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group"><input class="form-control" id="bar_baz_foo" name="bar[baz][foo]" type="text"/></div>'
67
- end
68
- end
69
- end
70
-
71
- it "should consider form's :values hash for default values based on the :key option if :value is not present" do
72
- @f.opts[:values] = {'foo'=>'baz'}
73
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group"><input class="form-control" id="foo" name="foo" type="text" value="baz"/></div>'
74
- @f.input(:text, :key=>"foo", :value=>'x').must_equal '<div class="form-group"><input class="form-control" id="foo" name="foo" type="text" value="x"/></div>'
75
-
76
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="foo" name="foo" type="text" value="baz"/></div>'
77
- @f.opts[:values] = {:foo=>'baz'}
78
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="foo" name="foo" type="text" value="baz"/></div>'
79
- end
80
-
81
- it "should consider form's :values hash for default values based on the :key option when using namespaces" do
82
- @f.opts[:values] = {'bar'=>{'foo'=>'baz'}}
83
- @f.with_opts(:namespace=>['bar']) do
84
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text" value="baz"/></div>'
85
- @f.input(:text, :key=>"foo", :value=>'x').must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text" value="x"/></div>'
86
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text" value="baz"/></div>'
87
- end
88
-
89
- @f.with_opts(:namespace=>[:bar]) do
90
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text" value="baz"/></div>'
91
-
92
- @f.opts[:values] = {:bar=>{:foo=>'baz'}}
93
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text" value="baz"/></div>'
94
- @f.opts[:values] = {:bar=>{}}
95
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text"/></div>'
96
- @f.opts[:values] = {}
97
- @f.input(:text, :key=>:foo).must_equal '<div class="form-group"><input class="form-control" id="bar_foo" name="bar[foo]" type="text"/></div>'
98
-
99
- @f.opts[:values] = {'bar'=>{'quux'=>{'foo'=>'baz'}}}
100
- @f.with_opts(:namespace=>['bar', 'quux']) do
101
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group"><input class="form-control" id="bar_quux_foo" name="bar[quux][foo]" type="text" value="baz"/></div>'
102
- end
103
- end
104
- end
105
-
106
- it "should consider form's :errors hash based on the :key option" do
107
- @f.opts[:errors] = { 'foo' => 'must be present' }
108
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group has-error"><input aria-describedby="foo_error_message" aria-invalid="true" class="form-control" id="foo" name="foo" type="text"/><span class="help-block with-errors" id="foo_error_message">must be present</span></div>'
109
- end
110
-
111
- it "should consider form's :errors hash based on the :key option when using namespaces" do
112
- @f.opts[:errors] = { 'bar' => { 'foo' => 'must be present' } }
113
- @f.with_opts(:namespace=>['bar']) do
114
- @f.input(:text, :key=>"foo").must_equal '<div class="form-group has-error"><input aria-describedby="bar_foo_error_message" aria-invalid="true" class="form-control" id="bar_foo" name="bar[foo]" type="text"/><span class="help-block with-errors" id="bar_foo_error_message">must be present</span></div>'
115
- end
116
- end
117
-
118
- it "should support a with_obj method that changes the object and namespace for the given block" do
119
- @f.with_obj([:a, :c], 'bar') do
120
- @f.input(:first).must_equal '<div class="form-group"><input class="form-control" id="bar_first" name="bar[first]" type="text" value="a"/></div>'
121
- @f.with_obj([:b], 'baz') do
122
- @f.input(:first).must_equal '<div class="form-group"><input class="form-control" id="bar_baz_first" name="bar[baz][first]" type="text" value="b"/></div>'
123
- end
124
- @f.with_obj([:b], %w'baz quux') do
125
- @f.input(:first).must_equal '<div class="form-group"><input class="form-control" id="bar_baz_quux_first" name="bar[baz][quux][first]" type="text" value="b"/></div>'
126
- end
127
- @f.with_obj([:b]) do
128
- @f.input(:first).must_equal '<div class="form-group"><input class="form-control" id="bar_first" name="bar[first]" type="text" value="b"/></div>'
129
- end
130
- @f.input(:last).must_equal '<div class="form-group"><input class="form-control" id="bar_last" name="bar[last]" type="text" value="c"/></div>'
131
- end
132
- end
133
-
134
- it "should support a each_obj method that changes the object and namespace for multiple objects for the given block" do
135
- @f.tag(:form) do
136
- @f.each_obj([[:a, :c], [:b, :d]], 'bar') do
137
- @f.input(:first)
138
- @f.input(:last)
139
- end
140
- end.must_equal '<form><div class="form-group"><input class="form-control" id="bar_0_first" name="bar[0][first]" type="text" value="a"/></div><div class="form-group"><input class="form-control" id="bar_0_last" name="bar[0][last]" type="text" value="c"/></div><div class="form-group"><input class="form-control" id="bar_1_first" name="bar[1][first]" type="text" value="b"/></div><div class="form-group"><input class="form-control" id="bar_1_last" name="bar[1][last]" type="text" value="d"/></div></form>'
141
-
142
- @f.tag(:form) do
143
- @f.each_obj([[:a, :c], [:b, :d]], %w'bar baz') do
144
- @f.input(:first)
145
- @f.input(:last)
146
- end
147
- end.must_equal '<form><div class="form-group"><input class="form-control" id="bar_baz_0_first" name="bar[baz][0][first]" type="text" value="a"/></div><div class="form-group"><input class="form-control" id="bar_baz_0_last" name="bar[baz][0][last]" type="text" value="c"/></div><div class="form-group"><input class="form-control" id="bar_baz_1_first" name="bar[baz][1][first]" type="text" value="b"/></div><div class="form-group"><input class="form-control" id="bar_baz_1_last" name="bar[baz][1][last]" type="text" value="d"/></div></form>'
148
-
149
- @f.tag(:form) do
150
- @f.each_obj([[:a, :c], [:b, :d]]) do
151
- @f.input(:first)
152
- @f.input(:last)
153
- end
154
- end.must_equal '<form><div class="form-group"><input class="form-control" id="0_first" name="0[first]" type="text" value="a"/></div><div class="form-group"><input class="form-control" id="0_last" name="0[last]" type="text" value="c"/></div><div class="form-group"><input class="form-control" id="1_first" name="1[first]" type="text" value="b"/></div><div class="form-group"><input class="form-control" id="1_last" name="1[last]" type="text" value="d"/></div></form>'
155
- end
156
-
157
- it "should allow overriding form inputs on a per-block basis" do
158
- @f.input(:text).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
159
- @f.with_opts(:wrapper=>:div){@f.input(:text)}.must_equal '<div><input class="form-control" type="text"/></div>'
160
- @f.with_opts(:wrapper=>:div){@f.input(:text).must_equal '<div><input class="form-control" type="text"/></div>'}
161
- @f.with_opts(:wrapper=>:div) do
162
- @f.input(:text).must_equal '<div><input class="form-control" type="text"/></div>'
163
- @f.with_opts(:wrapper=>:li){@f.input(:text).must_equal '<li><input class="form-control" type="text"/></li>'}
164
- @f.input(:text).must_equal '<div><input class="form-control" type="text"/></div>'
165
- end
166
- @f.input(:text).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
167
- end
168
-
169
- it "should handle delayed formatting when overriding form inputs on a per-block basis" do
170
- @f.form do
171
- @f.input(:text)
172
- @f.with_opts(:wrapper=>:div) do
173
- @f.input(:text)
174
- @f.with_opts(:wrapper=>:li){@f.input(:text)}
175
- @f.input(:text)
176
- end
177
- @f.input(:text)
178
- end.must_equal '<form><div class="form-group"><input class="form-control" type="text"/></div><div><input class="form-control" type="text"/></div><li><input class="form-control" type="text"/></li><div><input class="form-control" type="text"/></div><div class="form-group"><input class="form-control" type="text"/></div></form>'
179
- end
180
-
181
- it "should support :obj method to with_opts for changing the obj inside the block" do
182
- @f.form do
183
- @f.with_opts(:obj=>[:a, :c]) do
184
- @f.input(:first)
185
- @f.with_opts(:obj=>[:b]){@f.input(:first)}
186
- @f.input(:last)
187
- end
188
- end.must_equal '<form><div class="form-group"><input class="form-control" id="first" name="first" type="text" value="a"/></div><div class="form-group"><input class="form-control" id="first" name="first" type="text" value="b"/></div><div class="form-group"><input class="form-control" id="last" name="last" type="text" value="c"/></div></form>'
189
- end
190
-
191
- it "should allow arbitrary attributes using the :attr option" do
192
- @f.input(:text, :attr=>{:bar=>"foo"}).must_equal '<div class="form-group"><input bar="foo" class="form-control" type="text"/></div>'
193
- end
194
-
195
- it "should convert the :data option into attributes" do
196
- @f.input(:text, :data=>{:bar=>"foo"}).must_equal '<div class="form-group"><input class="form-control" data-bar="foo" type="text"/></div>'
197
- end
198
-
199
- it "should support the :dasherize_data option when using the :data option" do
200
- @f.input(:text, :data=>{:bar_baz=>"foo"}, :dasherize_data=>true).must_equal '<div class="form-group"><input class="form-control" data-bar-baz="foo" type="text"/></div>'
201
- end
202
-
203
- it "should not have standard options override the :attr option" do
204
- @f.input(:text, :name=>:bar, :attr=>{:name=>"foo"}).must_equal '<div class="form-group"><input class="form-control" name="foo" type="text"/></div>'
205
- end
206
-
207
- it "should combine :class standard option with :attr option" do
208
- @f.input(:text, :class=>:bar, :attr=>{:class=>"foo"}).must_equal '<div class="form-group"><input class="form-control foo bar" type="text"/></div>'
209
- end
210
-
211
- it "should not have :data options override the :attr option" do
212
- @f.input(:text, :data=>{:bar=>"baz"}, :attr=>{:"data-bar"=>"foo"}).must_equal '<div class="form-group"><input class="form-control" data-bar="foo" type="text"/></div>'
213
- end
214
-
215
- it "should use :size and :maxlength options as attributes for text inputs" do
216
- @f.input(:text, :size=>5, :maxlength=>10).must_equal '<div class="form-group"><input class="form-control" maxlength="10" size="5" type="text"/></div>'
217
- @f.input(:textarea, :size=>5, :maxlength=>10).must_equal '<div class="form-group"><textarea class="form-control"></textarea></div>'
218
- end
219
-
220
- it "should create hidden input with value 0 for each checkbox with a name" do
221
- @f.input(:checkbox, :name=>"foo").must_equal '<div class="checkbox"><input name="foo" type="hidden" value="0"/><input name="foo" type="checkbox"/></div>'
222
- end
223
-
224
- it "should not create hidden input with value 0 for each checkbox with a name if :no_hidden option is used" do
225
- @f.input(:checkbox, :name=>"foo", :no_hidden=>true).must_equal '<div class="checkbox"><input name="foo" type="checkbox"/></div>'
226
- end
227
-
228
- it "should create hidden input with _hidden appended to id for each checkbox with a name and id" do
229
- @f.input(:checkbox, :name=>"foo", :id=>"bar").must_equal '<div class="checkbox"><input id="bar_hidden" name="foo" type="hidden" value="0"/><input id="bar" name="foo" type="checkbox"/></div>'
230
- end
231
-
232
- it "should create hidden input with value f for each checkbox with a name and value t" do
233
- @f.input(:checkbox, :name=>"foo", :value=>"t").must_equal '<div class="checkbox"><input name="foo" type="hidden" value="f"/><input name="foo" type="checkbox" value="t"/></div>'
234
- end
235
-
236
- it "should use :hidden_value option for value of hidden input for checkbox" do
237
- @f.input(:checkbox, :name=>"foo", :hidden_value=>"no").must_equal '<div class="checkbox"><input name="foo" type="hidden" value="no"/><input name="foo" type="checkbox"/></div>'
238
- end
239
-
240
- it "should create hidden input" do
241
- @f.input(:hidden).must_equal '<input type="hidden"/>'
242
- end
243
-
244
- it "should handle :checked option" do
245
- @f.input(:checkbox, :checked=>true).must_equal '<div class="checkbox"><input checked="checked" type="checkbox"/></div>'
246
- @f.input(:checkbox, :checked=>false).must_equal '<div class="checkbox"><input type="checkbox"/></div>'
247
- end
248
-
249
- it "should create textarea tag" do
250
- @f.input(:textarea).must_equal '<div class="form-group"><textarea class="form-control"></textarea></div>'
251
- @f.input(:textarea, :value=>'a').must_equal '<div class="form-group"><textarea class="form-control">a</textarea></div>'
252
- end
253
-
254
- it "should use :cols and :rows options as attributes for textarea inputs" do
255
- @f.input(:text, :cols=>5, :rows=>10).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
256
- @f.input(:textarea, :cols=>5, :rows=>10).must_equal '<div class="form-group"><textarea class="form-control" cols="5" rows="10"></textarea></div>'
257
- end
258
-
259
- it "should create select tag" do
260
- @f.input(:select).must_equal '<div class="form-group"><select class="form-control"></select></div>'
261
- end
262
-
263
- it "should respect multiple and size options in select tag" do
264
- @f.input(:select, :multiple=>true, :size=>10).must_equal '<div class="form-group"><select class="form-control" multiple="multiple" size="10"></select></div>'
265
- end
266
-
267
- it "should create date tag" do
268
- @f.input(:date).must_equal '<div class="form-group"><input class="form-control" type="date"/></div>'
269
- end
270
-
271
- it "should create datetime-local tag" do
272
- @f.input(:datetime).must_equal '<div class="form-group"><input class="form-control" type="datetime-local"/></div>'
273
- end
274
-
275
- it "should not error for input type :input" do
276
- @f.input(:input).must_equal '<div class="form-group"><input class="form-control" type="input"/></div>'
277
- end
278
-
279
- it "should use multiple select boxes for dates if the :as=>:select option is given" do
280
- @f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5)).must_equal %{<div class="form-group"><select class="form-control" id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<select class="form-control" id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select class="form-control" id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select></div>}
281
- end
282
-
283
- it "should allow ordering date select boxes via :order" do
284
- @f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :order=>[:month, '/', :day, '/', :year]).must_equal %{<div class="form-group"><select class="form-control" id="bar" name="foo[month]">#{sel(1..12, 6)}</select>/<select class="form-control" id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select>/<select class="form-control" id="bar_year" name="foo[year]">#{sel(1900..2050, 2011)}</select></div>}
285
- end
286
-
287
- it "should allow only using specific date select boxes via :order" do
288
- @f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :order=>[:month, :year]).must_equal %{<div class="form-group"><select class="form-control" id="bar" name="foo[month]">#{sel(1..12, 6)}</select><select class="form-control" id="bar_year" name="foo[year]">#{sel(1900..2050, 2011)}</select></div>}
289
- end
290
-
291
- it "should support :select_options for dates when :as=>:select is given" do
292
- @f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :select_options=>{:year=>1970..2020}).must_equal %{<div class=\"form-group\"><select class="form-control" id="bar" name="foo[year]">#{sel(1970..2020, 2011)}</select>-<select class="form-control" id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select class="form-control" id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select></div>}
293
- end
294
-
295
- it "should have explicit labeler and trtd wrapper work with multiple select boxes for dates" do
296
- @f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :wrapper=>:trtd, :labeler=>:explicit, :label=>'Baz').must_equal %{<tr><td><label class="label-before" for="bar">Baz</label></td><td><select class="form-control" id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<select class="form-control" id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select class="form-control" id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select></td></tr>}
297
- end
298
-
299
- it "should use multiple select boxes for datetimes if the :as=>:select option is given" do
300
- @f.input(:datetime, :name=>"foo", :id=>"bar", :as=>:select, :value=>DateTime.new(2011, 6, 5, 4, 3, 2)).must_equal %{<div class=\"form-group\"><select class="form-control" id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<select class="form-control" id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select class="form-control" id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select> <select class="form-control" id="bar_hour" name="foo[hour]">#{sel(0..23, 4)}</select>:<select class="form-control" id="bar_minute" name="foo[minute]">#{sel(0..59, 3)}</select>:<select class="form-control" id="bar_second" name="foo[second]">#{sel(0..59, 2)}</select></div>}
301
- end
302
-
303
- it "should allow ordering select boxes for datetimes via :order" do
304
- @f.input(:datetime, :name=>"foo", :id=>"bar", :as=>:select, :value=>DateTime.new(2011, 6, 5, 4, 3, 2), :order=>[:day, '/', :month, 'T', :hour, ':', :minute]).must_equal %{<div class=\"form-group\"><select class="form-control" id="bar" name="foo[day]">#{sel(1..31, 5)}</select>/<select class="form-control" id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>T<select class="form-control" id="bar_hour" name="foo[hour]">#{sel(0..23, 4)}</select>:<select class="form-control" id="bar_minute" name="foo[minute]">#{sel(0..59, 3)}</select></div>}
305
- end
306
-
307
- it "should support :select_options for datetimes when :as=>:select option is given" do
308
- @f.input(:datetime, :name=>"foo", :id=>"bar", :as=>:select, :value=>DateTime.new(2011, 6, 5, 10, 3, 2), :select_options=>{:year=>1970..2020, :hour=>9..17}).must_equal %{<div class="form-group"><select class="form-control" id="bar" name="foo[year]">#{sel(1970..2020, 2011)}</select>-<select class="form-control" id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select class="form-control" id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select> <select class="form-control" id="bar_hour" name="foo[hour]">#{sel(9..17, 10)}</select>:<select class="form-control" id="bar_minute" name="foo[minute]">#{sel(0..59, 3)}</select>:<select class="form-control" id="bar_second" name="foo[second]">#{sel(0..59, 2)}</select></div>}
309
- end
310
-
311
- it "should create select tag with options" do
312
- @f.input(:select, :options=>[1, 2, 3], :selected=>2).must_equal '<div class="form-group"><select class="form-control"><option>1</option><option selected="selected">2</option><option>3</option></select></div>'
313
- @f.input(:select, :options=>[1, 2, 3], :value=>2).must_equal '<div class="form-group"><select class="form-control"><option>1</option><option selected="selected">2</option><option>3</option></select></div>'
314
- end
315
-
316
- it "should create select tag with options and values" do
317
- @f.input(:select, :options=>[[:a, 1], [:b, 2], [:c, 3]], :selected=>2).must_equal '<div class="form-group"><select class="form-control"><option value="1">a</option><option selected="selected" value="2">b</option><option value="3">c</option></select></div>'
318
- end
319
-
320
- it "should create select tag with option groups" do
321
- @f.input(:select, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).must_equal '<div class="form-group"><select class="form-control"><optgroup label="d"><option value="1">a</option><option selected="selected" value="2">b</option></optgroup><optgroup label="e"><option value="3">c</option></optgroup></select></div>'
322
- end
323
-
324
- it "should create select tag with option groups with attributes" do
325
- @f.input(:select, :optgroups=>[[{:label=>'d', :class=>'f'}, [[:a, 1], [:b, 2]]], [{:label=>'e', :class=>'g'}, [[:c, 3]]]], :selected=>2).must_equal '<div class="form-group"><select class="form-control"><optgroup class="f" label="d"><option value="1">a</option><option selected="selected" value="2">b</option></optgroup><optgroup class="g" label="e"><option value="3">c</option></optgroup></select></div>'
326
- end
327
-
328
- it "should create select tag with options and values with hashes" do
329
- @f.input(:select, :options=>[[:a, {:foo=>1}], [:b, {:bar=>4, :value=>2}], [:c, {:baz=>3}]], :selected=>2).must_equal '<div class="form-group"><select class="form-control"><option foo="1">a</option><option bar="4" selected="selected" value="2">b</option><option baz="3">c</option></select></div>'
330
- end
331
-
332
- it "should create select tag with options and values using given method" do
333
- @f.input(:select, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :selected=>2).must_equal '<div class="form-group"><select class="form-control"><option>1</option><option selected="selected">2</option><option>3</option></select></div>'
334
- @f.input(:select, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :value_method=>:first, :selected=>:b).must_equal '<div class="form-group"><select class="form-control"><option value="a">1</option><option selected="selected" value="b">2</option><option value="c">3</option></select></div>'
335
- end
336
-
337
- it "should use html attributes specified in options" do
338
- @f.input(:text, :value=>'foo', :name=>'bar').must_equal '<div class="form-group"><input class="form-control" name="bar" type="text" value="foo"/></div>'
339
- @f.input(:textarea, :value=>'foo', :name=>'bar').must_equal '<div class="form-group"><textarea class="form-control" name="bar">foo</textarea></div>'
340
- @f.input(:select, :name=>'bar', :options=>[1, 2, 3]).must_equal '<div class="form-group"><select class="form-control" name="bar"><option>1</option><option>2</option><option>3</option></select></div>'
341
- end
342
-
343
- it "should support :add_blank option for select inputs" do
344
- @f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).must_equal '<div class="form-group"><select class="form-control"><option value=""></option><option selected="selected" value="2">b</option><option value="3">c</option></select></div>'
345
- end
346
-
347
- it "should use Forme.default_add_blank_prompt value if :add_blank option is true" do
348
- begin
349
- Forme.default_add_blank_prompt = 'foo'
350
- @f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).must_equal '<div class="form-group"><select class="form-control"><option value="">foo</option><option selected="selected" value="2">b</option><option value="3">c</option></select></div>'
351
- ensure
352
- Forme.default_add_blank_prompt = nil
353
- end
354
- end
355
-
356
- it "should use :add_blank option value as prompt if it is a String" do
357
- @f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>"Prompt Here", :value=>2).must_equal '<div class="form-group"><select class="form-control"><option value="">Prompt Here</option><option selected="selected" value="2">b</option><option value="3">c</option></select></div>'
358
- end
359
-
360
- it "should support :add_blank option with :blank_position :after for select inputs" do
361
- @f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :blank_position=>:after, :value=>2).must_equal '<div class="form-group"><select class="form-control"><option selected="selected" value="2">b</option><option value="3">c</option><option value=""></option></select></div>'
362
- end
363
-
364
- it "should support :add_blank option with :blank_attr option for select inputs" do
365
- @f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :blank_attr=>{:foo=>:bar}, :value=>2).must_equal '<div class="form-group"><select class="form-control"><option foo="bar" value=""></option><option selected="selected" value="2">b</option><option value="3">c</option></select></div>'
366
- end
367
-
368
- it "should create set of radio buttons" do
369
- @f.input(:radioset, :options=>[1, 2, 3], :selected=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="1"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> 2</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> 3</label></div></div>'
370
- @f.input(:radioset, :options=>[1, 2, 3], :value=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="1"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> 2</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> 3</label></div></div>'
371
- end
372
-
373
- it "should create set of radio buttons" do
374
- proc{@f.input(:radioset)}.must_raise Forme::Error
375
- end
376
-
377
- it "should support radio buttons with nil values" do
378
- @f.input(:radioset, :options=>[1, 2, nil], :selected=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="1"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> 2</label></div><div class="radio"><input type="radio"/></div></div>'
379
- end
380
-
381
- it "should create set of radio buttons with options and values" do
382
- @f.input(:radioset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :selected=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="1"/> a</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> b</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> c</label></div></div>'
383
- end
384
-
385
- it "should create set of radio buttons with options and values with hashes" do
386
- @f.input(:radioset, :options=>[[:a, {:attr=>{:foo=>1}}], [:b, {:class=>'foo', :value=>2}], [:c, {:id=>:baz}]], :selected=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input foo="1" type="radio" value="a"/> a</label></div><div class="radio"><label class="option"><input checked="checked" class="foo" type="radio" value="2"/> b</label></div><div class="radio"><label class="option" for="baz"><input id="baz" type="radio" value="c"/> c</label></div></div>'
387
- end
388
-
389
- it "should create set of radio buttons with options and values using given method" do
390
- @f.input(:radioset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :selected=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="1"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> 2</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> 3</label></div></div>'
391
- @f.input(:radioset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :value_method=>:first, :selected=>:b).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value="a"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="b"/> 2</label></div><div class="radio"><label class="option"><input type="radio" value="c"/> 3</label></div></div>'
392
- end
393
-
394
- it "should support :add_blank option for radioset inputs" do
395
- @f.input(:radioset, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value=""/> </label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> b</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> c</label></div></div>'
396
- end
397
-
398
- it "should use :add_blank option value as prompt if it is a String" do
399
- @f.input(:radioset, :options=>[[:b, 2], [:c, 3]], :add_blank=>"Prompt Here", :value=>2).must_equal '<div class="radioset"><div class="radio"><label class="option"><input type="radio" value=""/> Prompt Here</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> b</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> c</label></div></div>'
400
- end
401
-
402
- it "should respect the :key option for radio sets" do
403
- @f.input(:radioset, :options=>[1, 2, 3], :key=>:foo, :value=>2).must_equal '<div class="radioset"><div class="radio"><label class="option" for="foo_1"><input id="foo_1" name="foo" type="radio" value="1"/> 1</label></div><div class="radio"><label class="option" for="foo_2"><input checked="checked" id="foo_2" name="foo" type="radio" value="2"/> 2</label></div><div class="radio"><label class="option" for="foo_3"><input id="foo_3" name="foo" type="radio" value="3"/> 3</label></div></div>'
404
- end
405
-
406
- it "should create set of radio buttons with fieldsets and legends for :optgroups" do
407
- @f.input(:radioset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).must_equal '<div class="radioset"><fieldset><legend>d</legend><div class="radio"><label class="option"><input type="radio" value="1"/> a</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> b</label></div></fieldset><fieldset><legend>e</legend><div class="radio"><label class="option"><input type="radio" value="3"/> c</label></div></fieldset></div>'
408
- end
409
-
410
- it "should create set of radio buttons with set label" do
411
- @f.input(:radioset, :options=>[1, 2, 3], :selected=>2, :label=>'foo').must_equal '<div class="radioset"><label>foo</label><div class="radio"><label class="option"><input type="radio" value="1"/> 1</label></div><div class="radio"><label class="option"><input checked="checked" type="radio" value="2"/> 2</label></div><div class="radio"><label class="option"><input type="radio" value="3"/> 3</label></div></div>'
412
- end
413
-
414
- it "should create set of checkbox buttons" do
415
- @f.input(:checkboxset, :options=>[1, 2, 3], :selected=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> 3</label></div></div>'
416
- @f.input(:checkboxset, :options=>[1, 2, 3], :value=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> 3</label></div></div>'
417
- end
418
-
419
- it "should create set of checkbox buttons with options and values" do
420
- @f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :selected=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> a</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> c</label></div></div>'
421
- end
422
-
423
- it "should create set of checkbox buttons with options and values with hashes" do
424
- @f.input(:checkboxset, :options=>[[:a, {:attr=>{:foo=>1}}], [:b, {:class=>'foo', :value=>2}], [:c, {:id=>:baz}]], :selected=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input foo="1" type="checkbox" value="a"/> a</label></div><div class="checkbox"><label class="option"><input checked="checked" class="foo" type="checkbox" value="2"/> b</label></div><div class="checkbox"><label class="option" for="baz"><input id="baz" type="checkbox" value="c"/> c</label></div></div>'
425
- end
426
-
427
- it "should create set of checkbox buttons with options and values using given method" do
428
- @f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :selected=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> 3</label></div></div>'
429
- @f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :value_method=>:first, :selected=>:b).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value="a"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="b"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="c"/> 3</label></div></div>'
430
- end
431
-
432
- it "should support :add_blank option for checkboxset inputs" do
433
- @f.input(:checkboxset, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value=""/> </label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> c</label></div></div>'
434
- end
435
-
436
- it "should use :add_blank option value as prompt if it is a String" do
437
- @f.input(:checkboxset, :options=>[[:b, 2], [:c, 3]], :add_blank=>"Prompt Here", :value=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option"><input type="checkbox" value=""/> Prompt Here</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> c</label></div></div>'
438
- end
439
-
440
- it "should respect the :key option for checkbox sets" do
441
- @f.input(:checkboxset, :options=>[1, 2, 3], :key=>:foo, :value=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option" for="foo_1"><input id="foo_1" name="foo[]" type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option" for="foo_2"><input checked="checked" id="foo_2" name="foo[]" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option" for="foo_3"><input id="foo_3" name="foo[]" type="checkbox" value="3"/> 3</label></div></div>'
442
- end
443
-
444
- it "should prefer the :name option to :key option for checkbox sets" do
445
- @f.input(:checkboxset, :options=>[1, 2, 3], :key=>:foo, :name=>'bar[]', :value=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option" for="foo_1"><input id="foo_1" name="bar[]" type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option" for="foo_2"><input checked="checked" id="foo_2" name="bar[]" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option" for="foo_3"><input id="foo_3" name="bar[]" type="checkbox" value="3"/> 3</label></div></div>'
446
- end
447
-
448
- it "should prefer the :name and :id option to :key option for checkbox sets" do
449
- @f.input(:checkboxset, :options=>[1, 2, 3], :key=>:foo, :name=>'bar[]', :id=>:baz, :value=>2).must_equal '<div class="checkboxset"><div class="checkbox"><label class="option" for="baz_1"><input id="baz_1" name="bar[]" type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option" for="baz_2"><input checked="checked" id="baz_2" name="bar[]" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option" for="baz_3"><input id="baz_3" name="bar[]" type="checkbox" value="3"/> 3</label></div></div>'
450
- end
451
-
452
- it "should respect the :error option for checkbox sets" do
453
- @f.input(:checkboxset, :options=>[1, 2, 3], :error=>'foo-checkboxset', :value=>2).must_equal '<div class="checkboxset has-error"><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> 1</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label></div><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> 3</label></div><span class="help-block with-errors">foo-checkboxset</span></div>'
454
- end
455
-
456
- it "should create set of checkbox buttons with fieldsets and legends for optgroups" do
457
- @f.input(:checkboxset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).must_equal '<div class="checkboxset"><fieldset><legend>d</legend><div class="checkbox"><label class="option"><input type="checkbox" value="1"/> a</label></div><div class="checkbox"><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label></div></fieldset><fieldset><legend>e</legend><div class="checkbox"><label class="option"><input type="checkbox" value="3"/> c</label></div></fieldset></div>'
458
- end
459
-
460
- it "radio and checkbox inputs should handle :checked option" do
461
- @f.input(:radio, :checked=>true).must_equal '<div class="radio"><input checked="checked" type="radio"/></div>'
462
- @f.input(:radio, :checked=>false).must_equal '<div class="radio"><input type="radio"/></div>'
463
- @f.input(:checkbox, :checked=>true).must_equal '<div class="checkbox"><input checked="checked" type="checkbox"/></div>'
464
- @f.input(:checkbox, :checked=>false).must_equal '<div class="checkbox"><input type="checkbox"/></div>'
465
- end
466
-
467
- it "inputs should handle :autofocus option" do
468
- @f.input(:text, :autofocus=>true).must_equal '<div class="form-group"><input autofocus="autofocus" class="form-control" type="text"/></div>'
469
- @f.input(:text, :autofocus=>false).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
470
- end
471
-
472
- it "inputs should handle :required option" do
473
- @f.input(:text, :required=>true).must_equal '<div class="form-group"><input class="form-control" required="required" type="text"/></div>'
474
- @f.input(:text, :required=>false).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
475
- end
476
-
477
- it "inputs should handle :disabled option" do
478
- @f.input(:text, :disabled=>true).must_equal '<div class="form-group"><input class="form-control" disabled="disabled" type="text"/></div>'
479
- @f.input(:text, :disabled=>false).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
480
- end
481
-
482
- it "inputs should not include options with nil values" do
483
- @f.input(:text, :name=>nil).must_equal '<div class="form-group"><input class="form-control" type="text"/></div>'
484
- @f.input(:textarea, :name=>nil).must_equal '<div class="form-group"><textarea class="form-control"></textarea></div>'
485
- end
486
-
487
- it "inputs should include options with false values" do
488
- @f.input(:text, :name=>false).must_equal '<div class="form-group"><input class="form-control" name="false" type="text"/></div>'
489
- end
490
-
491
- it "should automatically create a label if a :label option is used" do
492
- @f.input(:text, :label=>'Foo', :value=>'foo').must_equal '<div class="form-group"><label>Foo</label> <input class="form-control" type="text" value="foo"/></div>'
493
- end
494
-
495
- it "should set label attributes with :label_attr option" do
496
- @f.input(:text, :label=>'Foo', :value=>'foo', :label_attr=>{:class=>'bar'}).must_equal '<div class="form-group"><label class="bar">Foo</label> <input class="form-control" type="text" value="foo"/></div>'
497
- end
498
-
499
- it "should support label not referencing input via :for=>false option" do
500
- @f.input(:text, :id=>'x', :label=>'Foo', :value=>'foo', :label_attr=>{:for=>false}).must_equal '<div class="form-group"><label>Foo</label> <input class="form-control" id="x" type="text" value="foo"/></div>'
501
- end
502
-
503
- it "should handle implicit labels with checkboxes" do
504
- @f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a').must_equal '<div class="checkbox"><label><input name="a" type="hidden" value="0"/><input name="a" type="checkbox" value="foo"/> Foo</label></div>'
505
- end
506
-
507
- it "should handle implicit labels with :label_position=>:after" do
508
- @f.input(:text, :label=>'Foo', :value=>'foo', :label_position=>:after).must_equal '<div class="form-group"><input class="form-control" type="text" value="foo"/> <label>Foo</label></div>'
509
- end
510
-
511
- it "should handle implicit labels with checkboxes with :label_position=>:before" do
512
- @f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a', :label_position=>:before).must_equal '<div class="checkbox"><label>Foo <input name="a" type="hidden" value="0"/><input name="a" type="checkbox" value="foo"/></label></div>'
513
- end
514
-
515
- it "should automatically note the input has errors if :error option is used" do
516
- @f.input(:text, :error=>'Bad Stuff!', :value=>'foo').must_equal '<div class="form-group has-error"><input aria-invalid="true" class="form-control" type="text" value="foo"/><span class="help-block with-errors">Bad Stuff!</span></div>'
517
- end
518
-
519
- it "should add an error message after the label" do
520
- @f.input(:text, :error=>'Bad Stuff!', :value=>'foo', :label=>"Foo").must_equal '<div class="form-group has-error"><label>Foo</label> <input aria-invalid="true" class="form-control" type="text" value="foo"/><span class="help-block with-errors">Bad Stuff!</span></div>'
521
- end
522
-
523
- it "should add to existing :class option if :error option is used" do
524
- @f.input(:text, :error=>'Bad Stuff!', :class=>'bar', :value=>'foo').must_equal '<div class="form-group has-error"><input aria-invalid="true" class="form-control bar" type="text" value="foo"/><span class="help-block with-errors">Bad Stuff!</span></div>'
525
- end
526
-
527
- it "should respect :error_attr option for setting the attributes for the error message span" do
528
- @f.input(:text, :error=>'Bad Stuff!', :value=>'foo', :error_attr=>{:class=>'foo'}).must_equal '<div class="form-group has-error"><input aria-invalid="true" class="form-control" type="text" value="foo"/><span class="foo help-block with-errors">Bad Stuff!</span></div>'
529
- end
530
-
531
- it "should support :skip_error_message option" do
532
- @f.input(:text, :error=>'Bad Stuff!', :class=>'bar', :value=>'foo', :skip_error_message=>true).must_equal '<div class="form-group"><input aria-invalid="true" class="form-control bar" type="text" value="foo"/></div>'
533
- end
534
-
535
- it "#open should return an opening tag" do
536
- @f.open(:action=>'foo', :method=>'post').must_equal '<form action="foo" method="post">'
537
- end
538
-
539
- it "#close should return a closing tag" do
540
- @f.close.must_equal '</form>'
541
- end
542
-
543
- it "#button should return a submit tag" do
544
- @f.button.must_equal '<input class="btn btn-default" type="submit"/>'
545
- end
546
-
547
- it "#button should return a submit tag without label" do
548
- @f.button(:label=>'foo').must_equal '<input class="btn btn-default" type="submit"/>'
549
- end
550
-
551
- it "#button should accept an options hash" do
552
- @f.button(:name=>'foo', :value=>'bar').must_equal '<input class="btn btn-default" name="foo" type="submit" value="bar"/>'
553
- end
554
-
555
- it "#button should handle added classes" do
556
- @f.button(:class=>'btn btn-primary').must_equal '<input class="btn btn-primary" type="submit"/>'
557
- @f.button(:class=>'btn-danger').must_equal '<input class="btn btn-danger" type="submit"/>'
558
- @f.button(:class=>'btn-success btn-lg').must_equal '<input class="btn btn-success btn-lg" type="submit"/>'
559
- end
560
-
561
- it "#button should accept a string to use as a value" do
562
- @f.button('foo').must_equal '<input class="btn btn-default" type="submit" value="foo"/>'
563
- end
564
-
565
- it "#tag should accept children as procs" do
566
- @f.tag(:div, {:class=>"foo"}, lambda{|t| t.tag(:input, :class=>t.attr[:class])}).must_equal '<div class="foo"><input class="form-control foo" type="text"/></div>'
567
- end
568
-
569
- it "#tag should accept children as methods" do
570
- o = Object.new
571
- def o.foo(t) t.tag(:input, :class=>t.attr[:class]) end
572
- @f.tag(:div, {:class=>"foo"}, o.method(:foo)).must_equal '<div class="foo"><input class="form-control foo" type="text"/></div>'
573
- end
574
-
575
- it "should have an #inputs method for multiple inputs wrapped in a fieldset" do
576
- @f.inputs([:textarea, :text]).must_equal '<fieldset class="inputs"><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></fieldset>'
577
- end
578
-
579
- it "should have default #inputs method accept an :attr option" do
580
- @f.inputs([:textarea, :text], :legend=>'Inputs', :attr=>{:class=>'foo', :bar=>'baz'}).must_equal '<fieldset bar="baz" class="foo inputs"><legend>Inputs</legend><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></fieldset>'
581
- end
582
-
583
- it "should have default #inputs method accept a :legend option" do
584
- @f.inputs([:textarea, :text], :legend=>'Inputs').must_equal '<fieldset class="inputs"><legend>Inputs</legend><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></fieldset>'
585
- end
586
-
587
- it "should have default #inputs method accept a :legend_attr option" do
588
- @f.inputs([:textarea, :text], :legend=>'Inputs', :legend_attr=>{:class=>'foo'}).must_equal '<fieldset class="inputs"><legend class="foo">Inputs</legend><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></fieldset>'
589
- end
590
-
591
- it "should have an #inputs method take a block and yield to it" do
592
- @f.inputs{@f.input(:textarea); @f.input(:text)}.must_equal '<fieldset class="inputs"><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></fieldset>'
593
- end
594
-
595
- it "should have an #inputs method work with both args and block" do
596
- @f.inputs([:textarea]){@f.input(:text)}.must_equal '<fieldset class="inputs"><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></fieldset>'
597
- end
598
-
599
- it "should have an #inputs method support array arguments and creating inputs with the array as argument list" do
600
- @f.inputs([[:textarea, {:name=>'foo'}], [:text, {:id=>'bar'}]]).must_equal '<fieldset class="inputs"><div class="form-group"><textarea class="form-control" name="foo"></textarea></div><div class="form-group"><input class="form-control" id="bar" type="text"/></div></fieldset>'
601
- end
602
-
603
- it "should have #inputs accept transformer options to modify the options inside the inputs" do
604
- @f.inputs([:textarea, :text], :wrapper=>:div).must_equal '<fieldset class="inputs"><div><textarea class="form-control"></textarea></div><div><input class="form-control" type="text"/></div></fieldset>'
605
- end
606
-
607
- it "should have #inputs accept :nested_inputs_wrapper options to modify the :input_wrapper option inside the inputs" do
608
- @f.inputs(:nested_inputs_wrapper=>:div){@f.inputs([:textarea, :text])}.must_equal '<fieldset class="inputs"><div><div class="form-group"><textarea class="form-control"></textarea></div><div class="form-group"><input class="form-control" type="text"/></div></div></fieldset>'
609
- end
610
-
611
-
612
- it "should escape tag content" do
613
- @f.tag(:div, {}, ['<p></p>']).must_equal '<div>&lt;p&gt;&lt;/p&gt;</div>'
614
- end
615
-
616
- it "should not escape raw tag content using Forme::Raw" do
617
- @f.tag(:div, {}, ['<p></p>'.dup.extend(Forme::Raw)]).must_equal '<div><p></p></div>'
618
- end
619
-
620
- it "should not escape raw tag content using Forme.raw" do
621
- @f.tag(:div, {}, [Forme.raw('<p></p>')]).must_equal '<div><p></p></div>'
622
- end
623
-
624
- it "should not escape raw tag content using Form#raw" do
625
- @f.tag(:div, {}, [@f.raw('<p></p>')]).must_equal '<div><p></p></div>'
626
- end
627
-
628
- it "should escape tag content in attribute values" do
629
- @f.tag(:div, :foo=>'<p></p>').must_equal '<div foo="&lt;p&gt;&lt;/p&gt;"></div>'
630
- end
631
-
632
- it "should not escape raw tag content in attribute values" do
633
- @f.tag(:div, :foo=>Forme.raw('<p></p>')).must_equal '<div foo="<p></p>"></div>'
634
- end
635
-
636
- it "should format dates, times, and datetimes in ISO format" do
637
- @f.tag(:div, :foo=>Date.new(2011, 6, 5)).must_equal '<div foo="2011-06-05"></div>'
638
- @f.tag(:div, :foo=>DateTime.new(2011, 6, 5, 4, 3, 2)).must_equal '<div foo="2011-06-05T04:03:02.000"></div>'
639
- @f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).must_equal '<div foo="2011-06-05T04:03:02.000"></div>'
640
- end
641
-
642
- it "should format bigdecimals in standard notation" do
643
- @f.tag(:div, :foo=>BigDecimal('10000.010')).must_equal '<div foo="10000.01"></div>'
644
- end
645
-
646
- it "inputs should accept a :wrapper option to use a custom wrapper" do
647
- @f.input(:text, :wrapper=>:li).must_equal '<li><input class="form-control" type="text"/></li>'
648
- end
649
-
650
- it "inputs should accept a :wrapper_attr option to use custom wrapper attributes" do
651
- @f.input(:text, :wrapper=>:li, :wrapper_attr=>{:class=>"foo"}).must_equal '<li class="foo"><input class="form-control" type="text"/></li>'
652
- end
653
-
654
- it "inputs should accept a :help option to use custom helper text" do
655
- @f.input(:text, :help=>"List type of foo").must_equal '<div class="form-group"><input class="form-control" type="text"/><span class="helper">List type of foo</span></div>'
656
- end
657
-
658
- it "inputs should accept a :helper_attr option for custom helper attributes" do
659
- @f.input(:text, :help=>"List type of foo", :helper_attr=>{:class=>'foo'}).must_equal '<div class="form-group"><input class="form-control" type="text"/><span class="foo helper">List type of foo</span></div>'
660
- end
661
-
662
- it "inputs should have helper displayed inside wrapper, after error" do
663
- @f.input(:text, :help=>"List type of foo", :error=>'bad', :wrapper=>:li).must_equal '<li class="has-error"><input aria-invalid="true" class="form-control" type="text"/><span class="help-block with-errors">bad</span><span class="helper">List type of foo</span></li>'
664
- end
665
-
666
- it "inputs should accept a :formatter option to use a custom formatter" do
667
- @f.input(:text, :formatter=>:readonly, :value=>'1', :label=>'Foo').must_equal '<div class="form-group"><label>Foo</label> <span class="readonly-text">1</span></div>'
668
- @f.input(:text, :formatter=>:default, :value=>'1', :label=>'Foo').must_equal '<div class="form-group"><label>Foo</label> <input class="form-control" type="text" value="1"/></div>'
669
- @f.input(:text, :formatter=>:bs3_readonly, :value=>'1', :label=>'Foo').must_equal '<div class="form-group"><label>Foo</label> <input class="form-control" readonly="readonly" type="text" value="1"/></div>'
670
- end
671
-
672
- it "bs3_readonly formatter should disable checkbox, radio, select, and textarea inputs" do
673
- @f.input(:checkbox, :formatter=>:bs3_readonly).must_equal '<div class="checkbox"><input disabled="disabled" type="checkbox"/></div>'
674
- @f.input(:radio, :formatter=>:bs3_readonly).must_equal '<div class="radio"><input disabled="disabled" type="radio"/></div>'
675
- @f.input(:select, :formatter=>:bs3_readonly).must_equal '<div class="form-group"><select class="form-control" disabled="disabled"></select></div>'
676
- @f.input(:textarea, :formatter=>:bs3_readonly).must_equal '<div class="form-group"><textarea class="form-control" readonly="readonly"></textarea></div>'
677
- end
678
-
679
- it "inputs should accept a :labeler option to use a custom labeler" do
680
- @f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo).must_equal '<div class="form-group"><label class="label-before" for="foo">bar</label><textarea class="form-control" id="foo"></textarea></div>'
681
- end
682
-
683
- it "inputs handle explicit labels with :label_position=>:after" do
684
- @f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo, :label_position=>:after).must_equal '<div class="form-group"><textarea class="form-control" id="foo"></textarea><label class="label-after" for="foo">bar</label></div>'
685
- end
686
-
687
- it "should handle explicit labels with checkboxes" do
688
- @f.input(:checkbox, :labeler=>:explicit, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar').must_equal '<div class="checkbox"><input id="bar_hidden" name="a" type="hidden" value="0"/><input id="bar" name="a" type="checkbox" value="foo"/><label class="label-after" for="bar">Foo</label></div>'
689
- end
690
-
691
- it "should handle explicit labels with checkboxes with :label_position=>:before" do
692
- @f.input(:checkbox, :labeler=>:explicit, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar', :label_position=>:before).must_equal '<div class="checkbox"><label class="label-before" for="bar">Foo</label><input id="bar_hidden" name="a" type="hidden" value="0"/><input id="bar" name="a" type="checkbox" value="foo"/></div>'
693
- end
694
-
695
- it "inputs handle implicit labels or checkboxes without hidden fields with :label_position=>:before" do
696
- @f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar', :label_position=>:before, :no_hidden=>true).must_equal '<div class="checkbox"><label for="bar">Foo <input id="bar" name="a" type="checkbox" value="foo"/></label></div>'
697
- end
698
-
699
- it "inputs should accept a :error_handler option to use a custom error_handler" do
700
- @f.input(:textarea, :error_handler=>proc{|t, i| [t, "!!! #{i.opts[:error]}"]}, :error=>'bar', :id=>:foo).must_equal '<div class="form-group"><textarea aria-describedby="foo_error_message" aria-invalid="true" class="form-control" id="foo"></textarea>!!! bar</div>'
701
- end
702
-
703
- it "inputs should accept a :error_id option to specify id for error" do
704
- @f.input(:textarea, :error_id=>:baz, :error=>'bar', :id=>:foo).must_equal '<div class="form-group has-error"><textarea aria-describedby="baz" aria-invalid="true" class="form-control" id="foo"></textarea><span class="help-block with-errors" id="baz">bar</span></div>'
705
- end
706
-
707
- it "#inputs should accept a :inputs_wrapper option to use a custom inputs_wrapper" do
708
- @f.inputs([:textarea], :inputs_wrapper=>:ol).must_equal '<ol><div class="form-group"><textarea class="form-control"></textarea></div></ol>'
709
- @f.inputs([:textarea], :inputs_wrapper=>:bs3_table, :wrapper=>:trtd).must_equal '<table class="table table-bordered"><tr><td><textarea class="form-control"></textarea></td><td></td></tr></table>'
710
- @f.inputs([:textarea], :inputs_wrapper=>:bs3_table, :wrapper=>:trtd, :legend=>'Foo', :labels=>['bar']).must_equal '<table class="table table-bordered"><caption>Foo</caption><tr><th>bar</th></tr><tr><td><textarea class="form-control"></textarea></td><td></td></tr></table>'
711
- @f.inputs([:textarea], :inputs_wrapper=>:bs3_table, :wrapper=>:trtd, :attr=>{:class=>'foo'}).must_equal '<table class="foo"><tr><td><textarea class="form-control"></textarea></td><td></td></tr></table>'
712
- end
713
-
714
- it "inputs should accept a :wrapper=>nil option to not use a wrapper" do
715
- Forme::Form.new(:config=>:bs3,:wrapper=>:li).input(:text, :wrapper=>nil).must_equal '<input class="form-control" type="text"/>'
716
- end
717
-
718
- it "inputs should accept a :labeler=>nil option to not use a labeler" do
719
- @f.input(:textarea, :labeler=>nil, :label=>'bar', :id=>:foo).must_equal '<div class="form-group"><textarea class="form-control" id="foo"></textarea></div>'
720
- end
721
-
722
- it "inputs should accept a :error_handler=>nil option to not use an error_handler" do
723
- @f.input(:textarea, :error_handler=>nil, :error=>'bar', :id=>:foo).must_equal '<div class="form-group"><textarea aria-invalid="true" class="form-control" id="foo"></textarea></div>'
724
- end
725
-
726
- it "#inputs should accept a :inputs_wrapper=>nil option to not use an inputs_wrapper" do
727
- @f.form{|f| f.inputs([:textarea], :inputs_wrapper=>nil)}.must_equal '<form><div class="form-group"><textarea class="form-control"></textarea></div></form>'
728
- end
729
-
730
- it "#inputs should treat a single hash argument as an options hash with no default inputs" do
731
- @f.inputs(:inputs_wrapper=>:ol){@f.input(:textarea)}.must_equal '<ol><div class="form-group"><textarea class="form-control"></textarea></div></ol>'
732
- end
733
-
734
- it "should support setting defaults for inputs at the form level" do
735
- f = Forme::Form.new(:config=>:bs3, :input_defaults=>{'text'=>{:size=>20}, 'textarea'=>{:cols=>80, :rows=>6}})
736
- f.input(:text, :name=>"foo").must_equal '<div class="form-group"><input class="form-control" name="foo" size="20" type="text"/></div>'
737
- f.input(:textarea, :name=>"foo").must_equal '<div class="form-group"><textarea class="form-control" cols="80" name="foo" rows="6"></textarea></div>'
738
- end
739
-
740
- it "should work with input_defaults with symbol keys using using inputs with symbol keys" do
741
- f = Forme::Form.new(:config=>:bs3, :input_defaults=>{:text=>{:size=>20}, 'text'=>{:size=>30}})
742
- f.input(:text, :name=>"foo").must_equal '<div class="form-group"><input class="form-control" name="foo" size="20" type="text"/></div>'
743
- f.input('text', :name=>"foo").must_equal '<div class="form-group"><input class="form-control" name="foo" size="30" type="text"/></div>'
744
- end
745
-
746
- it "invalid custom transformers should raise an Error" do
747
- proc{Forme::Form.new(:config=>:bs3, :wrapper=>Object.new).input(:text)}.must_raise(Forme::Error)
748
- proc{@f.input(:textarea, :wrapper=>Object.new)}.must_raise(Forme::Error)
749
- proc{@f.input(:textarea, :formatter=>nil)}.must_raise(Forme::Error)
750
- end
751
- end