formtastic 1.0.1 → 1.1.0.beta
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 +2 -2
- data/Rakefile +33 -8
- data/generators/formtastic/templates/formtastic.css +3 -18
- data/init.rb +5 -0
- data/lib/formtastic.rb +180 -82
- data/lib/formtastic/i18n.rb +8 -9
- data/lib/formtastic/layout_helper.rb +0 -1
- data/lib/formtastic/railtie.rb +12 -0
- data/lib/formtastic/util.rb +7 -0
- data/lib/generators/formtastic/form/form_generator.rb +86 -0
- data/lib/generators/formtastic/install/install_generator.rb +24 -0
- data/rails/init.rb +1 -6
- data/spec/buttons_spec.rb +25 -8
- data/spec/commit_button_spec.rb +67 -29
- data/spec/custom_builder_spec.rb +40 -4
- data/spec/defaults_spec.rb +1 -1
- data/spec/error_proc_spec.rb +1 -1
- data/spec/errors_spec.rb +3 -2
- data/spec/form_helper_spec.rb +33 -17
- data/spec/helpers/layout_helper_spec.rb +21 -0
- data/spec/i18n_spec.rb +13 -9
- data/spec/include_blank_spec.rb +9 -5
- data/spec/input_spec.rb +188 -48
- data/spec/inputs/boolean_input_spec.rb +14 -7
- data/spec/inputs/check_boxes_input_spec.rb +150 -20
- data/spec/inputs/country_input_spec.rb +9 -5
- data/spec/inputs/date_input_spec.rb +21 -9
- data/spec/inputs/datetime_input_spec.rb +33 -14
- data/spec/inputs/file_input_spec.rb +4 -3
- data/spec/inputs/hidden_input_spec.rb +11 -4
- data/spec/inputs/numeric_input_spec.rb +3 -3
- data/spec/inputs/password_input_spec.rb +3 -3
- data/spec/inputs/radio_input_spec.rb +29 -10
- data/spec/inputs/select_input_spec.rb +66 -26
- data/spec/inputs/string_input_spec.rb +5 -4
- data/spec/inputs/text_input_spec.rb +4 -3
- data/spec/inputs/time_input_spec.rb +26 -10
- data/spec/inputs/time_zone_input_spec.rb +11 -5
- data/spec/inputs_spec.rb +103 -39
- data/spec/label_spec.rb +5 -3
- data/spec/semantic_errors_spec.rb +7 -7
- data/spec/semantic_fields_for_spec.rb +5 -4
- data/spec/spec_helper.rb +86 -38
- data/spec/{custom_macros.rb → support/custom_macros.rb} +69 -35
- data/spec/support/output_buffer.rb +4 -0
- data/spec/support/test_environment.rb +45 -0
- metadata +26 -28
- data/spec/layout_helper_spec.rb +0 -29
data/spec/label_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
require
|
2
|
+
require 'spec_helper'
|
3
3
|
|
4
4
|
describe 'SemanticFormBuilder#label' do
|
5
5
|
|
@@ -32,16 +32,18 @@ describe 'SemanticFormBuilder#label' do
|
|
32
32
|
|
33
33
|
describe 'when a collection is given' do
|
34
34
|
it 'should use a supplied label_method for simple collections' do
|
35
|
-
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
35
|
+
form = semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
36
36
|
concat(builder.input(:author_id, :as => :check_boxes, :collection => [:a, :b, :c], :value_method => :to_s, :label_method => proc {|f| ('Label_%s' % [f])}))
|
37
37
|
end
|
38
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
38
39
|
output_buffer.should have_tag('form li fieldset ol li label', :with => /Label_[abc]/, :count => 3)
|
39
40
|
end
|
40
41
|
|
41
42
|
it 'should use a supplied value_method for simple collections' do
|
42
|
-
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
43
|
+
form = semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
43
44
|
concat(builder.input(:author_id, :as => :check_boxes, :collection => [:a, :b, :c], :value_method => proc {|f| ('Value_%s' % [f.to_s])}))
|
44
45
|
end
|
46
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
45
47
|
output_buffer.should have_tag('form li fieldset ol li label input[value="Value_a"]')
|
46
48
|
output_buffer.should have_tag('form li fieldset ol li label input[value="Value_b"]')
|
47
49
|
output_buffer.should have_tag('form li fieldset ol li label input[value="Value_c"]')
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
require
|
2
|
+
require 'spec_helper'
|
3
3
|
|
4
4
|
describe 'SemanticFormBuilder#semantic_errors' do
|
5
5
|
|
@@ -17,7 +17,7 @@ describe 'SemanticFormBuilder#semantic_errors' do
|
|
17
17
|
|
18
18
|
describe 'when there is only one error on base' do
|
19
19
|
before do
|
20
|
-
@errors.stub!(:
|
20
|
+
@errors.stub!(:[]).with(:base).and_return(@base_error)
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'should render an unordered list' do
|
@@ -29,7 +29,7 @@ describe 'SemanticFormBuilder#semantic_errors' do
|
|
29
29
|
|
30
30
|
describe 'when there is more than one error on base' do
|
31
31
|
before do
|
32
|
-
@errors.stub!(:
|
32
|
+
@errors.stub!(:[]).with(:base).and_return(@base_errors)
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should render an unordered list' do
|
@@ -45,7 +45,7 @@ describe 'SemanticFormBuilder#semantic_errors' do
|
|
45
45
|
describe 'when there are errors on title' do
|
46
46
|
before do
|
47
47
|
@errors.stub!(:[]).with(:title).and_return(@title_errors)
|
48
|
-
@errors.stub!(:
|
48
|
+
@errors.stub!(:[]).with(:base).and_return([])
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'should render an unordered list' do
|
@@ -59,7 +59,7 @@ describe 'SemanticFormBuilder#semantic_errors' do
|
|
59
59
|
describe 'when there are errors on title and base' do
|
60
60
|
before do
|
61
61
|
@errors.stub!(:[]).with(:title).and_return(@title_errors)
|
62
|
-
@errors.stub!(:
|
62
|
+
@errors.stub!(:[]).with(:base).and_return(@base_error)
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'should render an unordered list' do
|
@@ -74,7 +74,7 @@ describe 'SemanticFormBuilder#semantic_errors' do
|
|
74
74
|
describe 'when there are no errors' do
|
75
75
|
before do
|
76
76
|
@errors.stub!(:[]).with(:title).and_return(nil)
|
77
|
-
@errors.stub!(:
|
77
|
+
@errors.stub!(:[]).with(:base).and_return(nil)
|
78
78
|
end
|
79
79
|
|
80
80
|
it 'should return nil' do
|
@@ -86,7 +86,7 @@ describe 'SemanticFormBuilder#semantic_errors' do
|
|
86
86
|
|
87
87
|
describe 'when there is one error on base and options with class is passed' do
|
88
88
|
before do
|
89
|
-
@errors.stub!(:
|
89
|
+
@errors.stub!(:[]).with(:base).and_return(@base_error)
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'should render an unordered list with given class' do
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
require
|
2
|
+
require 'spec_helper'
|
3
3
|
|
4
4
|
describe 'SemanticFormBuilder#semantic_fields_for' do
|
5
5
|
|
@@ -29,11 +29,12 @@ describe 'SemanticFormBuilder#semantic_fields_for' do
|
|
29
29
|
|
30
30
|
it 'should sanitize html id for li tag' do
|
31
31
|
@bob.stub!(:column_for_attribute).and_return(mock('column', :type => :string, :limit => 255))
|
32
|
-
semantic_form_for(@new_post) do |builder|
|
33
|
-
builder.semantic_fields_for(@bob, :index => 1) do |nested_builder|
|
32
|
+
form = semantic_form_for(@new_post) do |builder|
|
33
|
+
concat(builder.semantic_fields_for(@bob, :index => 1) do |nested_builder|
|
34
34
|
concat(nested_builder.inputs(:login))
|
35
|
-
end
|
35
|
+
end)
|
36
36
|
end
|
37
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
37
38
|
output_buffer.should have_tag('form fieldset.inputs #post_author_1_login_input')
|
38
39
|
# Not valid selector, so using good ol' regex
|
39
40
|
output_buffer.should_not =~ /id="post\[author\]_1_login_input"/
|
data/spec/spec_helper.rb
CHANGED
@@ -1,52 +1,47 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
require 'rubygems'
|
3
|
-
|
4
|
-
gem 'i18n', '< 0.4'
|
5
|
-
|
6
|
-
gem 'activesupport', '2.3.8'
|
7
|
-
gem 'actionpack', '2.3.8'
|
8
3
|
require 'active_support'
|
9
4
|
require 'action_pack'
|
10
5
|
require 'action_view'
|
11
6
|
require 'action_controller'
|
7
|
+
require 'action_mailer'
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
gem 'rspec', '>= 1.2.6'
|
16
|
-
gem 'rspec-rails', '>= 1.2.6'
|
17
|
-
gem 'hpricot', '>= 0.6.1'
|
18
|
-
gem 'rspec_tag_matchers', '>= 1.0.0'
|
19
|
-
require 'rspec_tag_matchers'
|
20
|
-
|
21
|
-
require 'custom_macros'
|
22
|
-
|
23
|
-
Spec::Runner.configure do |config|
|
24
|
-
config.include(RspecTagMatchers)
|
25
|
-
config.include(CustomMacros)
|
26
|
-
end
|
27
|
-
|
28
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/formtastic'))
|
29
9
|
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/formtastic/util'))
|
10
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/formtastic'))
|
30
11
|
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/formtastic/layout_helper'))
|
31
12
|
|
13
|
+
# Requires supporting files with custom matchers and macros, etc,
|
14
|
+
# in ./support/ and its subdirectories in alphabetic order.
|
15
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each {|f| require f}
|
32
16
|
|
33
17
|
module FormtasticSpecHelper
|
18
|
+
include ActionPack
|
19
|
+
include ActionView::Context if defined?(ActionView::Context)
|
20
|
+
include ActionController::RecordIdentifier
|
34
21
|
include ActionView::Helpers::FormHelper
|
35
22
|
include ActionView::Helpers::FormTagHelper
|
36
23
|
include ActionView::Helpers::FormOptionsHelper
|
37
24
|
include ActionView::Helpers::UrlHelper
|
38
25
|
include ActionView::Helpers::TagHelper
|
39
26
|
include ActionView::Helpers::TextHelper
|
40
|
-
include ActionView::Helpers::ActiveRecordHelper
|
41
|
-
include ActionView::Helpers::
|
27
|
+
include ActionView::Helpers::ActiveRecordHelper if defined?(ActionView::Helpers::ActiveRecordHelper)
|
28
|
+
include ActionView::Helpers::ActiveModelHelper if defined?(ActionView::Helpers::ActiveModelHelper)
|
42
29
|
include ActionView::Helpers::DateHelper
|
43
30
|
include ActionView::Helpers::CaptureHelper
|
44
31
|
include ActionView::Helpers::AssetTagHelper
|
45
32
|
include ActiveSupport
|
46
|
-
include ActionController::PolymorphicRoutes
|
33
|
+
include ActionController::PolymorphicRoutes if defined?(ActionController::PolymorphicRoutes)
|
47
34
|
|
48
35
|
include Formtastic::SemanticFormHelper
|
49
36
|
|
37
|
+
def rails3?
|
38
|
+
ActionPack::VERSION::MAJOR > 2
|
39
|
+
end
|
40
|
+
|
41
|
+
def rails2?
|
42
|
+
ActionPack::VERSION::MAJOR == 2
|
43
|
+
end
|
44
|
+
|
50
45
|
def default_input_type(column_type, column_name = :generic_column_name)
|
51
46
|
@new_post.stub!(column_name)
|
52
47
|
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => column_type)) unless column_type.nil?
|
@@ -58,27 +53,56 @@ module FormtasticSpecHelper
|
|
58
53
|
return @default_type
|
59
54
|
end
|
60
55
|
|
56
|
+
def active_model_presence_validator(attributes, options = {})
|
57
|
+
presence_validator = mock('ActiveModel::Validations::PresenceValidator', :attributes => attributes, :options => options)
|
58
|
+
presence_validator.stub!(:kind).and_return(:presence)
|
59
|
+
presence_validator
|
60
|
+
end
|
61
|
+
|
61
62
|
class ::Post
|
63
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
64
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
65
|
+
|
62
66
|
def id
|
63
67
|
end
|
68
|
+
|
69
|
+
def persisted?
|
70
|
+
end
|
64
71
|
end
|
65
72
|
module ::Namespaced
|
66
73
|
class Post
|
74
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
75
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
76
|
+
|
67
77
|
def id
|
68
78
|
end
|
79
|
+
|
80
|
+
def persisted?
|
81
|
+
end
|
69
82
|
end
|
70
83
|
end
|
71
84
|
class ::Author
|
85
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
86
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
87
|
+
|
72
88
|
def to_label
|
73
89
|
end
|
74
90
|
end
|
75
91
|
class ::Continent
|
92
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
93
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
94
|
+
end
|
95
|
+
class ::PostModel
|
96
|
+
extend ActiveModel::Naming if defined?(ActiveModel::Naming)
|
97
|
+
include ActiveModel::Conversion if defined?(ActiveModel::Conversion)
|
76
98
|
end
|
77
99
|
|
78
100
|
def mock_everything
|
79
101
|
|
80
102
|
# Resource-oriented styles like form_for(@post) will expect a path method for the object,
|
81
103
|
# so we're defining some here.
|
104
|
+
def post_models_path; "/postmodels/1"; end
|
105
|
+
|
82
106
|
def post_path(o); "/posts/1"; end
|
83
107
|
def posts_path; "/posts"; end
|
84
108
|
def new_post_path; "/posts/new"; end
|
@@ -88,14 +112,18 @@ module FormtasticSpecHelper
|
|
88
112
|
def new_author_path; "/authors/new"; end
|
89
113
|
|
90
114
|
@fred = mock('user')
|
115
|
+
@fred.stub!(:to_ary)
|
91
116
|
@fred.stub!(:class).and_return(::Author)
|
92
117
|
@fred.stub!(:to_label).and_return('Fred Smith')
|
93
118
|
@fred.stub!(:login).and_return('fred_smith')
|
94
119
|
@fred.stub!(:id).and_return(37)
|
95
120
|
@fred.stub!(:new_record?).and_return(false)
|
96
121
|
@fred.stub!(:errors).and_return(mock('errors', :[] => nil))
|
122
|
+
@fred.stub!(:to_key).and_return(nil)
|
123
|
+
@fred.stub!(:persisted?).and_return(nil)
|
97
124
|
|
98
125
|
@bob = mock('user')
|
126
|
+
@bob.stub!(:to_ary)
|
99
127
|
@bob.stub!(:class).and_return(::Author)
|
100
128
|
@bob.stub!(:to_label).and_return('Bob Rock')
|
101
129
|
@bob.stub!(:login).and_return('bob')
|
@@ -105,37 +133,50 @@ module FormtasticSpecHelper
|
|
105
133
|
@bob.stub!(:post_ids).and_return([])
|
106
134
|
@bob.stub!(:new_record?).and_return(false)
|
107
135
|
@bob.stub!(:errors).and_return(mock('errors', :[] => nil))
|
136
|
+
@bob.stub!(:to_key).and_return(nil)
|
137
|
+
@bob.stub!(:persisted?).and_return(nil)
|
108
138
|
|
109
139
|
@james = mock('user')
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
140
|
+
@james.stub!(:to_ary)
|
141
|
+
@james.stub!(:class).and_return(::Author)
|
142
|
+
@james.stub!(:to_label).and_return('James Shock')
|
143
|
+
@james.stub!(:login).and_return('james')
|
144
|
+
@james.stub!(:id).and_return(75)
|
145
|
+
@james.stub!(:posts).and_return([])
|
146
|
+
@james.stub!(:post_ids).and_return([])
|
147
|
+
@james.stub!(:new_record?).and_return(false)
|
148
|
+
@james.stub!(:errors).and_return(mock('errors', :[] => nil))
|
149
|
+
@james.stub!(:to_key).and_return(nil)
|
150
|
+
@james.stub!(:persisted?).and_return(nil)
|
118
151
|
|
119
152
|
|
120
153
|
::Author.stub!(:find).and_return([@fred, @bob])
|
154
|
+
::Author.stub!(:all).and_return([@fred, @bob])
|
155
|
+
::Author.stub!(:to_ary)
|
121
156
|
::Author.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
|
122
157
|
::Author.stub!(:human_name).and_return('::Author')
|
123
|
-
::Author.stub!(:reflect_on_validations_for).and_return([])
|
124
158
|
::Author.stub!(:reflect_on_association).and_return { |column_name| mock('reflection', :options => {}, :klass => Post, :macro => :has_many) if column_name == :posts }
|
125
159
|
::Author.stub!(:content_columns).and_return([mock('column', :name => 'login'), mock('column', :name => 'created_at')])
|
160
|
+
::Author.stub!(:to_key).and_return(nil)
|
161
|
+
::Author.stub!(:persisted?).and_return(nil)
|
126
162
|
|
127
163
|
# Sometimes we need a mock @post object and some Authors for belongs_to
|
128
164
|
@new_post = mock('post')
|
165
|
+
@new_post.stub!(:to_ary)
|
129
166
|
@new_post.stub!(:class).and_return(::Post)
|
130
167
|
@new_post.stub!(:id).and_return(nil)
|
131
168
|
@new_post.stub!(:new_record?).and_return(true)
|
132
169
|
@new_post.stub!(:errors).and_return(mock('errors', :[] => nil))
|
133
170
|
@new_post.stub!(:author).and_return(nil)
|
134
|
-
|
171
|
+
@new_post.stub!(:reviewer).and_return(nil)
|
135
172
|
@new_post.stub!(:main_post).and_return(nil)
|
136
173
|
@new_post.stub!(:sub_posts).and_return([]) #TODO should be a mock with methods for adding sub posts
|
174
|
+
@new_post.stub!(:to_key).and_return(nil)
|
175
|
+
@new_post.stub!(:to_model).and_return(@new_post)
|
176
|
+
@new_post.stub!(:persisted?).and_return(nil)
|
137
177
|
|
138
178
|
@freds_post = mock('post')
|
179
|
+
@freds_post.stub!(:to_ary)
|
139
180
|
@freds_post.stub!(:class).and_return(::Post)
|
140
181
|
@freds_post.stub!(:to_label).and_return('Fred Smith')
|
141
182
|
@freds_post.stub!(:id).and_return(19)
|
@@ -145,6 +186,8 @@ module FormtasticSpecHelper
|
|
145
186
|
@freds_post.stub!(:author_ids).and_return([@fred.id])
|
146
187
|
@freds_post.stub!(:new_record?).and_return(false)
|
147
188
|
@freds_post.stub!(:errors).and_return(mock('errors', :[] => nil))
|
189
|
+
@freds_post.stub!(:to_key).and_return(nil)
|
190
|
+
@freds_post.stub!(:persisted?).and_return(nil)
|
148
191
|
@fred.stub!(:posts).and_return([@freds_post])
|
149
192
|
@fred.stub!(:post_ids).and_return([@freds_post.id])
|
150
193
|
|
@@ -159,8 +202,8 @@ module FormtasticSpecHelper
|
|
159
202
|
mock = mock('reflection', :options => {}, :klass => ::Author, :macro => :belongs_to)
|
160
203
|
mock.stub!(:[]).with(:class_name).and_return("Author")
|
161
204
|
mock
|
162
|
-
|
163
|
-
|
205
|
+
when :reviewer
|
206
|
+
mock = mock('reflection', :options => {:class_name => 'Author'}, :klass => ::Author, :macro => :belongs_to)
|
164
207
|
mock.stub!(:[]).with(:class_name).and_return("Author")
|
165
208
|
mock
|
166
209
|
when :authors
|
@@ -173,9 +216,14 @@ module FormtasticSpecHelper
|
|
173
216
|
|
174
217
|
end
|
175
218
|
::Post.stub!(:find).and_return([@freds_post])
|
219
|
+
::Post.stub!(:all).and_return([@freds_post])
|
176
220
|
::Post.stub!(:content_columns).and_return([mock('column', :name => 'title'), mock('column', :name => 'body'), mock('column', :name => 'created_at')])
|
221
|
+
::Post.stub!(:to_key).and_return(nil)
|
222
|
+
::Post.stub!(:persisted?).and_return(nil)
|
223
|
+
::Post.stub!(:to_ary)
|
177
224
|
|
178
225
|
@new_post.stub!(:title)
|
226
|
+
@new_post.stub!(:to_ary)
|
179
227
|
@new_post.stub!(:body)
|
180
228
|
@new_post.stub!(:published)
|
181
229
|
@new_post.stub!(:publish_at)
|
@@ -202,8 +250,8 @@ module FormtasticSpecHelper
|
|
202
250
|
@new_post.stub!(:author).and_return(@bob)
|
203
251
|
@new_post.stub!(:author_id).and_return(@bob.id)
|
204
252
|
|
205
|
-
|
206
|
-
|
253
|
+
@new_post.stub!(:reviewer).and_return(@fred)
|
254
|
+
@new_post.stub!(:reviewer_id).and_return(@fred.id)
|
207
255
|
|
208
256
|
@new_post.should_receive(:publish_at=).any_number_of_times
|
209
257
|
@new_post.should_receive(:title=).any_number_of_times
|
@@ -8,66 +8,77 @@ module CustomMacros
|
|
8
8
|
|
9
9
|
def it_should_have_input_wrapper_with_class(class_name)
|
10
10
|
it "should have input wrapper with class '#{class_name}'" do
|
11
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
11
12
|
output_buffer.should have_tag("form li.#{class_name}")
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
16
|
def it_should_have_input_wrapper_with_id(id_string)
|
16
17
|
it "should have input wrapper with id '#{id_string}'" do
|
18
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
17
19
|
output_buffer.should have_tag("form li##{id_string}")
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def it_should_not_have_a_label
|
22
24
|
it "should not have a label" do
|
25
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
23
26
|
output_buffer.should_not have_tag("form li label")
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
30
|
def it_should_have_a_nested_fieldset
|
28
31
|
it "should have a nested_fieldset" do
|
32
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
29
33
|
output_buffer.should have_tag("form li fieldset")
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def it_should_have_label_with_text(string_or_regex)
|
34
38
|
it "should have a label with text '#{string_or_regex}'" do
|
39
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
35
40
|
output_buffer.should have_tag("form li label", string_or_regex)
|
36
41
|
end
|
37
42
|
end
|
38
43
|
|
39
44
|
def it_should_have_label_for(element_id)
|
40
45
|
it "should have a label for ##{element_id}" do
|
46
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
41
47
|
output_buffer.should have_tag("form li label[@for='#{element_id}']")
|
42
48
|
end
|
43
49
|
end
|
44
50
|
|
45
51
|
def it_should_have_input_with_id(element_id)
|
46
52
|
it "should have an input with id '#{element_id}'" do
|
53
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
47
54
|
output_buffer.should have_tag("form li input##{element_id}")
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
51
58
|
def it_should_have_input_with_type(input_type)
|
52
59
|
it "should have a #{input_type} input" do
|
60
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
53
61
|
output_buffer.should have_tag("form li input[@type=\"#{input_type}\"]")
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
65
|
def it_should_have_input_with_name(name)
|
58
66
|
it "should have an input named #{name}" do
|
67
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
59
68
|
output_buffer.should have_tag("form li input[@name=\"#{name}\"]")
|
60
69
|
end
|
61
70
|
end
|
62
71
|
|
63
72
|
def it_should_have_textarea_with_name(name)
|
64
73
|
it "should have an input named #{name}" do
|
74
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
65
75
|
output_buffer.should have_tag("form li textarea[@name=\"#{name}\"]")
|
66
76
|
end
|
67
77
|
end
|
68
78
|
|
69
79
|
def it_should_have_textarea_with_id(element_id)
|
70
80
|
it "should have an input with id '#{element_id}'" do
|
81
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
71
82
|
output_buffer.should have_tag("form li textarea##{element_id}")
|
72
83
|
end
|
73
84
|
end
|
@@ -76,27 +87,30 @@ module CustomMacros
|
|
76
87
|
it 'should use default_text_field_size when method has no database column' do
|
77
88
|
@new_post.stub!(:column_for_attribute).and_return(nil) # Return a nil column
|
78
89
|
|
79
|
-
semantic_form_for(@new_post) do |builder|
|
90
|
+
form = semantic_form_for(@new_post) do |builder|
|
80
91
|
concat(builder.input(:title, :as => as))
|
81
92
|
end
|
93
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
82
94
|
output_buffer.should have_tag("form li input[@size='#{Formtastic::SemanticFormBuilder.default_text_field_size}']")
|
83
95
|
end
|
84
96
|
end
|
85
97
|
|
86
98
|
def it_should_apply_custom_input_attributes_when_input_html_provided(as)
|
87
99
|
it 'it should apply custom input attributes when input_html provided' do
|
88
|
-
semantic_form_for(@new_post) do |builder|
|
100
|
+
form = semantic_form_for(@new_post) do |builder|
|
89
101
|
concat(builder.input(:title, :as => as, :input_html => { :class => 'myclass' }))
|
90
102
|
end
|
103
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
91
104
|
output_buffer.should have_tag("form li input.myclass")
|
92
105
|
end
|
93
106
|
end
|
94
107
|
|
95
108
|
def it_should_apply_custom_for_to_label_when_input_html_id_provided(as)
|
96
109
|
it 'it should apply custom for to label when input_html :id provided' do
|
97
|
-
semantic_form_for(@new_post) do |builder|
|
110
|
+
form = semantic_form_for(@new_post) do |builder|
|
98
111
|
concat(builder.input(:title, :as => as, :input_html => { :id => 'myid' }))
|
99
112
|
end
|
113
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
100
114
|
output_buffer.should have_tag('form li label[@for="myid"]')
|
101
115
|
end
|
102
116
|
end
|
@@ -104,6 +118,7 @@ module CustomMacros
|
|
104
118
|
def it_should_have_maxlength_matching_column_limit
|
105
119
|
it 'should have a maxlength matching column limit' do
|
106
120
|
@new_post.column_for_attribute(:title).limit.should == 50
|
121
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
107
122
|
output_buffer.should have_tag("form li input[@maxlength='50']")
|
108
123
|
end
|
109
124
|
end
|
@@ -113,10 +128,11 @@ module CustomMacros
|
|
113
128
|
default_size = Formtastic::SemanticFormBuilder.default_text_field_size
|
114
129
|
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => as, :limit => default_size * 2))
|
115
130
|
|
116
|
-
semantic_form_for(@new_post) do |builder|
|
131
|
+
form = semantic_form_for(@new_post) do |builder|
|
117
132
|
concat(builder.input(:title, :as => as))
|
118
133
|
end
|
119
134
|
|
135
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
120
136
|
output_buffer.should have_tag("form li input[@size='#{default_size}']")
|
121
137
|
end
|
122
138
|
end
|
@@ -126,10 +142,11 @@ module CustomMacros
|
|
126
142
|
column_limit_shorted_than_default = 1
|
127
143
|
@new_post.stub!(:column_for_attribute).and_return(mock('column', :type => as, :limit => column_limit_shorted_than_default))
|
128
144
|
|
129
|
-
semantic_form_for(@new_post) do |builder|
|
145
|
+
form = semantic_form_for(@new_post) do |builder|
|
130
146
|
concat(builder.input(:title, :as => as))
|
131
147
|
end
|
132
148
|
|
149
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
133
150
|
output_buffer.should have_tag("form li input[@size='#{column_limit_shorted_than_default}']")
|
134
151
|
end
|
135
152
|
end
|
@@ -144,72 +161,82 @@ module CustomMacros
|
|
144
161
|
end
|
145
162
|
|
146
163
|
it 'should apply an errors class to the list item' do
|
147
|
-
semantic_form_for(@new_post) do |builder|
|
164
|
+
form = semantic_form_for(@new_post) do |builder|
|
148
165
|
concat(builder.input(:title, :as => type))
|
149
166
|
end
|
167
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
150
168
|
output_buffer.should have_tag('form li.error')
|
151
169
|
end
|
152
170
|
|
153
171
|
it 'should not wrap the input with the Rails default error wrapping' do
|
154
|
-
semantic_form_for(@new_post) do |builder|
|
172
|
+
form = semantic_form_for(@new_post) do |builder|
|
155
173
|
concat(builder.input(:title, :as => type))
|
156
174
|
end
|
175
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
157
176
|
output_buffer.should_not have_tag('div.fieldWithErrors')
|
158
177
|
end
|
159
178
|
|
160
179
|
it 'should render a paragraph for the errors' do
|
161
180
|
::Formtastic::SemanticFormBuilder.inline_errors = :sentence
|
162
|
-
semantic_form_for(@new_post) do |builder|
|
181
|
+
form = semantic_form_for(@new_post) do |builder|
|
163
182
|
concat(builder.input(:title, :as => type))
|
164
183
|
end
|
184
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
165
185
|
output_buffer.should have_tag('form li.error p.inline-errors')
|
166
186
|
end
|
167
187
|
|
168
188
|
it 'should not display an error list' do
|
169
189
|
::Formtastic::SemanticFormBuilder.inline_errors = :list
|
170
|
-
semantic_form_for(@new_post) do |builder|
|
190
|
+
form = semantic_form_for(@new_post) do |builder|
|
171
191
|
concat(builder.input(:title, :as => type))
|
172
192
|
end
|
193
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
173
194
|
output_buffer.should have_tag('form li.error ul.errors')
|
174
195
|
end
|
175
196
|
end
|
176
197
|
|
177
198
|
describe 'when there are no errors on the object for this method' do
|
178
199
|
before do
|
179
|
-
semantic_form_for(@new_post) do |builder|
|
200
|
+
@form = semantic_form_for(@new_post) do |builder|
|
180
201
|
concat(builder.input(:title, :as => type))
|
181
202
|
end
|
182
203
|
end
|
183
204
|
|
184
205
|
it 'should not apply an errors class to the list item' do
|
206
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
185
207
|
output_buffer.should_not have_tag('form li.error')
|
186
208
|
end
|
187
209
|
|
188
210
|
it 'should not render a paragraph for the errors' do
|
211
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
189
212
|
output_buffer.should_not have_tag('form li.error p.inline-errors')
|
190
213
|
end
|
191
214
|
|
192
215
|
it 'should not display an error list' do
|
216
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
193
217
|
output_buffer.should_not have_tag('form li.error ul.errors')
|
194
218
|
end
|
195
219
|
end
|
196
220
|
|
197
221
|
describe 'when no object is provided' do
|
198
222
|
before do
|
199
|
-
semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
223
|
+
@form = semantic_form_for(:project, :url => 'http://test.host') do |builder|
|
200
224
|
concat(builder.input(:title, :as => type))
|
201
225
|
end
|
202
226
|
end
|
203
227
|
|
204
228
|
it 'should not apply an errors class to the list item' do
|
229
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
205
230
|
output_buffer.should_not have_tag('form li.error')
|
206
231
|
end
|
207
232
|
|
208
233
|
it 'should not render a paragraph for the errors' do
|
234
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
209
235
|
output_buffer.should_not have_tag('form li.error p.inline-errors')
|
210
236
|
end
|
211
237
|
|
212
238
|
it 'should not display an error list' do
|
239
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
213
240
|
output_buffer.should_not have_tag('form li.error ul.errors')
|
214
241
|
end
|
215
242
|
end
|
@@ -217,8 +244,8 @@ module CustomMacros
|
|
217
244
|
|
218
245
|
def it_should_call_find_on_association_class_when_no_collection_is_provided(as)
|
219
246
|
it "should call find on the association class when no collection is provided" do
|
220
|
-
::Author.should_receive(:
|
221
|
-
semantic_form_for(@new_post) do |builder|
|
247
|
+
::Author.should_receive(:all)
|
248
|
+
form = semantic_form_for(@new_post) do |builder|
|
222
249
|
concat(builder.input(:author, :as => as))
|
223
250
|
end
|
224
251
|
end
|
@@ -232,17 +259,11 @@ module CustomMacros
|
|
232
259
|
output_buffer.replace '' # clears the output_buffer from the before block, hax!
|
233
260
|
end
|
234
261
|
|
235
|
-
it 'should not call find() on the parent class' do
|
236
|
-
::Author.should_not_receive(:find)
|
237
|
-
semantic_form_for(@new_post) do |builder|
|
238
|
-
concat(builder.input(:author, :as => as, :collection => @authors))
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
262
|
it 'should use the provided collection' do
|
243
|
-
semantic_form_for(@new_post) do |builder|
|
263
|
+
form = semantic_form_for(@new_post) do |builder|
|
244
264
|
concat(builder.input(:author, :as => as, :collection => @authors))
|
245
265
|
end
|
266
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
246
267
|
output_buffer.should have_tag("form li.#{as} #{countable}", :count => @authors.size + (as == :select ? 1 : 0))
|
247
268
|
end
|
248
269
|
|
@@ -252,9 +273,10 @@ module CustomMacros
|
|
252
273
|
end
|
253
274
|
|
254
275
|
it "should use the string as the label text and value for each #{countable}" do
|
255
|
-
semantic_form_for(@new_post) do |builder|
|
276
|
+
form = semantic_form_for(@new_post) do |builder|
|
256
277
|
concat(builder.input(:category_name, :as => as, :collection => @categories))
|
257
278
|
end
|
279
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
258
280
|
|
259
281
|
@categories.each do |value|
|
260
282
|
output_buffer.should have_tag("form li.#{as}", /#{value}/)
|
@@ -265,11 +287,13 @@ module CustomMacros
|
|
265
287
|
if as == :radio
|
266
288
|
it 'should generate a sanitized label for attribute' do
|
267
289
|
@bob.stub!(:category_name).and_return(@categories)
|
268
|
-
semantic_form_for(@new_post) do |builder|
|
269
|
-
builder.semantic_fields_for(@bob) do |bob_builder|
|
290
|
+
form = semantic_form_for(@new_post) do |builder|
|
291
|
+
fields = builder.semantic_fields_for(@bob) do |bob_builder|
|
270
292
|
concat(bob_builder.input(:category_name, :as => as, :collection => @categories))
|
271
293
|
end
|
294
|
+
concat(fields)
|
272
295
|
end
|
296
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
273
297
|
output_buffer.should have_tag("form li fieldset ol li label[@for='post_author_category_name_general']")
|
274
298
|
output_buffer.should have_tag("form li fieldset ol li label[@for='post_author_category_name_design']")
|
275
299
|
output_buffer.should have_tag("form li fieldset ol li label[@for='post_author_category_name_development']")
|
@@ -284,9 +308,10 @@ module CustomMacros
|
|
284
308
|
end
|
285
309
|
|
286
310
|
it "should use the key as the label text and the hash value as the value attribute for each #{countable}" do
|
287
|
-
semantic_form_for(@new_post) do |builder|
|
311
|
+
form = semantic_form_for(@new_post) do |builder|
|
288
312
|
concat(builder.input(:category_name, :as => as, :collection => @categories))
|
289
313
|
end
|
314
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
290
315
|
|
291
316
|
@categories.each do |label, value|
|
292
317
|
output_buffer.should have_tag("form li.#{as}", /#{label}/)
|
@@ -301,9 +326,10 @@ module CustomMacros
|
|
301
326
|
end
|
302
327
|
|
303
328
|
it "should use the first value as the label text and the last value as the value attribute for #{countable}" do
|
304
|
-
semantic_form_for(@new_post) do |builder|
|
329
|
+
form = semantic_form_for(@new_post) do |builder|
|
305
330
|
concat(builder.input(:category_name, :as => as, :collection => @categories))
|
306
331
|
end
|
332
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
307
333
|
|
308
334
|
@categories.each do |text, value|
|
309
335
|
label = as == :select ? :option : :label
|
@@ -321,9 +347,10 @@ module CustomMacros
|
|
321
347
|
end
|
322
348
|
|
323
349
|
it "should use the first value as the label text and the last value as the value attribute for #{countable}" do
|
324
|
-
semantic_form_for(@new_post) do |builder|
|
350
|
+
form = semantic_form_for(@new_post) do |builder|
|
325
351
|
concat(builder.input(:category_name, :as => as, :collection => @choices))
|
326
352
|
end
|
353
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
327
354
|
|
328
355
|
output_buffer.should have_tag("form li.#{as} #{countable}#post_category_name_true")
|
329
356
|
output_buffer.should have_tag("form li.#{as} #{countable}#post_category_name_false")
|
@@ -337,9 +364,10 @@ module CustomMacros
|
|
337
364
|
end
|
338
365
|
|
339
366
|
it "should use the symbol as the label text and value for each #{countable}" do
|
340
|
-
semantic_form_for(@new_post) do |builder|
|
367
|
+
form = semantic_form_for(@new_post) do |builder|
|
341
368
|
concat(builder.input(:category_name, :as => as, :collection => @categories))
|
342
369
|
end
|
370
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
343
371
|
|
344
372
|
@categories.each do |value|
|
345
373
|
label = as == :select ? :option : :label
|
@@ -355,9 +383,10 @@ module CustomMacros
|
|
355
383
|
end
|
356
384
|
|
357
385
|
it "should use the key as the label text and the hash value as the value attribute for each #{countable}" do
|
358
|
-
semantic_form_for(@new_post) do |builder|
|
386
|
+
form = semantic_form_for(@new_post) do |builder|
|
359
387
|
concat(builder.input(:category_name, :as => as, :collection => @categories))
|
360
388
|
end
|
389
|
+
output_buffer.concat(form) if Formtastic::Util.rails3?
|
361
390
|
|
362
391
|
@categories.each do |label, value|
|
363
392
|
output_buffer.should have_tag("form li.#{as}", /#{label}/)
|
@@ -371,12 +400,13 @@ module CustomMacros
|
|
371
400
|
|
372
401
|
describe 'as a symbol' do
|
373
402
|
before do
|
374
|
-
semantic_form_for(@new_post) do |builder|
|
403
|
+
@form = semantic_form_for(@new_post) do |builder|
|
375
404
|
concat(builder.input(:author, :as => as, :label_method => :login))
|
376
405
|
end
|
377
406
|
end
|
378
407
|
|
379
408
|
it 'should have options with text content from the specified method' do
|
409
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
380
410
|
::Author.find(:all).each do |author|
|
381
411
|
output_buffer.should have_tag("form li.#{as}", /#{author.login}/)
|
382
412
|
end
|
@@ -385,12 +415,13 @@ module CustomMacros
|
|
385
415
|
|
386
416
|
describe 'as a proc' do
|
387
417
|
before do
|
388
|
-
semantic_form_for(@new_post) do |builder|
|
418
|
+
@form = semantic_form_for(@new_post) do |builder|
|
389
419
|
concat(builder.input(:author, :as => as, :label_method => Proc.new {|a| a.login.reverse }))
|
390
420
|
end
|
391
421
|
end
|
392
422
|
|
393
423
|
it 'should have options with the proc applied to each' do
|
424
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
394
425
|
::Author.find(:all).each do |author|
|
395
426
|
output_buffer.should have_tag("form li.#{as}", /#{author.login.reverse}/)
|
396
427
|
end
|
@@ -404,15 +435,16 @@ module CustomMacros
|
|
404
435
|
|
405
436
|
describe "when the collection objects respond to #{label_method}" do
|
406
437
|
before do
|
407
|
-
@fred.stub!(:respond_to?).and_return { |m| m.to_s == label_method }
|
438
|
+
@fred.stub!(:respond_to?).and_return { |m| m.to_s == label_method || m.to_s == 'id' }
|
408
439
|
::Author.find(:all).each { |a| a.stub!(label_method).and_return('The Label Text') }
|
409
440
|
|
410
|
-
semantic_form_for(@new_post) do |builder|
|
441
|
+
@form = semantic_form_for(@new_post) do |builder|
|
411
442
|
concat(builder.input(:author, :as => as))
|
412
443
|
end
|
413
444
|
end
|
414
445
|
|
415
446
|
it "should render the options with #{label_method} as the label" do
|
447
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
416
448
|
::Author.find(:all).each do |author|
|
417
449
|
output_buffer.should have_tag("form li.#{as}", /The Label Text/)
|
418
450
|
end
|
@@ -426,12 +458,13 @@ module CustomMacros
|
|
426
458
|
|
427
459
|
describe 'as a symbol' do
|
428
460
|
before do
|
429
|
-
semantic_form_for(@new_post) do |builder|
|
461
|
+
@form = semantic_form_for(@new_post) do |builder|
|
430
462
|
concat(builder.input(:author, :as => as, :value_method => :login))
|
431
463
|
end
|
432
464
|
end
|
433
465
|
|
434
466
|
it 'should have options with values from specified method' do
|
467
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
435
468
|
::Author.find(:all).each do |author|
|
436
469
|
output_buffer.should have_tag("form li.#{as} #{countable}[@value='#{author.login}']")
|
437
470
|
end
|
@@ -440,12 +473,13 @@ module CustomMacros
|
|
440
473
|
|
441
474
|
describe 'as a proc' do
|
442
475
|
before do
|
443
|
-
semantic_form_for(@new_post) do |builder|
|
476
|
+
@form = semantic_form_for(@new_post) do |builder|
|
444
477
|
concat(builder.input(:author, :as => as, :value_method => Proc.new {|a| a.login.reverse }))
|
445
478
|
end
|
446
479
|
end
|
447
480
|
|
448
481
|
it 'should have options with the proc applied to each value' do
|
482
|
+
output_buffer.concat(@form) if Formtastic::Util.rails3?
|
449
483
|
::Author.find(:all).each do |author|
|
450
484
|
output_buffer.should have_tag("form li.#{as} #{countable}[@value='#{author.login.reverse}']")
|
451
485
|
end
|