forme 2.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG +16 -0
- data/README.rdoc +10 -5
- data/lib/forme/bs3.rb +7 -7
- data/lib/forme/bs5.rb +213 -0
- data/lib/forme/form.rb +2 -0
- data/lib/forme/transformers/error_handler.rb +10 -10
- data/lib/forme/transformers/formatter.rb +32 -34
- data/lib/forme/version.rb +1 -1
- data/lib/forme.rb +2 -1
- data/lib/roda/plugins/forme_set.rb +5 -3
- data/lib/sequel/plugins/forme.rb +8 -6
- data/lib/sequel/plugins/forme_set.rb +4 -4
- metadata +7 -24
- data/Rakefile +0 -82
- data/spec/all.rb +0 -2
- data/spec/bs3_reference_spec.rb +0 -358
- data/spec/bs3_sequel_plugin_spec.rb +0 -523
- data/spec/bs3_spec.rb +0 -722
- data/spec/erb_helper.rb +0 -198
- data/spec/erubi_capture_helper.rb +0 -198
- data/spec/forme_coverage.rb +0 -13
- data/spec/forme_spec.rb +0 -1216
- data/spec/rails_integration_spec.rb +0 -274
- data/spec/roda_integration_spec.rb +0 -523
- data/spec/sequel_helper.rb +0 -101
- data/spec/sequel_i18n_helper.rb +0 -40
- data/spec/sequel_i18n_plugin_spec.rb +0 -31
- data/spec/sequel_plugin_spec.rb +0 -600
- data/spec/sequel_set_plugin_spec.rb +0 -232
- data/spec/shared_erb_specs.rb +0 -71
- data/spec/sinatra_integration_spec.rb +0 -45
- data/spec/spec_helper.rb +0 -31
data/spec/forme_spec.rb
DELETED
@@ -1,1216 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
|
3
|
-
describe "Forme plain forms" do
|
4
|
-
def sel(opts, s)
|
5
|
-
opts.map{|o| "<option #{'selected="selected" ' if o == s}value=\"#{o}\">#{sprintf("%02i", o)}</option>"}.join
|
6
|
-
end
|
7
|
-
|
8
|
-
before do
|
9
|
-
@f = Forme::Form.new
|
10
|
-
end
|
11
|
-
|
12
|
-
it "Forme.version should return version string" do
|
13
|
-
Forme.version.must_match(/\A\d+\.\d+\.\d+\z/)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should create a simple input tags" do
|
17
|
-
@f.input(:text).to_s.must_equal '<input type="text"/>'
|
18
|
-
@f.input(:radio).to_s.must_equal '<input type="radio"/>'
|
19
|
-
@f.input(:password).to_s.must_equal '<input type="password"/>'
|
20
|
-
@f.input(:checkbox).to_s.must_equal '<input type="checkbox"/>'
|
21
|
-
@f.input(:submit).to_s.must_equal '<input type="submit"/>'
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should use :html option if given" do
|
25
|
-
@f.input(:text, :html=>"<a>foo</a>").to_s.must_equal '<a>foo</a>'
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should support a callable :html option" do
|
29
|
-
@f.input(:text, :html=>proc{|i| "<a>#{i.type}</a>"}).to_s.must_equal '<a>text</a>'
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should still use labeler, wrapper, error_handler, and helper if :html option is given" do
|
33
|
-
@f.input(:text, :html=>"<a>foo</a>", :label=>'a', :error=>'b', :help=>'c', :wrapper=>:div).to_s.must_equal '<div><label>a: <a>foo</a></label><span class="error_message">b</span><span class="helper">c</span></div>'
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should use :name option as attribute" do
|
37
|
-
@f.input(:text, :name=>"foo").to_s.must_equal '<input name="foo" type="text"/>'
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should use :id option as attribute" do
|
41
|
-
@f.input(:text, :id=>"foo").to_s.must_equal '<input id="foo" type="text"/>'
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should use :class option as attribute" do
|
45
|
-
@f.input(:text, :class=>"foo").to_s.must_equal '<input class="foo" type="text"/>'
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should use :value option as attribute" do
|
49
|
-
@f.input(:text, :value=>"foo").to_s.must_equal '<input type="text" value="foo"/>'
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should use :placeholder option as attribute" do
|
53
|
-
@f.input(:text, :placeholder=>"foo").to_s.must_equal '<input placeholder="foo" type="text"/>'
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should use :style option as attribute" do
|
57
|
-
@f.input(:text, :style=>"foo").to_s.must_equal '<input style="foo" type="text"/>'
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should use :key option as name and id attributes" do
|
61
|
-
@f.input(:text, :key=>"foo").to_s.must_equal '<input id="foo" name="foo" type="text"/>'
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should use :key_id option as suffix for :key option id attributes" do
|
65
|
-
@f.input(:text, :key=>"foo", :key_id=>'bar').to_s.must_equal '<input id="foo_bar" name="foo" type="text"/>'
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should have :key option respect :multiple option" do
|
69
|
-
@f.input(:text, :key=>"foo", :multiple=>true).to_s.must_equal '<input id="foo" name="foo[]" type="text"/>'
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should use :key option respect form's current namespace" do
|
73
|
-
@f.with_opts(:namespace=>['bar']) do
|
74
|
-
@f.input(:text, :key=>"foo").to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text"/>'
|
75
|
-
@f.input(:text, :key=>"foo", :multiple=>true).to_s.must_equal '<input id="bar_foo" name="bar[foo][]" type="text"/>'
|
76
|
-
@f.with_opts(:namespace=>['bar', 'baz']) do
|
77
|
-
@f.input(:text, :key=>"foo").to_s.must_equal '<input id="bar_baz_foo" name="bar[baz][foo]" type="text"/>'
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should consider form's :values hash for default values based on the :key option if :value is not present" do
|
83
|
-
@f.opts[:values] = {'foo'=>'baz'}
|
84
|
-
@f.input(:text, :key=>"foo").to_s.must_equal '<input id="foo" name="foo" type="text" value="baz"/>'
|
85
|
-
@f.input(:text, :key=>"foo", :value=>'x').to_s.must_equal '<input id="foo" name="foo" type="text" value="x"/>'
|
86
|
-
|
87
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="foo" name="foo" type="text" value="baz"/>'
|
88
|
-
@f.opts[:values] = {:foo=>'baz'}
|
89
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="foo" name="foo" type="text" value="baz"/>'
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should consider form's :values hash for default values based on the :key option when using namespaces" do
|
93
|
-
@f.opts[:values] = {'bar'=>{'foo'=>'baz'}}
|
94
|
-
@f.with_opts(:namespace=>['bar']) do
|
95
|
-
@f.input(:text, :key=>"foo").to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text" value="baz"/>'
|
96
|
-
@f.input(:text, :key=>"foo", :value=>'x').to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text" value="x"/>'
|
97
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text" value="baz"/>'
|
98
|
-
end
|
99
|
-
|
100
|
-
@f.with_opts(:namespace=>[:bar]) do
|
101
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text" value="baz"/>'
|
102
|
-
|
103
|
-
@f.opts[:values] = {:bar=>{:foo=>'baz'}}
|
104
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text" value="baz"/>'
|
105
|
-
@f.opts[:values] = {:bar=>{}}
|
106
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text"/>'
|
107
|
-
@f.opts[:values] = {}
|
108
|
-
@f.input(:text, :key=>:foo).to_s.must_equal '<input id="bar_foo" name="bar[foo]" type="text"/>'
|
109
|
-
|
110
|
-
@f.opts[:values] = {'bar'=>{'quux'=>{'foo'=>'baz'}}}
|
111
|
-
@f.with_opts(:namespace=>['bar', 'quux']) do
|
112
|
-
@f.input(:text, :key=>"foo").to_s.must_equal '<input id="bar_quux_foo" name="bar[quux][foo]" type="text" value="baz"/>'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should consider form's :errors hash based on the :key option" do
|
118
|
-
@f.opts[:errors] = { 'foo' => 'must be present' }
|
119
|
-
@f.input(:text, :key=>"foo").to_s.must_equal "<input aria-describedby=\"foo_error_message\" aria-invalid=\"true\" class=\"error\" id=\"foo\" name=\"foo\" type=\"text\"/><span class=\"error_message\" id=\"foo_error_message\">must be present</span>"
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should consider form's :errors hash based on the :key option when using namespaces" do
|
123
|
-
@f.opts[:errors] = { 'bar' => { 'foo' => 'must be present' } }
|
124
|
-
@f.with_opts(:namespace=>['bar']) do
|
125
|
-
@f.input(:text, :key=>"foo").to_s.must_equal "<input aria-describedby=\"bar_foo_error_message\" aria-invalid=\"true\" class=\"error\" id=\"bar_foo\" name=\"bar[foo]\" type=\"text\"/><span class=\"error_message\" id=\"bar_foo_error_message\">must be present</span>"
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
it "should support a with_obj method that changes the object and namespace for the given block" do
|
130
|
-
@f.with_obj([:a, :c], 'bar') do
|
131
|
-
@f.input(:first).to_s.must_equal '<input id="bar_first" name="bar[first]" type="text" value="a"/>'
|
132
|
-
@f.with_obj([:b], 'baz') do
|
133
|
-
@f.input(:first).to_s.must_equal '<input id="bar_baz_first" name="bar[baz][first]" type="text" value="b"/>'
|
134
|
-
end
|
135
|
-
@f.with_obj([:b], %w'baz quux') do
|
136
|
-
@f.input(:first).to_s.must_equal '<input id="bar_baz_quux_first" name="bar[baz][quux][first]" type="text" value="b"/>'
|
137
|
-
end
|
138
|
-
@f.with_obj([:b]) do
|
139
|
-
@f.input(:first).to_s.must_equal '<input id="bar_first" name="bar[first]" type="text" value="b"/>'
|
140
|
-
end
|
141
|
-
@f.input(:last).to_s.must_equal '<input id="bar_last" name="bar[last]" type="text" value="c"/>'
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
it "should support a each_obj method that changes the object and namespace for multiple objects for the given block" do
|
146
|
-
@f.tag(:form) do
|
147
|
-
@f.each_obj([[:a, :c], [:b, :d]], 'bar') do
|
148
|
-
@f.input(:first)
|
149
|
-
@f.input(:last)
|
150
|
-
end
|
151
|
-
end.to_s.must_equal '<form><input id="bar_0_first" name="bar[0][first]" type="text" value="a"/><input id="bar_0_last" name="bar[0][last]" type="text" value="c"/><input id="bar_1_first" name="bar[1][first]" type="text" value="b"/><input id="bar_1_last" name="bar[1][last]" type="text" value="d"/></form>'
|
152
|
-
|
153
|
-
@f.tag(:form) do
|
154
|
-
@f.each_obj([[:a, :c], [:b, :d]], %w'bar baz') do
|
155
|
-
@f.input(:first)
|
156
|
-
@f.input(:last)
|
157
|
-
end
|
158
|
-
end.to_s.must_equal '<form><input id="bar_baz_0_first" name="bar[baz][0][first]" type="text" value="a"/><input id="bar_baz_0_last" name="bar[baz][0][last]" type="text" value="c"/><input id="bar_baz_1_first" name="bar[baz][1][first]" type="text" value="b"/><input id="bar_baz_1_last" name="bar[baz][1][last]" type="text" value="d"/></form>'
|
159
|
-
|
160
|
-
@f.tag(:form) do
|
161
|
-
@f.each_obj([[:a, :c], [:b, :d]]) do
|
162
|
-
@f.input(:first)
|
163
|
-
@f.input(:last)
|
164
|
-
end
|
165
|
-
end.to_s.must_equal '<form><input id="0_first" name="0[first]" type="text" value="a"/><input id="0_last" name="0[last]" type="text" value="c"/><input id="1_first" name="1[first]" type="text" value="b"/><input id="1_last" name="1[last]" type="text" value="d"/></form>'
|
166
|
-
end
|
167
|
-
|
168
|
-
it "should allow overriding form inputs on a per-block basis" do
|
169
|
-
@f.input(:text).to_s.must_equal '<input type="text"/>'
|
170
|
-
@f.with_opts(:wrapper=>:div){@f.input(:text).to_s}.must_equal '<div><input type="text"/></div>'
|
171
|
-
@f.with_opts(:wrapper=>:div){@f.input(:text).to_s.must_equal '<div><input type="text"/></div>'}
|
172
|
-
@f.with_opts(:wrapper=>:div) do
|
173
|
-
@f.input(:text).to_s.must_equal '<div><input type="text"/></div>'
|
174
|
-
@f.with_opts(:wrapper=>:li){@f.input(:text).to_s.must_equal '<li><input type="text"/></li>'}
|
175
|
-
@f.input(:text).to_s.must_equal '<div><input type="text"/></div>'
|
176
|
-
end
|
177
|
-
@f.input(:text).to_s.must_equal '<input type="text"/>'
|
178
|
-
end
|
179
|
-
|
180
|
-
it "should handle delayed formatting when overriding form inputs on a per-block basis" do
|
181
|
-
@f.form do
|
182
|
-
@f.input(:text)
|
183
|
-
@f.with_opts(:wrapper=>:div) do
|
184
|
-
@f.input(:text)
|
185
|
-
@f.with_opts(:wrapper=>:li){@f.input(:text)}
|
186
|
-
@f.input(:text)
|
187
|
-
end
|
188
|
-
@f.input(:text)
|
189
|
-
end.to_s.must_equal '<form><input type="text"/><div><input type="text"/></div><li><input type="text"/></li><div><input type="text"/></div><input type="text"/></form>'
|
190
|
-
end
|
191
|
-
|
192
|
-
it "should support :obj method to with_opts for changing the obj inside the block" do
|
193
|
-
@f.form do
|
194
|
-
@f.with_opts(:obj=>[:a, :c]) do
|
195
|
-
@f.input(:first)
|
196
|
-
@f.with_opts(:obj=>[:b]){@f.input(:first)}
|
197
|
-
@f.input(:last)
|
198
|
-
end
|
199
|
-
end.to_s.must_equal '<form><input id="first" name="first" type="text" value="a"/><input id="first" name="first" type="text" value="b"/><input id="last" name="last" type="text" value="c"/></form>'
|
200
|
-
end
|
201
|
-
|
202
|
-
it "should allow arbitrary attributes using the :attr option" do
|
203
|
-
@f.input(:text, :attr=>{:bar=>"foo"}).to_s.must_equal '<input bar="foo" type="text"/>'
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should convert the :data option into attributes" do
|
207
|
-
@f.input(:text, :data=>{:bar=>"foo"}).to_s.must_equal '<input data-bar="foo" type="text"/>'
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should replace underscores with hyphens in symbol :data keys when :dasherize_data is set" do
|
211
|
-
@f.input(:text, :data=>{:foo_bar=>"baz"}).to_s.must_equal '<input data-foo_bar="baz" type="text"/>'
|
212
|
-
@f.input(:text, :data=>{"foo_bar"=>"baz"}).to_s.must_equal '<input data-foo_bar="baz" type="text"/>'
|
213
|
-
|
214
|
-
@f.input(:text, :data=>{:foo_bar=>"baz"}, :dasherize_data => true).to_s.must_equal '<input data-foo-bar="baz" type="text"/>'
|
215
|
-
@f.input(:text, :data=>{"foo_bar"=>"baz"}, :dasherize_data => true).to_s.must_equal '<input data-foo_bar="baz" type="text"/>'
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should not have standard options override the :attr option" do
|
219
|
-
@f.input(:text, :name=>:bar, :attr=>{:name=>"foo"}).to_s.must_equal '<input name="foo" type="text"/>'
|
220
|
-
end
|
221
|
-
|
222
|
-
it "should combine :class standard option with :attr option" do
|
223
|
-
@f.input(:text, :class=>:bar, :attr=>{:class=>"foo"}).to_s.must_equal '<input class="foo bar" type="text"/>'
|
224
|
-
end
|
225
|
-
|
226
|
-
it "should not have :data options override the :attr option" do
|
227
|
-
@f.input(:text, :data=>{:bar=>"baz"}, :attr=>{:"data-bar"=>"foo"}).to_s.must_equal '<input data-bar="foo" type="text"/>'
|
228
|
-
end
|
229
|
-
|
230
|
-
it "should use :size and :maxlength options as attributes for text inputs" do
|
231
|
-
@f.input(:text, :size=>5, :maxlength=>10).to_s.must_equal '<input maxlength="10" size="5" type="text"/>'
|
232
|
-
@f.input(:textarea, :size=>5, :maxlength=>10).to_s.must_equal '<textarea></textarea>'
|
233
|
-
end
|
234
|
-
|
235
|
-
it "should create hidden input with value 0 for each checkbox with a name" do
|
236
|
-
@f.input(:checkbox, :name=>"foo").to_s.must_equal '<input name="foo" type="hidden" value="0"/><input name="foo" type="checkbox"/>'
|
237
|
-
end
|
238
|
-
|
239
|
-
it "should not create hidden input with value 0 for readonly or disabled checkboxes" do
|
240
|
-
@f.input(:checkbox, :name=>"foo", :formatter=>:disabled).to_s.must_equal '<input disabled="disabled" name="foo" type="checkbox"/>'
|
241
|
-
@f.input(:checkbox, :name=>"foo", :formatter=>:readonly).to_s.must_equal '<input disabled="disabled" name="foo" type="checkbox"/>'
|
242
|
-
end
|
243
|
-
|
244
|
-
it "should create hidden input with value 0 for readonly or disabled checkboxes if no_hidden is explicitly given and not true" do
|
245
|
-
@f.input(:checkbox, :name=>"foo", :formatter=>:disabled, :no_hidden=>false).to_s.must_equal '<input name="foo" type="hidden" value="0"/><input disabled="disabled" name="foo" type="checkbox"/>'
|
246
|
-
@f.input(:checkbox, :name=>"foo", :formatter=>:readonly, :no_hidden=>false).to_s.must_equal '<input name="foo" type="hidden" value="0"/><input disabled="disabled" name="foo" type="checkbox"/>'
|
247
|
-
end
|
248
|
-
|
249
|
-
it "should not create hidden input with value 0 for each checkbox with a name if :no_hidden option is used" do
|
250
|
-
@f.input(:checkbox, :name=>"foo", :no_hidden=>true).to_s.must_equal '<input name="foo" type="checkbox"/>'
|
251
|
-
end
|
252
|
-
|
253
|
-
it "should create hidden input with _hidden appened to id for each checkbox with a name and id" do
|
254
|
-
@f.input(:checkbox, :name=>"foo", :id=>"bar").to_s.must_equal '<input id="bar_hidden" name="foo" type="hidden" value="0"/><input id="bar" name="foo" type="checkbox"/>'
|
255
|
-
end
|
256
|
-
|
257
|
-
it "should create hidden input with value f for each checkbox with a name and value t" do
|
258
|
-
@f.input(:checkbox, :name=>"foo", :value=>"t").to_s.must_equal '<input name="foo" type="hidden" value="f"/><input name="foo" type="checkbox" value="t"/>'
|
259
|
-
end
|
260
|
-
|
261
|
-
it "should use :hidden_value option for value of hidden input for checkbox" do
|
262
|
-
@f.input(:checkbox, :name=>"foo", :hidden_value=>"no").to_s.must_equal '<input name="foo" type="hidden" value="no"/><input name="foo" type="checkbox"/>'
|
263
|
-
end
|
264
|
-
|
265
|
-
it "should handle :checked option" do
|
266
|
-
@f.input(:checkbox, :checked=>true).to_s.must_equal '<input checked="checked" type="checkbox"/>'
|
267
|
-
@f.input(:checkbox, :checked=>false).to_s.must_equal '<input type="checkbox"/>'
|
268
|
-
end
|
269
|
-
|
270
|
-
it "should create textarea tag" do
|
271
|
-
@f.input(:textarea).to_s.must_equal '<textarea></textarea>'
|
272
|
-
@f.input(:textarea, :value=>'a').to_s.must_equal '<textarea>a</textarea>'
|
273
|
-
end
|
274
|
-
|
275
|
-
it "should use :cols and :rows options as attributes for textarea inputs" do
|
276
|
-
@f.input(:text, :cols=>5, :rows=>10).to_s.must_equal '<input type="text"/>'
|
277
|
-
@f.input(:textarea, :cols=>5, :rows=>10).to_s.must_equal '<textarea cols="5" rows="10"></textarea>'
|
278
|
-
end
|
279
|
-
|
280
|
-
it "should create select tag" do
|
281
|
-
@f.input(:select).to_s.must_equal '<select></select>'
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should respect multiple and size options in select tag" do
|
285
|
-
@f.input(:select, :multiple=>true, :size=>10).to_s.must_equal '<select multiple="multiple" size="10"></select>'
|
286
|
-
end
|
287
|
-
|
288
|
-
it "should create date tag" do
|
289
|
-
@f.input(:date).to_s.must_equal '<input type="date"/>'
|
290
|
-
end
|
291
|
-
|
292
|
-
it "should create datetime-local tag" do
|
293
|
-
@f.input(:datetime).to_s.must_equal '<input type="datetime-local"/>'
|
294
|
-
end
|
295
|
-
|
296
|
-
it "should not error for input type :input" do
|
297
|
-
@f.input(:input).to_s.must_equal '<input type="input"/>'
|
298
|
-
end
|
299
|
-
|
300
|
-
it "should use multiple select boxes for dates if the :as=>:select option is given" do
|
301
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5)).to_s.must_equal %{<select id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select>}
|
302
|
-
end
|
303
|
-
|
304
|
-
it "should use labels for select boxes for dates if the :as=>:select and :select_labels options are given" do
|
305
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :select_labels=>{:year=>'Y', :month=>'M', :day=>'D'}, :labeler=>:explicit).to_s.must_equal %{<label class="label-before" for="bar">Y</label><select id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<label class="label-before" for="bar_month">M</label><select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<label class="label-before" for="bar_day">D</label><select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select>}
|
306
|
-
end
|
307
|
-
|
308
|
-
it "should allow ordering date select boxes via :order" do
|
309
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :order=>[:month, '/', :day, '/', :year]).to_s.must_equal %{<select id="bar" name="foo[month]">#{sel(1..12, 6)}</select>/<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select>/<select id="bar_year" name="foo[year]">#{sel(1900..2050, 2011)}</select>}
|
310
|
-
end
|
311
|
-
|
312
|
-
it "should allow only using specific date select boxes via :order" do
|
313
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :order=>[:month, :year]).to_s.must_equal %{<select id="bar" name="foo[month]">#{sel(1..12, 6)}</select><select id="bar_year" name="foo[year]">#{sel(1900..2050, 2011)}</select>}
|
314
|
-
end
|
315
|
-
|
316
|
-
it "should support :select_options for dates when :as=>:select is given" do
|
317
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :select_options=>{:year=>1970..2020}).to_s.must_equal %{<select id="bar" name="foo[year]">#{sel(1970..2020, 2011)}</select>-<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select>}
|
318
|
-
end
|
319
|
-
|
320
|
-
it "should support :select_options with both values and text for dates when :as=>:select is given" do
|
321
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :select_options=>{:year=>[[2011, 'A'], [2012, 'B']]}).to_s.must_equal %{<select id="bar" name="foo[year]"><option selected="selected" value="2011">A</option><option value="2012">B</option></select>-<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select>}
|
322
|
-
end
|
323
|
-
|
324
|
-
it "should have explicit labeler and trtd wrapper work with multiple select boxes for dates" do
|
325
|
-
@f.input(:date, :name=>"foo", :id=>"bar", :as=>:select, :value=>Date.new(2011, 6, 5), :wrapper=>:trtd, :labeler=>:explicit, :label=>'Baz').to_s.must_equal %{<tr><td><label class="label-before" for="bar">Baz</label></td><td><select id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select></td></tr>}
|
326
|
-
end
|
327
|
-
|
328
|
-
it "should use multiple select boxes for datetimes if the :as=>:select option is given" do
|
329
|
-
@f.input(:datetime, :name=>"foo", :id=>"bar", :as=>:select, :value=>DateTime.new(2011, 6, 5, 4, 3, 2)).to_s.must_equal %{<select id="bar" name="foo[year]">#{sel(1900..2050, 2011)}</select>-<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select> <select id="bar_hour" name="foo[hour]">#{sel(0..23, 4)}</select>:<select id="bar_minute" name="foo[minute]">#{sel(0..59, 3)}</select>:<select id="bar_second" name="foo[second]">#{sel(0..59, 2)}</select>}
|
330
|
-
end
|
331
|
-
|
332
|
-
it "should allow ordering select boxes for datetimes via :order" do
|
333
|
-
@f.input(:datetime, :name=>"foo", :id=>"bar", :as=>:select, :value=>DateTime.new(2011, 6, 5, 4, 3, 2), :order=>[:day, '/', :month, 'T', :hour, ':', :minute]).to_s.must_equal %{<select id="bar" name="foo[day]">#{sel(1..31, 5)}</select>/<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>T<select id="bar_hour" name="foo[hour]">#{sel(0..23, 4)}</select>:<select id="bar_minute" name="foo[minute]">#{sel(0..59, 3)}</select>}
|
334
|
-
end
|
335
|
-
|
336
|
-
it "should support :select_options for datetimes when :as=>:select option is given" do
|
337
|
-
@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}).to_s.must_equal %{<select id="bar" name="foo[year]">#{sel(1970..2020, 2011)}</select>-<select id="bar_month" name="foo[month]">#{sel(1..12, 6)}</select>-<select id="bar_day" name="foo[day]">#{sel(1..31, 5)}</select> <select id="bar_hour" name="foo[hour]">#{sel(9..17, 10)}</select>:<select id="bar_minute" name="foo[minute]">#{sel(0..59, 3)}</select>:<select id="bar_second" name="foo[second]">#{sel(0..59, 2)}</select>}
|
338
|
-
end
|
339
|
-
|
340
|
-
it "should create select tag with options" do
|
341
|
-
@f.input(:select, :options=>[1, 2, 3], :selected=>2).to_s.must_equal '<select><option>1</option><option selected="selected">2</option><option>3</option></select>'
|
342
|
-
@f.input(:select, :options=>[1, 2, 3], :value=>2).to_s.must_equal '<select><option>1</option><option selected="selected">2</option><option>3</option></select>'
|
343
|
-
end
|
344
|
-
|
345
|
-
it "should create select tag with options and values" do
|
346
|
-
@f.input(:select, :options=>[[:a, 1], [:b, 2], [:c, 3]], :selected=>2).to_s.must_equal '<select><option value="1">a</option><option selected="selected" value="2">b</option><option value="3">c</option></select>'
|
347
|
-
end
|
348
|
-
|
349
|
-
it "should have select work with false values" do
|
350
|
-
@f.input(:select, :options=>[[1, true], [2, false]], :value=>false).to_s.must_equal '<select><option value="true">1</option><option selected="selected" value="false">2</option></select>'
|
351
|
-
end
|
352
|
-
|
353
|
-
it "should create select tag with option groups" do
|
354
|
-
@f.input(:select, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).to_s.must_equal '<select><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>'
|
355
|
-
end
|
356
|
-
|
357
|
-
it "should create select tag with option groups with attributes" do
|
358
|
-
@f.input(:select, :optgroups=>[[{:label=>'d', :class=>'f'}, [[:a, 1], [:b, 2]]], [{:label=>'e', :class=>'g'}, [[:c, 3]]]], :selected=>2).to_s.must_equal '<select><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>'
|
359
|
-
end
|
360
|
-
|
361
|
-
it "should create select tag with options and values with hashes" do
|
362
|
-
@f.input(:select, :options=>[[:a, {:foo=>1}], [:b, {:bar=>4, :value=>2}], [:c, {:baz=>3}]], :selected=>2).to_s.must_equal '<select><option foo="1">a</option><option bar="4" selected="selected" value="2">b</option><option baz="3">c</option></select>'
|
363
|
-
end
|
364
|
-
|
365
|
-
it "should create select tag with options and values using given method" do
|
366
|
-
@f.input(:select, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :selected=>2).to_s.must_equal '<select><option>1</option><option selected="selected">2</option><option>3</option></select>'
|
367
|
-
@f.input(:select, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :value_method=>:first, :selected=>:b).to_s.must_equal '<select><option value="a">1</option><option selected="selected" value="b">2</option><option value="c">3</option></select>'
|
368
|
-
end
|
369
|
-
|
370
|
-
it "should use html attributes specified in options" do
|
371
|
-
@f.input(:text, :value=>'foo', :name=>'bar').to_s.must_equal '<input name="bar" type="text" value="foo"/>'
|
372
|
-
@f.input(:textarea, :value=>'foo', :name=>'bar').to_s.must_equal '<textarea name="bar">foo</textarea>'
|
373
|
-
@f.input(:select, :name=>'bar', :options=>[1, 2, 3]).to_s.must_equal '<select name="bar"><option>1</option><option>2</option><option>3</option></select>'
|
374
|
-
end
|
375
|
-
|
376
|
-
it "should support :add_blank option for select inputs" do
|
377
|
-
@f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).to_s.must_equal '<select><option value=""></option><option selected="selected" value="2">b</option><option value="3">c</option></select>'
|
378
|
-
end
|
379
|
-
|
380
|
-
it "should use Forme.default_add_blank_prompt value if :add_blank option is true" do
|
381
|
-
begin
|
382
|
-
Forme.default_add_blank_prompt = 'foo'
|
383
|
-
@f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).to_s.must_equal '<select><option value="">foo</option><option selected="selected" value="2">b</option><option value="3">c</option></select>'
|
384
|
-
ensure
|
385
|
-
Forme.default_add_blank_prompt = nil
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
it "should use :add_blank option value as prompt if it is a String" do
|
390
|
-
@f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>"Prompt Here", :value=>2).to_s.must_equal '<select><option value="">Prompt Here</option><option selected="selected" value="2">b</option><option value="3">c</option></select>'
|
391
|
-
end
|
392
|
-
|
393
|
-
it "should support :add_blank option with :blank_position :after for select inputs" do
|
394
|
-
@f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :blank_position=>:after, :value=>2).to_s.must_equal '<select><option selected="selected" value="2">b</option><option value="3">c</option><option value=""></option></select>'
|
395
|
-
end
|
396
|
-
|
397
|
-
it "should support :add_blank option with :blank_attr option for select inputs" do
|
398
|
-
@f.input(:select, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :blank_attr=>{:foo=>:bar}, :value=>2).to_s.must_equal '<select><option foo="bar" value=""></option><option selected="selected" value="2">b</option><option value="3">c</option></select>'
|
399
|
-
end
|
400
|
-
|
401
|
-
it "should create set of radio buttons" do
|
402
|
-
@f.input(:radioset, :options=>[1, 2, 3], :selected=>2).to_s.must_equal '<label class="option"><input type="radio" value="1"/> 1</label><label class="option"><input checked="checked" type="radio" value="2"/> 2</label><label class="option"><input type="radio" value="3"/> 3</label>'
|
403
|
-
@f.input(:radioset, :options=>[1, 2, 3], :value=>2).to_s.must_equal '<label class="option"><input type="radio" value="1"/> 1</label><label class="option"><input checked="checked" type="radio" value="2"/> 2</label><label class="option"><input type="radio" value="3"/> 3</label>'
|
404
|
-
end
|
405
|
-
|
406
|
-
it "should have radioset work with false values" do
|
407
|
-
@f.input(:radioset, :options=>[[1, true], [2, false]], :value=>false).to_s.must_equal '<label class="option"><input type="radio" value="true"/> 1</label><label class="option"><input checked="checked" type="radio" value="false"/> 2</label>'
|
408
|
-
end
|
409
|
-
|
410
|
-
it "should create set of radio buttons with options and values" do
|
411
|
-
@f.input(:radioset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :selected=>2).to_s.must_equal '<label class="option"><input type="radio" value="1"/> a</label><label class="option"><input checked="checked" type="radio" value="2"/> b</label><label class="option"><input type="radio" value="3"/> c</label>'
|
412
|
-
end
|
413
|
-
|
414
|
-
it "should create set of radio buttons with options and values with hashes" do
|
415
|
-
@f.input(:radioset, :options=>[[:a, {:attr=>{:foo=>1}}], [:b, {:class=>'foo', :value=>2}], [:c, {:id=>:baz}]], :selected=>2).to_s.must_equal '<label class="option"><input foo="1" type="radio" value="a"/> a</label><label class="option"><input checked="checked" class="foo" type="radio" value="2"/> b</label><label class="option"><input id="baz" type="radio" value="c"/> c</label>'
|
416
|
-
end
|
417
|
-
|
418
|
-
it "should create set of radio buttons with options and values using given method" do
|
419
|
-
@f.input(:radioset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :selected=>2).to_s.must_equal '<label class="option"><input type="radio" value="1"/> 1</label><label class="option"><input checked="checked" type="radio" value="2"/> 2</label><label class="option"><input type="radio" value="3"/> 3</label>'
|
420
|
-
@f.input(:radioset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :value_method=>:first, :selected=>:b).to_s.must_equal '<label class="option"><input type="radio" value="a"/> 1</label><label class="option"><input checked="checked" type="radio" value="b"/> 2</label><label class="option"><input type="radio" value="c"/> 3</label>'
|
421
|
-
end
|
422
|
-
|
423
|
-
it "should support :add_blank option for radioset inputs" do
|
424
|
-
@f.input(:radioset, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).to_s.must_equal '<label class="option"><input type="radio" value=""/> </label><label class="option"><input checked="checked" type="radio" value="2"/> b</label><label class="option"><input type="radio" value="3"/> c</label>'
|
425
|
-
end
|
426
|
-
|
427
|
-
it "should use :add_blank option value as prompt if it is a String" do
|
428
|
-
@f.input(:radioset, :options=>[[:b, 2], [:c, 3]], :add_blank=>"Prompt Here", :value=>2).to_s.must_equal '<label class="option"><input type="radio" value=""/> Prompt Here</label><label class="option"><input checked="checked" type="radio" value="2"/> b</label><label class="option"><input type="radio" value="3"/> c</label>'
|
429
|
-
end
|
430
|
-
|
431
|
-
it "should respect the :key option for radio sets" do
|
432
|
-
@f.input(:radioset, :options=>[1, 2, 3], :key=>:foo, :value=>2).to_s.must_equal '<label class="option"><input id="foo_1" name="foo" type="radio" value="1"/> 1</label><label class="option"><input checked="checked" id="foo_2" name="foo" type="radio" value="2"/> 2</label><label class="option"><input id="foo_3" name="foo" type="radio" value="3"/> 3</label>'
|
433
|
-
end
|
434
|
-
|
435
|
-
it "should create set of radio buttons with fieldsets and legends for :optgroups" do
|
436
|
-
@f.input(:radioset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).to_s.must_equal '<fieldset><legend>d</legend><label class="option"><input type="radio" value="1"/> a</label><label class="option"><input checked="checked" type="radio" value="2"/> b</label></fieldset><fieldset><legend>e</legend><label class="option"><input type="radio" value="3"/> c</label></fieldset>'
|
437
|
-
end
|
438
|
-
|
439
|
-
it "should create set of radio buttons with label attributes" do
|
440
|
-
@f.input(:radioset, :options=>[1, 2, 3], :selected=>2, :label_attr=>{:foo=>:bar}).to_s.must_equal '<label class="option" foo="bar"><input type="radio" value="1"/> 1</label><label class="option" foo="bar"><input checked="checked" type="radio" value="2"/> 2</label><label class="option" foo="bar"><input type="radio" value="3"/> 3</label>'
|
441
|
-
end
|
442
|
-
|
443
|
-
it "should create set of radio buttons with :error and :error_attr options" do
|
444
|
-
@f.input(:radioset, :options=>[1, 2, 3], :selected=>2, :error=>'foo', :error_attr=>{'bar'=>'baz'}).to_s.must_equal '<label class="option"><input type="radio" value="1"/> 1</label><label class="option"><input checked="checked" type="radio" value="2"/> 2</label><label class="option"><input aria-invalid="true" class="error" type="radio" value="3"/> 3</label><span bar="baz" class="error_message">foo</span>'
|
445
|
-
end
|
446
|
-
|
447
|
-
it "should support custom error_handler for set of radio buttons" do
|
448
|
-
@f.input(:radioset, :options=>[1, 2, 3], :selected=>2, :error=>'foo', :error_attr=>{'bar'=>'baz'}, :error_handler=>lambda{|tag, input| input.tag(:div, {}, tag)}).to_s.must_equal '<div><label class="option"><input type="radio" value="1"/> 1</label><label class="option"><input checked="checked" type="radio" value="2"/> 2</label><label class="option"><input type="radio" value="3"/> 3</label></div>'
|
449
|
-
end
|
450
|
-
|
451
|
-
it "should create set of checkbox buttons" do
|
452
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :selected=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option"><input type="checkbox" value="3"/> 3</label>'
|
453
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :value=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option"><input type="checkbox" value="3"/> 3</label>'
|
454
|
-
end
|
455
|
-
|
456
|
-
it "should create set of checkbox buttons with options and values" do
|
457
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :selected=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> a</label><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label><label class="option"><input type="checkbox" value="3"/> c</label>'
|
458
|
-
end
|
459
|
-
|
460
|
-
it "should have radioset work with false values" do
|
461
|
-
@f.input(:checkboxset, :options=>[[1, true], [2, false]], :value=>false).to_s.must_equal '<label class="option"><input type="checkbox" value="true"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="false"/> 2</label>'
|
462
|
-
end
|
463
|
-
|
464
|
-
it "should support :wrapper and :tag_wrapper for checkboxsets" do
|
465
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :tag_wrapper=>:div, :wrapper=>:li).to_s.must_equal '<li><div><label class="option"><input type="checkbox" value="1"/> a</label></div><div><label class="option"><input type="checkbox" value="2"/> b</label></div><div><label class="option"><input type="checkbox" value="3"/> c</label></div></li>'
|
466
|
-
end
|
467
|
-
|
468
|
-
it "should support :label for checkboxsets" do
|
469
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :label=>'foo').to_s.must_equal '<span class="label">foo</span><label class="option"><input type="checkbox" value="1"/> a</label><label class="option"><input type="checkbox" value="2"/> b</label><label class="option"><input type="checkbox" value="3"/> c</label>'
|
470
|
-
end
|
471
|
-
|
472
|
-
it "should support fieldset/legend for checkboxsets" do
|
473
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :label=>'foo', :labeler=>:legend, :wrapper=>:fieldset).to_s.must_equal '<fieldset><legend>foo</legend><label class="option"><input type="checkbox" value="1"/> a</label><label class="option"><input type="checkbox" value="2"/> b</label><label class="option"><input type="checkbox" value="3"/> c</label></fieldset>'
|
474
|
-
end
|
475
|
-
|
476
|
-
it "should support legend with attributes for checkboxsets" do
|
477
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :label=>'foo', :label_attr=>{:class=>"baz"}, :tag_label_attr=>{:class=>"bar"}, :labeler=>:legend, :wrapper=>:fieldset).to_s.must_equal '<fieldset><legend class="baz">foo</legend><label class="bar"><input type="checkbox" value="1"/> a</label><label class="bar"><input type="checkbox" value="2"/> b</label><label class="bar"><input type="checkbox" value="3"/> c</label></fieldset>'
|
478
|
-
end
|
479
|
-
|
480
|
-
it "should support legend with attributes for checkboxsets, handling errors with :error_handler=>:after_legend" do
|
481
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :id=>:quux, :label=>'foo', :label_attr=>{:class=>"baz"}, :tag_label_attr=>{:class=>"bar"}, :labeler=>:legend, :wrapper=>:fieldset, :error=>'bar2', :error_handler=>:after_legend).to_s.must_equal '<fieldset><legend class="baz">foo</legend><span class="error_message" id="quux_1_error_message">bar2</span><label class="bar"><input aria-describedby="quux_1_error_message" aria-invalid="true" class="error" id="quux_1" type="checkbox" value="1"/> a</label><label class="bar"><input id="quux_2" type="checkbox" value="2"/> b</label><label class="bar"><input id="quux_3" type="checkbox" value="3"/> c</label></fieldset>'
|
482
|
-
end
|
483
|
-
|
484
|
-
it "should support :tag_labeler for checkboxsets" do
|
485
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :tag_labeler=>:explicit).to_s.must_equal '<input type="checkbox" value="1"/><label class="option label-after">a</label><input type="checkbox" value="2"/><label class="option label-after">b</label><input type="checkbox" value="3"/><label class="option label-after">c</label>'
|
486
|
-
end
|
487
|
-
|
488
|
-
it "should support custom :labeler for checkboxsets" do
|
489
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :label=>'foo', :labeler=>lambda{|tag, input| input.tag(:div, {}, tag)}).to_s.must_equal '<div><label class="option"><input type="checkbox" value="1"/> a</label><label class="option"><input type="checkbox" value="2"/> b</label><label class="option"><input type="checkbox" value="3"/> c</label></div>'
|
490
|
-
end
|
491
|
-
|
492
|
-
it "should create set of checkbox buttons with options and values with hashes" do
|
493
|
-
@f.input(:checkboxset, :options=>[[:a, {:attr=>{:foo=>1}}], [:b, {:class=>'foo', :value=>2}], [:c, {:id=>:baz}]], :selected=>2).to_s.must_equal '<label class="option"><input foo="1" type="checkbox" value="a"/> a</label><label class="option"><input checked="checked" class="foo" type="checkbox" value="2"/> b</label><label class="option"><input id="baz" type="checkbox" value="c"/> c</label>'
|
494
|
-
end
|
495
|
-
|
496
|
-
it "should create set of checkbox buttons with options and values using given method" do
|
497
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :selected=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option"><input type="checkbox" value="3"/> 3</label>'
|
498
|
-
@f.input(:checkboxset, :options=>[[:a, 1], [:b, 2], [:c, 3]], :text_method=>:last, :value_method=>:first, :selected=>:b).to_s.must_equal '<label class="option"><input type="checkbox" value="a"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="b"/> 2</label><label class="option"><input type="checkbox" value="c"/> 3</label>'
|
499
|
-
end
|
500
|
-
|
501
|
-
it "should support :add_blank option for checkboxset inputs" do
|
502
|
-
@f.input(:checkboxset, :options=>[[:b, 2], [:c, 3]], :add_blank=>true, :value=>2).to_s.must_equal '<label class="option"><input type="checkbox" value=""/> </label><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label><label class="option"><input type="checkbox" value="3"/> c</label>'
|
503
|
-
end
|
504
|
-
|
505
|
-
it "should use :add_blank option value as prompt if it is a String" do
|
506
|
-
@f.input(:checkboxset, :options=>[[:b, 2], [:c, 3]], :add_blank=>"Prompt Here", :value=>2).to_s.must_equal '<label class="option"><input type="checkbox" value=""/> Prompt Here</label><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label><label class="option"><input type="checkbox" value="3"/> c</label>'
|
507
|
-
end
|
508
|
-
|
509
|
-
it "should respect the :key option for checkbox sets" do
|
510
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :key=>:foo, :value=>2).to_s.must_equal '<label class="option"><input id="foo_1" name="foo[]" type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" id="foo_2" name="foo[]" type="checkbox" value="2"/> 2</label><label class="option"><input id="foo_3" name="foo[]" type="checkbox" value="3"/> 3</label>'
|
511
|
-
end
|
512
|
-
|
513
|
-
it "should prefer the :name option to :key option for checkbox sets" do
|
514
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :key=>:foo, :name=>'bar[]', :value=>2).to_s.must_equal '<label class="option"><input id="foo_1" name="bar[]" type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" id="foo_2" name="bar[]" type="checkbox" value="2"/> 2</label><label class="option"><input id="foo_3" name="bar[]" type="checkbox" value="3"/> 3</label>'
|
515
|
-
end
|
516
|
-
|
517
|
-
it "should prefer the :name and :id option to :key option for checkbox sets" do
|
518
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :key=>:foo, :name=>'bar[]', :id=>:baz, :value=>2).to_s.must_equal '<label class="option"><input id="baz_1" name="bar[]" type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" id="baz_2" name="bar[]" type="checkbox" value="2"/> 2</label><label class="option"><input id="baz_3" name="bar[]" type="checkbox" value="3"/> 3</label>'
|
519
|
-
end
|
520
|
-
|
521
|
-
it "should respect the :error option for checkbox sets" do
|
522
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :error=>'foo', :value=>2).to_s.must_equal '<label class="option"><input type="checkbox" value="1"/> 1</label><label class="option"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option"><input aria-invalid="true" class="error" type="checkbox" value="3"/> 3</label><span class="error_message">foo</span>'
|
523
|
-
end
|
524
|
-
|
525
|
-
it "should create set of checkbox buttons with fieldsets and legends for optgroups" do
|
526
|
-
@f.input(:checkboxset, :optgroups=>[['d', [[:a, 1], [:b, 2]]], ['e', [[:c, 3]]]], :selected=>2).to_s.must_equal '<fieldset><legend>d</legend><label class="option"><input type="checkbox" value="1"/> a</label><label class="option"><input checked="checked" type="checkbox" value="2"/> b</label></fieldset><fieldset><legend>e</legend><label class="option"><input type="checkbox" value="3"/> c</label></fieldset>'
|
527
|
-
end
|
528
|
-
|
529
|
-
it "should create set of checkbox buttons with label attributes" do
|
530
|
-
@f.input(:checkboxset, :options=>[1, 2, 3], :selected=>2, :label_attr=>{:foo=>:bar}).to_s.must_equal '<label class="option" foo="bar"><input type="checkbox" value="1"/> 1</label><label class="option" foo="bar"><input checked="checked" type="checkbox" value="2"/> 2</label><label class="option" foo="bar"><input type="checkbox" value="3"/> 3</label>'
|
531
|
-
end
|
532
|
-
|
533
|
-
it "should raise an Error for empty checkbox sets" do
|
534
|
-
@f.input(:checkboxset, :options=>[], :error=>'foo', :value=>2).to_s.must_equal '<span class="error_message">foo</span>'
|
535
|
-
end
|
536
|
-
|
537
|
-
it "radio and checkbox inputs should handle :checked option" do
|
538
|
-
@f.input(:radio, :checked=>true).to_s.must_equal '<input checked="checked" type="radio"/>'
|
539
|
-
@f.input(:radio, :checked=>false).to_s.must_equal '<input type="radio"/>'
|
540
|
-
@f.input(:checkbox, :checked=>true).to_s.must_equal '<input checked="checked" type="checkbox"/>'
|
541
|
-
@f.input(:checkbox, :checked=>false).to_s.must_equal '<input type="checkbox"/>'
|
542
|
-
end
|
543
|
-
|
544
|
-
it "inputs should handle :autofocus option" do
|
545
|
-
@f.input(:text, :autofocus=>true).to_s.must_equal '<input autofocus="autofocus" type="text"/>'
|
546
|
-
@f.input(:text, :autofocus=>false).to_s.must_equal '<input type="text"/>'
|
547
|
-
end
|
548
|
-
|
549
|
-
it "inputs should handle :required option" do
|
550
|
-
@f.input(:text, :required=>true).to_s.must_equal '<input required="required" type="text"/>'
|
551
|
-
@f.input(:text, :required=>false).to_s.must_equal '<input type="text"/>'
|
552
|
-
end
|
553
|
-
|
554
|
-
it "inputs should handle :disabled option" do
|
555
|
-
@f.input(:text, :disabled=>true).to_s.must_equal '<input disabled="disabled" type="text"/>'
|
556
|
-
@f.input(:text, :disabled=>false).to_s.must_equal '<input type="text"/>'
|
557
|
-
end
|
558
|
-
|
559
|
-
it "inputs should not include options with nil values" do
|
560
|
-
@f.input(:text, :name=>nil).to_s.must_equal '<input type="text"/>'
|
561
|
-
@f.input(:textarea, :name=>nil).to_s.must_equal '<textarea></textarea>'
|
562
|
-
end
|
563
|
-
|
564
|
-
it "inputs should include options with false values" do
|
565
|
-
@f.input(:text, :name=>false).to_s.must_equal '<input name="false" type="text"/>'
|
566
|
-
end
|
567
|
-
|
568
|
-
it "should automatically create a label if a :label option is used" do
|
569
|
-
@f.input(:text, :label=>'Foo', :value=>'foo').to_s.must_equal '<label>Foo: <input type="text" value="foo"/></label>'
|
570
|
-
end
|
571
|
-
|
572
|
-
it "should set label attributes with :label_attr option" do
|
573
|
-
@f.input(:text, :label=>'Foo', :value=>'foo', :label_attr=>{:class=>'bar'}).to_s.must_equal '<label class="bar">Foo: <input type="text" value="foo"/></label>'
|
574
|
-
end
|
575
|
-
|
576
|
-
it "should handle implicit labels with checkboxes" do
|
577
|
-
@f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a').to_s.must_equal '<input name="a" type="hidden" value="0"/><label><input name="a" type="checkbox" value="foo"/> Foo</label>'
|
578
|
-
end
|
579
|
-
|
580
|
-
it "should handle implicit labels with :label_position=>:after" do
|
581
|
-
@f.input(:text, :label=>'Foo', :value=>'foo', :label_position=>:after).to_s.must_equal '<label><input type="text" value="foo"/> Foo</label>'
|
582
|
-
end
|
583
|
-
|
584
|
-
it "should handle implicit labels with checkboxes with :label_position=>:before" do
|
585
|
-
@f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a', :label_position=>:before).to_s.must_equal '<input name="a" type="hidden" value="0"/><label>Foo <input name="a" type="checkbox" value="foo"/></label>'
|
586
|
-
end
|
587
|
-
|
588
|
-
it "should automatically note the input has errors if :error option is used" do
|
589
|
-
@f.input(:text, :error=>'Bad Stuff!', :value=>'foo').to_s.must_equal '<input aria-invalid="true" class="error" type="text" value="foo"/><span class="error_message">Bad Stuff!</span>'
|
590
|
-
end
|
591
|
-
|
592
|
-
it "should add an error message after the label" do
|
593
|
-
@f.input(:text, :error=>'Bad Stuff!', :value=>'foo', :label=>"Foo").to_s.must_equal '<label>Foo: <input aria-invalid="true" class="error" type="text" value="foo"/></label><span class="error_message">Bad Stuff!</span>'
|
594
|
-
end
|
595
|
-
|
596
|
-
it "should add to existing :class option if :error option is used" do
|
597
|
-
@f.input(:text, :error=>'Bad Stuff!', :class=>'bar', :value=>'foo').to_s.must_equal '<input aria-invalid="true" class="bar error" type="text" value="foo"/><span class="error_message">Bad Stuff!</span>'
|
598
|
-
end
|
599
|
-
|
600
|
-
it "should respect :error_attr option for setting the attributes for the error message span" do
|
601
|
-
@f.input(:text, :error=>'Bad Stuff!', :value=>'foo', :error_attr=>{:class=>'foo'}).to_s.must_equal '<input aria-invalid="true" class="error" type="text" value="foo"/><span class="foo error_message">Bad Stuff!</span>'
|
602
|
-
end
|
603
|
-
|
604
|
-
it "should use aria-describedby and aria-invalid tags for errors with where the id attribute can be determined" do
|
605
|
-
@f.input(:text, :error=>'Bad Stuff!', :id=>:bar, :value=>'foo', :error_attr=>{:class=>'foo'}).to_s.must_equal '<input aria-describedby="bar_error_message" aria-invalid="true" class="error" id="bar" type="text" value="foo"/><span class="foo error_message" id="bar_error_message">Bad Stuff!</span>'
|
606
|
-
end
|
607
|
-
|
608
|
-
it "#open should return an opening tag" do
|
609
|
-
@f.open(:action=>'foo', :method=>'post').to_s.must_equal '<form action="foo" method="post">'
|
610
|
-
end
|
611
|
-
|
612
|
-
it "#close should return a closing tag" do
|
613
|
-
@f.close.to_s.must_equal '</form>'
|
614
|
-
end
|
615
|
-
|
616
|
-
it "#button should return a submit tag" do
|
617
|
-
@f.button.to_s.must_equal '<input type="submit"/>'
|
618
|
-
end
|
619
|
-
|
620
|
-
it "#button should accept an options hash" do
|
621
|
-
@f.button(:name=>'foo', :value=>'bar').to_s.must_equal '<input name="foo" type="submit" value="bar"/>'
|
622
|
-
end
|
623
|
-
|
624
|
-
it "#button should accept a string to use as a value" do
|
625
|
-
@f.button('foo').to_s.must_equal '<input type="submit" value="foo"/>'
|
626
|
-
end
|
627
|
-
|
628
|
-
it "#tag should return a serialized_tag" do
|
629
|
-
@f.tag(:textarea).to_s.must_equal '<textarea></textarea>'
|
630
|
-
@f.tag(:textarea, :name=>:foo).to_s.must_equal '<textarea name="foo"></textarea>'
|
631
|
-
@f.tag(:textarea, {:name=>:foo}, :bar).to_s.must_equal '<textarea name="foo">bar</textarea>'
|
632
|
-
end
|
633
|
-
|
634
|
-
it "#tag should accept a block" do
|
635
|
-
@f.tag(:div){@f.tag(:textarea)}.to_s.must_equal '<div><textarea></textarea></div>'
|
636
|
-
@f.tag(:div, :name=>'a'){@f.tag(:textarea)}.to_s.must_equal '<div name="a"><textarea></textarea></div>'
|
637
|
-
@f.tag(:div, {:name=>'a'}, ["text"]){@f.tag(:textarea)}.to_s.must_equal '<div name="a">text<textarea></textarea></div>'
|
638
|
-
end
|
639
|
-
|
640
|
-
it "#tag should accept children as procs" do
|
641
|
-
@f.tag(:div, {:class=>"foo"}, lambda{|t| t.tag(:input, :class=>t.attr[:class])}).to_s.must_equal '<div class="foo"><input class="foo"/></div>'
|
642
|
-
end
|
643
|
-
|
644
|
-
it "#tag should accept children as methods" do
|
645
|
-
o = Object.new
|
646
|
-
def o.foo(t) t.tag(:input, :class=>t.attr[:class]) end
|
647
|
-
@f.tag(:div, {:class=>"foo"}, o.method(:foo)).to_s.must_equal '<div class="foo"><input class="foo"/></div>'
|
648
|
-
end
|
649
|
-
|
650
|
-
it "should have an #inputs method for multiple inputs wrapped in a fieldset" do
|
651
|
-
@f.inputs([:textarea, :text]).to_s.must_equal '<fieldset class="inputs"><textarea></textarea><input type="text"/></fieldset>'
|
652
|
-
end
|
653
|
-
|
654
|
-
it "should have an #inputs method for multiple inputs wrapped in a fieldset when using an empty block" do
|
655
|
-
@f.inputs([:textarea, :text]){}.to_s.must_equal '<fieldset class="inputs"><textarea></textarea><input type="text"/></fieldset>'
|
656
|
-
end
|
657
|
-
|
658
|
-
it "should have default #inputs method accept an :attr option" do
|
659
|
-
@f.inputs([:textarea, :text], :legend=>'Inputs', :attr=>{:class=>'foo', :bar=>'baz'}).to_s.must_equal '<fieldset bar="baz" class="foo inputs"><legend>Inputs</legend><textarea></textarea><input type="text"/></fieldset>'
|
660
|
-
end
|
661
|
-
|
662
|
-
it "should have default #inputs method accept a :legend option" do
|
663
|
-
@f.inputs([:textarea, :text], :legend=>'Inputs').to_s.must_equal '<fieldset class="inputs"><legend>Inputs</legend><textarea></textarea><input type="text"/></fieldset>'
|
664
|
-
end
|
665
|
-
|
666
|
-
it "should have default #inputs method accept a :legend_attr option" do
|
667
|
-
@f.inputs([:textarea, :text], :legend=>'Inputs', :legend_attr=>{:class=>'foo'}).to_s.must_equal '<fieldset class="inputs"><legend class="foo">Inputs</legend><textarea></textarea><input type="text"/></fieldset>'
|
668
|
-
end
|
669
|
-
|
670
|
-
it "should have an #inputs method take a block and yield to it" do
|
671
|
-
@f.inputs{@f.input(:textarea); @f.input(:text)}.to_s.must_equal '<fieldset class="inputs"><textarea></textarea><input type="text"/></fieldset>'
|
672
|
-
end
|
673
|
-
|
674
|
-
it "should have an #inputs method work with both args and block" do
|
675
|
-
@f.inputs([:textarea]){@f.input(:text)}.to_s.must_equal '<fieldset class="inputs"><textarea></textarea><input type="text"/></fieldset>'
|
676
|
-
end
|
677
|
-
|
678
|
-
it "should have an #inputs method support array arguments and creating inputs with the array as argument list" do
|
679
|
-
@f.inputs([[:textarea, {:name=>'foo'}], [:text, {:id=>'bar'}]]).to_s.must_equal '<fieldset class="inputs"><textarea name="foo"></textarea><input id="bar" type="text"/></fieldset>'
|
680
|
-
end
|
681
|
-
|
682
|
-
it "should have #inputs accept transformer options to modify the options inside the inputs" do
|
683
|
-
@f.inputs([:textarea, :text], :wrapper=>:div).to_s.must_equal '<fieldset class="inputs"><div><textarea></textarea></div><div><input type="text"/></div></fieldset>'
|
684
|
-
end
|
685
|
-
|
686
|
-
it "should have #inputs accept :nested_inputs_wrapper options to modify the :input_wrapper option inside the inputs" do
|
687
|
-
@f.inputs(:nested_inputs_wrapper=>:div){@f.inputs([:textarea, :text])}.to_s.must_equal '<fieldset class="inputs"><div><textarea></textarea><input type="text"/></div></fieldset>'
|
688
|
-
end
|
689
|
-
|
690
|
-
it "should escape tag content" do
|
691
|
-
@f.tag(:div, {}, ['<p></p>']).to_s.must_equal '<div><p></p></div>'
|
692
|
-
end
|
693
|
-
|
694
|
-
it "should not escape raw tag content using Forme::Raw" do
|
695
|
-
@f.tag(:div, {}, ['<p></p>'.dup.extend(Forme::Raw)]).to_s.must_equal '<div><p></p></div>'
|
696
|
-
end
|
697
|
-
|
698
|
-
it "should not escape raw tag content using Forme.raw" do
|
699
|
-
@f.tag(:div, {}, [Forme.raw('<p></p>')]).to_s.must_equal '<div><p></p></div>'
|
700
|
-
end
|
701
|
-
|
702
|
-
it "should not escape raw tag content using Form#raw" do
|
703
|
-
@f.tag(:div, {}, [@f.raw('<p></p>')]).to_s.must_equal '<div><p></p></div>'
|
704
|
-
end
|
705
|
-
|
706
|
-
it "should escape tag content in attribute values" do
|
707
|
-
@f.tag(:div, :foo=>'<p></p>').to_s.must_equal '<div foo="<p></p>"></div>'
|
708
|
-
end
|
709
|
-
|
710
|
-
it "should not escape raw tag content in attribute values" do
|
711
|
-
@f.tag(:div, :foo=>Forme.raw('<p></p>')).to_s.must_equal '<div foo="<p></p>"></div>'
|
712
|
-
end
|
713
|
-
|
714
|
-
it "should format dates, times, and datetimes in ISO format" do
|
715
|
-
@f.tag(:div, :foo=>Date.new(2011, 6, 5)).to_s.must_equal '<div foo="2011-06-05"></div>'
|
716
|
-
@f.tag(:div, :foo=>DateTime.new(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="2011-06-05T04:03:02.000"></div>'
|
717
|
-
@f.tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="2011-06-05T04:03:02.000"></div>'
|
718
|
-
end
|
719
|
-
|
720
|
-
it "should format bigdecimals in standard notation" do
|
721
|
-
@f.tag(:div, :foo=>BigDecimal('10000.010')).to_s.must_equal '<div foo="10000.01"></div>'
|
722
|
-
end
|
723
|
-
|
724
|
-
it "inputs should accept a :wrapper option to use a custom wrapper" do
|
725
|
-
@f.input(:text, :wrapper=>:li).to_s.must_equal '<li><input type="text"/></li>'
|
726
|
-
end
|
727
|
-
|
728
|
-
it "inputs should accept a :wrapper_attr option to use custom wrapper attributes" do
|
729
|
-
@f.input(:text, :wrapper=>:li, :wrapper_attr=>{:class=>"foo"}).to_s.must_equal '<li class="foo"><input type="text"/></li>'
|
730
|
-
end
|
731
|
-
|
732
|
-
it "inputs should accept a :help option to use custom helper text" do
|
733
|
-
@f.input(:text, :help=>"List type of foo").to_s.must_equal '<input type="text"/><span class="helper">List type of foo</span>'
|
734
|
-
end
|
735
|
-
|
736
|
-
it "inputs should accept a :helper_attr option for custom helper attributes" do
|
737
|
-
@f.input(:text, :help=>"List type of foo", :helper_attr=>{:class=>'foo'}).to_s.must_equal '<input type="text"/><span class="foo helper">List type of foo</span>'
|
738
|
-
end
|
739
|
-
|
740
|
-
it "inputs should have helper displayed inside wrapper, after error" do
|
741
|
-
@f.input(:text, :help=>"List type of foo", :error=>'bad', :wrapper=>:li).to_s.must_equal '<li><input aria-invalid="true" class="error" type="text"/><span class="error_message">bad</span><span class="helper">List type of foo</span></li>'
|
742
|
-
end
|
743
|
-
|
744
|
-
it "inputs should accept a :formatter option to use a custom formatter" do
|
745
|
-
@f.input(:text, :formatter=>:readonly, :value=>'1', :label=>'Foo').to_s.must_equal '<label>Foo: <span class="readonly-text">1</span></label>'
|
746
|
-
@f.input(:text, :formatter=>:default, :value=>'1', :label=>'Foo').to_s.must_equal '<label>Foo: <input type="text" value="1"/></label>'
|
747
|
-
end
|
748
|
-
|
749
|
-
it "inputs should accept a :labeler option to use a custom labeler" do
|
750
|
-
@f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo).to_s.must_equal '<label class="label-before" for="foo">bar</label><textarea id="foo"></textarea>'
|
751
|
-
end
|
752
|
-
|
753
|
-
it "inputs handle explicit labels with :label_position=>:after" do
|
754
|
-
@f.input(:textarea, :labeler=>:explicit, :label=>'bar', :id=>:foo, :label_position=>:after).to_s.must_equal '<textarea id="foo"></textarea><label class="label-after" for="foo">bar</label>'
|
755
|
-
end
|
756
|
-
|
757
|
-
it "inputs handle explicit labels with :key_id" do
|
758
|
-
@f.input(:textarea, :labeler=>:explicit, :label=>'bar', :key=>:bar, :key_id=>:foo).to_s.must_equal '<label class="label-before" for="bar_foo">bar</label><textarea id="bar_foo" name="bar"></textarea>'
|
759
|
-
end
|
760
|
-
|
761
|
-
it "should handle explicit labels with checkboxes" do
|
762
|
-
@f.input(:checkbox, :labeler=>:explicit, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar').to_s.must_equal '<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>'
|
763
|
-
end
|
764
|
-
|
765
|
-
it "should handle explicit labels with checkboxes with :label_position=>:before" do
|
766
|
-
@f.input(:checkbox, :labeler=>:explicit, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar', :label_position=>:before).to_s.must_equal '<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"/>'
|
767
|
-
end
|
768
|
-
|
769
|
-
it "inputs handle implicit labels or checkboxes without hidden fields with :label_position=>:before" do
|
770
|
-
@f.input(:checkbox, :label=>'Foo', :value=>'foo', :name=>'a', :id=>'bar', :label_position=>:before, :no_hidden=>true).to_s.must_equal '<label>Foo <input id="bar" name="a" type="checkbox" value="foo"/></label>'
|
771
|
-
end
|
772
|
-
|
773
|
-
it "inputs should accept a :error_handler option to use a custom error_handler" do
|
774
|
-
@f.input(:textarea, :error_handler=>proc{|t, i| [t, "!!! #{i.opts[:error]}"]}, :error=>'bar', :id=>:foo).to_s.must_equal '<textarea aria-describedby="foo_error_message" aria-invalid="true" class="error" id="foo"></textarea>!!! bar'
|
775
|
-
end
|
776
|
-
|
777
|
-
it "#inputs should accept a :inputs_wrapper option to use a custom inputs_wrapper" do
|
778
|
-
@f.inputs([:textarea], :inputs_wrapper=>:ol).to_s.must_equal '<ol><textarea></textarea></ol>'
|
779
|
-
end
|
780
|
-
|
781
|
-
it "inputs should accept a :wrapper=>nil option to not use a wrapper" do
|
782
|
-
Forme::Form.new(:wrapper=>:li).input(:text, :wrapper=>nil).to_s.must_equal '<input type="text"/>'
|
783
|
-
end
|
784
|
-
|
785
|
-
it "inputs should accept a :labeler=>nil option to not use a labeler" do
|
786
|
-
@f.input(:textarea, :labeler=>nil, :label=>'bar', :id=>:foo).to_s.must_equal '<textarea id="foo"></textarea>'
|
787
|
-
end
|
788
|
-
|
789
|
-
it "inputs should accept a :error_handler=>nil option to not use an error_handler" do
|
790
|
-
@f.input(:textarea, :error_handler=>nil, :error=>'bar', :id=>:foo).to_s.must_equal '<textarea aria-invalid="true" class="error" id="foo"></textarea>'
|
791
|
-
end
|
792
|
-
|
793
|
-
it "#inputs should accept a :inputs_wrapper=>nil option to not use an inputs_wrapper" do
|
794
|
-
@f.form{|f| f.inputs([:textarea], :inputs_wrapper=>nil)}.to_s.must_equal '<form><textarea></textarea></form>'
|
795
|
-
end
|
796
|
-
|
797
|
-
it "#inputs should treat a single hash argument as an options hash with no default inputs" do
|
798
|
-
@f.inputs(:inputs_wrapper=>:ol){@f.input(:textarea)}.to_s.must_equal '<ol><textarea></textarea></ol>'
|
799
|
-
end
|
800
|
-
|
801
|
-
it "should support setting defaults for inputs at the form level" do
|
802
|
-
f = Forme::Form.new(:input_defaults=>{'text'=>{:size=>20}, 'textarea'=>{:cols=>80, :rows=>6}})
|
803
|
-
f.input(:text, :name=>"foo").to_s.must_equal '<input name="foo" size="20" type="text"/>'
|
804
|
-
f.input(:textarea, :name=>"foo").to_s.must_equal '<textarea cols="80" name="foo" rows="6"></textarea>'
|
805
|
-
end
|
806
|
-
|
807
|
-
it "should work with input_defaults with symbol keys using using inputs with symbol keys" do
|
808
|
-
f = Forme::Form.new(:input_defaults=>{:text=>{:size=>20}, 'text'=>{:size=>30}})
|
809
|
-
f.input(:text, :name=>"foo").to_s.must_equal '<input name="foo" size="20" type="text"/>'
|
810
|
-
f.input('text', :name=>"foo").to_s.must_equal '<input name="foo" size="30" type="text"/>'
|
811
|
-
end
|
812
|
-
|
813
|
-
it "invalid custom transformers should raise an Error" do
|
814
|
-
proc{Forme::Form.new(:wrapper=>Object.new).input(:text).to_s}.must_raise(Forme::Error)
|
815
|
-
proc{@f.input(:textarea, :wrapper=>Object.new).to_s}.must_raise(Forme::Error)
|
816
|
-
proc{@f.input(:textarea, :formatter=>nil).to_s}.must_raise(Forme::Error)
|
817
|
-
end
|
818
|
-
|
819
|
-
it "should handle :before and :after hook options" do
|
820
|
-
Forme.form({}, :before=>lambda{|f| f.tag(:input, :type=>:hidden, :name=>:a, :value=>'b')}, :after=>lambda{|f| f.tag(:input, :type=>:hidden, :name=>:c, :value=>'d')}){|f| f.tag(:input)}.to_s.must_equal '<form><input name="a" type="hidden" value="b"/><input/><input name="c" type="hidden" value="d"/></form>'
|
821
|
-
end
|
822
|
-
end
|
823
|
-
|
824
|
-
describe "Forme custom" do
|
825
|
-
it "formatters can be specified as a proc" do
|
826
|
-
Forme::Form.new(:formatter=>proc{|i| i.tag(:textarea, i.opts[:name]=>:name)}).input(:text, :name=>'foo').to_s.must_equal '<textarea foo="name"></textarea>'
|
827
|
-
end
|
828
|
-
|
829
|
-
it "serializers can be specified as a proc" do
|
830
|
-
Forme::Form.new(:serializer=>proc{|t| "#{t.type} = #{t.opts[:name]}"}).input(:textarea, :name=>'foo').to_s.must_equal 'textarea = foo'
|
831
|
-
end
|
832
|
-
|
833
|
-
it "labelers can be specified as a proc" do
|
834
|
-
Forme::Form.new(:labeler=>proc{|t, i| ["#{i.opts[:label]}: ", t]}).input(:textarea, :name=>'foo', :label=>'bar').to_s.must_equal 'bar: <textarea name="foo"></textarea>'
|
835
|
-
end
|
836
|
-
|
837
|
-
it "error_handlers can be specified as a proc" do
|
838
|
-
Forme::Form.new(:error_handler=>proc{|t, i| [t, "!!! #{i.opts[:error]}"]}).input(:textarea, :name=>'foo', :error=>'bar').to_s.must_equal '<textarea aria-invalid="true" class="error" name="foo"></textarea>!!! bar'
|
839
|
-
end
|
840
|
-
|
841
|
-
it "wrappers can be specified as a proc" do
|
842
|
-
Forme::Form.new(:wrapper=>proc{|t, i| t.tag(:div, {:bar=>i.opts[:name]}, t)}).input(:textarea, :name=>'foo').to_s.must_equal '<div bar="foo"><textarea name="foo"></textarea></div>'
|
843
|
-
end
|
844
|
-
|
845
|
-
it "inputs_wrappers can be specified as a proc" do
|
846
|
-
Forme::Form.new(:inputs_wrapper=>proc{|f, opts, &block| f.tag(:div, &block)}).inputs([:textarea]).to_s.must_equal '<div><textarea></textarea></div>'
|
847
|
-
end
|
848
|
-
|
849
|
-
it "can use nil as value to disable default transformer" do
|
850
|
-
Forme::Form.new(:labeler=>nil).input(:textarea, :label=>'foo').to_s.must_equal '<textarea></textarea>'
|
851
|
-
end
|
852
|
-
end
|
853
|
-
|
854
|
-
describe "Forme built-in custom" do
|
855
|
-
it "transformers should raise if the there is no matching transformer" do
|
856
|
-
proc{Forme::Form.new(:formatter=>:foo).input(:text).to_s}.must_raise(Forme::Error)
|
857
|
-
end
|
858
|
-
|
859
|
-
it "formatter: disabled disables all inputs unless :disabled=>false option" do
|
860
|
-
Forme::Form.new(:formatter=>:disabled).input(:textarea).to_s.must_equal '<textarea disabled="disabled"></textarea>'
|
861
|
-
Forme::Form.new(:formatter=>:disabled).input(:textarea, :disabled=>false).to_s.must_equal '<textarea></textarea>'
|
862
|
-
end
|
863
|
-
|
864
|
-
it "formatter: readonly uses spans for text input fields and disables radio/checkbox fields" do
|
865
|
-
Forme::Form.new(:formatter=>:readonly).input(:text, :label=>"Foo", :value=>"Bar").to_s.must_equal "<label>Foo: <span class=\"readonly-text\">Bar</span></label>"
|
866
|
-
Forme::Form.new(:formatter=>:readonly).input(:radio, :label=>"Foo", :value=>"Bar").to_s.must_equal "<label><input disabled=\"disabled\" type=\"radio\" value=\"Bar\"/> Foo</label>"
|
867
|
-
Forme::Form.new(:formatter=>:readonly).input(:radio, :label=>"Foo", :value=>"Bar", :checked=>true).to_s.must_equal "<label><input checked=\"checked\" disabled=\"disabled\" type=\"radio\" value=\"Bar\"/> Foo</label>"
|
868
|
-
Forme::Form.new(:formatter=>:readonly).input(:checkbox, :label=>"Foo", :value=>"Bar").to_s.must_equal "<label><input disabled=\"disabled\" type=\"checkbox\" value=\"Bar\"/> Foo</label>"
|
869
|
-
Forme::Form.new(:formatter=>:readonly).input(:checkbox, :label=>"Foo", :value=>"Bar", :checked=>true).to_s.must_equal "<label><input checked=\"checked\" disabled=\"disabled\" type=\"checkbox\" value=\"Bar\"/> Foo</label>"
|
870
|
-
Forme::Form.new(:formatter=>:readonly).input(:select, :label=>"Foo", :options=>[1, 2, 3], :value=>2).to_s.must_equal "<label>Foo: <span>2</span></label>"
|
871
|
-
end
|
872
|
-
|
873
|
-
it "formatter: readonly removes hidden inputs" do
|
874
|
-
Forme::Form.new(:formatter=>:readonly).input(:hidden, :value=>"Bar").to_s.must_equal ""
|
875
|
-
end
|
876
|
-
|
877
|
-
it "formatter: readonly formats text into paragraphs for textarea inputs" do
|
878
|
-
Forme::Form.new(:formatter=>:readonly).input(:textarea, :label=>"Foo", :value=>"\n Bar\nBaz\n\nQuuz\n\n1\n2 \n").to_s.must_equal "<label>Foo: <div class=\"readonly-textarea\"><p> Bar<br />Baz</p><p>Quuz</p><p>1<br />2 </p></div></label>"
|
879
|
-
end
|
880
|
-
|
881
|
-
it "formatter: readonly does not format nil, raw string, or non-string inputs" do
|
882
|
-
Forme::Form.new(:formatter=>:readonly).input(:textarea, :label=>"Foo").to_s.must_equal "<label>Foo: <div class=\"readonly-textarea\"></div></label>"
|
883
|
-
Forme::Form.new(:formatter=>:readonly).input(:textarea, :label=>"Foo", :value=>Forme.raw("Bar\n\nBaz")).to_s.must_equal "<label>Foo: <div class=\"readonly-textarea\">Bar\n\nBaz</div></label>"
|
884
|
-
Forme::Form.new(:formatter=>:readonly).input(:textarea, :label=>"Foo", :value=>1).to_s.must_equal "<label>Foo: <div class=\"readonly-textarea\">1</div></label>"
|
885
|
-
end
|
886
|
-
|
887
|
-
it "formatter: readonly should ignore submit buttons" do
|
888
|
-
Forme.form({}, :formatter=>:readonly, :button=>'a').to_s.must_equal '<form></form>'
|
889
|
-
end
|
890
|
-
|
891
|
-
it "labeler: explicit uses an explicit label with for attribute" do
|
892
|
-
Forme::Form.new(:labeler=>:explicit).input(:textarea, :id=>'foo', :label=>'bar').to_s.must_equal '<label class="label-before" for="foo">bar</label><textarea id="foo"></textarea>'
|
893
|
-
end
|
894
|
-
|
895
|
-
it "labeler: explicit handles the key option correctly" do
|
896
|
-
Forme::Form.new(:labeler=>:explicit, :namespace=>:baz).input(:textarea, :key=>'foo', :label=>'bar').to_s.must_equal '<label class="label-before" for="baz_foo">bar</label><textarea id="baz_foo" name="baz[foo]"></textarea>'
|
897
|
-
end
|
898
|
-
|
899
|
-
it "labeler: explicit should handle tags with errors" do
|
900
|
-
Forme::Form.new(:labeler=>:explicit).input(:text, :error=>'Bad Stuff!', :value=>'f', :id=>'foo', :label=>'bar').to_s.must_equal '<label class="label-before" for="foo">bar</label><input aria-describedby="foo_error_message" aria-invalid="true" class="error" id="foo" type="text" value="f"/><span class="error_message" id="foo_error_message">Bad Stuff!</span>'
|
901
|
-
end
|
902
|
-
|
903
|
-
it "wrapper: li wraps tag in an li" do
|
904
|
-
Forme::Form.new(:wrapper=>:li).input(:textarea, :id=>'foo').to_s.must_equal '<li><textarea id="foo"></textarea></li>'
|
905
|
-
Forme::Form.new(:wrapper=>:li).input(:textarea, :id=>'foo', :wrapper_attr=>{:id=>'bar'}).to_s.must_equal '<li id="bar"><textarea id="foo"></textarea></li>'
|
906
|
-
end
|
907
|
-
|
908
|
-
it "wrapper: p wraps tag in an p" do
|
909
|
-
Forme::Form.new(:wrapper=>:p).input(:textarea, :id=>'foo').to_s.must_equal '<p><textarea id="foo"></textarea></p>'
|
910
|
-
Forme::Form.new(:wrapper=>:p).input(:textarea, :id=>'foo', :wrapper_attr=>{:id=>'bar'}).to_s.must_equal '<p id="bar"><textarea id="foo"></textarea></p>'
|
911
|
-
end
|
912
|
-
|
913
|
-
it "wrapper: div wraps tag in an div" do
|
914
|
-
Forme::Form.new(:wrapper=>:div).input(:textarea, :id=>'foo').to_s.must_equal '<div><textarea id="foo"></textarea></div>'
|
915
|
-
Forme::Form.new(:wrapper=>:div).input(:textarea, :id=>'foo', :wrapper_attr=>{:id=>'bar'}).to_s.must_equal '<div id="bar"><textarea id="foo"></textarea></div>'
|
916
|
-
end
|
917
|
-
|
918
|
-
it "wrapper: span wraps tag in an span" do
|
919
|
-
Forme::Form.new(:wrapper=>:span).input(:textarea, :id=>'foo').to_s.must_equal '<span><textarea id="foo"></textarea></span>'
|
920
|
-
Forme::Form.new(:wrapper=>:span).input(:textarea, :id=>'foo', :wrapper_attr=>{:id=>'bar'}).to_s.must_equal '<span id="bar"><textarea id="foo"></textarea></span>'
|
921
|
-
end
|
922
|
-
|
923
|
-
it "wrapper: td wraps tag in an td" do
|
924
|
-
Forme::Form.new(:wrapper=>:td).input(:textarea, :id=>'foo').to_s.must_equal '<td><textarea id="foo"></textarea></td>'
|
925
|
-
Forme::Form.new(:wrapper=>:td).input(:textarea, :id=>'foo', :wrapper_attr=>{:id=>'bar'}).to_s.must_equal '<td id="bar"><textarea id="foo"></textarea></td>'
|
926
|
-
end
|
927
|
-
|
928
|
-
it "wrapper: trtd wraps tag in an tr/td" do
|
929
|
-
Forme::Form.new(:wrapper=>:trtd).input(:textarea, :id=>'foo').to_s.must_equal '<tr><td><textarea id="foo"></textarea></td><td></td></tr>'
|
930
|
-
Forme::Form.new(:wrapper=>:trtd).input(:textarea, :id=>'foo', :wrapper_attr=>{:id=>'bar'}).to_s.must_equal '<tr id="bar"><td><textarea id="foo"></textarea></td><td></td></tr>'
|
931
|
-
end
|
932
|
-
|
933
|
-
it "wrapper: trtd supports multiple tags in separate tds" do
|
934
|
-
Forme::Form.new(:wrapper=>:trtd, :labeler=>:explicit).input(:textarea, :id=>'foo', :label=>'Foo').to_s.must_equal '<tr><td><label class="label-before" for="foo">Foo</label></td><td><textarea id="foo"></textarea></td></tr>'
|
935
|
-
end
|
936
|
-
|
937
|
-
it "wrapper: trtd should use at most 2 td tags" do
|
938
|
-
Forme::Form.new(:wrapper=>:trtd, :labeler=>:explicit).input(:textarea, :id=>'foo', :label=>'Foo', :error=>'Bar').to_s.must_equal '<tr><td><label class="label-before" for="foo">Foo</label></td><td><textarea aria-describedby="foo_error_message" aria-invalid="true" class="error" id="foo"></textarea><span class="error_message" id="foo_error_message">Bar</span></td></tr>'
|
939
|
-
end
|
940
|
-
|
941
|
-
it "wrapper: trtd should handle inputs with label after" do
|
942
|
-
Forme::Form.new(:wrapper=>:trtd, :labeler=>:explicit).input(:checkbox, :id=>'foo', :name=>'foo', :label=>'Foo').to_s.must_equal '<tr><td><label class="label-after" for="foo">Foo</label></td><td><input id="foo_hidden" name="foo" type="hidden" value="0"/><input id="foo" name="foo" type="checkbox"/></td></tr>'
|
943
|
-
end
|
944
|
-
|
945
|
-
it "wrapper: tr should use a td wrapper and tr inputs_wrapper" do
|
946
|
-
Forme::Form.new(:wrapper=>:tr).inputs([:textarea]).to_s.must_equal '<tr><td><textarea></textarea></td></tr>'
|
947
|
-
f = Forme::Form.new
|
948
|
-
f.with_opts(:wrapper=>:tr){f.inputs([:textarea])}.to_s.must_equal '<tr><td><textarea></textarea></td></tr>'
|
949
|
-
end
|
950
|
-
|
951
|
-
it "wrapper: table should use a trtd wrapper and table inputs_wrapper" do
|
952
|
-
Forme::Form.new(:wrapper=>:table).inputs([:textarea]).to_s.must_equal '<table><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
953
|
-
f = Forme::Form.new
|
954
|
-
f.with_opts(:wrapper=>:table){f.inputs([:textarea])}.to_s.must_equal '<table><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
955
|
-
end
|
956
|
-
|
957
|
-
it "wrapper: ol should use an li wrapper and ol inputs_wrapper" do
|
958
|
-
Forme::Form.new(:wrapper=>:ol).inputs([:textarea]).to_s.must_equal '<ol><li><textarea></textarea></li></ol>'
|
959
|
-
f = Forme::Form.new
|
960
|
-
f.with_opts(:wrapper=>:ol){f.inputs([:textarea])}.to_s.must_equal '<ol><li><textarea></textarea></li></ol>'
|
961
|
-
end
|
962
|
-
|
963
|
-
it "wrapper: fieldset_ol should use an li wrapper and fieldset_ol inputs_wrapper" do
|
964
|
-
Forme::Form.new(:wrapper=>:fieldset_ol).inputs([:textarea]).to_s.must_equal '<fieldset class="inputs"><ol><li><textarea></textarea></li></ol></fieldset>'
|
965
|
-
f = Forme::Form.new
|
966
|
-
f.with_opts(:wrapper=>:fieldset_ol){f.inputs([:textarea])}.to_s.must_equal '<fieldset class="inputs"><ol><li><textarea></textarea></li></ol></fieldset>'
|
967
|
-
end
|
968
|
-
|
969
|
-
it "wrapper should not override inputs_wrapper if both given" do
|
970
|
-
Forme::Form.new(:wrapper=>:tr, :inputs_wrapper=>:div).inputs([:textarea]).to_s.must_equal '<div><td><textarea></textarea></td></div>'
|
971
|
-
f = Forme::Form.new
|
972
|
-
f.with_opts(:wrapper=>:tr, :inputs_wrapper=>:div){f.inputs([:textarea])}.to_s.must_equal '<div><td><textarea></textarea></td></div>'
|
973
|
-
end
|
974
|
-
|
975
|
-
it "inputs_wrapper: ol wraps tags in an ol" do
|
976
|
-
Forme::Form.new(:inputs_wrapper=>:ol, :wrapper=>:li).inputs([:textarea]).to_s.must_equal '<ol><li><textarea></textarea></li></ol>'
|
977
|
-
Forme::Form.new(:inputs_wrapper=>:ol, :wrapper=>:li).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<ol foo="1"><li><textarea></textarea></li></ol>'
|
978
|
-
end
|
979
|
-
|
980
|
-
it "inputs_wrapper: fieldset_ol wraps tags in a fieldset and an ol" do
|
981
|
-
Forme::Form.new(:inputs_wrapper=>:fieldset_ol, :wrapper=>:li).inputs([:textarea]).to_s.must_equal '<fieldset class="inputs"><ol><li><textarea></textarea></li></ol></fieldset>'
|
982
|
-
Forme::Form.new(:inputs_wrapper=>:fieldset_ol, :wrapper=>:li).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<fieldset class="inputs" foo="1"><ol><li><textarea></textarea></li></ol></fieldset>'
|
983
|
-
end
|
984
|
-
|
985
|
-
it "inputs_wrapper: fieldset_ol supports a :legend option" do
|
986
|
-
Forme.form({}, :inputs_wrapper=>:fieldset_ol, :wrapper=>:li, :legend=>'Foo', :inputs=>[:textarea]).to_s.must_equal '<form><fieldset class="inputs"><legend>Foo</legend><ol><li><textarea></textarea></li></ol></fieldset></form>'
|
987
|
-
end
|
988
|
-
|
989
|
-
it "inputs_wrapper: div wraps tags in a div" do
|
990
|
-
Forme::Form.new(:inputs_wrapper=>:div, :wrapper=>:span).inputs([:textarea]).to_s.must_equal '<div><span><textarea></textarea></span></div>'
|
991
|
-
Forme::Form.new(:inputs_wrapper=>:div, :wrapper=>:span).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<div foo="1"><span><textarea></textarea></span></div>'
|
992
|
-
end
|
993
|
-
|
994
|
-
it "inputs_wrapper: tr wraps tags in an tr" do
|
995
|
-
Forme::Form.new(:inputs_wrapper=>:tr, :wrapper=>:td).inputs([:textarea]).to_s.must_equal '<tr><td><textarea></textarea></td></tr>'
|
996
|
-
Forme::Form.new(:inputs_wrapper=>:tr, :wrapper=>:td).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<tr foo="1"><td><textarea></textarea></td></tr>'
|
997
|
-
end
|
998
|
-
|
999
|
-
it "inputs_wrapper: table wraps tags in an table" do
|
1000
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea]).to_s.must_equal '<table><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
1001
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :attr=>{:foo=>1}).to_s.must_equal '<table foo="1"><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
1002
|
-
end
|
1003
|
-
|
1004
|
-
it "inputs_wrapper: table accepts a :legend option" do
|
1005
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :legend=>'Inputs').to_s.must_equal '<table><caption>Inputs</caption><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
1006
|
-
end
|
1007
|
-
|
1008
|
-
it "inputs_wrapper: table accepts a :legend_attr option" do
|
1009
|
-
Forme::Form.new(:inputs_wrapper=>:table, :wrapper=>:trtd).inputs([:textarea], :legend=>'Inputs', :legend_attr=>{:class=>'foo'}).to_s.must_equal '<table><caption class="foo">Inputs</caption><tbody><tr><td><textarea></textarea></td><td></td></tr></tbody></table>'
|
1010
|
-
end
|
1011
|
-
|
1012
|
-
it "inputs_wrapper: table accepts a :labels option" do
|
1013
|
-
Forme::Form.new(:inputs_wrapper=>:table).inputs(:labels=>%w'A B C').to_s.must_equal '<table><thead><tr><th>A</th><th>B</th><th>C</th></tr></thead><tbody></tbody></table>'
|
1014
|
-
end
|
1015
|
-
|
1016
|
-
it "inputs_wrapper: table doesn't add empty header row for :labels=>[]" do
|
1017
|
-
Forme::Form.new(:inputs_wrapper=>:table).inputs(:labels=>[]).to_s.must_equal '<table><tbody></tbody></table>'
|
1018
|
-
end
|
1019
|
-
|
1020
|
-
it "serializer: html_usa formats dates and datetimes in American format without timezones" do
|
1021
|
-
Forme::Form.new(:serializer=>:html_usa).tag(:div, :foo=>Date.new(2011, 6, 5)).to_s.must_equal '<div foo="06/05/2011"></div>'
|
1022
|
-
Forme::Form.new(:serializer=>:html_usa).tag(:div, :foo=>DateTime.new(2011, 6, 5, 16, 3, 2)).to_s.must_equal '<div foo="06/05/2011 04:03:02PM"></div>'
|
1023
|
-
Forme::Form.new(:serializer=>:html_usa).tag(:div, :foo=>Time.utc(2011, 6, 5, 4, 3, 2)).to_s.must_equal '<div foo="06/05/2011 04:03:02AM"></div>'
|
1024
|
-
end
|
1025
|
-
|
1026
|
-
it "serializer: html_usa should convert date and datetime inputs into text inputs" do
|
1027
|
-
Forme::Form.new(:serializer=>:html_usa).input(:date, :value=>Date.new(2011, 6, 5)).to_s.must_equal '<input type="text" value="06/05/2011"/>'
|
1028
|
-
Forme::Form.new(:serializer=>:html_usa).input(:datetime, :value=>DateTime.new(2011, 6, 5, 16, 3, 2)).to_s.must_equal '<input type="text" value="06/05/2011 04:03:02PM"/>'
|
1029
|
-
end
|
1030
|
-
|
1031
|
-
it "serializer: text uses plain text output instead of html" do
|
1032
|
-
Forme::Form.new(:serializer=>:text).input(:textarea, :label=>"Foo", :value=>"Bar").to_s.must_equal "Foo: Bar\n\n"
|
1033
|
-
Forme::Form.new(:serializer=>:text).input(:text, :label=>"Foo", :value=>"Bar").to_s.must_equal "Foo: Bar\n\n"
|
1034
|
-
Forme::Form.new(:serializer=>:text).input(:radio, :label=>"Foo", :value=>"Bar").to_s.must_equal "___ Foo\n"
|
1035
|
-
Forme::Form.new(:serializer=>:text).input(:radio, :label=>"Foo", :value=>"Bar", :checked=>true).to_s.must_equal "_X_ Foo\n"
|
1036
|
-
Forme::Form.new(:serializer=>:text).input(:checkbox, :label=>"Foo", :value=>"Bar").to_s.must_equal "___ Foo\n"
|
1037
|
-
Forme::Form.new(:serializer=>:text).input(:checkbox, :label=>"Foo", :value=>"Bar", :checked=>true).to_s.must_equal "_X_ Foo\n"
|
1038
|
-
Forme::Form.new(:serializer=>:text).input(:select, :label=>"Foo", :options=>[1, 2, 3], :value=>2).to_s.must_equal "Foo: \n___ 1\n_X_ 2\n___ 3\n\n"
|
1039
|
-
Forme::Form.new(:serializer=>:text).input(:password, :label=>"Pass").to_s.must_equal "Pass: ********\n\n"
|
1040
|
-
Forme::Form.new(:serializer=>:text).button().to_s.must_equal ""
|
1041
|
-
Forme::Form.new(:serializer=>:text).inputs([[:textarea, {:label=>"Foo", :value=>"Bar"}]], :legend=>'Baz').to_s.must_equal "Baz\n---\nFoo: Bar\n\n"
|
1042
|
-
Forme::Form.new(:serializer=>:text).tag(:p){|f| f.input(:textarea, :label=>"Foo", :value=>"Bar")}.to_s.must_equal "Foo: Bar\n\n"
|
1043
|
-
Forme::Form.new(:serializer=>:text).tag(:p, {}, ['a']).to_s.must_equal "a"
|
1044
|
-
end
|
1045
|
-
end
|
1046
|
-
|
1047
|
-
describe "Forme registering custom transformers" do
|
1048
|
-
it "should have #register_transformer register a transformer object for later use" do
|
1049
|
-
Forme.register_transformer(:wrapper, :div2, proc{|t, i| i.tag(:div2, {}, [t])})
|
1050
|
-
Forme::Form.new(:wrapper=>:div2).input(:textarea).to_s.must_equal '<div2><textarea></textarea></div2>'
|
1051
|
-
end
|
1052
|
-
|
1053
|
-
it "should have #register_transformer register a transformer block for later use" do
|
1054
|
-
Forme.register_transformer(:wrapper, :div1){|t, i| i.tag(:div1, {}, [t])}
|
1055
|
-
Forme::Form.new(:wrapper=>:div1).input(:textarea).to_s.must_equal '<div1><textarea></textarea></div1>'
|
1056
|
-
end
|
1057
|
-
|
1058
|
-
it "should have #register_transformer raise an error if given a block and an object" do
|
1059
|
-
proc do
|
1060
|
-
Forme.register_transformer(:wrapper, :div1, proc{|t, i| t}){|t, i| i.tag(:div1, {}, [t])}
|
1061
|
-
end.must_raise(Forme::Error)
|
1062
|
-
end
|
1063
|
-
end
|
1064
|
-
|
1065
|
-
describe "Forme configurations" do
|
1066
|
-
after do
|
1067
|
-
Forme.default_config = :default
|
1068
|
-
end
|
1069
|
-
|
1070
|
-
it "config: :formastic uses fieldset_ol inputs_wrapper and li wrapper, and explicit labeler" do
|
1071
|
-
Forme::Form.new(:config=>:formtastic).inputs([[:textarea, {:id=>:foo, :label=>'Foo'}]]).to_s.must_equal '<fieldset class="inputs"><ol><li><label class="label-before" for="foo">Foo</label><textarea id="foo"></textarea></li></ol></fieldset>'
|
1072
|
-
end
|
1073
|
-
|
1074
|
-
it "should be able to set a default configuration with Forme.default_config=" do
|
1075
|
-
Forme.default_config = :formtastic
|
1076
|
-
Forme::Form.new.inputs([[:textarea, {:id=>:foo, :label=>'Foo'}]]).to_s.must_equal '<fieldset class="inputs"><ol><li><label class="label-before" for="foo">Foo</label><textarea id="foo"></textarea></li></ol></fieldset>'
|
1077
|
-
end
|
1078
|
-
|
1079
|
-
it "should have #register_config register a configuration for later use" do
|
1080
|
-
Forme.register_config(:foo, :wrapper=>:li, :labeler=>:explicit)
|
1081
|
-
Forme::Form.new(:config=>:foo).input(:textarea, :id=>:foo, :label=>'Foo').to_s.must_equal '<li><label class="label-before" for="foo">Foo</label><textarea id="foo"></textarea></li>'
|
1082
|
-
end
|
1083
|
-
|
1084
|
-
it "should have #register_config support a :base option to base it on an existing config" do
|
1085
|
-
Forme.register_config(:foo2, :labeler=>:default, :base=>:formtastic)
|
1086
|
-
Forme::Form.new(:config=>:foo2).inputs([[:textarea, {:id=>:foo, :label=>'Foo'}]]).to_s.must_equal '<fieldset class="inputs"><ol><li><label>Foo: <textarea id="foo"></textarea></label></li></ol></fieldset>'
|
1087
|
-
end
|
1088
|
-
|
1089
|
-
end
|
1090
|
-
|
1091
|
-
describe "Forme object forms" do
|
1092
|
-
it "should handle a simple case" do
|
1093
|
-
obj = Class.new{def forme_input(form, field, opts) form._input(:text, :name=>"obj[#{field}]", :id=>"obj_#{field}", :value=>"#{field}_foo") end}.new
|
1094
|
-
Forme::Form.new(obj).input(:field).to_s.must_equal '<input id="obj_field" name="obj[field]" type="text" value="field_foo"/>'
|
1095
|
-
end
|
1096
|
-
|
1097
|
-
it "should handle more complex case with multiple different types and opts" do
|
1098
|
-
obj = Class.new do
|
1099
|
-
def self.name() "Foo" end
|
1100
|
-
|
1101
|
-
attr_reader :x, :y
|
1102
|
-
|
1103
|
-
def initialize(x, y)
|
1104
|
-
@x, @y = x, y
|
1105
|
-
end
|
1106
|
-
def forme_input(form, field, opts={})
|
1107
|
-
t = opts[:type]
|
1108
|
-
t ||= (field == :x ? :textarea : :text)
|
1109
|
-
s = field.to_s
|
1110
|
-
form._input(t, {:label=>s.upcase, :name=>"foo[#{s}]", :id=>"foo_#{s}", :value=>send(field)}.merge!(opts))
|
1111
|
-
end
|
1112
|
-
end.new('&foo', 3)
|
1113
|
-
f = Forme::Form.new(obj)
|
1114
|
-
f.input(:x).to_s.must_equal '<label>X: <textarea id="foo_x" name="foo[x]">&foo</textarea></label>'
|
1115
|
-
f.input(:y, :attr=>{:brain=>'no'}).to_s.must_equal '<label>Y: <input brain="no" id="foo_y" name="foo[y]" type="text" value="3"/></label>'
|
1116
|
-
end
|
1117
|
-
|
1118
|
-
it "should handle case where obj doesn't respond to forme_input" do
|
1119
|
-
Forme::Form.new([:foo]).input(:first).to_s.must_equal '<input id="first" name="first" type="text" value="foo"/>'
|
1120
|
-
obj = Class.new{attr_accessor :foo}.new
|
1121
|
-
obj.foo = 'bar'
|
1122
|
-
Forme::Form.new(obj).input(:foo).to_s.must_equal '<input id="foo" name="foo" type="text" value="bar"/>'
|
1123
|
-
end
|
1124
|
-
|
1125
|
-
it "should respect opts hash when obj doesn't respond to forme_input" do
|
1126
|
-
Forme::Form.new([:foo]).input(:first, :name=>'bar').to_s.must_equal '<input id="first" name="bar" type="text" value="foo"/>'
|
1127
|
-
Forme::Form.new([:foo]).input(:first, :id=>'bar').to_s.must_equal '<input id="bar" name="first" type="text" value="foo"/>'
|
1128
|
-
Forme::Form.new([:foo]).input(:first, :value=>'bar').to_s.must_equal '<input id="first" name="first" type="text" value="bar"/>'
|
1129
|
-
Forme::Form.new([:foo]).input(:first, :attr=>{:x=>'bar'}).to_s.must_equal '<input id="first" name="first" type="text" value="foo" x="bar"/>'
|
1130
|
-
end
|
1131
|
-
|
1132
|
-
it "should respect current namespace" do
|
1133
|
-
Forme::Form.new([:foo], :namespace=>'a').input(:first).to_s.must_equal '<input id="a_first" name="a[first]" type="text" value="foo"/>'
|
1134
|
-
end
|
1135
|
-
|
1136
|
-
it "should get values for hashes using #[]" do
|
1137
|
-
Forme::Form.new(:obj=>{:bar=>:foo}, :namespace=>'a').input(:bar).to_s.must_equal '<input id="a_bar" name="a[bar]" type="text" value="foo"/>'
|
1138
|
-
end
|
1139
|
-
|
1140
|
-
it "should handle obj passed in via :obj hash key" do
|
1141
|
-
Forme::Form.new(:obj=>[:foo]).input(:first).to_s.must_equal '<input id="first" name="first" type="text" value="foo"/>'
|
1142
|
-
end
|
1143
|
-
|
1144
|
-
it "should be able to turn off obj handling per input using :obj=>nil option" do
|
1145
|
-
Forme::Form.new([:foo]).input(:checkbox, :name=>"foo", :hidden_value=>"no", :obj=>nil).to_s.must_equal '<input name="foo" type="hidden" value="no"/><input name="foo" type="checkbox"/>'
|
1146
|
-
end
|
1147
|
-
|
1148
|
-
it "should be able to change input type" do
|
1149
|
-
Forme::Form.new([:foo]).input(:first, :type=>:email).to_s.must_equal '<input id="first" name="first" type="email" value="foo"/>'
|
1150
|
-
end
|
1151
|
-
|
1152
|
-
it "should not have default value for file input" do
|
1153
|
-
Forme::Form.new([:foo]).input(:first, :type=>:file).to_s.must_equal '<input id="first" name="first" type="file"/>'
|
1154
|
-
end
|
1155
|
-
|
1156
|
-
it "should be able to set value for file input" do
|
1157
|
-
Forme::Form.new([:foo]).input(:first, :type=>:file, :value=>"foo").to_s.must_equal '<input id="first" name="first" type="file" value="foo"/>'
|
1158
|
-
end
|
1159
|
-
end
|
1160
|
-
|
1161
|
-
describe "Forme.form DSL" do
|
1162
|
-
it "should return a form tag" do
|
1163
|
-
Forme.form.to_s.must_equal '<form></form>'
|
1164
|
-
end
|
1165
|
-
|
1166
|
-
it "should yield a Form object to the block" do
|
1167
|
-
Forme.form{|f| f.must_be_kind_of(Forme::Form)}
|
1168
|
-
end
|
1169
|
-
|
1170
|
-
it "should respect an array of classes" do
|
1171
|
-
Forme.form(:class=>[:foo, :bar]).to_s.must_equal '<form class="foo bar"></form>'
|
1172
|
-
Forme.form(:class=>[:foo, [:bar, :baz]]).to_s.must_equal '<form class="foo bar baz"></form>'
|
1173
|
-
end
|
1174
|
-
|
1175
|
-
it "should have inputs called instead the block be added to the existing form" do
|
1176
|
-
Forme.form{|f| f.input(:text)}.to_s.must_equal '<form><input type="text"/></form>'
|
1177
|
-
end
|
1178
|
-
|
1179
|
-
it "should be able to nest inputs inside tags" do
|
1180
|
-
Forme.form{|f| f.tag(:div){f.input(:text)}}.to_s.must_equal '<form><div><input type="text"/></div></form>'
|
1181
|
-
Forme.form{|f| f.tag(:div){f.tag(:fieldset){f.input(:text)}}}.to_s.must_equal '<form><div><fieldset><input type="text"/></fieldset></div></form>'
|
1182
|
-
Forme.form{|f| f.tag(:div){f.tag(:fieldset){f.tag(:span){f.input(:text)}}}}.to_s.must_equal '<form><div><fieldset><span><input type="text"/></span></fieldset></div></form>'
|
1183
|
-
Forme.form{|f| f.tag(:div){f.input(:text)}; f.input(:radio)}.to_s.must_equal '<form><div><input type="text"/></div><input type="radio"/></form>'
|
1184
|
-
Forme.form{|f| f.tag(:div){f.tag(:fieldset){f.input(:text); f.input(:radio)}; f.input(:checkbox)}}.to_s.must_equal '<form><div><fieldset><input type="text"/><input type="radio"/></fieldset><input type="checkbox"/></div></form>'
|
1185
|
-
end
|
1186
|
-
|
1187
|
-
it "should handle an :inputs option to automatically create inputs" do
|
1188
|
-
Forme.form({}, :inputs=>[:text, :textarea]).to_s.must_equal '<form><fieldset class="inputs"><input type="text"/><textarea></textarea></fieldset></form>'
|
1189
|
-
end
|
1190
|
-
|
1191
|
-
it "should handle a :legend option if inputs is used" do
|
1192
|
-
Forme.form({}, :inputs=>[:text, :textarea], :legend=>'Foo').to_s.must_equal '<form><fieldset class="inputs"><legend>Foo</legend><input type="text"/><textarea></textarea></fieldset></form>'
|
1193
|
-
end
|
1194
|
-
|
1195
|
-
it "should still work with a block if :inputs is used" do
|
1196
|
-
Forme.form({}, :inputs=>[:text]){|f| f.input(:textarea)}.to_s.must_equal '<form><fieldset class="inputs"><input type="text"/></fieldset><textarea></textarea></form>'
|
1197
|
-
end
|
1198
|
-
|
1199
|
-
it "should handle an :button option to automatically create a button" do
|
1200
|
-
Forme.form({}, :button=>'Foo').to_s.must_equal '<form><input type="submit" value="Foo"/></form>'
|
1201
|
-
end
|
1202
|
-
|
1203
|
-
it "should allow :button option value to be a hash" do
|
1204
|
-
Forme.form({}, :button=>{:value=>'Foo', :name=>'bar'}).to_s.must_equal '<form><input name="bar" type="submit" value="Foo"/></form>'
|
1205
|
-
end
|
1206
|
-
|
1207
|
-
it "should handle an :button option work with a block" do
|
1208
|
-
Forme.form({}, :button=>'Foo'){|f| f.input(:textarea)}.to_s.must_equal '<form><textarea></textarea><input type="submit" value="Foo"/></form>'
|
1209
|
-
end
|
1210
|
-
|
1211
|
-
it "should have an :button and :inputs option work together" do
|
1212
|
-
Forme.form({}, :inputs=>[:text, :textarea], :button=>'Foo').to_s.must_equal '<form><fieldset class="inputs"><input type="text"/><textarea></textarea></fieldset><input type="submit" value="Foo"/></form>'
|
1213
|
-
end
|
1214
|
-
|
1215
|
-
end
|
1216
|
-
|