ShadowBelmolve-formtastic 0.1.6 → 0.2.1
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/README.textile +179 -40
- data/Rakefile +1 -1
- data/generators/formtastic_stylesheets/formtastic_stylesheets_generator.rb +21 -0
- data/generators/formtastic_stylesheets/templates/formtastic.css +136 -0
- data/generators/formtastic_stylesheets/templates/formtastic_changes.css +10 -0
- data/lib/formtastic.rb +351 -170
- data/lib/justin_french/formtastic.rb +3 -3
- data/spec/formtastic_spec.rb +775 -274
- metadata +9 -6
- data/spec/spec.opts +0 -2
@@ -1,6 +1,6 @@
|
|
1
|
-
module JustinFrench
|
2
|
-
module Formtastic
|
3
|
-
class SemanticFormBuilder < ::Formtastic::SemanticFormBuilder
|
1
|
+
module JustinFrench #:nodoc:
|
2
|
+
module Formtastic #:nodoc:
|
3
|
+
class SemanticFormBuilder < ::Formtastic::SemanticFormBuilder #:nodoc:
|
4
4
|
def initialize(*args)
|
5
5
|
::ActiveSupport::Deprecation.warn("JustinFrench::Formtastic::SemanticFormBuilder is deprecated. User Formtastic::SemanticFormBuilder instead", caller)
|
6
6
|
super
|
data/spec/formtastic_spec.rb
CHANGED
@@ -62,7 +62,7 @@ describe 'Formtastic' do
|
|
62
62
|
@fred.stub!(:login).and_return('fred_smith')
|
63
63
|
@fred.stub!(:id).and_return(37)
|
64
64
|
@fred.stub!(:new_record?).and_return(false)
|
65
|
-
@fred.stub!(:errors).and_return(mock('errors', :
|
65
|
+
@fred.stub!(:errors).and_return(mock('errors', :[] => nil))
|
66
66
|
|
67
67
|
@bob = mock('user')
|
68
68
|
@bob.stub!(:class).and_return(Author)
|
@@ -72,20 +72,20 @@ describe 'Formtastic' do
|
|
72
72
|
@bob.stub!(:posts).and_return([])
|
73
73
|
@bob.stub!(:post_ids).and_return([])
|
74
74
|
@bob.stub!(:new_record?).and_return(false)
|
75
|
-
@bob.stub!(:errors).and_return(mock('errors', :
|
75
|
+
@bob.stub!(:errors).and_return(mock('errors', :[] => nil))
|
76
76
|
|
77
77
|
Author.stub!(:find).and_return([@fred, @bob])
|
78
78
|
Author.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
|
79
79
|
Author.stub!(:human_name).and_return('Author')
|
80
80
|
Author.stub!(:reflect_on_all_validations).and_return([])
|
81
|
-
Author.stub!(:reflect_on_association).and_return { |column_name| mock('reflection', :klass => Post, :macro => :has_many) if column_name == :posts }
|
81
|
+
Author.stub!(:reflect_on_association).and_return { |column_name| mock('reflection', :options => {}, :klass => Post, :macro => :has_many) if column_name == :posts }
|
82
82
|
|
83
83
|
# Sometimes we need a mock @post object and some Authors for belongs_to
|
84
84
|
@new_post = mock('post')
|
85
85
|
@new_post.stub!(:class).and_return(Post)
|
86
86
|
@new_post.stub!(:id).and_return(nil)
|
87
87
|
@new_post.stub!(:new_record?).and_return(true)
|
88
|
-
@new_post.stub!(:errors).and_return(mock('errors', :
|
88
|
+
@new_post.stub!(:errors).and_return(mock('errors', :[] => nil))
|
89
89
|
@new_post.stub!(:author).and_return(nil)
|
90
90
|
|
91
91
|
@freds_post = mock('post')
|
@@ -97,7 +97,7 @@ describe 'Formtastic' do
|
|
97
97
|
@freds_post.stub!(:authors).and_return([@fred])
|
98
98
|
@freds_post.stub!(:author_ids).and_return([@fred.id])
|
99
99
|
@freds_post.stub!(:new_record?).and_return(false)
|
100
|
-
@freds_post.stub!(:errors).and_return(mock('errors', :
|
100
|
+
@freds_post.stub!(:errors).and_return(mock('errors', :[] => nil))
|
101
101
|
@fred.stub!(:posts).and_return([@freds_post])
|
102
102
|
@fred.stub!(:post_ids).and_return([@freds_post.id])
|
103
103
|
|
@@ -106,10 +106,10 @@ describe 'Formtastic' do
|
|
106
106
|
Post.stub!(:reflect_on_all_validations).and_return([])
|
107
107
|
Post.stub!(:reflect_on_association).and_return do |column_name|
|
108
108
|
case column_name
|
109
|
-
when :author
|
110
|
-
mock('reflection', :klass => Author, :macro => :belongs_to)
|
109
|
+
when :author, :author_status
|
110
|
+
mock('reflection', :options => {}, :klass => Author, :macro => :belongs_to)
|
111
111
|
when :authors
|
112
|
-
mock('reflection', :klass => Author, :macro => :has_and_belongs_to_many)
|
112
|
+
mock('reflection', :options => {}, :klass => Author, :macro => :has_and_belongs_to_many)
|
113
113
|
end
|
114
114
|
end
|
115
115
|
Post.stub!(:find).and_return([@freds_post])
|
@@ -234,6 +234,10 @@ describe 'Formtastic' do
|
|
234
234
|
@new_post.stub!(:body)
|
235
235
|
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :string, :limit => 255))
|
236
236
|
end
|
237
|
+
|
238
|
+
after do
|
239
|
+
Formtastic::SemanticFormHelper.builder = Formtastic::SemanticFormBuilder
|
240
|
+
end
|
237
241
|
|
238
242
|
it "can be overridden" do
|
239
243
|
|
@@ -286,6 +290,103 @@ describe 'Formtastic' do
|
|
286
290
|
end
|
287
291
|
end
|
288
292
|
|
293
|
+
describe '#label' do
|
294
|
+
it 'should humanize the given attribute' do
|
295
|
+
semantic_form_for(@new_post) do |builder|
|
296
|
+
builder.label(:login).should have_tag('label', :with => /Login/)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
it 'should be printed as span' do
|
301
|
+
semantic_form_for(@new_post) do |builder|
|
302
|
+
builder.label(:login, nil, { :required => true, :as_span => true }).should have_tag('span.label abbr')
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
describe 'when required is given' do
|
307
|
+
it 'should append a required note' do
|
308
|
+
semantic_form_for(@new_post) do |builder|
|
309
|
+
builder.label(:login, nil, :required => true).should have_tag('label abbr')
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'should allow require option to be given as second argument' do
|
314
|
+
semantic_form_for(@new_post) do |builder|
|
315
|
+
builder.label(:login, :required => true).should have_tag('label abbr')
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
describe 'when label is given' do
|
321
|
+
it 'should allow the text to be given as label option' do
|
322
|
+
semantic_form_for(@new_post) do |builder|
|
323
|
+
builder.label(:login, :required => true, :label => 'My label').should have_tag('label', :with => /My label/)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
it 'should return nil if label is false' do
|
328
|
+
semantic_form_for(@new_post) do |builder|
|
329
|
+
builder.label(:login, :label => false).should be_blank
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
describe '#errors_on' do
|
336
|
+
before(:each) do
|
337
|
+
@title_errors = ['must not be blank', 'must be longer than 10 characters', 'must be awesome']
|
338
|
+
@errors = mock('errors')
|
339
|
+
@errors.stub!(:[]).with(:title).and_return(@title_errors)
|
340
|
+
@errors.stub!(:[]).with(:body).and_return(nil)
|
341
|
+
@new_post.stub!(:errors).and_return(@errors)
|
342
|
+
end
|
343
|
+
|
344
|
+
describe 'and the errors will be displayed as a sentence' do
|
345
|
+
it 'should render a paragraph with the errors joined into a sentence' do
|
346
|
+
Formtastic::SemanticFormBuilder.inline_errors = :sentence
|
347
|
+
semantic_form_for(@new_post) do |builder|
|
348
|
+
builder.errors_on(:title).should have_tag('p.inline-errors', @title_errors.to_sentence)
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
describe 'and the errors will be displayed as a list' do
|
354
|
+
it 'should render an unordered list with the class errors' do
|
355
|
+
Formtastic::SemanticFormBuilder.inline_errors = :list
|
356
|
+
semantic_form_for(@new_post) do |builder|
|
357
|
+
builder.errors_on(:title).should have_tag('ul.errors')
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
it 'should include a list element for each of the errors within the unordered list' do
|
362
|
+
Formtastic::SemanticFormBuilder.inline_errors = :list
|
363
|
+
semantic_form_for(@new_post) do |builder|
|
364
|
+
@title_errors.each do |error|
|
365
|
+
builder.errors_on(:title).should have_tag('ul.errors li', error)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
describe 'but the errors will not be shown' do
|
372
|
+
it 'should return nil' do
|
373
|
+
Formtastic::SemanticFormBuilder.inline_errors = :none
|
374
|
+
semantic_form_for(@new_post) do |builder|
|
375
|
+
builder.errors_on(:title).should be_nil
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
describe 'and no error is found on the method' do
|
381
|
+
it 'should return nil' do
|
382
|
+
Formtastic::SemanticFormBuilder.inline_errors = :sentence
|
383
|
+
semantic_form_for(@new_post) do |builder|
|
384
|
+
builder.errors_on(:body).should be_nil
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
289
390
|
describe '#input' do
|
290
391
|
|
291
392
|
before do
|
@@ -472,13 +573,22 @@ describe 'Formtastic' do
|
|
472
573
|
|
473
574
|
describe 'when not provided' do
|
474
575
|
|
475
|
-
it 'should default to a string for forms without objects' do
|
576
|
+
it 'should default to a string for forms without objects unless column is password' do
|
476
577
|
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
477
578
|
concat(builder.input(:anything))
|
478
579
|
end
|
479
580
|
output_buffer.should have_tag('form li.string')
|
480
581
|
end
|
481
582
|
|
583
|
+
it 'should default to password for forms without objects if column is password' do
|
584
|
+
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
585
|
+
concat(builder.input(:password))
|
586
|
+
concat(builder.input(:password_confirmation))
|
587
|
+
concat(builder.input(:confirm_password))
|
588
|
+
end
|
589
|
+
output_buffer.should have_tag('form li.password', :count => 3)
|
590
|
+
end
|
591
|
+
|
482
592
|
it 'should default to a string for methods on objects that don\'t respond to "column_for_attribute"' do
|
483
593
|
@new_post.stub!(:method_without_a_database_column)
|
484
594
|
@new_post.stub!(:column_for_attribute).and_return(nil)
|
@@ -538,6 +648,10 @@ describe 'Formtastic' do
|
|
538
648
|
default_input_type(:float).should == :numeric
|
539
649
|
default_input_type(:decimal).should == :numeric
|
540
650
|
end
|
651
|
+
|
652
|
+
it 'should default to :country for :string columns named country' do
|
653
|
+
default_input_type(:string, :country).should == :country
|
654
|
+
end
|
541
655
|
|
542
656
|
describe 'defaulting to file column' do
|
543
657
|
Formtastic::SemanticFormBuilder.file_methods.each do |method|
|
@@ -561,7 +675,7 @@ describe 'Formtastic' do
|
|
561
675
|
end
|
562
676
|
|
563
677
|
it 'should call the corresponding input method' do
|
564
|
-
[:select, :time_zone, :radio, :date, :datetime, :time, :boolean].each do |input_style|
|
678
|
+
[:select, :time_zone, :radio, :date, :datetime, :time, :boolean, :check_boxes, :hidden].each do |input_style|
|
565
679
|
@new_post.stub!(:generic_column_name)
|
566
680
|
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :string, :limit => 255))
|
567
681
|
semantic_form_for(@new_post) do |builder|
|
@@ -583,9 +697,8 @@ describe 'Formtastic' do
|
|
583
697
|
end
|
584
698
|
|
585
699
|
describe ':label option' do
|
586
|
-
|
700
|
+
|
587
701
|
describe 'when provided' do
|
588
|
-
|
589
702
|
it 'should be passed down to the label tag' do
|
590
703
|
semantic_form_for(@new_post) do |builder|
|
591
704
|
concat(builder.input(:title, :label => "Kustom"))
|
@@ -593,35 +706,89 @@ describe 'Formtastic' do
|
|
593
706
|
output_buffer.should have_tag("form li label", /Kustom/)
|
594
707
|
end
|
595
708
|
|
709
|
+
it 'should not generate a label if false' do
|
710
|
+
semantic_form_for(@new_post) do |builder|
|
711
|
+
concat(builder.input(:title, :label => false))
|
712
|
+
end
|
713
|
+
output_buffer.should_not have_tag("form li label")
|
714
|
+
end
|
715
|
+
|
716
|
+
it 'should be dupped if frozen' do
|
717
|
+
semantic_form_for(@new_post) do |builder|
|
718
|
+
concat(builder.input(:title, :label => "Kustom".freeze))
|
719
|
+
end
|
720
|
+
output_buffer.should have_tag("form li label", /Kustom/)
|
721
|
+
end
|
596
722
|
end
|
597
723
|
|
598
724
|
describe 'when not provided' do
|
599
|
-
describe '
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
725
|
+
describe 'when localized label is NOT provided' do
|
726
|
+
describe 'and object is not given' do
|
727
|
+
it 'should default the humanized method name, passing it down to the label tag' do
|
728
|
+
Formtastic::SemanticFormBuilder.label_str_method = :humanize
|
729
|
+
|
730
|
+
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
731
|
+
concat(builder.input(:meta_description))
|
732
|
+
end
|
733
|
+
|
734
|
+
output_buffer.should have_tag("form li label", /#{'meta_description'.humanize}/)
|
735
|
+
end
|
736
|
+
end
|
737
|
+
|
738
|
+
describe 'and object is given' do
|
739
|
+
it 'should delegate the label logic to class human attribute name and pass it down to the label tag' do
|
740
|
+
@new_post.stub!(:meta_description) # a two word method name
|
741
|
+
@new_post.class.should_receive(:human_attribute_name).with('meta_description').and_return('meta_description'.humanize)
|
742
|
+
|
743
|
+
semantic_form_for(@new_post) do |builder|
|
744
|
+
concat(builder.input(:meta_description))
|
745
|
+
end
|
746
|
+
|
747
|
+
output_buffer.should have_tag("form li label", /#{'meta_description'.humanize}/)
|
605
748
|
end
|
606
|
-
|
607
|
-
output_buffer.should have_tag("form li label", /#{'meta_description'.humanize}/)
|
608
749
|
end
|
609
750
|
end
|
610
|
-
|
611
|
-
describe '
|
612
|
-
|
613
|
-
@
|
614
|
-
@
|
615
|
-
|
751
|
+
|
752
|
+
describe 'when localized label is provided' do
|
753
|
+
before do
|
754
|
+
@localized_label_text = 'Localized title'
|
755
|
+
@default_localized_label_text = 'Default localized title'
|
756
|
+
::I18n.backend.store_translations :en,
|
757
|
+
:formtastic => {
|
758
|
+
:labels => {
|
759
|
+
:title => @default_localized_label_text,
|
760
|
+
:post => {
|
761
|
+
:title => @localized_label_text
|
762
|
+
}
|
763
|
+
}
|
764
|
+
}
|
765
|
+
::Formtastic::SemanticFormBuilder.i18n_lookups_by_default = false
|
766
|
+
end
|
767
|
+
|
768
|
+
it 'should render a label with localized label (I18n)' do
|
616
769
|
semantic_form_for(@new_post) do |builder|
|
617
|
-
concat(builder.input(:
|
770
|
+
concat(builder.input(:title, :label => true))
|
618
771
|
end
|
619
|
-
|
620
|
-
|
772
|
+
output_buffer.should have_tag('form li label', @localized_label_text)
|
773
|
+
end
|
774
|
+
|
775
|
+
it 'should render a hint paragraph containing an optional localized label (I18n) if first is not set' do
|
776
|
+
::I18n.backend.store_translations :en,
|
777
|
+
:formtastic => {
|
778
|
+
:labels => {
|
779
|
+
:post => {
|
780
|
+
:title => nil
|
781
|
+
}
|
782
|
+
}
|
783
|
+
}
|
784
|
+
semantic_form_for(@new_post) do |builder|
|
785
|
+
concat(builder.input(:title, :label => true))
|
786
|
+
end
|
787
|
+
output_buffer.should have_tag('form li label', @default_localized_label_text)
|
621
788
|
end
|
622
789
|
end
|
623
790
|
end
|
624
|
-
|
791
|
+
|
625
792
|
end
|
626
793
|
|
627
794
|
describe ':hint option' do
|
@@ -637,12 +804,104 @@ describe 'Formtastic' do
|
|
637
804
|
end
|
638
805
|
|
639
806
|
describe 'when not provided' do
|
640
|
-
|
641
|
-
|
807
|
+
describe 'when localized hint (I18n) is provided' do
|
808
|
+
before do
|
809
|
+
@localized_hint_text = "This is the localized hint."
|
810
|
+
@default_localized_hint_text = "This is the default localized hint."
|
811
|
+
::I18n.backend.store_translations :en,
|
812
|
+
:formtastic => {
|
813
|
+
:hints => {
|
814
|
+
:title => @default_localized_hint_text,
|
815
|
+
:post => {
|
816
|
+
:title => @localized_hint_text
|
817
|
+
}
|
818
|
+
}
|
819
|
+
}
|
820
|
+
::Formtastic::SemanticFormBuilder.i18n_lookups_by_default = false
|
821
|
+
end
|
822
|
+
|
823
|
+
describe 'when provided value (hint value) is set to TRUE' do
|
824
|
+
it 'should render a hint paragraph containing a localized hint (I18n)' do
|
825
|
+
semantic_form_for(@new_post) do |builder|
|
826
|
+
concat(builder.input(:title, :hint => true))
|
827
|
+
end
|
828
|
+
output_buffer.should have_tag('form li p.inline-hints', @localized_hint_text)
|
829
|
+
end
|
830
|
+
|
831
|
+
it 'should render a hint paragraph containing an optional localized hint (I18n) if first is not set' do
|
832
|
+
::I18n.backend.store_translations :en,
|
833
|
+
:formtastic => {
|
834
|
+
:hints => {
|
835
|
+
:post => {
|
836
|
+
:title => nil
|
837
|
+
}
|
838
|
+
}
|
839
|
+
}
|
840
|
+
semantic_form_for(@new_post) do |builder|
|
841
|
+
concat(builder.input(:title, :hint => true))
|
842
|
+
end
|
843
|
+
output_buffer.should have_tag('form li p.inline-hints', @default_localized_hint_text)
|
844
|
+
end
|
845
|
+
end
|
846
|
+
|
847
|
+
describe 'when provided value (label value) is set to FALSE' do
|
848
|
+
it 'should not render a hint paragraph' do
|
849
|
+
semantic_form_for(@new_post) do |builder|
|
850
|
+
concat(builder.input(:title, :hint => false))
|
851
|
+
end
|
852
|
+
output_buffer.should_not have_tag('form li p.inline-hints', @localized_hint_text)
|
853
|
+
end
|
854
|
+
end
|
855
|
+
end
|
856
|
+
|
857
|
+
describe 'when localized hint (I18n) is not provided' do
|
858
|
+
it 'should not render a hint paragraph' do
|
859
|
+
semantic_form_for(@new_post) do |builder|
|
860
|
+
concat(builder.input(:title))
|
861
|
+
end
|
862
|
+
output_buffer.should_not have_tag('form li p.inline-hints')
|
863
|
+
end
|
864
|
+
end
|
865
|
+
end
|
866
|
+
|
867
|
+
end
|
868
|
+
|
869
|
+
describe ':wrapper_html option' do
|
870
|
+
|
871
|
+
describe 'when provided' do
|
872
|
+
it 'should be passed down to the li tag' do
|
873
|
+
semantic_form_for(@new_post) do |builder|
|
874
|
+
concat(builder.input(:title, :wrapper_html => {:id => :another_id}))
|
875
|
+
end
|
876
|
+
output_buffer.should have_tag("form li#another_id")
|
877
|
+
end
|
878
|
+
|
879
|
+
it 'should append given classes to li default classes' do
|
880
|
+
semantic_form_for(@new_post) do |builder|
|
881
|
+
concat(builder.input(:title, :wrapper_html => {:class => :another_class}, :required => true))
|
882
|
+
end
|
883
|
+
output_buffer.should have_tag("form li.string")
|
884
|
+
output_buffer.should have_tag("form li.required")
|
885
|
+
output_buffer.should have_tag("form li.another_class")
|
886
|
+
end
|
887
|
+
|
888
|
+
it 'should allow classes to be an array' do
|
889
|
+
semantic_form_for(@new_post) do |builder|
|
890
|
+
concat(builder.input(:title, :wrapper_html => {:class => [ :my_class, :another_class ]}))
|
891
|
+
end
|
892
|
+
output_buffer.should have_tag("form li.string")
|
893
|
+
output_buffer.should have_tag("form li.my_class")
|
894
|
+
output_buffer.should have_tag("form li.another_class")
|
895
|
+
end
|
896
|
+
end
|
897
|
+
|
898
|
+
describe 'when not provided' do
|
899
|
+
it 'should use default id and class' do
|
642
900
|
semantic_form_for(@new_post) do |builder|
|
643
901
|
concat(builder.input(:title))
|
644
902
|
end
|
645
|
-
output_buffer.
|
903
|
+
output_buffer.should have_tag("form li#post_title_input")
|
904
|
+
output_buffer.should have_tag("form li.string")
|
646
905
|
end
|
647
906
|
end
|
648
907
|
|
@@ -660,11 +919,10 @@ describe 'Formtastic' do
|
|
660
919
|
end
|
661
920
|
|
662
921
|
describe 'when there are errors on the object for this method' do
|
663
|
-
|
664
922
|
before do
|
665
923
|
@title_errors = ['must not be blank', 'must be longer than 10 characters', 'must be awesome']
|
666
924
|
@errors = mock('errors')
|
667
|
-
@errors.stub!(:
|
925
|
+
@errors.stub!(:[]).with(:title).and_return(@title_errors)
|
668
926
|
@new_post.stub!(:errors).and_return(@errors)
|
669
927
|
end
|
670
928
|
|
@@ -682,65 +940,24 @@ describe 'Formtastic' do
|
|
682
940
|
output_buffer.should_not have_tag('div.fieldWithErrors')
|
683
941
|
end
|
684
942
|
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
semantic_form_for(@new_post) do |builder|
|
690
|
-
concat(builder.input(:title))
|
691
|
-
end
|
692
|
-
end
|
693
|
-
|
694
|
-
it 'should render a paragraph with the errors joined into a sentence' do
|
695
|
-
output_buffer.should have_tag('form li.error p.inline-errors', @title_errors.to_sentence)
|
696
|
-
end
|
697
|
-
|
698
|
-
end
|
699
|
-
|
700
|
-
describe 'and the errors will be displayed as a list' do
|
701
|
-
|
702
|
-
before do
|
703
|
-
Formtastic::SemanticFormBuilder.inline_errors = :list
|
704
|
-
semantic_form_for(@new_post) do |builder|
|
705
|
-
concat(builder.input(:title))
|
706
|
-
end
|
707
|
-
end
|
708
|
-
|
709
|
-
it 'should render an unordered list with the class errors' do
|
710
|
-
output_buffer.should have_tag('form li.error ul.errors')
|
711
|
-
end
|
712
|
-
|
713
|
-
it 'should include a list element for each of the errors within the unordered list' do
|
714
|
-
@title_errors.each do |error|
|
715
|
-
output_buffer.should have_tag('form li.error ul.errors li', error)
|
716
|
-
end
|
943
|
+
it 'should render a paragraph for the errors' do
|
944
|
+
Formtastic::SemanticFormBuilder.inline_errors = :sentence
|
945
|
+
semantic_form_for(@new_post) do |builder|
|
946
|
+
concat(builder.input(:title))
|
717
947
|
end
|
718
|
-
|
948
|
+
output_buffer.should have_tag('form li.error p.inline-errors')
|
719
949
|
end
|
720
950
|
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
semantic_form_for(@new_post) do |builder|
|
726
|
-
concat(builder.input(:title))
|
727
|
-
end
|
728
|
-
end
|
729
|
-
|
730
|
-
it 'should not display an error sentence' do
|
731
|
-
output_buffer.should_not have_tag('form li.error p.inline-errors')
|
732
|
-
end
|
733
|
-
|
734
|
-
it 'should not display an error list' do
|
735
|
-
output_buffer.should_not have_tag('form li.error ul.errors')
|
951
|
+
it 'should not display an error list' do
|
952
|
+
Formtastic::SemanticFormBuilder.inline_errors = :list
|
953
|
+
semantic_form_for(@new_post) do |builder|
|
954
|
+
concat(builder.input(:title))
|
736
955
|
end
|
737
|
-
|
956
|
+
output_buffer.should have_tag('form li.error ul.errors')
|
738
957
|
end
|
739
|
-
|
740
958
|
end
|
741
959
|
|
742
960
|
describe 'when there are no errors on the object for this method' do
|
743
|
-
|
744
961
|
before do
|
745
962
|
semantic_form_for(@new_post) do |builder|
|
746
963
|
concat(builder.input(:title))
|
@@ -758,11 +975,9 @@ describe 'Formtastic' do
|
|
758
975
|
it 'should not display an error list' do
|
759
976
|
output_buffer.should_not have_tag('form li.error ul.errors')
|
760
977
|
end
|
761
|
-
|
762
978
|
end
|
763
979
|
|
764
980
|
describe 'when no object is provided' do
|
765
|
-
|
766
981
|
before do
|
767
982
|
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
768
983
|
concat(builder.input(:title))
|
@@ -780,7 +995,6 @@ describe 'Formtastic' do
|
|
780
995
|
it 'should not display an error list' do
|
781
996
|
output_buffer.should_not have_tag('form li.error ul.errors')
|
782
997
|
end
|
783
|
-
|
784
998
|
end
|
785
999
|
end
|
786
1000
|
|
@@ -821,31 +1035,33 @@ describe 'Formtastic' do
|
|
821
1035
|
output_buffer.should have_tag("form li input[@name=\"post[title]\"]")
|
822
1036
|
end
|
823
1037
|
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
1038
|
+
unless type == :numeric
|
1039
|
+
it 'should have a maxlength matching the column limit' do
|
1040
|
+
@new_post.column_for_attribute(:title).limit.should == 50
|
1041
|
+
output_buffer.should have_tag("form li input[@maxlength='50']")
|
1042
|
+
end
|
828
1043
|
|
829
|
-
|
830
|
-
|
831
|
-
|
1044
|
+
it 'should use default_text_field_size for columns longer than default_text_field_size' do
|
1045
|
+
default_size = Formtastic::SemanticFormBuilder.default_text_field_size
|
1046
|
+
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => type, :limit => default_size * 2))
|
832
1047
|
|
833
|
-
|
834
|
-
|
1048
|
+
semantic_form_for(@new_post) do |builder|
|
1049
|
+
concat(builder.input(:title, :as => type))
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
output_buffer.should have_tag("form li input[@size='#{default_size}']")
|
835
1053
|
end
|
836
1054
|
|
837
|
-
|
838
|
-
|
1055
|
+
it 'should use the column size for columns shorter than default_text_field_size' do
|
1056
|
+
column_limit_shorted_than_default = 1
|
1057
|
+
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => type, :limit => column_limit_shorted_than_default))
|
839
1058
|
|
840
|
-
|
841
|
-
|
842
|
-
|
1059
|
+
semantic_form_for(@new_post) do |builder|
|
1060
|
+
concat(builder.input(:title, :as => type))
|
1061
|
+
end
|
843
1062
|
|
844
|
-
|
845
|
-
concat(builder.input(:title, :as => type))
|
1063
|
+
output_buffer.should have_tag("form li input[@size='#{column_limit_shorted_than_default}']")
|
846
1064
|
end
|
847
|
-
|
848
|
-
output_buffer.should have_tag("form li input[@size='#{column_limit_shorted_than_default}']")
|
849
1065
|
end
|
850
1066
|
|
851
1067
|
it 'should use default_text_field_size for methods without database columns' do
|
@@ -866,6 +1082,13 @@ describe 'Formtastic' do
|
|
866
1082
|
output_buffer.should have_tag("form li input.myclass")
|
867
1083
|
end
|
868
1084
|
|
1085
|
+
it 'should consider input_html :id in labels' do
|
1086
|
+
semantic_form_for(@new_post) do |builder|
|
1087
|
+
concat(builder.input(:title, :as => type, :input_html => { :id => 'myid' }))
|
1088
|
+
end
|
1089
|
+
output_buffer.should have_tag('form li label[@for="myid"]')
|
1090
|
+
end
|
1091
|
+
|
869
1092
|
it 'should generate input and labels even if no object is given' do
|
870
1093
|
semantic_form_for(:project, :url => 'http://test.host/') do |builder|
|
871
1094
|
concat(builder.input(:title, :as => type))
|
@@ -947,139 +1170,206 @@ describe 'Formtastic' do
|
|
947
1170
|
|
948
1171
|
end
|
949
1172
|
|
950
|
-
|
951
|
-
|
952
|
-
|
1173
|
+
describe 'when no object is given' do
|
1174
|
+
before(:each) do
|
1175
|
+
semantic_form_for(:project, :url => 'http://test.host/') do |builder|
|
1176
|
+
concat(builder.input(:title, :as => type))
|
1177
|
+
end
|
953
1178
|
end
|
954
1179
|
|
955
|
-
|
956
|
-
|
957
|
-
|
1180
|
+
it 'should generate input' do
|
1181
|
+
if template_method.to_s =~ /_field$/ # password_field
|
1182
|
+
output_buffer.should have_tag("form li input")
|
1183
|
+
output_buffer.should have_tag("form li input#project_title")
|
1184
|
+
output_buffer.should have_tag("form li input[@type=\"#{input_type}\"]")
|
1185
|
+
output_buffer.should have_tag("form li input[@name=\"project[title]\"]")
|
1186
|
+
else
|
1187
|
+
output_buffer.should have_tag("form li #{input_type}")
|
1188
|
+
output_buffer.should have_tag("form li #{input_type}#project_title")
|
1189
|
+
output_buffer.should have_tag("form li #{input_type}[@name=\"project[title]\"]")
|
1190
|
+
end
|
1191
|
+
end
|
958
1192
|
|
959
|
-
|
960
|
-
output_buffer.should have_tag(
|
961
|
-
output_buffer.should have_tag(
|
962
|
-
output_buffer.should have_tag(
|
963
|
-
output_buffer.should have_tag("form li input[@name=\"project[title]\"]")
|
964
|
-
else
|
965
|
-
output_buffer.should have_tag("form li #{input_type}")
|
966
|
-
output_buffer.should have_tag("form li #{input_type}#project_title")
|
967
|
-
output_buffer.should have_tag("form li #{input_type}[@name=\"project[title]\"]")
|
1193
|
+
it 'should generate labels' do
|
1194
|
+
output_buffer.should have_tag('form li label')
|
1195
|
+
output_buffer.should have_tag('form li label[@for="project_title"')
|
1196
|
+
output_buffer.should have_tag('form li label', /Title/)
|
968
1197
|
end
|
969
1198
|
end
|
970
1199
|
|
971
1200
|
end
|
972
1201
|
end
|
973
1202
|
|
1203
|
+
describe ":as => :hidden" do
|
1204
|
+
before do
|
1205
|
+
@new_post.stub!(:hidden)
|
1206
|
+
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :string))
|
974
1207
|
|
975
|
-
|
1208
|
+
semantic_form_for(@new_post) do |builder|
|
1209
|
+
concat(builder.input(:hidden, :as => :hidden))
|
1210
|
+
end
|
1211
|
+
end
|
976
1212
|
|
977
|
-
|
978
|
-
|
979
|
-
@new_post.stub!(:author_id).and_return(@bob.id)
|
980
|
-
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :integer, :limit => 255))
|
1213
|
+
it "should have a hidden class on the wrapper" do
|
1214
|
+
output_buffer.should have_tag('form li.hidden')
|
981
1215
|
end
|
982
1216
|
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
concat(builder.input(:author, :as => :radio, :value_as_class => true))
|
987
|
-
end
|
988
|
-
end
|
1217
|
+
it 'should have a post_hidden_input id on the wrapper' do
|
1218
|
+
output_buffer.should have_tag('form li#post_hidden_input')
|
1219
|
+
end
|
989
1220
|
|
990
|
-
|
991
|
-
|
992
|
-
|
1221
|
+
it 'should not generate a label for the input' do
|
1222
|
+
output_buffer.should_not have_tag('form li label')
|
1223
|
+
end
|
993
1224
|
|
994
|
-
|
995
|
-
|
996
|
-
|
1225
|
+
it "should generate a input field" do
|
1226
|
+
output_buffer.should have_tag("form li input#post_hidden")
|
1227
|
+
output_buffer.should have_tag("form li input[@type=\"hidden\"]")
|
1228
|
+
output_buffer.should have_tag("form li input[@name=\"post[hidden]\"]")
|
1229
|
+
end
|
1230
|
+
end
|
997
1231
|
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
end
|
1232
|
+
describe ":as => :time_zone" do
|
1233
|
+
before do
|
1234
|
+
@new_post.stub!(:time_zone)
|
1235
|
+
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :string))
|
1003
1236
|
|
1004
|
-
|
1005
|
-
|
1006
|
-
output_buffer.should have_tag('form li fieldset ol li', :count => Author.find(:all).size)
|
1237
|
+
semantic_form_for(@new_post) do |builder|
|
1238
|
+
concat(builder.input(:time_zone))
|
1007
1239
|
end
|
1240
|
+
end
|
1008
1241
|
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1242
|
+
it "should have a time_zone class on the wrapper" do
|
1243
|
+
output_buffer.should have_tag('form li.time_zone')
|
1244
|
+
end
|
1012
1245
|
|
1013
|
-
|
1246
|
+
it 'should have a post_title_input id on the wrapper' do
|
1247
|
+
output_buffer.should have_tag('form li#post_time_zone_input')
|
1248
|
+
end
|
1014
1249
|
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
output_buffer.should have_tag("form li fieldset ol li label input")
|
1021
|
-
end
|
1022
|
-
end
|
1250
|
+
it 'should generate a label for the input' do
|
1251
|
+
output_buffer.should have_tag('form li label')
|
1252
|
+
output_buffer.should have_tag('form li label[@for="post_time_zone"')
|
1253
|
+
output_buffer.should have_tag('form li label', /Time zone/)
|
1254
|
+
end
|
1023
1255
|
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1256
|
+
it "should generate a select" do
|
1257
|
+
output_buffer.should have_tag("form li select")
|
1258
|
+
output_buffer.should have_tag("form li select#post_time_zone")
|
1259
|
+
output_buffer.should have_tag("form li select[@name=\"post[time_zone]\"]")
|
1260
|
+
end
|
1029
1261
|
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1262
|
+
it 'should use input_html to style inputs' do
|
1263
|
+
semantic_form_for(@new_post) do |builder|
|
1264
|
+
concat(builder.input(:time_zone, :input_html => { :class => 'myclass' }))
|
1265
|
+
end
|
1266
|
+
output_buffer.should have_tag("form li select.myclass")
|
1267
|
+
end
|
1268
|
+
|
1269
|
+
describe 'when no object is given' do
|
1270
|
+
before(:each) do
|
1271
|
+
semantic_form_for(:project, :url => 'http://test.host/') do |builder|
|
1272
|
+
concat(builder.input(:time_zone, :as => :time_zone))
|
1037
1273
|
end
|
1274
|
+
end
|
1038
1275
|
|
1039
|
-
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1276
|
+
it 'should generate labels' do
|
1277
|
+
output_buffer.should have_tag('form li label')
|
1278
|
+
output_buffer.should have_tag('form li label[@for="project_time_zone"')
|
1279
|
+
output_buffer.should have_tag('form li label', /Time zone/)
|
1280
|
+
end
|
1043
1281
|
|
1282
|
+
it 'should generate select inputs' do
|
1283
|
+
output_buffer.should have_tag("form li select")
|
1284
|
+
output_buffer.should have_tag("form li select#project_time_zone")
|
1285
|
+
output_buffer.should have_tag("form li select[@name=\"project[time_zone]\"]")
|
1286
|
+
end
|
1287
|
+
end
|
1288
|
+
end
|
1289
|
+
|
1290
|
+
describe ":as => :country" do
|
1291
|
+
|
1292
|
+
before do
|
1293
|
+
@new_post.stub!(:country)
|
1294
|
+
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :string))
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
describe "when country_select is not available as a helper from a plugin" do
|
1298
|
+
|
1299
|
+
it "should raise an error, sugesting the author installs a plugin" do
|
1300
|
+
lambda {
|
1044
1301
|
semantic_form_for(@new_post) do |builder|
|
1045
|
-
concat(builder.input(:
|
1302
|
+
concat(builder.input(:country, :as => :country))
|
1046
1303
|
end
|
1047
|
-
|
1048
|
-
output_buffer.should have_tag("form li fieldset ol li label input[@checked='checked']")
|
1049
|
-
end
|
1304
|
+
}.should raise_error
|
1050
1305
|
end
|
1051
|
-
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1306
|
+
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
describe "when country_select is available as a helper (from a plugin)" do
|
1310
|
+
|
1311
|
+
before do
|
1312
|
+
semantic_form_for(@new_post) do |builder|
|
1313
|
+
builder.stub!(:country_select).and_return("<select><option>...</option></select>")
|
1314
|
+
concat(builder.input(:country, :as => :country))
|
1057
1315
|
end
|
1316
|
+
end
|
1317
|
+
|
1318
|
+
it "should have a time_zone class on the wrapper" do
|
1319
|
+
output_buffer.should have_tag('form li.country')
|
1320
|
+
end
|
1058
1321
|
|
1059
|
-
|
1060
|
-
output_buffer.should have_tag('form li
|
1322
|
+
it 'should have a post_title_input id on the wrapper' do
|
1323
|
+
output_buffer.should have_tag('form li#post_country_input')
|
1324
|
+
end
|
1061
1325
|
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1326
|
+
it 'should generate a label for the input' do
|
1327
|
+
output_buffer.should have_tag('form li label')
|
1328
|
+
output_buffer.should have_tag('form li label[@for="post_country"')
|
1329
|
+
output_buffer.should have_tag('form li label', /Country/)
|
1330
|
+
end
|
1065
1331
|
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1332
|
+
it "should generate a select" do
|
1333
|
+
output_buffer.should have_tag("form li select")
|
1334
|
+
end
|
1335
|
+
|
1336
|
+
end
|
1337
|
+
|
1338
|
+
describe ":priority_countries option" do
|
1339
|
+
|
1340
|
+
it "should be passed down to the country_select helper when provided" do
|
1341
|
+
priority_countries = ["Foo", "Bah"]
|
1342
|
+
semantic_form_for(@new_post) do |builder|
|
1343
|
+
builder.stub!(:country_select).and_return("<select><option>...</option></select>")
|
1344
|
+
builder.should_receive(:country_select).with(:country, priority_countries, {}, {}).and_return("<select><option>...</option></select>")
|
1345
|
+
|
1346
|
+
concat(builder.input(:country, :as => :country, :priority_countries => priority_countries))
|
1347
|
+
end
|
1348
|
+
end
|
1349
|
+
|
1350
|
+
it "should default to the @@priority_countries config when absent" do
|
1351
|
+
priority_countries = Formtastic::SemanticFormBuilder.priority_countries
|
1352
|
+
priority_countries.should_not be_empty
|
1353
|
+
priority_countries.should_not be_nil
|
1354
|
+
|
1355
|
+
semantic_form_for(@new_post) do |builder|
|
1356
|
+
builder.stub!(:country_select).and_return("<select><option>...</option></select>")
|
1357
|
+
builder.should_receive(:country_select).with(:country, priority_countries, {}, {}).and_return("<select><option>...</option></select>")
|
1358
|
+
|
1359
|
+
concat(builder.input(:country, :as => :country))
|
1070
1360
|
end
|
1071
1361
|
end
|
1072
|
-
|
1362
|
+
|
1073
1363
|
end
|
1074
|
-
|
1364
|
+
|
1075
1365
|
end
|
1076
|
-
|
1077
|
-
describe ':as => :
|
1366
|
+
|
1367
|
+
describe ':as => :radio' do
|
1078
1368
|
|
1079
1369
|
before do
|
1080
1370
|
@new_post.stub!(:author).and_return(@bob)
|
1081
1371
|
@new_post.stub!(:author_id).and_return(@bob.id)
|
1082
|
-
|
1372
|
+
Post.stub!(:reflect_on_association).and_return { |column_name| mock('reflection', :options => {}, :klass => Author, :macro => :belongs_to) }
|
1083
1373
|
end
|
1084
1374
|
|
1085
1375
|
describe 'for belongs_to association' do
|
@@ -1093,7 +1383,7 @@ describe 'Formtastic' do
|
|
1093
1383
|
output_buffer.should have_tag('form li.radio')
|
1094
1384
|
end
|
1095
1385
|
|
1096
|
-
it 'should have a
|
1386
|
+
it 'should have a post_author_input id on the wrapper' do
|
1097
1387
|
output_buffer.should have_tag('form li#post_author_input')
|
1098
1388
|
end
|
1099
1389
|
|
@@ -1108,7 +1398,7 @@ describe 'Formtastic' do
|
|
1108
1398
|
output_buffer.should have_tag('form li fieldset ol li', :count => Author.find(:all).size)
|
1109
1399
|
end
|
1110
1400
|
|
1111
|
-
it 'should have one option with a "
|
1401
|
+
it 'should have one option with a "checked" attribute' do
|
1112
1402
|
output_buffer.should have_tag('form li input[@checked]', :count => 1)
|
1113
1403
|
end
|
1114
1404
|
|
@@ -1116,10 +1406,8 @@ describe 'Formtastic' do
|
|
1116
1406
|
|
1117
1407
|
it 'should contain a label for the radio input with a nested input and label text' do
|
1118
1408
|
Author.find(:all).each do |author|
|
1119
|
-
output_buffer.should have_tag('form li fieldset ol li label')
|
1120
1409
|
output_buffer.should have_tag('form li fieldset ol li label', /#{author.to_label}/)
|
1121
1410
|
output_buffer.should have_tag("form li fieldset ol li label[@for='post_author_id_#{author.id}']")
|
1122
|
-
output_buffer.should have_tag("form li fieldset ol li label input")
|
1123
1411
|
end
|
1124
1412
|
end
|
1125
1413
|
|
@@ -1151,29 +1439,39 @@ describe 'Formtastic' do
|
|
1151
1439
|
end
|
1152
1440
|
end
|
1153
1441
|
|
1154
|
-
|
1155
|
-
|
1442
|
+
describe 'and no object is given' do
|
1443
|
+
before(:each) do
|
1444
|
+
output_buffer.replace ''
|
1445
|
+
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
1446
|
+
concat(builder.input(:author_id, :as => :radio, :collection => Author.find(:all)))
|
1447
|
+
end
|
1448
|
+
end
|
1156
1449
|
|
1157
|
-
|
1158
|
-
|
1450
|
+
it 'should generate a fieldset with legend' do
|
1451
|
+
output_buffer.should have_tag('form li fieldset legend', /Author/)
|
1159
1452
|
end
|
1160
1453
|
|
1161
|
-
|
1162
|
-
|
1454
|
+
it 'shold generate an li tag for each item in the collection' do
|
1455
|
+
output_buffer.should have_tag('form li fieldset ol li', :count => Author.find(:all).size)
|
1456
|
+
end
|
1163
1457
|
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1458
|
+
it 'should generate labels for each item' do
|
1459
|
+
Author.find(:all).each do |author|
|
1460
|
+
output_buffer.should have_tag('form li fieldset ol li label', /#{author.to_label}/)
|
1461
|
+
output_buffer.should have_tag("form li fieldset ol li label[@for='project_author_id_#{author.id}']")
|
1462
|
+
end
|
1463
|
+
end
|
1167
1464
|
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1465
|
+
it 'should generate inputs for each item' do
|
1466
|
+
Author.find(:all).each do |author|
|
1467
|
+
output_buffer.should have_tag("form li fieldset ol li label input#project_author_id_#{author.id}")
|
1468
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@type='radio']")
|
1469
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@value='#{author.id}']")
|
1470
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@name='project[author_id]']")
|
1471
|
+
end
|
1172
1472
|
end
|
1173
1473
|
end
|
1174
|
-
|
1175
1474
|
end
|
1176
|
-
|
1177
1475
|
end
|
1178
1476
|
|
1179
1477
|
describe ':as => :select' do
|
@@ -1217,9 +1515,13 @@ describe 'Formtastic' do
|
|
1217
1515
|
it 'should create a select without size' do
|
1218
1516
|
output_buffer.should_not have_tag('form li select[@size]')
|
1219
1517
|
end
|
1220
|
-
|
1518
|
+
|
1519
|
+
it 'should have a blank option' do
|
1520
|
+
output_buffer.should have_tag("form li select option[@value='']")
|
1521
|
+
end
|
1522
|
+
|
1221
1523
|
it 'should have a select option for each Author' do
|
1222
|
-
output_buffer.should have_tag('form li select option', :count => Author.find(:all).size)
|
1524
|
+
output_buffer.should have_tag('form li select option', :count => Author.find(:all).size + 1)
|
1223
1525
|
Author.find(:all).each do |author|
|
1224
1526
|
output_buffer.should have_tag("form li select option[@value='#{author.id}']", /#{author.to_label}/)
|
1225
1527
|
end
|
@@ -1228,6 +1530,18 @@ describe 'Formtastic' do
|
|
1228
1530
|
it 'should have one option with a "selected" attribute' do
|
1229
1531
|
output_buffer.should have_tag('form li select option[@selected]', :count => 1)
|
1230
1532
|
end
|
1533
|
+
|
1534
|
+
it 'should not singularize the association name' do
|
1535
|
+
@new_post.stub!(:author_status).and_return(@bob)
|
1536
|
+
@new_post.stub!(:author_status_id).and_return(@bob.id)
|
1537
|
+
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :integer, :limit => 255))
|
1538
|
+
|
1539
|
+
semantic_form_for(@new_post) do |builder|
|
1540
|
+
concat(builder.input(:author_status, :as => :select))
|
1541
|
+
end
|
1542
|
+
|
1543
|
+
output_buffer.should have_tag('form li select#post_author_status_id')
|
1544
|
+
end
|
1231
1545
|
end
|
1232
1546
|
|
1233
1547
|
describe 'for a has_many association' do
|
@@ -1247,7 +1561,7 @@ describe 'Formtastic' do
|
|
1247
1561
|
|
1248
1562
|
it 'should have a label inside the wrapper' do
|
1249
1563
|
output_buffer.should have_tag('form li label')
|
1250
|
-
output_buffer.should have_tag('form li label', /
|
1564
|
+
output_buffer.should have_tag('form li label', /Post/)
|
1251
1565
|
output_buffer.should have_tag("form li label[@for='author_post_ids']")
|
1252
1566
|
end
|
1253
1567
|
|
@@ -1266,6 +1580,10 @@ describe 'Formtastic' do
|
|
1266
1580
|
output_buffer.should have_tag("form li select option[@value='#{post.id}']", /#{post.to_label}/)
|
1267
1581
|
end
|
1268
1582
|
end
|
1583
|
+
|
1584
|
+
it 'should not have a blank option' do
|
1585
|
+
output_buffer.should_not have_tag("form li select option[@value='']")
|
1586
|
+
end
|
1269
1587
|
|
1270
1588
|
it 'should have one option with a "selected" attribute' do
|
1271
1589
|
output_buffer.should have_tag('form li select option[@selected]', :count => 1)
|
@@ -1289,7 +1607,7 @@ describe 'Formtastic' do
|
|
1289
1607
|
|
1290
1608
|
it 'should have a label inside the wrapper' do
|
1291
1609
|
output_buffer.should have_tag('form li label')
|
1292
|
-
output_buffer.should have_tag('form li label', /
|
1610
|
+
output_buffer.should have_tag('form li label', /Author/)
|
1293
1611
|
output_buffer.should have_tag("form li label[@for='post_author_ids']")
|
1294
1612
|
end
|
1295
1613
|
|
@@ -1308,42 +1626,179 @@ describe 'Formtastic' do
|
|
1308
1626
|
output_buffer.should have_tag("form li select option[@value='#{author.id}']", /#{author.to_label}/)
|
1309
1627
|
end
|
1310
1628
|
end
|
1629
|
+
|
1630
|
+
it 'should not have a blank option' do
|
1631
|
+
output_buffer.should_not have_tag("form li select option[@value='']")
|
1632
|
+
end
|
1311
1633
|
|
1312
1634
|
it 'should have one option with a "selected" attribute' do
|
1313
1635
|
output_buffer.should have_tag('form li select option[@selected]', :count => 1)
|
1314
1636
|
end
|
1315
1637
|
end
|
1316
|
-
|
1317
|
-
describe 'when :include_blank
|
1638
|
+
|
1639
|
+
describe 'when :include_blank is not set' do
|
1640
|
+
before do
|
1641
|
+
@new_post.stub!(:author_id).and_return(nil)
|
1642
|
+
semantic_form_for(@new_post) do |builder|
|
1643
|
+
concat(builder.input(:author, :as => :select))
|
1644
|
+
end
|
1645
|
+
end
|
1646
|
+
|
1647
|
+
it 'should have a blank option by default' do
|
1648
|
+
output_buffer.should have_tag("form li select option[@value='']", "")
|
1649
|
+
end
|
1650
|
+
end
|
1651
|
+
|
1652
|
+
describe 'when :include_blank is set to false' do
|
1318
1653
|
before do
|
1319
1654
|
@new_post.stub!(:author_id).and_return(nil)
|
1320
1655
|
semantic_form_for(@new_post) do |builder|
|
1321
|
-
concat(builder.input(:author, :as => :select, :include_blank =>
|
1656
|
+
concat(builder.input(:author, :as => :select, :include_blank => false))
|
1322
1657
|
end
|
1323
1658
|
end
|
1659
|
+
|
1660
|
+
it 'should not have a blank option' do
|
1661
|
+
output_buffer.should_not have_tag("form li select option[@value='']", "")
|
1662
|
+
end
|
1663
|
+
end
|
1324
1664
|
|
1325
|
-
|
1326
|
-
|
1665
|
+
describe 'when :prompt => "choose something" is set' do
|
1666
|
+
before do
|
1667
|
+
@new_post.stub!(:author_id).and_return(nil)
|
1668
|
+
semantic_form_for(@new_post) do |builder|
|
1669
|
+
concat(builder.input(:author, :as => :select, :prompt => "choose author"))
|
1670
|
+
end
|
1327
1671
|
end
|
1328
1672
|
|
1329
1673
|
it 'should have a select with prompt' do
|
1330
1674
|
output_buffer.should have_tag("form li select option[@value='']", /choose author/)
|
1331
1675
|
end
|
1676
|
+
|
1677
|
+
it 'should not have a blank select option' do
|
1678
|
+
output_buffer.should_not have_tag("form li select option[@value='']", "")
|
1679
|
+
end
|
1332
1680
|
end
|
1333
1681
|
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1682
|
+
describe 'when no object is given' do
|
1683
|
+
before(:each) do
|
1684
|
+
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
1685
|
+
concat(builder.input(:author, :as => :select, :collection => Author.find(:all)))
|
1686
|
+
end
|
1687
|
+
end
|
1688
|
+
|
1689
|
+
it 'should generate label' do
|
1690
|
+
output_buffer.should have_tag('form li label', /Author/)
|
1691
|
+
output_buffer.should have_tag("form li label[@for='project_author']")
|
1692
|
+
end
|
1693
|
+
|
1694
|
+
it 'should generate select inputs' do
|
1695
|
+
output_buffer.should have_tag('form li select#project_author')
|
1696
|
+
output_buffer.should have_tag('form li select option', :count => Author.find(:all).size + 1)
|
1697
|
+
end
|
1698
|
+
|
1699
|
+
it 'should generate an option to each item' do
|
1700
|
+
Author.find(:all).each do |author|
|
1701
|
+
output_buffer.should have_tag("form li select option[@value='#{author.id}']", /#{author.to_label}/)
|
1702
|
+
end
|
1703
|
+
end
|
1704
|
+
end
|
1705
|
+
end
|
1706
|
+
|
1707
|
+
describe ':as => :check_boxes' do
|
1708
|
+
|
1709
|
+
describe 'for a has_many association' do
|
1710
|
+
before do
|
1711
|
+
semantic_form_for(@fred) do |builder|
|
1712
|
+
concat(builder.input(:posts, :as => :check_boxes, :value_as_class => true))
|
1713
|
+
end
|
1714
|
+
end
|
1715
|
+
|
1716
|
+
it 'should have a check_boxes class on the wrapper' do
|
1717
|
+
output_buffer.should have_tag('form li.check_boxes')
|
1718
|
+
end
|
1719
|
+
|
1720
|
+
it 'should have a author_posts_input id on the wrapper' do
|
1721
|
+
output_buffer.should have_tag('form li#author_posts_input')
|
1722
|
+
end
|
1723
|
+
|
1724
|
+
it 'should generate a fieldset and legend containing label text for the input' do
|
1725
|
+
output_buffer.should have_tag('form li fieldset')
|
1726
|
+
output_buffer.should have_tag('form li fieldset legend')
|
1727
|
+
output_buffer.should have_tag('form li fieldset legend', /Posts/)
|
1728
|
+
end
|
1729
|
+
|
1730
|
+
it 'should generate an ordered list with a list item for each choice' do
|
1731
|
+
output_buffer.should have_tag('form li fieldset ol')
|
1732
|
+
output_buffer.should have_tag('form li fieldset ol li', :count => Post.find(:all).size)
|
1733
|
+
end
|
1734
|
+
|
1735
|
+
it 'should have one option with a "checked" attribute' do
|
1736
|
+
output_buffer.should have_tag('form li input[@checked]', :count => 1)
|
1737
|
+
end
|
1738
|
+
|
1739
|
+
it 'should generate hidden inputs with default value blank' do
|
1740
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@type='hidden'][@value='']", :count => Post.find(:all).size)
|
1741
|
+
end
|
1742
|
+
|
1743
|
+
describe "each choice" do
|
1744
|
+
|
1745
|
+
it 'should contain a label for the radio input with a nested input and label text' do
|
1746
|
+
Post.find(:all).each do |post|
|
1747
|
+
output_buffer.should have_tag('form li fieldset ol li label', /#{post.to_label}/)
|
1748
|
+
output_buffer.should have_tag("form li fieldset ol li label[@for='author_post_ids_#{post.id}']")
|
1749
|
+
end
|
1750
|
+
end
|
1751
|
+
|
1752
|
+
it 'should use values as li.class when value_as_class is true' do
|
1753
|
+
Post.find(:all).each do |post|
|
1754
|
+
output_buffer.should have_tag("form li fieldset ol li.#{post.id} label")
|
1755
|
+
end
|
1756
|
+
end
|
1757
|
+
|
1758
|
+
it 'should have a checkbox input for each post' do
|
1759
|
+
Post.find(:all).each do |post|
|
1760
|
+
output_buffer.should have_tag("form li fieldset ol li label input#author_post_ids_#{post.id}")
|
1761
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@name='author[post_ids][]']", :count => 2)
|
1762
|
+
end
|
1763
|
+
end
|
1764
|
+
|
1765
|
+
it "should mark input as checked if it's the the existing choice" do
|
1766
|
+
Post.find(:all).include?(@fred.posts.first).should be_true
|
1767
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@checked='checked']")
|
1768
|
+
end
|
1337
1769
|
end
|
1338
1770
|
|
1339
|
-
|
1340
|
-
|
1771
|
+
describe 'and no object is given' do
|
1772
|
+
before(:each) do
|
1773
|
+
output_buffer.replace ''
|
1774
|
+
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
1775
|
+
concat(builder.input(:author_id, :as => :check_boxes, :collection => Author.find(:all)))
|
1776
|
+
end
|
1777
|
+
end
|
1778
|
+
|
1779
|
+
it 'should generate a fieldset with legend' do
|
1780
|
+
output_buffer.should have_tag('form li fieldset legend', /Author/)
|
1781
|
+
end
|
1341
1782
|
|
1342
|
-
|
1343
|
-
|
1783
|
+
it 'shold generate an li tag for each item in the collection' do
|
1784
|
+
output_buffer.should have_tag('form li fieldset ol li', :count => Author.find(:all).size)
|
1785
|
+
end
|
1786
|
+
|
1787
|
+
it 'should generate labels for each item' do
|
1788
|
+
Author.find(:all).each do |author|
|
1789
|
+
output_buffer.should have_tag('form li fieldset ol li label', /#{author.to_label}/)
|
1790
|
+
output_buffer.should have_tag("form li fieldset ol li label[@for='project_author_id_#{author.id}']")
|
1791
|
+
end
|
1792
|
+
end
|
1344
1793
|
|
1345
|
-
|
1346
|
-
|
1794
|
+
it 'should generate inputs for each item' do
|
1795
|
+
Author.find(:all).each do |author|
|
1796
|
+
output_buffer.should have_tag("form li fieldset ol li label input#project_author_id_#{author.id}")
|
1797
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@type='checkbox']")
|
1798
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@value='#{author.id}']")
|
1799
|
+
output_buffer.should have_tag("form li fieldset ol li label input[@name='project[author_id][]']")
|
1800
|
+
end
|
1801
|
+
end
|
1347
1802
|
end
|
1348
1803
|
end
|
1349
1804
|
end
|
@@ -1356,7 +1811,7 @@ describe 'Formtastic' do
|
|
1356
1811
|
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => :integer, :limit => 255))
|
1357
1812
|
end
|
1358
1813
|
|
1359
|
-
{ :select => :option, :radio => :input }.each do |type, countable|
|
1814
|
+
{ :select => :option, :radio => :input, :check_boxes => :'input[@type="checkbox"]' }.each do |type, countable|
|
1360
1815
|
|
1361
1816
|
describe ":as => #{type.inspect}" do
|
1362
1817
|
describe 'when the :collection option is not provided' do
|
@@ -1397,7 +1852,7 @@ describe 'Formtastic' do
|
|
1397
1852
|
semantic_form_for(@new_post) do |builder|
|
1398
1853
|
concat(builder.input(:author, :as => type, :collection => @authors))
|
1399
1854
|
end
|
1400
|
-
output_buffer.should have_tag("form li.#{type} #{countable}", :count => @authors.size)
|
1855
|
+
output_buffer.should have_tag("form li.#{type} #{countable}", :count => @authors.size + (type == :select ? 1 : 0))
|
1401
1856
|
end
|
1402
1857
|
|
1403
1858
|
describe 'and the :collection is an array of strings' do
|
@@ -1411,9 +1866,9 @@ describe 'Formtastic' do
|
|
1411
1866
|
concat(builder.input(:category_name, :as => type, :collection => @categories))
|
1412
1867
|
end
|
1413
1868
|
|
1414
|
-
@categories.each do |
|
1415
|
-
output_buffer.should have_tag("form li.#{type}", /#{
|
1416
|
-
output_buffer.should have_tag("form li.#{type} #{countable}[@value
|
1869
|
+
@categories.each do |value|
|
1870
|
+
output_buffer.should have_tag("form li.#{type}", /#{value}/)
|
1871
|
+
output_buffer.should have_tag("form li.#{type} #{countable}[@value='#{value}']")
|
1417
1872
|
end
|
1418
1873
|
end
|
1419
1874
|
|
@@ -1446,7 +1901,7 @@ describe 'Formtastic' do
|
|
1446
1901
|
|
1447
1902
|
@categories.each do |label, value|
|
1448
1903
|
output_buffer.should have_tag("form li.#{type}", /#{label}/)
|
1449
|
-
output_buffer.should have_tag("form li.#{type} #{countable}[@value
|
1904
|
+
output_buffer.should have_tag("form li.#{type} #{countable}[@value='#{value}']")
|
1450
1905
|
end
|
1451
1906
|
end
|
1452
1907
|
end
|
@@ -1459,12 +1914,13 @@ describe 'Formtastic' do
|
|
1459
1914
|
|
1460
1915
|
it "should use the first value as the label text and the last value as the value attribute for #{countable}" do
|
1461
1916
|
semantic_form_for(@new_post) do |builder|
|
1462
|
-
concat(builder.input(:category_name, :as =>
|
1917
|
+
concat(builder.input(:category_name, :as => type, :collection => @categories))
|
1463
1918
|
end
|
1464
1919
|
|
1465
|
-
@categories.each do |
|
1466
|
-
|
1467
|
-
output_buffer.should have_tag(
|
1920
|
+
@categories.each do |text, value|
|
1921
|
+
label = type == :select ? :option : :label
|
1922
|
+
output_buffer.should have_tag("form li.#{type} #{label}", /#{text}/i)
|
1923
|
+
output_buffer.should have_tag("form li.#{type} #{countable}[@value='#{value.to_s}']")
|
1468
1924
|
end
|
1469
1925
|
end
|
1470
1926
|
end
|
@@ -1477,12 +1933,13 @@ describe 'Formtastic' do
|
|
1477
1933
|
|
1478
1934
|
it "should use the symbol as the label text and value for each #{countable}" do
|
1479
1935
|
semantic_form_for(@new_post) do |builder|
|
1480
|
-
concat(builder.input(:category_name, :as =>
|
1936
|
+
concat(builder.input(:category_name, :as => type, :collection => @categories))
|
1481
1937
|
end
|
1482
1938
|
|
1483
1939
|
@categories.each do |value|
|
1484
|
-
|
1485
|
-
output_buffer.should have_tag(
|
1940
|
+
label = type == :select ? :option : :label
|
1941
|
+
output_buffer.should have_tag("form li.#{type} #{label}", /#{value}/i)
|
1942
|
+
output_buffer.should have_tag("form li.#{type} #{countable}[@value='#{value.to_s}']")
|
1486
1943
|
end
|
1487
1944
|
end
|
1488
1945
|
end
|
@@ -1539,8 +1996,15 @@ describe 'Formtastic' do
|
|
1539
1996
|
end
|
1540
1997
|
|
1541
1998
|
end
|
1999
|
+
end
|
2000
|
+
end
|
2001
|
+
|
2002
|
+
describe 'for boolean attributes' do
|
2003
|
+
|
2004
|
+
{ :select => :option, :radio => :input }.each do |type, countable|
|
2005
|
+
checked_or_selected = { :select => :selected, :radio => :checked }[type]
|
1542
2006
|
|
1543
|
-
describe
|
2007
|
+
describe ":as => #{type.inspect}" do
|
1544
2008
|
|
1545
2009
|
before do
|
1546
2010
|
@new_post.stub!(:allow_comments)
|
@@ -1564,7 +2028,7 @@ describe 'Formtastic' do
|
|
1564
2028
|
end
|
1565
2029
|
|
1566
2030
|
it "should generate two #{countable}" do
|
1567
|
-
output_buffer.should have_tag("form li.#{type} #{countable}", :count => 2)
|
2031
|
+
output_buffer.should have_tag("form li.#{type} #{countable}", :count => (type == :select ? 3 : 2))
|
1568
2032
|
output_buffer.should have_tag(%{form li.#{type} #{countable}[@value="true"]})
|
1569
2033
|
output_buffer.should have_tag(%{form li.#{type} #{countable}[@value="false"]})
|
1570
2034
|
end
|
@@ -1588,8 +2052,6 @@ describe 'Formtastic' do
|
|
1588
2052
|
end
|
1589
2053
|
end
|
1590
2054
|
|
1591
|
-
checked_or_selected = { :select => :selected, :radio => :checked }[type]
|
1592
|
-
|
1593
2055
|
describe 'when the value is nil' do
|
1594
2056
|
before do
|
1595
2057
|
@new_post.stub!(:allow_comments).and_return(nil)
|
@@ -1656,6 +2118,7 @@ describe 'Formtastic' do
|
|
1656
2118
|
end
|
1657
2119
|
end
|
1658
2120
|
end
|
2121
|
+
|
1659
2122
|
end
|
1660
2123
|
end
|
1661
2124
|
end
|
@@ -1758,24 +2221,21 @@ describe 'Formtastic' do
|
|
1758
2221
|
end
|
1759
2222
|
|
1760
2223
|
describe 'when :discard_input => true is set' do
|
1761
|
-
|
1762
2224
|
it 'should use default hidden value equals to 1 when attribute returns nil' do
|
1763
|
-
pending
|
1764
2225
|
semantic_form_for(@new_post) do |builder|
|
1765
2226
|
concat(builder.input(:publish_at, :as => :datetime, :discard_day => true))
|
1766
2227
|
end
|
1767
2228
|
|
1768
|
-
output_buffer.should have_tag("form li
|
2229
|
+
output_buffer.should have_tag("form li input[@type='hidden'][@value='1']")
|
1769
2230
|
end
|
1770
2231
|
|
1771
2232
|
it 'should use default attribute value when it is not nil' do
|
1772
|
-
pending
|
1773
2233
|
@new_post.stub!(:publish_at).and_return(Date.new(2007,12,27))
|
1774
2234
|
semantic_form_for(@new_post) do |builder|
|
1775
2235
|
concat(builder.input(:publish_at, :as => :datetime, :discard_day => true))
|
1776
2236
|
end
|
1777
2237
|
|
1778
|
-
output_buffer.should have_tag("form li
|
2238
|
+
output_buffer.should have_tag("form li input[@type='hidden'][@value='27']")
|
1779
2239
|
end
|
1780
2240
|
end
|
1781
2241
|
|
@@ -1848,16 +2308,25 @@ describe 'Formtastic' do
|
|
1848
2308
|
end
|
1849
2309
|
end
|
1850
2310
|
|
1851
|
-
|
1852
|
-
|
2311
|
+
describe 'when no object is given' do
|
2312
|
+
before(:each) do
|
2313
|
+
output_buffer.replace ''
|
2314
|
+
semantic_form_for(:project, :url => 'http://test.host') do |@builder|
|
2315
|
+
concat(@builder.input(:publish_at, :as => :datetime))
|
2316
|
+
end
|
2317
|
+
end
|
1853
2318
|
|
1854
|
-
|
1855
|
-
|
2319
|
+
it 'should have fieldset with legend' do
|
2320
|
+
output_buffer.should have_tag('form li.datetime fieldset legend', /Publish at/)
|
1856
2321
|
end
|
1857
2322
|
|
1858
|
-
|
1859
|
-
|
1860
|
-
|
2323
|
+
it 'should have labels for each input' do
|
2324
|
+
output_buffer.should have_tag('form li.datetime fieldset ol li label', :count => 5)
|
2325
|
+
end
|
2326
|
+
|
2327
|
+
it 'should have selects for each inputs' do
|
2328
|
+
output_buffer.should have_tag('form li.datetime fieldset ol li select', :count => 5)
|
2329
|
+
end
|
1861
2330
|
end
|
1862
2331
|
end
|
1863
2332
|
|
@@ -1885,19 +2354,18 @@ describe 'Formtastic' do
|
|
1885
2354
|
|
1886
2355
|
it 'should have an ordered list of two items inside the fieldset' do
|
1887
2356
|
output_buffer.should have_tag('form li.time fieldset ol')
|
1888
|
-
|
2357
|
+
output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
|
1889
2358
|
end
|
1890
2359
|
|
1891
2360
|
it 'should have five labels for hour and minute' do
|
1892
|
-
pending
|
1893
2361
|
output_buffer.should have_tag('form li.time fieldset ol li label', :count => 2)
|
1894
2362
|
output_buffer.should have_tag('form li.time fieldset ol li label', /hour/i)
|
1895
2363
|
output_buffer.should have_tag('form li.time fieldset ol li label', /minute/i)
|
1896
2364
|
end
|
1897
2365
|
|
1898
|
-
it 'should have
|
1899
|
-
|
1900
|
-
output_buffer.should have_tag('form li.time fieldset ol li
|
2366
|
+
it 'should have two selects for hour and minute' do
|
2367
|
+
#output_buffer.should have_tag('form li.time fieldset ol li select', :count => 2)
|
2368
|
+
output_buffer.should have_tag('form li.time fieldset ol li', :count => 2)
|
1901
2369
|
end
|
1902
2370
|
end
|
1903
2371
|
|
@@ -1976,7 +2444,6 @@ describe 'Formtastic' do
|
|
1976
2444
|
end
|
1977
2445
|
end
|
1978
2446
|
|
1979
|
-
|
1980
2447
|
describe '#inputs' do
|
1981
2448
|
|
1982
2449
|
describe 'with a block' do
|
@@ -2130,8 +2597,8 @@ describe 'Formtastic' do
|
|
2130
2597
|
describe 'without a block' do
|
2131
2598
|
|
2132
2599
|
before do
|
2133
|
-
Post.stub!(:reflections).and_return({:author => mock('reflection', :macro => :belongs_to),
|
2134
|
-
:comments => mock('reflection', :macro => :has_many) })
|
2600
|
+
Post.stub!(:reflections).and_return({:author => mock('reflection', :options => {}, :macro => :belongs_to),
|
2601
|
+
:comments => mock('reflection', :options => {}, :macro => :has_many) })
|
2135
2602
|
Post.stub!(:content_columns).and_return([mock('column', :name => 'title'), mock('column', :name => 'body'), mock('column', :name => 'created_at')])
|
2136
2603
|
Author.stub!(:find).and_return([@fred, @bob])
|
2137
2604
|
|
@@ -2436,7 +2903,41 @@ describe 'Formtastic' do
|
|
2436
2903
|
output_buffer.should have_tag('li.commit input#my_id')
|
2437
2904
|
output_buffer.should have_tag('li.commit input.my_class')
|
2438
2905
|
end
|
2906
|
+
|
2907
|
+
end
|
2439
2908
|
|
2909
|
+
describe 'when the first option is a string and the second is a hash' do
|
2910
|
+
|
2911
|
+
before do
|
2912
|
+
@new_post.stub!(:new_record?).and_return(false)
|
2913
|
+
semantic_form_for(@new_post) do |builder|
|
2914
|
+
concat(builder.commit_button("a string", :button_html => { :class => "pretty"}))
|
2915
|
+
end
|
2916
|
+
end
|
2917
|
+
|
2918
|
+
it "should render the string as the value of the button" do
|
2919
|
+
output_buffer.should have_tag('li input[@value="a string"]')
|
2920
|
+
end
|
2921
|
+
|
2922
|
+
it "should deal with the options hash" do
|
2923
|
+
output_buffer.should have_tag('li input.pretty')
|
2924
|
+
end
|
2925
|
+
|
2926
|
+
end
|
2927
|
+
|
2928
|
+
describe 'when the first option is a hash' do
|
2929
|
+
|
2930
|
+
before do
|
2931
|
+
@new_post.stub!(:new_record?).and_return(false)
|
2932
|
+
semantic_form_for(@new_post) do |builder|
|
2933
|
+
concat(builder.commit_button(:button_html => { :class => "pretty"}))
|
2934
|
+
end
|
2935
|
+
end
|
2936
|
+
|
2937
|
+
it "should deal with the options hash" do
|
2938
|
+
output_buffer.should have_tag('li input.pretty')
|
2939
|
+
end
|
2940
|
+
|
2440
2941
|
end
|
2441
2942
|
|
2442
2943
|
describe 'when used on an existing record' do
|
@@ -2549,7 +3050,7 @@ describe 'Formtastic' do
|
|
2549
3050
|
end
|
2550
3051
|
end
|
2551
3052
|
|
2552
|
-
output_buffer.should eql("<form action=\"/posts\" class=\"formtastic post\" id=\"new_post\" method=\"post\"><input id=\"post_links__delete\" name=\"post[links][_delete]\" type=\"hidden\" /><a href=\"#\" onclick=\"
|
3053
|
+
output_buffer.should eql("<form action=\"/posts\" class=\"formtastic post\" id=\"new_post\" method=\"post\"><input id=\"post_links__delete\" name=\"post[links][_delete]\" type=\"hidden\" /><a href=\"#\" onclick=\";$(this).parents('.nil_class').hide(); $(this).prev(':input').val('1');; return false;\">Remove</a></form>")
|
2553
3054
|
end
|
2554
3055
|
|
2555
3056
|
it "should have a show method" do
|