merb-helpers 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/merb-helpers/form/builder.rb +13 -3
- data/spec/fixture/app/controllers/hacker.rb +2 -0
- data/spec/fixture/app/models/hacker_generic_model.rb +5 -0
- data/spec/fixture/app/views/hacker/file_field.html.erb +3 -0
- data/spec/fixture/app/views/hacker/hidden_field.html.erb +3 -0
- data/spec/fixture/app/views/hacker/option_tag.html.erb +4 -0
- data/spec/fixture/app/views/hacker/password_field.html.erb +3 -0
- data/spec/fixture/app/views/hacker/radio_button.html.erb +3 -0
- data/spec/fixture/app/views/hacker/radio_group.html.erb +3 -0
- data/spec/fixture/app/views/hacker/text_area.html.erb +3 -0
- data/spec/fixture/app/views/hacker/text_field.html.erb +3 -0
- data/spec/merb.main.pid +1 -1
- data/spec/merb_helpers_form_spec.rb +109 -76
- data/spec/merb_test.log +21 -0
- metadata +14 -3
@@ -243,9 +243,14 @@ module Merb::Helpers::Form::Builder
|
|
243
243
|
([b] + col.map do |item|
|
244
244
|
text_meth = text_meth && item.respond_to?(text_meth) ? text_meth : :last
|
245
245
|
value_meth = value_meth && item.respond_to?(value_meth) ? value_meth : :first
|
246
|
-
|
247
|
-
text
|
246
|
+
|
247
|
+
text = item.is_a?(String) ? item : item.send(text_meth)
|
248
248
|
value = item.is_a?(String) ? item : item.send(value_meth)
|
249
|
+
|
250
|
+
unless Merb.disabled?(:merb_helper_escaping)
|
251
|
+
text = Merb::Parse.escape_xml(text)
|
252
|
+
value = Merb::Parse.escape_xml(value)
|
253
|
+
end
|
249
254
|
|
250
255
|
option_attrs = {:value => value}
|
251
256
|
if sel.is_a?(Array)
|
@@ -271,7 +276,12 @@ module Merb::Helpers::Form::Builder
|
|
271
276
|
end
|
272
277
|
|
273
278
|
def control_value(method)
|
274
|
-
@obj ? @obj.send(method) : @origin.params[method]
|
279
|
+
value = @obj ? @obj.send(method) : @origin.params[method]
|
280
|
+
if Merb.disabled?(:merb_helper_escaping)
|
281
|
+
value.to_s
|
282
|
+
else
|
283
|
+
Merb::Parse.escape_xml(value.to_s)
|
284
|
+
end
|
275
285
|
end
|
276
286
|
|
277
287
|
def add_css_class(attrs, new_class)
|
data/spec/merb.main.pid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
25322
|
@@ -2,9 +2,9 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
2
2
|
|
3
3
|
# Quick rundown of how these specs work
|
4
4
|
# please read before hacking on this plugin
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# helpers must be tested through then entire stack
|
7
|
-
# what that means is that each spec must
|
7
|
+
# what that means is that each spec must
|
8
8
|
# send a request to a controller and render a template
|
9
9
|
#
|
10
10
|
# Start by creating a spec controller subclassing SpecController
|
@@ -14,7 +14,7 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
14
14
|
# Create a new controller in the spec/fixture/app/controllers/ if you are adding a new helper
|
15
15
|
#
|
16
16
|
# To test your helper, start by initializing a controller
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# @controller = CustomHelperSpecs.new(Merb::Request.new({}))
|
19
19
|
#
|
20
20
|
# Note that we are sending a real request to the controller, feel free to use the request as needed
|
@@ -24,7 +24,7 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
24
24
|
#
|
25
25
|
# @obj = FakeModel.new # FaKeModel is defined in spec/fixture/models/first_generic_fake_model.rb check it out!
|
26
26
|
# @controller.instance_variable_set(:@obj, @obj)
|
27
|
-
#
|
27
|
+
#
|
28
28
|
# To test a helper, you need to render a view:
|
29
29
|
#
|
30
30
|
# result = @controller.render :view_name
|
@@ -82,17 +82,17 @@ describe "error_messages_for" do
|
|
82
82
|
errs = @c.error_messages_for(@dm_obj, :error_class => "foo")
|
83
83
|
errs.should include("<div class='foo'>")
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
it "should accept a custom header block" do
|
87
87
|
errs = @c.error_messages_for(@dm_obj, :header => "<h3>Failure: %s issue%s</h3>")
|
88
88
|
errs.should include("<h3>Failure: 2 issues</h3>")
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# it "should put the error messages inside a form if :before is false" do
|
92
92
|
# ret = @c.form_for @dm_obj do
|
93
93
|
# _buffer << error_messages
|
94
94
|
# end
|
95
|
-
# ret.should =~ /\A\s*<form.*<div class='error'>/
|
95
|
+
# ret.should =~ /\A\s*<form.*<div class='error'>/
|
96
96
|
# end
|
97
97
|
|
98
98
|
end
|
@@ -128,22 +128,22 @@ describe "form" do
|
|
128
128
|
ret = @c.render(:get_if_set)
|
129
129
|
ret.should have_selector("form[method=get]")
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
it "should fake out the put method if set" do
|
133
133
|
ret = @c.render(:fake_put_if_set)
|
134
134
|
ret.should have_selector("form[method=post]")
|
135
135
|
ret.should have_selector("input[type=hidden][name=_method][value=put]")
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
it "should fake out the delete method if set" do
|
139
139
|
ret = @c.render(:fake_delete_if_set)
|
140
140
|
ret.should have_selector("form[method=post]")
|
141
141
|
ret.should have_selector("input[type=hidden][name=_method][value=delete]")
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
# TODO: Why is this required?
|
145
145
|
# ---------------------------
|
146
|
-
#
|
146
|
+
#
|
147
147
|
# it "should silently set method to post if an unsupported method is used" do
|
148
148
|
# form_tag :method => :dodgy do
|
149
149
|
# _buffer << "CONTENT"
|
@@ -151,13 +151,13 @@ describe "form" do
|
|
151
151
|
# _buffer.should match_tag(:form, :method => "post")
|
152
152
|
# _buffer.should_not match_tag(:input, :type => "hidden", :name => "_method", :value => "dodgy")
|
153
153
|
# end
|
154
|
-
|
154
|
+
|
155
155
|
it "should take create a form" do
|
156
156
|
ret = @c.render(:create_a_form)
|
157
157
|
ret.should have_selector("form[action=foo][method=post]")
|
158
158
|
ret.should include("Hello")
|
159
159
|
end
|
160
|
-
|
160
|
+
|
161
161
|
it "should set a form to be multipart" do
|
162
162
|
ret = @c.render(:create_a_multipart_form)
|
163
163
|
ret.should have_selector("form[action=foo][method=post][enctype='multipart/form-data']")
|
@@ -196,7 +196,7 @@ describe "form_for" do
|
|
196
196
|
end
|
197
197
|
|
198
198
|
|
199
|
-
describe "fields_for" do
|
199
|
+
describe "fields_for" do
|
200
200
|
|
201
201
|
before :each do
|
202
202
|
@c = FieldsForSpecs.new(Merb::Request.new({}))
|
@@ -248,7 +248,7 @@ describe "text_field" do
|
|
248
248
|
r = @c.render :class
|
249
249
|
r.should == "<input type=\"text\" class=\"awesome foobar text\"/>"
|
250
250
|
end
|
251
|
-
|
251
|
+
|
252
252
|
it "should be disabled if :disabled => true is passed in" do
|
253
253
|
r = @c.render :disabled
|
254
254
|
r.should have_selector("input[type=text][disabled=disabled]")
|
@@ -258,7 +258,7 @@ describe "text_field" do
|
|
258
258
|
r = @c.render :label
|
259
259
|
r.should match(/<label class="cool">LABEL<\/label>/)
|
260
260
|
end
|
261
|
-
|
261
|
+
|
262
262
|
end
|
263
263
|
|
264
264
|
describe "bound_text_field" do
|
@@ -305,7 +305,7 @@ describe "bound_text_field" do
|
|
305
305
|
end
|
306
306
|
|
307
307
|
describe "bound_radio_button" do
|
308
|
-
|
308
|
+
|
309
309
|
before :each do
|
310
310
|
@c = BoundRadioButtonSpecs.new(Merb::Request.new({}))
|
311
311
|
@c.instance_variable_set(:@obj, FakeModel.new)
|
@@ -348,7 +348,7 @@ describe "bound_radio_button" do
|
|
348
348
|
end
|
349
349
|
|
350
350
|
describe "password_field" do
|
351
|
-
|
351
|
+
|
352
352
|
before :each do
|
353
353
|
@c = PasswordFieldSpecs.new(Merb::Request.new({}))
|
354
354
|
end
|
@@ -362,7 +362,7 @@ describe "password_field" do
|
|
362
362
|
r = @c.render :basic
|
363
363
|
r.should have_selector("label:contains('LABEL')")
|
364
364
|
end
|
365
|
-
|
365
|
+
|
366
366
|
it "should be disabled if :disabled => true is passed in" do
|
367
367
|
r = @c.render :disabled
|
368
368
|
r.should match_tag(:input, :type => "password", :disabled => "disabled")
|
@@ -420,7 +420,7 @@ describe "check_box" do
|
|
420
420
|
before :each do
|
421
421
|
@c = CheckBoxSpecs.new(Merb::Request.new({}))
|
422
422
|
end
|
423
|
-
|
423
|
+
|
424
424
|
it "should return a basic checkbox based on the values passed in" do
|
425
425
|
r = @c.render :basic
|
426
426
|
r.should match_tag(:input, :class => "checkbox", :name => "foo", :checked => "checked")
|
@@ -432,12 +432,12 @@ describe "check_box" do
|
|
432
432
|
res = result.scan(/<[^>]*>/)
|
433
433
|
res[0].should_not match_tag(:input, :label => "LABEL")
|
434
434
|
end
|
435
|
-
|
435
|
+
|
436
436
|
it 'should remove the checked="checked" attribute if :checked is false or nil' do
|
437
437
|
r = @c.render :unchecked
|
438
438
|
r.should_not include('checked="')
|
439
439
|
end
|
440
|
-
|
440
|
+
|
441
441
|
it 'should have the checked="checked" attribute if :checked => true is passed in' do
|
442
442
|
r = @c.render :basic
|
443
443
|
r.should include('checked="checked"')
|
@@ -453,7 +453,7 @@ describe "check_box" do
|
|
453
453
|
r.should have_tag(:input, :type => "checkbox", :value => "1")
|
454
454
|
r.should have_tag(:input, :type => "hidden", :value => "0")
|
455
455
|
r.should match(/<input.*?type="hidden"[^>]*>[^<]*<input.*?type="checkbox"[^>]*>/)
|
456
|
-
|
456
|
+
|
457
457
|
end
|
458
458
|
|
459
459
|
it "should not allow a :value param if boolean" do
|
@@ -476,7 +476,7 @@ describe "check_box" do
|
|
476
476
|
lambda { @c.render :raise_unless_both_on_and_off }.should raise_error(ArgumentError, /must be specified/)
|
477
477
|
lambda { @c.render :raise_unless_both_on_and_off }.should raise_error(ArgumentError, /must be specified/)
|
478
478
|
end
|
479
|
-
|
479
|
+
|
480
480
|
it "should convert :value to a string on a non-boolean checkbox" do
|
481
481
|
r = @c.render :to_string
|
482
482
|
r.should match_tag(:input, :value => "")
|
@@ -487,12 +487,12 @@ describe "check_box" do
|
|
487
487
|
r.should match_tag(:input, :value => "1")
|
488
488
|
r.should match_tag(:input, :value => "true")
|
489
489
|
end
|
490
|
-
|
490
|
+
|
491
491
|
it "should be disabled if :disabled => true is passed in" do
|
492
492
|
r = @c.render :disabled
|
493
493
|
r.should match_tag(:input, :type => "checkbox", :disabled => "disabled")
|
494
494
|
end
|
495
|
-
|
495
|
+
|
496
496
|
it "should be possible to call with just check_box" do
|
497
497
|
r = @c.render :simple
|
498
498
|
r.should match_tag(:input, :type => "checkbox", :class => "checkbox")
|
@@ -507,7 +507,7 @@ describe "bound_check_box" do
|
|
507
507
|
end
|
508
508
|
|
509
509
|
it "should take a string and return a useful checkbox control" do
|
510
|
-
r = @c.render :basic
|
510
|
+
r = @c.render :basic
|
511
511
|
r.should match_tag(:input, :type =>"checkbox", :name => "fake_model[baz]", :class => "checkbox", :value => "1", :checked => "checked", :id => "fake_model_baz")
|
512
512
|
r.should match_tag(:input, :type =>"hidden", :name => "fake_model[baz]", :value => "0")
|
513
513
|
end
|
@@ -526,8 +526,8 @@ describe "bound_check_box" do
|
|
526
526
|
:value => "1",
|
527
527
|
:checked => "checked",
|
528
528
|
:id => "fake_dm_model_baz")
|
529
|
-
|
530
|
-
r.should match_tag(:input, :type =>"hidden", :name => "fake_dm_model[bat]", :value => "0")
|
529
|
+
|
530
|
+
r.should match_tag(:input, :type =>"hidden", :name => "fake_dm_model[bat]", :value => "0")
|
531
531
|
r.should match_tag(:input, :type =>"checkbox", :name => "fake_dm_model[bat]", :class => "checkbox", :value => "1")
|
532
532
|
end
|
533
533
|
|
@@ -538,7 +538,7 @@ describe "bound_check_box" do
|
|
538
538
|
end
|
539
539
|
|
540
540
|
it "should render controls with errors if their attribute contains an error" do
|
541
|
-
r = @c.render :errors
|
541
|
+
r = @c.render :errors
|
542
542
|
r.should match_tag(:input, :type =>"checkbox", :name => "fake_model[bazbad]", :class => "error checkbox", :value => "1", :checked => "checked")
|
543
543
|
r.should match_tag(:input, :type =>"hidden", :name => "fake_model[batbad]", :value => "0")
|
544
544
|
end
|
@@ -570,13 +570,13 @@ describe "bound_check_box" do
|
|
570
570
|
r = @c.render :basic
|
571
571
|
r.should match_tag(:input, :type => "checkbox", :class => "error checkbox")
|
572
572
|
end
|
573
|
-
|
573
|
+
|
574
574
|
it "should be boolean" do
|
575
575
|
r = @c.render :basic
|
576
576
|
r.should have_tag(:input, :type => "checkbox", :value => "1")
|
577
577
|
r.should have_tag(:input, :type => "hidden", :value => "0")
|
578
578
|
end
|
579
|
-
|
579
|
+
|
580
580
|
it "should be checked if the value of the model's attribute is equal to the value of :on" do
|
581
581
|
r = @c.render :checked
|
582
582
|
r.should match_tag(:input, :type =>"checkbox", :value => "foowee", :checked => "checked")
|
@@ -586,7 +586,7 @@ describe "bound_check_box" do
|
|
586
586
|
end
|
587
587
|
|
588
588
|
describe "hidden_field" do
|
589
|
-
|
589
|
+
|
590
590
|
before :each do
|
591
591
|
@c = HiddenFieldSpecs.new(Merb::Request.new({}))
|
592
592
|
end
|
@@ -601,7 +601,7 @@ describe "hidden_field" do
|
|
601
601
|
res.should_not match(/<label>LABEL/)
|
602
602
|
res.should_not match_tag(:input, :label=> "LABEL")
|
603
603
|
end
|
604
|
-
|
604
|
+
|
605
605
|
it "should be disabled if :disabled => true is passed in" do
|
606
606
|
r = @c.render :disabled
|
607
607
|
r.should match_tag(:input, :type => "hidden", :disabled => "disabled")
|
@@ -654,7 +654,7 @@ describe "bound_hidden_field" do
|
|
654
654
|
end
|
655
655
|
|
656
656
|
describe "radio_button" do
|
657
|
-
|
657
|
+
|
658
658
|
before :each do
|
659
659
|
@c = RadioButtonSpecs.new(Merb::Request.new({}))
|
660
660
|
end
|
@@ -681,7 +681,7 @@ describe "radio_button" do
|
|
681
681
|
end
|
682
682
|
|
683
683
|
describe "radio_group" do
|
684
|
-
|
684
|
+
|
685
685
|
before :each do
|
686
686
|
@c = RadioGroupSpecs.new(Merb::Request.new({}))
|
687
687
|
end
|
@@ -728,7 +728,7 @@ end
|
|
728
728
|
|
729
729
|
|
730
730
|
describe "bound_radio_group" do
|
731
|
-
|
731
|
+
|
732
732
|
before do
|
733
733
|
@c = BoundRadioGroupSpecs.new(Merb::Request.new({}))
|
734
734
|
@c.instance_variable_set(:@obj, FakeModel.new)
|
@@ -746,7 +746,7 @@ describe "bound_radio_group" do
|
|
746
746
|
r.scan( /<input.*?><label.*?>(foowee|baree)<\/label>/ ).size.should == 2
|
747
747
|
radio = r.scan(/<[^>]*>/)[2..-2]
|
748
748
|
radio[0].should_not match_tag(:input, :label => "LABEL")
|
749
|
-
radio[3].should_not match_tag(:input, :label => "LABEL")
|
749
|
+
radio[3].should_not match_tag(:input, :label => "LABEL")
|
750
750
|
end
|
751
751
|
|
752
752
|
it "should accept array of hashes as options" do
|
@@ -782,7 +782,7 @@ end
|
|
782
782
|
|
783
783
|
|
784
784
|
describe "text_area" do
|
785
|
-
|
785
|
+
|
786
786
|
before do
|
787
787
|
@c = TextAreaSpecs.new(Merb::Request.new({}))
|
788
788
|
end
|
@@ -800,7 +800,7 @@ describe "text_area" do
|
|
800
800
|
|
801
801
|
# TODO: Why is this required?
|
802
802
|
# ---------------------------
|
803
|
-
#
|
803
|
+
#
|
804
804
|
# it "should handle a nil attributes hash" do
|
805
805
|
# text_area("CONTENT", nil).should == "<textarea>CONTENT</textarea>"
|
806
806
|
# end
|
@@ -810,14 +810,14 @@ describe "text_area" do
|
|
810
810
|
result.should match(/<label.*>LABEL<\/label><textarea/)
|
811
811
|
result.should_not match_tag(:textarea, :label => "LABEL")
|
812
812
|
end
|
813
|
-
|
813
|
+
|
814
814
|
it "should be disabled if :disabled => true is passed in" do
|
815
815
|
r = @c.render :disabled
|
816
816
|
r.should match_tag(:textarea, :disabled => "disabled")
|
817
817
|
end
|
818
818
|
end
|
819
819
|
|
820
|
-
describe "bound_text_area" do
|
820
|
+
describe "bound_text_area" do
|
821
821
|
|
822
822
|
before do
|
823
823
|
@c = BoundTextAreaSpecs.new(Merb::Request.new({}))
|
@@ -833,11 +833,11 @@ describe "bound_text_area" do
|
|
833
833
|
end
|
834
834
|
|
835
835
|
describe "select" do
|
836
|
-
|
836
|
+
|
837
837
|
before do
|
838
838
|
@c = SelectSpecs.new(Merb::Request.new({}))
|
839
839
|
end
|
840
|
-
|
840
|
+
|
841
841
|
it "should provide a blank option if you :include_blank" do
|
842
842
|
r = @c.render :blank
|
843
843
|
r.should =~ /<option.*>\s*<\/option>/
|
@@ -854,7 +854,7 @@ describe "bound_select" do
|
|
854
854
|
before do
|
855
855
|
@c = BoundSelectSpecs.new(Merb::Request.new({}))
|
856
856
|
@c.instance_variable_set(:@obj, FakeModel.new)
|
857
|
-
end
|
857
|
+
end
|
858
858
|
|
859
859
|
it "should render the select tag with the correct id and name" do
|
860
860
|
r = @c.render :basic
|
@@ -904,7 +904,7 @@ describe "bound_select" do
|
|
904
904
|
end
|
905
905
|
|
906
906
|
describe "bound option tags" do
|
907
|
-
|
907
|
+
|
908
908
|
before do
|
909
909
|
@c = BoundOptionTagSpecs.new(Merb::Request.new({}))
|
910
910
|
@c.instance_variable_set(:@obj, FakeModel.new)
|
@@ -912,9 +912,9 @@ describe "bound option tags" do
|
|
912
912
|
|
913
913
|
|
914
914
|
it "should use text_method and value_method for tag generation" do
|
915
|
-
r = @c.render :text_and_value
|
915
|
+
r = @c.render :text_and_value
|
916
916
|
r.should match_tag( :option, :content => "foowee", :value => "7" )
|
917
|
-
r.should match_tag( :option, :content => "foowee2", :value => "barbar" )
|
917
|
+
r.should match_tag( :option, :content => "foowee2", :value => "barbar" )
|
918
918
|
|
919
919
|
# content = options_from_collection_for_select( [FakeModel.new, FakeModel2.new], :text_method => 'foo', :value_method => 'bar' )
|
920
920
|
# content.should match_tag( :option, :content => "foowee", :value => "7" )
|
@@ -966,7 +966,7 @@ end
|
|
966
966
|
require "hpricot"
|
967
967
|
|
968
968
|
describe "option tags" do
|
969
|
-
|
969
|
+
|
970
970
|
before do
|
971
971
|
@c = OptionTagSpecs.new(Merb::Request.new({}))
|
972
972
|
@c.instance_variable_set(:@collection, [['rabbit','Rabbit'],['horse','Horse'],['bird','Bird']])
|
@@ -1067,12 +1067,12 @@ describe "file_field" do
|
|
1067
1067
|
r = @c.render :with_label
|
1068
1068
|
r.should have_selector("label:contains('LABEL') + input.file[type=file]")
|
1069
1069
|
end
|
1070
|
-
|
1070
|
+
|
1071
1071
|
it "should be disabled if :disabled => true is passed in" do
|
1072
1072
|
r = @c.render :disabled
|
1073
1073
|
r.should have_selector("input[type=file][disabled=disabled]")
|
1074
1074
|
end
|
1075
|
-
|
1075
|
+
|
1076
1076
|
it "should make the surrounding form multipart" do
|
1077
1077
|
r = @c.render :makes_multipart
|
1078
1078
|
r.should have_selector("form[enctype='multipart/form-data']")
|
@@ -1107,8 +1107,8 @@ describe "submit" do
|
|
1107
1107
|
|
1108
1108
|
before :each do
|
1109
1109
|
@c = SubmitSpecs.new(Merb::Request.new({}))
|
1110
|
-
end
|
1111
|
-
|
1110
|
+
end
|
1111
|
+
|
1112
1112
|
it "should return a basic submit input based on the values passed in" do
|
1113
1113
|
r = @c.render :submit_with_values
|
1114
1114
|
r.should have_selector("input[type=submit][name=foo][value=Done]")
|
@@ -1119,11 +1119,11 @@ describe "submit" do
|
|
1119
1119
|
r.should have_selector("input[type=submit][name=submit][value=Done]")
|
1120
1120
|
r.should have_selector("label:contains('LABEL')")
|
1121
1121
|
end
|
1122
|
-
|
1122
|
+
|
1123
1123
|
it "should be disabled if :disabled => true is passed in" do
|
1124
1124
|
r = @c.render :disabled_submit
|
1125
1125
|
r.should have_selector("input[type=submit][value=Done][disabled=disabled]")
|
1126
|
-
end
|
1126
|
+
end
|
1127
1127
|
end
|
1128
1128
|
|
1129
1129
|
describe "button" do
|
@@ -1131,7 +1131,7 @@ describe "button" do
|
|
1131
1131
|
before :each do
|
1132
1132
|
@c = ButtonSpecs.new(Merb::Request.new({}))
|
1133
1133
|
end
|
1134
|
-
|
1134
|
+
|
1135
1135
|
it "should return a button based on the values passed in" do
|
1136
1136
|
r = @c.render :button_with_values
|
1137
1137
|
r.should have_selector("button[type=button][name=foo][value=bar]:contains('Click Me')")
|
@@ -1151,7 +1151,7 @@ end
|
|
1151
1151
|
|
1152
1152
|
|
1153
1153
|
class MyBuilder < Merb::Helpers::Form::Builder::Base
|
1154
|
-
|
1154
|
+
|
1155
1155
|
def update_bound_controls(method, attrs, type)
|
1156
1156
|
super
|
1157
1157
|
attrs[:bound] = type
|
@@ -1161,16 +1161,16 @@ class MyBuilder < Merb::Helpers::Form::Builder::Base
|
|
1161
1161
|
super
|
1162
1162
|
attrs[:unbound] = type
|
1163
1163
|
end
|
1164
|
-
|
1164
|
+
|
1165
1165
|
end
|
1166
1166
|
|
1167
1167
|
describe "custom builder" do
|
1168
|
-
|
1168
|
+
|
1169
1169
|
before :each do
|
1170
1170
|
@c = CustomBuilderSpecs.new(Merb::Request.new({}))
|
1171
1171
|
@c.instance_variable_set(:@obj, FakeModel.new)
|
1172
|
-
end
|
1173
|
-
|
1172
|
+
end
|
1173
|
+
|
1174
1174
|
it "should let you override update_bound_controls" do
|
1175
1175
|
r = @c.render :everything
|
1176
1176
|
r.should =~ / bound="file"/
|
@@ -1180,7 +1180,7 @@ describe "custom builder" do
|
|
1180
1180
|
r.should =~ / bound="radio"/
|
1181
1181
|
r.should =~ / bound="text_area"/
|
1182
1182
|
end
|
1183
|
-
|
1183
|
+
|
1184
1184
|
it "should let you override update_unbound_controls" do
|
1185
1185
|
r = @c.render :everything
|
1186
1186
|
r.should have_selector("button[unbound=button]")
|
@@ -1196,7 +1196,7 @@ describe 'delete_button' do
|
|
1196
1196
|
@controller = DeleteButtonSpecs.new(Merb::Request.new({}))
|
1197
1197
|
@controller.instance_variable_set(:@obj, FakeModel.new)
|
1198
1198
|
end
|
1199
|
-
|
1199
|
+
|
1200
1200
|
it "should have a default submit button text" do
|
1201
1201
|
result = @controller.render :simple_delete # <%= delete_button @obj %>
|
1202
1202
|
result.should have_selector("input[type=submit][value=Delete]")
|
@@ -1212,26 +1212,59 @@ describe 'delete_button' do
|
|
1212
1212
|
result = @controller.render :delete_with_label # <%= delete_button(@obj, "Delete moi!") %>
|
1213
1213
|
result.should have_selector("input[type=submit][value='Delete moi!']")
|
1214
1214
|
end
|
1215
|
-
|
1215
|
+
|
1216
1216
|
it "should allow you to pass some extra params like a class" do
|
1217
1217
|
result = @controller.render :delete_with_extra_params
|
1218
1218
|
result.should have_selector("input.custom-class[type=submit][value=Delete]")
|
1219
1219
|
end
|
1220
|
-
|
1220
|
+
|
1221
1221
|
it "should allow to pass an explicit url as a string" do
|
1222
1222
|
result = @controller.render :delete_with_explicit_url # <%= delete_button('/test/custom_url') %>
|
1223
1223
|
result.should have_selector("form[action='/test/custom_url'][method=post]")
|
1224
1224
|
end
|
1225
|
-
|
1225
|
+
|
1226
1226
|
end
|
1227
1227
|
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1228
|
+
describe "escaping values" do
|
1229
|
+
|
1230
|
+
before :each do
|
1231
|
+
@c = Hacker.new(Merb::Request.new({}))
|
1232
|
+
@c.instance_variable_set(:@obj, HackerModel.new)
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
it "should escape bound text field values" do
|
1236
|
+
r = @c.render :text_field
|
1237
|
+
r.should =~ /&"<>/
|
1238
|
+
end
|
1239
|
+
|
1240
|
+
it "should escape bound hidden field values" do
|
1241
|
+
r = @c.render :hidden_field
|
1242
|
+
r.should =~ /&"<>/
|
1243
|
+
end
|
1244
|
+
|
1245
|
+
it "should escape bound password field values" do
|
1246
|
+
r = @c.render :password_field
|
1247
|
+
r.should =~ /&"<>/
|
1248
|
+
end
|
1249
|
+
|
1250
|
+
it "should escape bound text area values" do
|
1251
|
+
r = @c.render :text_area
|
1252
|
+
r.should =~ /&"<>/
|
1253
|
+
end
|
1254
|
+
|
1255
|
+
it "should escape bound file field values" do
|
1256
|
+
r = @c.render :file_field
|
1257
|
+
r.should =~ /&"<>/
|
1258
|
+
end
|
1259
|
+
|
1260
|
+
it "should escape bound option tag values" do
|
1261
|
+
r = @c.render :option_tag
|
1262
|
+
r.should =~ /&"<>/
|
1263
|
+
end
|
1264
|
+
|
1265
|
+
it "should escape bound radio button values" do
|
1266
|
+
r = @c.render :radio_button
|
1267
|
+
r.should =~ /&"<>/
|
1268
|
+
end
|
1269
|
+
|
1270
|
+
end
|
data/spec/merb_test.log
CHANGED
@@ -40,3 +40,24 @@
|
|
40
40
|
~ {:before_filters_time=>6.0e-06, :dispatch_time=>0.000631, :after_filters_time=>6.0e-06, :action_time=>0.000445}
|
41
41
|
~
|
42
42
|
|
43
|
+
~ Compiling routes...
|
44
|
+
~ Started request handling: Mon Dec 15 19:19:40 -0800 2008
|
45
|
+
~ Params: {"format"=>nil, "action"=>"tag_with_content", "id"=>nil, "controller"=>"tag_helper"}
|
46
|
+
~ {:after_filters_time=>1.5e-05, :dispatch_time=>0.000935, :before_filters_time=>1.6e-05, :action_time=>0.000635}
|
47
|
+
~
|
48
|
+
|
49
|
+
~ Started request handling: Mon Dec 15 19:19:40 -0800 2008
|
50
|
+
~ Params: {"format"=>nil, "action"=>"tag_with_content_in_the_block", "id"=>nil, "controller"=>"tag_helper"}
|
51
|
+
~ {:after_filters_time=>5.0e-06, :dispatch_time=>0.000663, :before_filters_time=>6.0e-06, :action_time=>0.000402}
|
52
|
+
~
|
53
|
+
|
54
|
+
~ Started request handling: Mon Dec 15 19:19:40 -0800 2008
|
55
|
+
~ Params: {"format"=>nil, "action"=>"tag_with_attributes", "id"=>nil, "controller"=>"tag_helper"}
|
56
|
+
~ {:after_filters_time=>4.0e-06, :dispatch_time=>0.000514, :before_filters_time=>5.0e-06, :action_time=>0.000332}
|
57
|
+
~
|
58
|
+
|
59
|
+
~ Started request handling: Mon Dec 15 19:19:40 -0800 2008
|
60
|
+
~ Params: {"format"=>nil, "action"=>"nested_tags", "id"=>nil, "controller"=>"tag_helper"}
|
61
|
+
~ {:after_filters_time=>6.0e-06, :dispatch_time=>0.000648, :before_filters_time=>5.0e-06, :action_time=>0.000453}
|
62
|
+
~
|
63
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael D. Ivey
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-15 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.0.
|
23
|
+
version: 1.0.5
|
24
24
|
version:
|
25
25
|
description: Helper support for Merb
|
26
26
|
email: ivey@gweezlebur.com
|
@@ -77,6 +77,7 @@ files:
|
|
77
77
|
- spec/fixture/app/controllers/foo.rb
|
78
78
|
- spec/fixture/app/controllers/form.rb
|
79
79
|
- spec/fixture/app/controllers/form_for.rb
|
80
|
+
- spec/fixture/app/controllers/hacker.rb
|
80
81
|
- spec/fixture/app/controllers/hidden_field.rb
|
81
82
|
- spec/fixture/app/controllers/label.rb
|
82
83
|
- spec/fixture/app/controllers/numeric_ext.rb
|
@@ -97,6 +98,7 @@ files:
|
|
97
98
|
- spec/fixture/app/models
|
98
99
|
- spec/fixture/app/models/fake_dm_model.rb
|
99
100
|
- spec/fixture/app/models/first_generic_fake_model.rb
|
101
|
+
- spec/fixture/app/models/hacker_generic_model.rb
|
100
102
|
- spec/fixture/app/models/second_generic_fake_model.rb
|
101
103
|
- spec/fixture/app/models/third_generic_fake_model.rb
|
102
104
|
- spec/fixture/app/views
|
@@ -193,6 +195,15 @@ files:
|
|
193
195
|
- spec/fixture/app/views/form_specs/get_if_set.html.erb
|
194
196
|
- spec/fixture/app/views/form_specs/post_by_default.html.erb
|
195
197
|
- spec/fixture/app/views/form_specs/resourceful_form.html.erb
|
198
|
+
- spec/fixture/app/views/hacker
|
199
|
+
- spec/fixture/app/views/hacker/file_field.html.erb
|
200
|
+
- spec/fixture/app/views/hacker/hidden_field.html.erb
|
201
|
+
- spec/fixture/app/views/hacker/option_tag.html.erb
|
202
|
+
- spec/fixture/app/views/hacker/password_field.html.erb
|
203
|
+
- spec/fixture/app/views/hacker/radio_button.html.erb
|
204
|
+
- spec/fixture/app/views/hacker/radio_group.html.erb
|
205
|
+
- spec/fixture/app/views/hacker/text_area.html.erb
|
206
|
+
- spec/fixture/app/views/hacker/text_field.html.erb
|
196
207
|
- spec/fixture/app/views/hidden_field_specs
|
197
208
|
- spec/fixture/app/views/hidden_field_specs/basic.html.erb
|
198
209
|
- spec/fixture/app/views/hidden_field_specs/disabled.html.erb
|