formtastic 3.1.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/test.yml +61 -0
  4. data/.gitignore +3 -2
  5. data/CHANGELOG.md +52 -0
  6. data/Gemfile.lock +105 -0
  7. data/MIT-LICENSE +1 -1
  8. data/{README.textile → README.md} +178 -167
  9. data/RELEASE_PROCESS +3 -1
  10. data/Rakefile +20 -1
  11. data/app/assets/stylesheets/formtastic.css +1 -1
  12. data/bin/appraisal +8 -0
  13. data/formtastic.gemspec +10 -16
  14. data/gemfiles/rails_5.2/Gemfile +5 -0
  15. data/gemfiles/rails_6.0/Gemfile +5 -0
  16. data/gemfiles/rails_6.1/Gemfile +5 -0
  17. data/gemfiles/rails_edge/Gemfile +13 -0
  18. data/lib/formtastic.rb +9 -11
  19. data/lib/formtastic/actions.rb +6 -3
  20. data/lib/formtastic/deprecation.rb +1 -38
  21. data/lib/formtastic/engine.rb +3 -1
  22. data/lib/formtastic/form_builder.rb +11 -24
  23. data/lib/formtastic/helpers.rb +1 -1
  24. data/lib/formtastic/helpers/action_helper.rb +1 -48
  25. data/lib/formtastic/helpers/enum.rb +13 -0
  26. data/lib/formtastic/helpers/errors_helper.rb +2 -2
  27. data/lib/formtastic/helpers/fieldset_wrapper.rb +13 -9
  28. data/lib/formtastic/helpers/form_helper.rb +1 -1
  29. data/lib/formtastic/helpers/input_helper.rb +23 -77
  30. data/lib/formtastic/helpers/inputs_helper.rb +27 -22
  31. data/lib/formtastic/i18n.rb +1 -1
  32. data/lib/formtastic/inputs.rb +32 -29
  33. data/lib/formtastic/inputs/base/choices.rb +1 -1
  34. data/lib/formtastic/inputs/base/collections.rb +43 -10
  35. data/lib/formtastic/inputs/base/database.rb +7 -2
  36. data/lib/formtastic/inputs/base/errors.rb +4 -4
  37. data/lib/formtastic/inputs/base/hints.rb +1 -1
  38. data/lib/formtastic/inputs/base/html.rb +7 -6
  39. data/lib/formtastic/inputs/base/naming.rb +4 -4
  40. data/lib/formtastic/inputs/base/options.rb +2 -3
  41. data/lib/formtastic/inputs/base/timeish.rb +5 -1
  42. data/lib/formtastic/inputs/base/validations.rb +38 -12
  43. data/lib/formtastic/inputs/check_boxes_input.rb +13 -5
  44. data/lib/formtastic/inputs/color_input.rb +0 -1
  45. data/lib/formtastic/inputs/country_input.rb +3 -1
  46. data/lib/formtastic/inputs/radio_input.rb +20 -0
  47. data/lib/formtastic/inputs/select_input.rb +29 -1
  48. data/lib/formtastic/inputs/time_zone_input.rb +16 -6
  49. data/lib/formtastic/localizer.rb +20 -22
  50. data/lib/formtastic/namespaced_class_finder.rb +1 -1
  51. data/lib/formtastic/version.rb +1 -1
  52. data/lib/generators/formtastic/form/form_generator.rb +1 -1
  53. data/lib/generators/formtastic/input/input_generator.rb +46 -0
  54. data/lib/generators/templates/formtastic.rb +14 -13
  55. data/lib/generators/templates/input.rb +19 -0
  56. data/sample/basic_inputs.html +1 -1
  57. data/script/integration-template.rb +74 -0
  58. data/script/integration.sh +19 -0
  59. data/spec/action_class_finder_spec.rb +1 -1
  60. data/spec/actions/button_action_spec.rb +8 -8
  61. data/spec/actions/generic_action_spec.rb +60 -60
  62. data/spec/actions/input_action_spec.rb +7 -7
  63. data/spec/actions/link_action_spec.rb +10 -10
  64. data/spec/builder/custom_builder_spec.rb +37 -21
  65. data/spec/builder/error_proc_spec.rb +4 -4
  66. data/spec/builder/semantic_fields_for_spec.rb +27 -27
  67. data/spec/fast_spec_helper.rb +12 -0
  68. data/spec/generators/formtastic/form/form_generator_spec.rb +25 -25
  69. data/spec/generators/formtastic/input/input_generator_spec.rb +124 -0
  70. data/spec/generators/formtastic/install/install_generator_spec.rb +9 -9
  71. data/spec/helpers/action_helper_spec.rb +328 -10
  72. data/spec/helpers/actions_helper_spec.rb +17 -17
  73. data/spec/helpers/form_helper_spec.rb +37 -37
  74. data/spec/helpers/input_helper_spec.rb +975 -2
  75. data/spec/helpers/inputs_helper_spec.rb +120 -105
  76. data/spec/helpers/reflection_helper_spec.rb +3 -3
  77. data/spec/helpers/semantic_errors_helper_spec.rb +22 -22
  78. data/spec/i18n_spec.rb +26 -26
  79. data/spec/input_class_finder_spec.rb +1 -1
  80. data/spec/inputs/base/collections_spec.rb +76 -0
  81. data/spec/inputs/base/validations_spec.rb +480 -0
  82. data/spec/inputs/boolean_input_spec.rb +55 -55
  83. data/spec/inputs/check_boxes_input_spec.rb +155 -108
  84. data/spec/inputs/color_input_spec.rb +51 -63
  85. data/spec/inputs/country_input_spec.rb +20 -20
  86. data/spec/inputs/custom_input_spec.rb +2 -6
  87. data/spec/inputs/datalist_input_spec.rb +1 -1
  88. data/spec/inputs/date_picker_input_spec.rb +42 -42
  89. data/spec/inputs/date_select_input_spec.rb +51 -37
  90. data/spec/inputs/datetime_picker_input_spec.rb +46 -46
  91. data/spec/inputs/datetime_select_input_spec.rb +53 -37
  92. data/spec/inputs/email_input_spec.rb +5 -5
  93. data/spec/inputs/file_input_spec.rb +6 -6
  94. data/spec/inputs/hidden_input_spec.rb +18 -18
  95. data/spec/inputs/include_blank_spec.rb +8 -8
  96. data/spec/inputs/label_spec.rb +20 -20
  97. data/spec/inputs/number_input_spec.rb +112 -112
  98. data/spec/inputs/password_input_spec.rb +5 -5
  99. data/spec/inputs/phone_input_spec.rb +5 -5
  100. data/spec/inputs/placeholder_spec.rb +5 -5
  101. data/spec/inputs/radio_input_spec.rb +84 -58
  102. data/spec/inputs/range_input_spec.rb +66 -66
  103. data/spec/inputs/readonly_spec.rb +50 -0
  104. data/spec/inputs/search_input_spec.rb +5 -5
  105. data/spec/inputs/select_input_spec.rb +149 -93
  106. data/spec/inputs/string_input_spec.rb +23 -23
  107. data/spec/inputs/text_input_spec.rb +16 -16
  108. data/spec/inputs/time_picker_input_spec.rb +43 -43
  109. data/spec/inputs/time_select_input_spec.rb +67 -54
  110. data/spec/inputs/time_zone_input_spec.rb +54 -28
  111. data/spec/inputs/url_input_spec.rb +5 -5
  112. data/spec/inputs/with_options_spec.rb +7 -7
  113. data/spec/localizer_spec.rb +17 -17
  114. data/spec/namespaced_class_finder_spec.rb +2 -2
  115. data/spec/schema.rb +21 -0
  116. data/spec/spec_helper.rb +165 -253
  117. data/spec/support/custom_macros.rb +72 -75
  118. data/spec/support/shared_examples.rb +0 -1232
  119. data/spec/support/test_environment.rb +23 -9
  120. metadata +69 -176
  121. data/.travis.yml +0 -29
  122. data/Appraisals +0 -29
  123. data/CHANGELOG +0 -31
  124. data/DEPRECATIONS +0 -49
  125. data/gemfiles/rails_3.2.gemfile +0 -7
  126. data/gemfiles/rails_4.0.4.gemfile +0 -7
  127. data/gemfiles/rails_4.1.gemfile +0 -7
  128. data/gemfiles/rails_4.2.gemfile +0 -7
  129. data/gemfiles/rails_4.gemfile +0 -7
  130. data/gemfiles/rails_edge.gemfile +0 -10
  131. data/lib/formtastic/util.rb +0 -57
  132. data/spec/helpers/namespaced_action_helper_spec.rb +0 -43
  133. data/spec/helpers/namespaced_input_helper_spec.rb +0 -36
  134. data/spec/support/deferred_garbage_collection.rb +0 -21
  135. data/spec/util_spec.rb +0 -66
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe 'readonly option' do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ''
10
+ mock_everything
11
+ end
12
+
13
+ describe "placeholder text" do
14
+ [:email, :number, :password, :phone, :search, :string, :url, :text, :date_picker, :time_picker, :datetime_picker].each do |type|
15
+
16
+ describe "for #{type} inputs" do
17
+
18
+ describe "when readonly is found in input_html" do
19
+ it "sets readonly attribute" do
20
+ concat(semantic_form_for(@new_post) do |builder|
21
+ concat(builder.input(:title, :as => type, input_html: {readonly: true}))
22
+ end)
23
+ expect(output_buffer).to have_tag((type == :text ? 'textarea' : 'input') + '[@readonly]')
24
+ end
25
+ end
26
+
27
+ describe "when readonly not found in input_html" do
28
+ describe "when column is not readonly attribute" do
29
+ it "doesn't set readonly attribute" do
30
+ concat(semantic_form_for(@new_post) do |builder|
31
+ concat(builder.input(:title, :as => type))
32
+ end)
33
+ expect(output_buffer).not_to have_tag((type == :text ? 'textarea' : 'input') + '[@readonly]')
34
+ end
35
+ end
36
+ describe "when column is readonly attribute" do
37
+ it "sets readonly attribute" do
38
+ input_class = "Formtastic::Inputs::#{type.to_s.camelize}Input".constantize
39
+ expect_any_instance_of(input_class).to receive(:readonly_attribute?).at_least(1).and_return(true)
40
+ concat(semantic_form_for(@new_post) do |builder|
41
+ concat(builder.input(:title, :as => type))
42
+ end)
43
+ expect(output_buffer).to have_tag((type == :text ? 'textarea' : 'input') + '[@readonly]')
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe 'search input' do
4
+ RSpec.describe 'search input' do
5
5
 
6
6
  include FormtasticSpecHelper
7
7
 
@@ -56,15 +56,15 @@ describe 'search input' do
56
56
  end
57
57
 
58
58
  it 'should index the id of the wrapper' do
59
- output_buffer.should have_tag("li#post_author_attributes_3_name_input")
59
+ expect(output_buffer).to have_tag("li#post_author_attributes_3_name_input")
60
60
  end
61
61
 
62
62
  it 'should index the id of the select tag' do
63
- output_buffer.should have_tag("input#post_author_attributes_3_name")
63
+ expect(output_buffer).to have_tag("input#post_author_attributes_3_name")
64
64
  end
65
65
 
66
66
  it 'should index the name of the select tag' do
67
- output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
67
+ expect(output_buffer).to have_tag("input[@name='post[author_attributes][3][name]']")
68
68
  end
69
69
 
70
70
  end
@@ -75,7 +75,7 @@ describe 'search input' do
75
75
  concat(semantic_form_for(@new_post) do |builder|
76
76
  concat(builder.input(:title, :as => :search, :required => true))
77
77
  end)
78
- output_buffer.should have_tag("input[@required]")
78
+ expect(output_buffer).to have_tag("input[@required]")
79
79
  end
80
80
  end
81
81
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe 'select input' do
4
+ RSpec.describe 'select input' do
5
5
 
6
6
  include FormtasticSpecHelper
7
7
 
@@ -23,10 +23,10 @@ describe 'select input' do
23
23
 
24
24
  it 'should have a option for each key and/or value' do
25
25
  @array_with_values.each do |v|
26
- output_buffer.should have_tag("form li select option[@value='#{v}']", /^#{v}$/)
26
+ expect(output_buffer).to have_tag("form li select option[@value='#{v}']", :text => /^#{v}$/)
27
27
  end
28
28
  @array_with_keys_and_values.each do |v|
29
- output_buffer.should have_tag("form li select option[@value='#{v.second}']", /^#{v.first}$/)
29
+ expect(output_buffer).to have_tag("form li select option[@value='#{v.second}']", :text => /^#{v.first}$/)
30
30
  end
31
31
  end
32
32
  end
@@ -43,26 +43,26 @@ describe 'select input' do
43
43
 
44
44
  it 'should have a option for each key and/or value' do
45
45
  @set_with_values.each do |v|
46
- output_buffer.should have_tag("form li select option[@value='#{v}']", /^#{v}$/)
46
+ expect(output_buffer).to have_tag("form li select option[@value='#{v}']", :text => /^#{v}$/)
47
47
  end
48
48
  @set_with_keys_and_values.each do |v|
49
- output_buffer.should have_tag("form li select option[@value='#{v.second}']", /^#{v.first}$/)
49
+ expect(output_buffer).to have_tag("form li select option[@value='#{v.second}']", :text => /^#{v.first}$/)
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
54
  describe "using a related model without reflection's options (Mongoid Document)" do
55
55
  before do
56
- @new_post.stub(:mongoid_reviewer)
56
+ allow(@new_post).to receive(:mongoid_reviewer)
57
57
  concat(semantic_form_for(@new_post) do |builder|
58
58
  concat(builder.input(:mongoid_reviewer, :as => :select))
59
59
  end)
60
60
  end
61
61
 
62
62
  it 'should draw select options' do
63
- output_buffer.should have_tag('form li select')
64
- output_buffer.should have_tag('form li select#post_reviewer_id')
65
- output_buffer.should_not have_tag('form li select#post_mongoid_reviewer_id')
63
+ expect(output_buffer).to have_tag('form li select')
64
+ expect(output_buffer).to have_tag('form li select#post_reviewer_id')
65
+ expect(output_buffer).not_to have_tag('form li select#post_mongoid_reviewer_id')
66
66
  end
67
67
  end
68
68
 
@@ -76,7 +76,7 @@ describe 'select input' do
76
76
 
77
77
  it 'should have an option for each value' do
78
78
  @range_with_values.each do |v|
79
- output_buffer.should have_tag("form li select option[@value='#{v}']", /^#{v}$/)
79
+ expect(output_buffer).to have_tag("form li select option[@value='#{v}']", :text => /^#{v}$/)
80
80
  end
81
81
  end
82
82
  end
@@ -91,7 +91,7 @@ describe 'select input' do
91
91
 
92
92
  it 'should render select options using provided HTML string' do
93
93
  2.times do |v|
94
- output_buffer.should have_tag("form li select option[@value='#{v}']", /^#{v}$/)
94
+ expect(output_buffer).to have_tag("form li select option[@value='#{v}']", :text => /^#{v}$/)
95
95
  end
96
96
  end
97
97
  end
@@ -125,8 +125,8 @@ describe 'select input' do
125
125
  end
126
126
 
127
127
  it 'should render a select with at least options: true/false' do
128
- output_buffer.should have_tag("form li select option[@value='true']", /^Yes$/)
129
- output_buffer.should have_tag("form li select option[@value='false']", /^No$/)
128
+ expect(output_buffer).to have_tag("form li select option[@value='true']", :text => /^Yes$/)
129
+ expect(output_buffer).to have_tag("form li select option[@value='false']", :text => /^No$/)
130
130
  end
131
131
  end
132
132
 
@@ -145,8 +145,79 @@ describe 'select input' do
145
145
  end
146
146
 
147
147
  it 'should render a select with at least options: true/false' do
148
- output_buffer.should have_tag("form li select option[@value='true']", /#{@boolean_select_labels[:yes]}/)
149
- output_buffer.should have_tag("form li select option[@value='false']", /#{@boolean_select_labels[:no]}/)
148
+ expect(output_buffer).to have_tag("form li select option[@value='true']", :text => /#{@boolean_select_labels[:yes]}/)
149
+ expect(output_buffer).to have_tag("form li select option[@value='false']", :text => /#{@boolean_select_labels[:no]}/)
150
+ end
151
+ end
152
+ end
153
+
154
+ describe 'for a enum column' do
155
+ before do
156
+ allow(@new_post).to receive(:status) { 'inactive' }
157
+ statuses = ActiveSupport::HashWithIndifferentAccess.new("active"=>0, "inactive"=>1)
158
+ allow(@new_post.class).to receive(:statuses) { statuses }
159
+ allow(@new_post).to receive(:defined_enums) { { "status" => statuses } }
160
+ end
161
+
162
+ context 'single choice' do
163
+ before do
164
+ concat(semantic_form_for(@new_post) do |builder|
165
+ concat(builder.input(:status, :as => :select))
166
+ end)
167
+ end
168
+
169
+ it_should_have_input_wrapper_with_class("select")
170
+ it_should_have_input_wrapper_with_class(:input)
171
+ it_should_have_input_wrapper_with_id("post_status_input")
172
+ it_should_have_label_with_text(/Status/)
173
+ it_should_have_label_for('post_status')
174
+ it_should_apply_error_logic_for_input_type(:select)
175
+
176
+ it 'should have a select inside the wrapper' do
177
+ expect(output_buffer).to have_tag('form li select')
178
+ expect(output_buffer).to have_tag('form li select#post_status')
179
+ end
180
+
181
+ it 'should have a valid name' do
182
+ expect(output_buffer).to have_tag("form li select[@name='post[status]']")
183
+ expect(output_buffer).not_to have_tag("form li select[@name='post[status][]']")
184
+ end
185
+
186
+ it 'should not create a multi-select' do
187
+ expect(output_buffer).not_to have_tag('form li select[@multiple]')
188
+ end
189
+
190
+ it 'should not add a hidden input' do
191
+ expect(output_buffer).not_to have_tag('form li input[@type="hidden"]')
192
+ end
193
+
194
+ it 'should create a select without size' do
195
+ expect(output_buffer).not_to have_tag('form li select[@size]')
196
+ end
197
+
198
+ it 'should have a blank option' do
199
+ expect(output_buffer).to have_tag("form li select option[@value='']")
200
+ end
201
+
202
+ it 'should have a select option for each defined enum status' do
203
+ expect(output_buffer).to have_tag("form li select[@name='post[status]'] option", :count => @new_post.class.statuses.count + 1)
204
+ @new_post.class.statuses.each do |label, value|
205
+ expect(output_buffer).to have_tag("form li select option[@value='#{label}']", :text => /#{label.humanize}/)
206
+ end
207
+ end
208
+
209
+ it 'should have one option with a "selected" attribute (TODO)' do
210
+ expect(output_buffer).to have_tag("form li select[@name='post[status]'] option[@selected]", :count => 1)
211
+ end
212
+ end
213
+
214
+ context 'multiple choice' do
215
+ it 'raises an error' do
216
+ expect {
217
+ concat(semantic_form_for(@new_post) do |builder|
218
+ concat(builder.input(:status, :as => :select, :multiple => true))
219
+ end)
220
+ }.to raise_error Formtastic::UnsupportedEnumCollection
150
221
  end
151
222
  end
152
223
  end
@@ -169,88 +240,73 @@ describe 'select input' do
169
240
  it_should_use_the_collection_when_provided(:select, 'option')
170
241
 
171
242
  it 'should have a select inside the wrapper' do
172
- output_buffer.should have_tag('form li select')
173
- output_buffer.should have_tag('form li select#post_author_id')
174
- output_buffer.should have_tag('form li select#post_reviewer_id')
243
+ expect(output_buffer).to have_tag('form li select')
244
+ expect(output_buffer).to have_tag('form li select#post_author_id')
245
+ expect(output_buffer).to have_tag('form li select#post_reviewer_id')
175
246
  end
176
247
 
177
248
  it 'should have a valid name' do
178
- output_buffer.should have_tag("form li select[@name='post[author_id]']")
179
- output_buffer.should_not have_tag("form li select[@name='post[author_id][]']")
180
- output_buffer.should_not have_tag("form li select[@name='post[reviewer_id][]']")
249
+ expect(output_buffer).to have_tag("form li select[@name='post[author_id]']")
250
+ expect(output_buffer).not_to have_tag("form li select[@name='post[author_id][]']")
251
+ expect(output_buffer).not_to have_tag("form li select[@name='post[reviewer_id][]']")
181
252
  end
182
253
 
183
254
  it 'should not create a multi-select' do
184
- output_buffer.should_not have_tag('form li select[@multiple]')
255
+ expect(output_buffer).not_to have_tag('form li select[@multiple]')
185
256
  end
186
257
 
187
258
  it 'should not add a hidden input' do
188
- output_buffer.should_not have_tag('form li input[@type="hidden"]')
259
+ expect(output_buffer).not_to have_tag('form li input[@type="hidden"]')
189
260
  end
190
261
 
191
262
  it 'should create a select without size' do
192
- output_buffer.should_not have_tag('form li select[@size]')
263
+ expect(output_buffer).not_to have_tag('form li select[@size]')
193
264
  end
194
265
 
195
266
  it 'should have a blank option' do
196
- output_buffer.should have_tag("form li select option[@value='']")
267
+ expect(output_buffer).to have_tag("form li select option[@value='']")
197
268
  end
198
269
 
199
270
  it 'should have a select option for each Author' do
200
- output_buffer.should have_tag("form li select[@name='post[author_id]'] option", :count => ::Author.all.size + 1)
271
+ expect(output_buffer).to have_tag("form li select[@name='post[author_id]'] option", :count => ::Author.all.size + 1)
201
272
  ::Author.all.each do |author|
202
- output_buffer.should have_tag("form li select option[@value='#{author.id}']", /#{author.to_label}/)
273
+ expect(output_buffer).to have_tag("form li select option[@value='#{author.id}']", :text => /#{author.to_label}/)
203
274
  end
204
275
  end
205
276
 
206
277
  it 'should have one option with a "selected" attribute (bob)' do
207
- output_buffer.should have_tag("form li select[@name='post[author_id]'] option[@selected]", :count => 1)
278
+ expect(output_buffer).to have_tag("form li select[@name='post[author_id]'] option[@selected]", :count => 1)
208
279
  end
209
280
 
210
281
  it 'should not singularize the association name' do
211
- @new_post.stub(:author_status).and_return(@bob)
212
- @new_post.stub(:author_status_id).and_return(@bob.id)
213
- @new_post.stub(:column_for_attribute).and_return(double('column', :type => :integer, :limit => 255))
282
+ allow(@new_post).to receive(:author_status).and_return(@bob)
283
+ allow(@new_post).to receive(:author_status_id).and_return(@bob.id)
284
+ allow(@new_post).to receive(:column_for_attribute).and_return(double('column', :type => :integer, :limit => 255))
214
285
 
215
286
  concat(semantic_form_for(@new_post) do |builder|
216
287
  concat(builder.input(:author_status, :as => :select))
217
288
  end)
218
289
 
219
- output_buffer.should have_tag('form li select#post_author_status_id')
290
+ expect(output_buffer).to have_tag('form li select#post_author_status_id')
220
291
  end
221
292
  end
222
293
 
223
294
  describe "for a belongs_to association with :conditions" do
224
295
  before do
225
- ::Post.stub(:reflect_on_association).with(:author) do
296
+ allow(::Post).to receive(:reflect_on_association).with(:author) do
226
297
  mock = double('reflection', :options => {:conditions => {:active => true}}, :klass => ::Author, :macro => :belongs_to)
227
- mock.stub(:[]).with(:class_name).and_return("Author")
298
+ allow(mock).to receive(:[]).with(:class_name).and_return("Author")
228
299
  mock
229
300
  end
230
301
  end
231
302
 
232
303
  it "should call author.(scoped|where) with association conditions" do
233
- if Formtastic::Util.rails3?
234
- ::Author.should_receive(:scoped).with(:conditions => {:active => true})
235
- else
236
- ::Author.should_receive(:where).with({:active => true})
237
- end
304
+ expect(::Author).to receive(:where).with({:active => true})
238
305
 
239
306
  semantic_form_for(@new_post) do |builder|
240
307
  concat(builder.input(:author, :as => :select))
241
308
  end
242
309
  end
243
-
244
- it "should call author.(scoped|where) with association conditions" do
245
- if Formtastic::Util.rails3?
246
- ::Author.should_receive(:scoped).with(:conditions => {:active => true})
247
- else
248
- ::Author.should_receive(:where).with({:active => true})
249
- end
250
- semantic_form_for(@new_post) do |builder|
251
- concat(builder.input(:author, :as => :select))
252
- end
253
- end
254
310
  end
255
311
 
256
312
  describe 'for a has_many association' do
@@ -269,31 +325,31 @@ describe 'select input' do
269
325
  it_should_use_the_collection_when_provided(:select, 'option')
270
326
 
271
327
  it 'should have a select inside the wrapper' do
272
- output_buffer.should have_tag('form li select')
273
- output_buffer.should have_tag('form li select#author_post_ids')
328
+ expect(output_buffer).to have_tag('form li select')
329
+ expect(output_buffer).to have_tag('form li select#author_post_ids')
274
330
  end
275
331
 
276
332
  it 'should have a multi-select select' do
277
- output_buffer.should have_tag('form li select[@multiple="multiple"]')
333
+ expect(output_buffer).to have_tag('form li select[@multiple="multiple"]')
278
334
  end
279
335
 
280
336
  it 'should append [] to the name attribute for multiple select' do
281
- output_buffer.should have_tag('form li select[@multiple="multiple"][@name="author[post_ids][]"]')
337
+ expect(output_buffer).to have_tag('form li select[@multiple="multiple"][@name="author[post_ids][]"]')
282
338
  end
283
339
 
284
340
  it 'should have a hidden field' do
285
- output_buffer.should have_tag('form li input[@type="hidden"][@name="author[post_ids][]"]', :count => 1)
341
+ expect(output_buffer).to have_tag('form li input[@type="hidden"][@name="author[post_ids][]"]', :count => 1)
286
342
  end
287
343
 
288
344
  it 'should have a select option for each Post' do
289
- output_buffer.should have_tag('form li select option', :count => ::Post.all.size)
345
+ expect(output_buffer).to have_tag('form li select option', :count => ::Post.all.size)
290
346
  ::Post.all.each do |post|
291
- output_buffer.should have_tag("form li select option[@value='#{post.id}']", /#{post.to_label}/)
347
+ expect(output_buffer).to have_tag("form li select option[@value='#{post.id}']", :text => /#{post.to_label}/)
292
348
  end
293
349
  end
294
350
 
295
351
  it 'should not have a blank option by default' do
296
- output_buffer.should_not have_tag("form li select option[@value='']")
352
+ expect(output_buffer).not_to have_tag("form li select option[@value='']")
297
353
  end
298
354
 
299
355
  it 'should respect the :include_blank option for single selects' do
@@ -301,7 +357,7 @@ describe 'select input' do
301
357
  concat(builder.input(:posts, :as => :select, :multiple => false, :include_blank => true))
302
358
  end)
303
359
 
304
- output_buffer.should have_tag("form li select option[@value='']")
360
+ expect(output_buffer).to have_tag("form li select option[@value='']")
305
361
  end
306
362
 
307
363
  it 'should respect the :include_blank option for multiple selects' do
@@ -309,11 +365,11 @@ describe 'select input' do
309
365
  concat(builder.input(:posts, :as => :select, :multiple => true, :include_blank => true))
310
366
  end)
311
367
 
312
- output_buffer.should have_tag("form li select option[@value='']")
368
+ expect(output_buffer).to have_tag("form li select option[@value='']")
313
369
  end
314
370
 
315
371
  it 'should have one option with a "selected" attribute' do
316
- output_buffer.should have_tag('form li select option[@selected]', :count => 1)
372
+ expect(output_buffer).to have_tag('form li select option[@selected]', :count => 1)
317
373
  end
318
374
  end
319
375
 
@@ -333,23 +389,23 @@ describe 'select input' do
333
389
  it_should_use_the_collection_when_provided(:select, 'option')
334
390
 
335
391
  it 'should have a select inside the wrapper' do
336
- output_buffer.should have_tag('form li select')
337
- output_buffer.should have_tag('form li select#post_author_ids')
392
+ expect(output_buffer).to have_tag('form li select')
393
+ expect(output_buffer).to have_tag('form li select#post_author_ids')
338
394
  end
339
395
 
340
396
  it 'should have a multi-select select' do
341
- output_buffer.should have_tag('form li select[@multiple="multiple"]')
397
+ expect(output_buffer).to have_tag('form li select[@multiple="multiple"]')
342
398
  end
343
399
 
344
400
  it 'should have a select option for each Author' do
345
- output_buffer.should have_tag('form li select option', :count => ::Author.all.size)
401
+ expect(output_buffer).to have_tag('form li select option', :count => ::Author.all.size)
346
402
  ::Author.all.each do |author|
347
- output_buffer.should have_tag("form li select option[@value='#{author.id}']", /#{author.to_label}/)
403
+ expect(output_buffer).to have_tag("form li select option[@value='#{author.id}']", :text => /#{author.to_label}/)
348
404
  end
349
405
  end
350
406
 
351
407
  it 'should not have a blank option by default' do
352
- output_buffer.should_not have_tag("form li select option[@value='']")
408
+ expect(output_buffer).not_to have_tag("form li select option[@value='']")
353
409
  end
354
410
 
355
411
  it 'should respect the :include_blank option for single selects' do
@@ -357,7 +413,7 @@ describe 'select input' do
357
413
  concat(builder.input(:authors, :as => :select, :multiple => false, :include_blank => true))
358
414
  end)
359
415
 
360
- output_buffer.should have_tag("form li select option[@value='']")
416
+ expect(output_buffer).to have_tag("form li select option[@value='']")
361
417
  end
362
418
 
363
419
  it 'should respect the :include_blank option for multiple selects' do
@@ -365,51 +421,51 @@ describe 'select input' do
365
421
  concat(builder.input(:authors, :as => :select, :multiple => true, :include_blank => true))
366
422
  end)
367
423
 
368
- output_buffer.should have_tag("form li select option[@value='']")
424
+ expect(output_buffer).to have_tag("form li select option[@value='']")
369
425
  end
370
426
 
371
427
  it 'should have one option with a "selected" attribute' do
372
- output_buffer.should have_tag('form li select option[@selected]', :count => 1)
428
+ expect(output_buffer).to have_tag('form li select option[@selected]', :count => 1)
373
429
  end
374
430
  end
375
431
 
376
432
  describe 'when :prompt => "choose something" is set' do
377
433
  before do
378
- @new_post.stub(:author_id).and_return(nil)
434
+ allow(@new_post).to receive(:author_id).and_return(nil)
379
435
  concat(semantic_form_for(@new_post) do |builder|
380
436
  concat(builder.input(:author, :as => :select, :prompt => "choose author"))
381
437
  end)
382
438
  end
383
439
 
384
440
  it 'should have a select with prompt' do
385
- output_buffer.should have_tag("form li select option[@value='']", /choose author/, :count => 1)
441
+ expect(output_buffer).to have_tag("form li select option[@value='']", :text => /choose author/, :count => 1)
386
442
  end
387
443
 
388
444
  it 'should not have a second blank select option' do
389
- output_buffer.should have_tag("form li select option[@value='']", :count => 1)
445
+ expect(output_buffer).to have_tag("form li select option[@value='']", :count => 1)
390
446
  end
391
447
  end
392
448
 
393
449
  describe 'when no object is given' do
394
- before(:each) do
450
+ before(:example) do
395
451
  concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
396
452
  concat(builder.input(:author, :as => :select, :collection => ::Author.all))
397
453
  end)
398
454
  end
399
455
 
400
456
  it 'should generate label' do
401
- output_buffer.should have_tag('form li label', /Author/)
402
- output_buffer.should have_tag("form li label[@for='project_author']")
457
+ expect(output_buffer).to have_tag('form li label', :text => /Author/)
458
+ expect(output_buffer).to have_tag("form li label[@for='project_author']")
403
459
  end
404
460
 
405
461
  it 'should generate select inputs' do
406
- output_buffer.should have_tag('form li select#project_author')
407
- output_buffer.should have_tag('form li select option', :count => ::Author.all.size + 1)
462
+ expect(output_buffer).to have_tag('form li select#project_author')
463
+ expect(output_buffer).to have_tag('form li select option', :count => ::Author.all.size + 1)
408
464
  end
409
465
 
410
466
  it 'should generate an option to each item' do
411
467
  ::Author.all.each do |author|
412
- output_buffer.should have_tag("form li select option[@value='#{author.id}']", /#{author.to_label}/)
468
+ expect(output_buffer).to have_tag("form li select option[@value='#{author.id}']", :text => /#{author.to_label}/)
413
469
  end
414
470
  end
415
471
  end
@@ -420,7 +476,7 @@ describe 'select input' do
420
476
  concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
421
477
  concat(builder.input(:author_name, :as => :select, :collection => ::Author.all))
422
478
  end)
423
- output_buffer.should have_tag("form li select[@name='project[author_name]']")
479
+ expect(output_buffer).to have_tag("form li select[@name='project[author_name]']")
424
480
  end
425
481
 
426
482
  describe 'and :multiple is set to true through :input_html' do
@@ -428,7 +484,7 @@ describe 'select input' do
428
484
  concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
429
485
  concat(builder.input(:author_name, :as => :select, :input_html => {:multiple => true} ))
430
486
  end)
431
- output_buffer.should have_tag("form li select[@multiple]")
487
+ expect(output_buffer).to have_tag("form li select[@multiple]")
432
488
  end
433
489
  end
434
490
 
@@ -437,14 +493,14 @@ describe 'select input' do
437
493
  concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
438
494
  concat(builder.input(:author_name, :as => :select, :multiple => true, :collection => ["Fred", "Bob"]))
439
495
  end)
440
- output_buffer.should have_tag("form li select[@multiple]")
496
+ expect(output_buffer).to have_tag("form li select[@multiple]")
441
497
  end
442
498
  end
443
499
 
444
500
  end
445
501
 
446
502
  describe 'when a grouped collection collection is given' do
447
- before(:each) do
503
+ before(:example) do
448
504
  concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
449
505
  @grouped_opts = [['one', ['pencil', 'crayon', 'pen']],
450
506
  ['two', ['eyes', 'hands', 'feet']],
@@ -455,12 +511,12 @@ describe 'select input' do
455
511
 
456
512
  it 'should generate an option to each item' do
457
513
  @grouped_opts.each do |opt_pair|
458
- output_buffer.should have_tag("form li select optgroup[@label='#{opt_pair[0]}']")
514
+ expect(output_buffer).to have_tag("form li select optgroup[@label='#{opt_pair[0]}']")
459
515
  opt_pair[1].each do |v|
460
- output_buffer.should have_tag("form li select optgroup[@label='#{opt_pair[0]}'] option[@value='#{v}']")
516
+ expect(output_buffer).to have_tag("form li select optgroup[@label='#{opt_pair[0]}'] option[@value='#{v}']")
461
517
  end
462
518
  end
463
- output_buffer.should have_tag("form li select optgroup option[@selected]","hands")
519
+ expect(output_buffer).to have_tag("form li select optgroup option[@selected]","hands")
464
520
  end
465
521
  end
466
522
 
@@ -468,7 +524,7 @@ describe 'select input' do
468
524
  before do
469
525
  @output_buffer = ''
470
526
  @some_meta_descriptions = ["One", "Two", "Three"]
471
- @new_post.stub(:meta_description).at_least(:once)
527
+ allow(@new_post).to receive(:meta_description).at_least(:once)
472
528
  end
473
529
 
474
530
  describe ":as is not set" do
@@ -482,7 +538,7 @@ describe 'select input' do
482
538
  end
483
539
 
484
540
  it "should render a select field" do
485
- output_buffer.should have_tag("form li select", :count => 2)
541
+ expect(output_buffer).to have_tag("form li select", :count => 2)
486
542
  end
487
543
  end
488
544
 
@@ -498,7 +554,7 @@ describe 'select input' do
498
554
  end
499
555
 
500
556
  it "should render a text field" do
501
- output_buffer.should have_tag("form li input[@type='text']", :count => 2)
557
+ expect(output_buffer).to have_tag("form li input[@type='text']", :count => 2)
502
558
  end
503
559
  end
504
560
  end
@@ -528,15 +584,15 @@ describe 'select input' do
528
584
  end
529
585
 
530
586
  it 'should index the id of the wrapper' do
531
- output_buffer.should have_tag("li#post_author_attributes_3_name_input")
587
+ expect(output_buffer).to have_tag("li#post_author_attributes_3_name_input")
532
588
  end
533
589
 
534
590
  it 'should index the id of the select tag' do
535
- output_buffer.should have_tag("select#post_author_attributes_3_name")
591
+ expect(output_buffer).to have_tag("select#post_author_attributes_3_name")
536
592
  end
537
593
 
538
594
  it 'should index the name of the select' do
539
- output_buffer.should have_tag("select[@name='post[author_attributes][3][name]']")
595
+ expect(output_buffer).to have_tag("select[@name='post[author_attributes][3][name]']")
540
596
  end
541
597
 
542
598
  end
@@ -547,7 +603,7 @@ describe 'select input' do
547
603
  concat(semantic_form_for(@new_post) do |builder|
548
604
  concat(builder.input(:author, :as => :select, :required => true))
549
605
  end)
550
- output_buffer.should have_tag("select[@required]")
606
+ expect(output_buffer).to have_tag("select[@required]")
551
607
  end
552
608
  end
553
609
  end