formtastic 2.0.2 → 2.1.0.beta1

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.
Files changed (116) hide show
  1. data/.gitignore +4 -1
  2. data/Appraisals +11 -0
  3. data/CHANGELOG +2 -2
  4. data/Gemfile +0 -2
  5. data/README.textile +183 -151
  6. data/Rakefile +9 -5
  7. data/app/assets/stylesheets/formtastic.css +16 -3
  8. data/formtastic.gemspec +6 -2
  9. data/gemfiles/rails-3.0.gemfile +7 -0
  10. data/gemfiles/rails-3.1.gemfile +7 -0
  11. data/gemfiles/rails-3.2.gemfile +7 -0
  12. data/lib/formtastic.rb +10 -2
  13. data/lib/formtastic/actions.rb +11 -0
  14. data/lib/formtastic/actions/base.rb +156 -0
  15. data/lib/formtastic/actions/button_action.rb +72 -0
  16. data/lib/formtastic/actions/buttonish.rb +17 -0
  17. data/lib/formtastic/actions/input_action.rb +68 -0
  18. data/lib/formtastic/actions/link_action.rb +87 -0
  19. data/lib/formtastic/engine.rb +5 -1
  20. data/lib/formtastic/form_builder.rb +3 -0
  21. data/lib/formtastic/helpers.rb +2 -1
  22. data/lib/formtastic/helpers/action_helper.rb +109 -0
  23. data/lib/formtastic/helpers/actions_helper.rb +168 -0
  24. data/lib/formtastic/helpers/buttons_helper.rb +22 -9
  25. data/lib/formtastic/helpers/errors_helper.rb +0 -54
  26. data/lib/formtastic/helpers/fieldset_wrapper.rb +10 -5
  27. data/lib/formtastic/helpers/form_helper.rb +2 -2
  28. data/lib/formtastic/helpers/input_helper.rb +1 -10
  29. data/lib/formtastic/helpers/inputs_helper.rb +6 -3
  30. data/lib/formtastic/i18n.rb +3 -2
  31. data/lib/formtastic/inputs/base.rb +11 -3
  32. data/lib/formtastic/inputs/base/choices.rb +6 -1
  33. data/lib/formtastic/inputs/base/collections.rb +36 -13
  34. data/lib/formtastic/inputs/base/grouped_collections.rb +1 -1
  35. data/lib/formtastic/inputs/base/numeric.rb +50 -0
  36. data/lib/formtastic/inputs/base/options.rb +1 -1
  37. data/lib/formtastic/inputs/base/placeholder.rb +17 -0
  38. data/lib/formtastic/inputs/base/stringish.rb +2 -7
  39. data/lib/formtastic/inputs/base/timeish.rb +21 -5
  40. data/lib/formtastic/inputs/base/validations.rb +1 -1
  41. data/lib/formtastic/inputs/base/wrapping.rb +10 -3
  42. data/lib/formtastic/inputs/boolean_input.rb +10 -2
  43. data/lib/formtastic/inputs/check_boxes_input.rb +18 -9
  44. data/lib/formtastic/inputs/country_input.rb +2 -2
  45. data/lib/formtastic/inputs/date_input.rb +19 -1
  46. data/lib/formtastic/inputs/datetime_input.rb +1 -1
  47. data/lib/formtastic/inputs/email_input.rb +2 -1
  48. data/lib/formtastic/inputs/file_input.rb +1 -1
  49. data/lib/formtastic/inputs/hidden_input.rb +1 -1
  50. data/lib/formtastic/inputs/number_input.rb +6 -36
  51. data/lib/formtastic/inputs/password_input.rb +2 -1
  52. data/lib/formtastic/inputs/phone_input.rb +3 -2
  53. data/lib/formtastic/inputs/radio_input.rb +1 -1
  54. data/lib/formtastic/inputs/range_input.rb +8 -32
  55. data/lib/formtastic/inputs/search_input.rb +2 -1
  56. data/lib/formtastic/inputs/select_input.rb +56 -28
  57. data/lib/formtastic/inputs/string_input.rb +3 -1
  58. data/lib/formtastic/inputs/text_input.rb +5 -4
  59. data/lib/formtastic/inputs/time_input.rb +4 -8
  60. data/lib/formtastic/inputs/time_zone_input.rb +1 -1
  61. data/lib/formtastic/inputs/url_input.rb +2 -1
  62. data/lib/formtastic/localized_string.rb +6 -94
  63. data/lib/formtastic/localizer.rb +110 -0
  64. data/lib/formtastic/version.rb +1 -1
  65. data/lib/generators/formtastic/form/form_generator.rb +105 -0
  66. data/lib/generators/templates/_form.html.erb +2 -2
  67. data/lib/generators/templates/_form.html.haml +4 -4
  68. data/lib/generators/templates/_form.html.slim +2 -2
  69. data/lib/generators/templates/formtastic.rb +4 -0
  70. data/lib/locale/en.yml +2 -0
  71. data/sample/basic_inputs.html +22 -0
  72. data/spec/actions/button_action_spec.rb +63 -0
  73. data/spec/actions/generic_action_spec.rb +484 -0
  74. data/spec/actions/input_action_spec.rb +59 -0
  75. data/spec/actions/link_action_spec.rb +92 -0
  76. data/spec/builder/semantic_fields_for_spec.rb +14 -0
  77. data/spec/generators/formtastic/form/form_generator_spec.rb +118 -0
  78. data/spec/generators/formtastic/install/install_generator_spec.rb +47 -0
  79. data/spec/helpers/action_helper_spec.rb +365 -0
  80. data/spec/helpers/actions_helper_spec.rb +143 -0
  81. data/spec/helpers/buttons_helper_spec.rb +39 -23
  82. data/spec/helpers/commit_button_helper_spec.rb +153 -93
  83. data/spec/helpers/inputs_helper_spec.rb +14 -0
  84. data/spec/i18n_spec.rb +11 -0
  85. data/spec/inputs/boolean_input_spec.rb +31 -2
  86. data/spec/inputs/check_boxes_input_spec.rb +29 -1
  87. data/spec/inputs/date_input_spec.rb +95 -0
  88. data/spec/inputs/datetime_input_spec.rb +49 -0
  89. data/spec/inputs/email_input_spec.rb +28 -0
  90. data/spec/inputs/file_input_spec.rb +28 -0
  91. data/spec/inputs/hidden_input_spec.rb +28 -0
  92. data/spec/inputs/include_blank_spec.rb +53 -45
  93. data/spec/inputs/number_input_spec.rb +34 -4
  94. data/spec/inputs/password_input_spec.rb +28 -0
  95. data/spec/inputs/phone_input_spec.rb +28 -0
  96. data/spec/inputs/placeholder_spec.rb +10 -10
  97. data/spec/inputs/radio_input_spec.rb +51 -6
  98. data/spec/inputs/range_input_spec.rb +30 -2
  99. data/spec/inputs/search_input_spec.rb +27 -0
  100. data/spec/inputs/select_input_spec.rb +52 -6
  101. data/spec/inputs/string_input_spec.rb +28 -0
  102. data/spec/inputs/text_input_spec.rb +27 -0
  103. data/spec/inputs/time_input_spec.rb +67 -1
  104. data/spec/inputs/time_zone_input_spec.rb +28 -0
  105. data/spec/inputs/url_input_spec.rb +28 -0
  106. data/spec/inputs/with_options_spec.rb +43 -0
  107. data/spec/spec_helper.rb +22 -6
  108. data/spec/support/custom_macros.rb +6 -134
  109. data/spec/support/test_environment.rb +0 -1
  110. metadata +104 -17
  111. data/lib/formtastic/helpers/semantic_form_helper.rb +0 -11
  112. data/lib/formtastic/inputs/numeric_input.rb +0 -21
  113. data/lib/formtastic/railtie.rb +0 -12
  114. data/lib/formtastic/semantic_form_builder.rb +0 -11
  115. data/spec/builder/errors_spec.rb +0 -203
  116. data/spec/inputs/numeric_input_spec.rb +0 -41
@@ -556,6 +556,20 @@ describe 'Formtastic::FormBuilder#inputs' do
556
556
  output_buffer.should have_tag('form > fieldset.inputs > ol > li > fieldset.inputs > ol > li > fieldset.inputs > ol')
557
557
  end
558
558
  end
559
+
560
+ context "when several are nested" do
561
+ it "should wrap each of the nested inputs in an li block to maintain HTML validity" do
562
+ concat(semantic_form_for(@new_post) do |builder|
563
+ concat(builder.inputs do
564
+ concat(builder.inputs do
565
+ end)
566
+ concat(builder.inputs do
567
+ end)
568
+ end)
569
+ end)
570
+ output_buffer.should have_tag('form > fieldset.inputs > ol > li > fieldset.inputs > ol', :count => 2)
571
+ end
572
+ end
559
573
 
560
574
  end
561
575
 
data/spec/i18n_spec.rb CHANGED
@@ -160,6 +160,17 @@ describe 'Formtastic::I18n' do
160
160
  output_buffer.should have_tag("form label", /Hello author name!/)
161
161
  end
162
162
  end
163
+
164
+ it 'should be able to translate nested objects with nested object translations' do
165
+ with_config :i18n_lookups_by_default, true do
166
+ concat(semantic_form_for(@new_post) do |builder|
167
+ builder.semantic_fields_for(:project) do |f|
168
+ concat(f.input(:title))
169
+ end
170
+ end)
171
+ output_buffer.should have_tag("form label", /Hello project!/)
172
+ end
173
+ end
163
174
 
164
175
  it 'should be able to translate nested forms with top level translations' do
165
176
  with_config :i18n_lookups_by_default, true do
@@ -21,8 +21,6 @@ describe 'boolean input' do
21
21
 
22
22
  it 'should generate a label containing the input' do
23
23
  output_buffer.should_not have_tag('label.label')
24
-
25
-
26
24
  output_buffer.should have_tag('form li label', :count => 1)
27
25
  output_buffer.should have_tag('form li label[@for="post_allow_comments"]')
28
26
  output_buffer.should have_tag('form li label', /Allow comments/)
@@ -186,5 +184,36 @@ describe 'boolean input' do
186
184
  it_should_have_an_inline_label_for("context2_post_allow_comments")
187
185
 
188
186
  end
187
+
188
+ describe "when index is provided" do
189
+
190
+ before do
191
+ @output_buffer = ''
192
+ mock_everything
193
+
194
+ concat(semantic_form_for(@new_post) do |builder|
195
+ concat(builder.fields_for(:author, :index => 3) do |author|
196
+ concat(author.input(:name, :as => :boolean))
197
+ end)
198
+ end)
199
+ end
200
+
201
+ it 'should index the id of the wrapper' do
202
+ output_buffer.should have_tag("li#post_author_attributes_3_name_input")
203
+ end
204
+
205
+ it 'should index the id of the input tag' do
206
+ output_buffer.should have_tag("input#post_author_attributes_3_name")
207
+ end
208
+
209
+ it 'should index the name of the hidden input' do
210
+ output_buffer.should have_tag("input[@type='hidden'][@name='post[author_attributes][3][name]']")
211
+ end
212
+
213
+ it 'should index the name of the checkbox input' do
214
+ output_buffer.should have_tag("input[@type='checkbox'][@name='post[author_attributes][3][name]']")
215
+ end
216
+
217
+ end
189
218
 
190
219
  end
@@ -348,7 +348,7 @@ describe 'check_boxes input' do
348
348
  item.should_not_receive(:id)
349
349
  item.stub!(:custom_value).and_return('custom_value')
350
350
  item.should_receive(:custom_value).exactly(3).times
351
- @new_post.author.should_receive(:custom_value).exactly(3).times
351
+ @new_post.author.should_receive(:custom_value).exactly(1).times
352
352
  concat(semantic_form_for(@new_post) do |builder|
353
353
  concat(builder.input(:author, :as => :check_boxes, :member_value => :custom_value, :collection => [item, item, item]))
354
354
  end)
@@ -392,6 +392,34 @@ describe 'check_boxes input' do
392
392
  it_should_have_input_with_id('context2_author_post_ids_19')
393
393
  it_should_have_input_wrapper_with_id("context2_author_posts_input")
394
394
  end
395
+
396
+ describe "when index is provided" do
397
+
398
+ before do
399
+ @output_buffer = ''
400
+ mock_everything
401
+
402
+ concat(semantic_form_for(@fred) do |builder|
403
+ concat(builder.fields_for(@fred.posts.first, :index => 3) do |author|
404
+ concat(author.input(:authors, :as => :check_boxes))
405
+ end)
406
+ end)
407
+ end
408
+
409
+ it 'should index the id of the wrapper' do
410
+ output_buffer.should have_tag("li#author_post_3_authors_input")
411
+ end
412
+
413
+ it 'should index the id of the input tag' do
414
+ output_buffer.should have_tag("input#author_post_3_author_ids_42")
415
+ end
416
+
417
+ it 'should index the name of the checkbox input' do
418
+ output_buffer.should have_tag("input[@type='checkbox'][@name='author[post][3][author_ids][]']")
419
+ end
420
+
421
+ end
422
+
395
423
 
396
424
  describe "when collection is an array" do
397
425
  before do
@@ -70,6 +70,37 @@ describe 'date input' do
70
70
  it_should_have_select_with_id("context2_post_publish_at_3i")
71
71
 
72
72
  end
73
+
74
+ describe "when index is provided" do
75
+
76
+ before do
77
+ @output_buffer = ''
78
+ mock_everything
79
+
80
+ concat(semantic_form_for(@new_post) do |builder|
81
+ concat(builder.fields_for(:author, :index => 3) do |author|
82
+ concat(author.input(:created_at, :as => :date))
83
+ end)
84
+ end)
85
+ end
86
+
87
+ it 'should index the id of the wrapper' do
88
+ output_buffer.should have_tag("li#post_author_attributes_3_created_at_input")
89
+ end
90
+
91
+ it 'should index the id of the select tag' do
92
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_1i")
93
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_2i")
94
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_3i")
95
+ end
96
+
97
+ it 'should index the name of the select tag' do
98
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(1i)]']")
99
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(2i)]']")
100
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(3i)]']")
101
+ end
102
+
103
+ end
73
104
 
74
105
  describe ':labels option' do
75
106
  fields = [:year, :month, :day]
@@ -129,4 +160,68 @@ describe 'date input' do
129
160
  end
130
161
  end
131
162
 
163
+ describe "when order does not include day" do
164
+ before do
165
+ output_buffer.replace ''
166
+ concat(semantic_form_for(@new_post) do |builder|
167
+ concat(builder.input(:publish_at, :as => :date, :order => [:year, :month]))
168
+ end)
169
+ end
170
+
171
+ it "should include a hidden input for day" do
172
+ output_buffer.should have_tag('input[@type="hidden"][@name="post[publish_at(3i)]"][@value="1"]')
173
+ end
174
+
175
+ it "should not include a select for day" do
176
+ output_buffer.should_not have_tag('select[@name="post[publish_at(3i)]"]')
177
+ end
178
+ end
179
+
180
+ describe "when order does not include month" do
181
+ before do
182
+ output_buffer.replace ''
183
+ concat(semantic_form_for(@new_post) do |builder|
184
+ concat(builder.input(:publish_at, :as => :date, :order => [:year, :day]))
185
+ end)
186
+ end
187
+
188
+ it "should include a hidden input for month" do
189
+ output_buffer.should have_tag('input[@type="hidden"][@name="post[publish_at(2i)]"][@value="1"]')
190
+ end
191
+
192
+ it "should not include a select for month" do
193
+ output_buffer.should_not have_tag('select[@name="post[publish_at(2i)]"]')
194
+ end
195
+ end
196
+
197
+ describe "when order does not include year" do
198
+ before do
199
+ output_buffer.replace ''
200
+ concat(semantic_form_for(@new_post) do |builder|
201
+ concat(builder.input(:publish_at, :as => :date, :order => [:month, :day]))
202
+ end)
203
+ end
204
+
205
+ it "should include a hidden input for month" do
206
+ output_buffer.should have_tag("input[@type=\"hidden\"][@name=\"post[publish_at(1i)]\"][@value=\"#{Time.now.year}\"]")
207
+ end
208
+
209
+ it "should not include a select for month" do
210
+ output_buffer.should_not have_tag('select[@name="post[publish_at(1i)]"]')
211
+ end
212
+ end
213
+
214
+ describe "when order does not have year first" do
215
+ before do
216
+ output_buffer.replace ''
217
+ concat(semantic_form_for(@new_post) do |builder|
218
+ concat(builder.input(:publish_at, :as => :date, :order => [:day, :month, :year]))
219
+ end)
220
+ end
221
+
222
+ it 'should associate the legend label with the new first select' do
223
+ output_buffer.should have_tag('form li.date fieldset legend.label label[@for="post_publish_at_3i"]')
224
+ end
225
+ end
226
+
132
227
  end
@@ -76,6 +76,42 @@ describe 'datetime input' do
76
76
 
77
77
  end
78
78
 
79
+ describe "when index is provided" do
80
+
81
+ before do
82
+ @output_buffer = ''
83
+ mock_everything
84
+
85
+ concat(semantic_form_for(@new_post) do |builder|
86
+ concat(builder.fields_for(:author, :index => 3) do |author|
87
+ concat(author.input(:created_at, :as => :datetime))
88
+ end)
89
+ end)
90
+ end
91
+
92
+ it 'should index the id of the wrapper' do
93
+ output_buffer.should have_tag("li#post_author_attributes_3_created_at_input")
94
+ end
95
+
96
+ it 'should index the id of the select tag' do
97
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_1i")
98
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_2i")
99
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_3i")
100
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_4i")
101
+ output_buffer.should have_tag("select#post_author_attributes_3_created_at_5i")
102
+ end
103
+
104
+ it 'should index the name of the select tag' do
105
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(1i)]']")
106
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(2i)]']")
107
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(3i)]']")
108
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(4i)]']")
109
+ output_buffer.should have_tag("select[@name='post[author_attributes][3][created_at(5i)]']")
110
+ end
111
+
112
+ end
113
+
114
+
79
115
  describe ':labels option' do
80
116
  fields = [:year, :month, :day, :hour, :minute]
81
117
  fields.each do |field|
@@ -132,5 +168,18 @@ describe 'datetime input' do
132
168
  end
133
169
  end
134
170
  end
171
+
172
+ describe "when order does not have year first" do
173
+ before do
174
+ output_buffer.replace ''
175
+ concat(semantic_form_for(@new_post) do |builder|
176
+ concat(builder.input(:publish_at, :as => :datetime, :order => [:day, :month, :year]))
177
+ end)
178
+ end
179
+
180
+ it 'should associate the legend label with the new first select' do
181
+ output_buffer.should have_tag('form li.datetime fieldset legend.label label[@for="post_publish_at_3i"]')
182
+ end
183
+ end
135
184
 
136
185
  end
@@ -42,6 +42,34 @@ describe 'email input' do
42
42
 
43
43
  end
44
44
 
45
+ describe "when index is provided" do
46
+
47
+ before do
48
+ @output_buffer = ''
49
+ mock_everything
50
+
51
+ concat(semantic_form_for(@new_post) do |builder|
52
+ concat(builder.fields_for(:author, :index => 3) do |author|
53
+ concat(author.input(:name, :as => :email))
54
+ end)
55
+ end)
56
+ end
57
+
58
+ it 'should index the id of the wrapper' do
59
+ output_buffer.should have_tag("li#post_author_attributes_3_name_input")
60
+ end
61
+
62
+ it 'should index the id of the select tag' do
63
+ output_buffer.should have_tag("input#post_author_attributes_3_name")
64
+ end
65
+
66
+ it 'should index the name of the select tag' do
67
+ output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
68
+ end
69
+
70
+ end
71
+
72
+
45
73
  describe "when required" do
46
74
  it "should add the required attribute to the input's html options" do
47
75
  with_config :use_required_attribute, true do
@@ -46,6 +46,34 @@ describe 'file input' do
46
46
 
47
47
  end
48
48
 
49
+ describe "when index is provided" do
50
+
51
+ before do
52
+ @output_buffer = ''
53
+ mock_everything
54
+
55
+ concat(semantic_form_for(@new_post) do |builder|
56
+ concat(builder.fields_for(:author, :index => 3) do |author|
57
+ concat(author.input(:name, :as => :file))
58
+ end)
59
+ end)
60
+ end
61
+
62
+ it 'should index the id of the wrapper' do
63
+ output_buffer.should have_tag("li#post_author_attributes_3_name_input")
64
+ end
65
+
66
+ it 'should index the id of the select tag' do
67
+ output_buffer.should have_tag("input#post_author_attributes_3_name")
68
+ end
69
+
70
+ it 'should index the name of the select tag' do
71
+ output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
72
+ end
73
+
74
+ end
75
+
76
+
49
77
  context "when required" do
50
78
  it "should add the required attribute to the input's html options" do
51
79
  with_config :use_required_attribute, true do
@@ -98,6 +98,34 @@ describe 'hidden input' do
98
98
 
99
99
  end
100
100
 
101
+ describe "when index is provided" do
102
+
103
+ before do
104
+ @output_buffer = ''
105
+ mock_everything
106
+
107
+ concat(semantic_form_for(@new_post) do |builder|
108
+ concat(builder.fields_for(:author, :index => 3) do |author|
109
+ concat(author.input(:name, :as => :hidden))
110
+ end)
111
+ end)
112
+ end
113
+
114
+ it 'should index the id of the wrapper' do
115
+ output_buffer.should have_tag("li#post_author_attributes_3_name_input")
116
+ end
117
+
118
+ it 'should index the id of the select tag' do
119
+ output_buffer.should have_tag("input#post_author_attributes_3_name")
120
+ end
121
+
122
+ it 'should index the name of the select tag' do
123
+ output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
124
+ end
125
+
126
+ end
127
+
128
+
101
129
  context "when required" do
102
130
  it "should not add the required attribute to the input's html options" do
103
131
  concat(semantic_form_for(@new_post) do |builder|
@@ -11,59 +11,67 @@ describe "*select: options[:include_blank]" do
11
11
 
12
12
  @new_post.stub!(:author_id).and_return(nil)
13
13
  @new_post.stub!(:publish_at).and_return(nil)
14
-
15
- @select_input_types = {
16
- :select => :author,
17
- :datetime => :publish_at,
18
- :date => :publish_at,
19
- :time => :publish_at
20
- }
21
14
  end
22
15
 
23
- describe 'when :include_blank is not set' do
24
- it 'blank value should be included if the default value specified in config is true' do
25
- Formtastic::FormBuilder.include_blank_for_select_by_default = true
26
- @select_input_types.each do |as, attribute|
27
- concat(semantic_form_for(@new_post) do |builder|
28
- concat(builder.input(attribute, :as => as))
29
- end)
30
- output_buffer.should have_tag("form li select option[@value='']", "")
31
- end
32
- end
16
+ SELECT_INPUT_TYPES = {
17
+ :select => :author,
18
+ :datetime => :publish_at,
19
+ :date => :publish_at,
20
+ :time => :publish_at
21
+ }
22
+
23
+ SELECT_INPUT_TYPES.each do |as, attribute|
24
+ describe "for #{as} input" do
25
+
26
+ describe 'when :include_blank is not set' do
27
+ it 'blank value should be included if the default value specified in config is true' do
28
+ Formtastic::FormBuilder.include_blank_for_select_by_default = true
29
+ concat(semantic_form_for(@new_post) do |builder|
30
+ concat(builder.input(attribute, :as => as))
31
+ end)
32
+ output_buffer.should have_tag("form li select option[@value='']", "")
33
+ end
34
+
35
+ it 'blank value should not be included if the default value specified in config is false' do
36
+ Formtastic::FormBuilder.include_blank_for_select_by_default = false
37
+ concat(semantic_form_for(@new_post) do |builder|
38
+ concat(builder.input(attribute, :as => as))
39
+ end)
40
+ output_buffer.should_not have_tag("form li select option[@value='']", "")
41
+ end
33
42
 
34
- it 'blank value should not be included if the default value specified in config is false' do
35
- Formtastic::FormBuilder.include_blank_for_select_by_default = false
36
- @select_input_types.each do |as, attribute|
37
- concat(semantic_form_for(@new_post) do |builder|
38
- concat(builder.input(attribute, :as => as))
39
- end)
40
- output_buffer.should_not have_tag("form li select option[@value='']", "")
43
+ after do
44
+ Formtastic::FormBuilder.include_blank_for_select_by_default = true
45
+ end
41
46
  end
42
- end
43
47
 
44
- after do
45
- Formtastic::FormBuilder.include_blank_for_select_by_default = true
46
- end
47
- end
48
+ describe 'when :include_blank is set to false' do
49
+ it 'should not have a blank option' do
50
+ concat(semantic_form_for(@new_post) do |builder|
51
+ concat(builder.input(attribute, :as => as, :include_blank => false))
52
+ end)
53
+ output_buffer.should_not have_tag("form li select option[@value='']", "")
54
+ end
55
+ end
48
56
 
49
- describe 'when :include_blank is set to false' do
50
- it 'should not have a blank option' do
51
- @select_input_types.each do |as, attribute|
52
- concat(semantic_form_for(@new_post) do |builder|
53
- concat(builder.input(attribute, :as => as, :include_blank => false))
54
- end)
55
- output_buffer.should_not have_tag("form li select option[@value='']", "")
57
+ describe 'when :include_blank is set to true' do
58
+ it 'should have a blank select option' do
59
+ concat(semantic_form_for(@new_post) do |builder|
60
+ concat(builder.input(attribute, :as => as, :include_blank => true))
61
+ end)
62
+ output_buffer.should have_tag("form li select option[@value='']", "")
63
+ end
56
64
  end
57
- end
58
- end
59
65
 
60
- describe 'when :include_blank => true is set' do
61
- it 'should have a blank select option' do
62
- @select_input_types.each do |as, attribute|
63
- concat(semantic_form_for(@new_post) do |builder|
64
- concat(builder.input(attribute, :as => as, :include_blank => true))
65
- end)
66
- output_buffer.should have_tag("form li select option[@value='']", "")
66
+ if as == :select
67
+ describe 'when :include_blank is set to a string' do
68
+ it 'should have a select option with blank value but that string as text' do
69
+ concat(semantic_form_for(@new_post) do |builder|
70
+ concat(builder.input(attribute, :as => as, :include_blank => 'string'))
71
+ end)
72
+ output_buffer.should have_tag("form li select option[@value='']", "string")
73
+ end
74
+ end
67
75
  end
68
76
  end
69
77
  end