formtastic 1.2.4 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +46 -0
  5. data/.yardopts +1 -0
  6. data/Appraisals +43 -0
  7. data/CHANGELOG +54 -0
  8. data/DEPRECATIONS +52 -0
  9. data/Gemfile +3 -0
  10. data/README.md +629 -0
  11. data/RELEASE_PROCESS +6 -0
  12. data/Rakefile +35 -0
  13. data/app/assets/stylesheets/formtastic.css +289 -0
  14. data/app/assets/stylesheets/formtastic_ie6.css +33 -0
  15. data/app/assets/stylesheets/formtastic_ie7.css +23 -0
  16. data/formtastic.gemspec +42 -0
  17. data/gemfiles/rails_3.2.gemfile +9 -0
  18. data/gemfiles/rails_4.0.4.gemfile +8 -0
  19. data/gemfiles/rails_4.1.gemfile +8 -0
  20. data/gemfiles/rails_4.2.gemfile +8 -0
  21. data/gemfiles/rails_4.gemfile +8 -0
  22. data/gemfiles/rails_5.0.gemfile +8 -0
  23. data/gemfiles/rails_edge.gemfile +15 -0
  24. data/lib/formtastic.rb +40 -1945
  25. data/lib/formtastic/action_class_finder.rb +18 -0
  26. data/lib/formtastic/actions.rb +11 -0
  27. data/lib/formtastic/actions/base.rb +156 -0
  28. data/lib/formtastic/actions/button_action.rb +67 -0
  29. data/lib/formtastic/actions/buttonish.rb +17 -0
  30. data/lib/formtastic/actions/input_action.rb +70 -0
  31. data/lib/formtastic/actions/link_action.rb +88 -0
  32. data/lib/formtastic/deprecation.rb +42 -0
  33. data/lib/formtastic/engine.rb +11 -0
  34. data/lib/formtastic/form_builder.rb +124 -0
  35. data/lib/formtastic/helpers.rb +16 -0
  36. data/lib/formtastic/helpers/action_helper.rb +162 -0
  37. data/lib/formtastic/helpers/actions_helper.rb +168 -0
  38. data/lib/formtastic/helpers/enum.rb +13 -0
  39. data/lib/formtastic/helpers/errors_helper.rb +81 -0
  40. data/lib/formtastic/helpers/fieldset_wrapper.rb +80 -0
  41. data/lib/formtastic/helpers/file_column_detection.rb +16 -0
  42. data/lib/formtastic/helpers/form_helper.rb +203 -0
  43. data/lib/formtastic/helpers/input_helper.rb +407 -0
  44. data/lib/formtastic/helpers/inputs_helper.rb +411 -0
  45. data/lib/formtastic/helpers/reflection.rb +37 -0
  46. data/lib/formtastic/html_attributes.rb +32 -0
  47. data/lib/formtastic/i18n.rb +4 -2
  48. data/lib/formtastic/input_class_finder.rb +18 -0
  49. data/lib/formtastic/inputs.rb +39 -0
  50. data/lib/formtastic/inputs/base.rb +76 -0
  51. data/lib/formtastic/inputs/base/associations.rb +31 -0
  52. data/lib/formtastic/inputs/base/choices.rb +108 -0
  53. data/lib/formtastic/inputs/base/collections.rb +159 -0
  54. data/lib/formtastic/inputs/base/database.rb +22 -0
  55. data/lib/formtastic/inputs/base/datetime_pickerish.rb +85 -0
  56. data/lib/formtastic/inputs/base/errors.rb +58 -0
  57. data/lib/formtastic/inputs/base/fileish.rb +23 -0
  58. data/lib/formtastic/inputs/base/hints.rb +31 -0
  59. data/lib/formtastic/inputs/base/html.rb +53 -0
  60. data/lib/formtastic/inputs/base/labelling.rb +52 -0
  61. data/lib/formtastic/inputs/base/naming.rb +42 -0
  62. data/lib/formtastic/inputs/base/numeric.rb +50 -0
  63. data/lib/formtastic/inputs/base/options.rb +17 -0
  64. data/lib/formtastic/inputs/base/placeholder.rb +17 -0
  65. data/lib/formtastic/inputs/base/stringish.rb +38 -0
  66. data/lib/formtastic/inputs/base/timeish.rb +241 -0
  67. data/lib/formtastic/inputs/base/validations.rb +215 -0
  68. data/lib/formtastic/inputs/base/wrapping.rb +50 -0
  69. data/lib/formtastic/inputs/boolean_input.rb +118 -0
  70. data/lib/formtastic/inputs/check_boxes_input.rb +197 -0
  71. data/lib/formtastic/inputs/color_input.rb +42 -0
  72. data/lib/formtastic/inputs/country_input.rb +86 -0
  73. data/lib/formtastic/inputs/datalist_input.rb +41 -0
  74. data/lib/formtastic/inputs/date_picker_input.rb +93 -0
  75. data/lib/formtastic/inputs/date_select_input.rb +34 -0
  76. data/lib/formtastic/inputs/datetime_picker_input.rb +103 -0
  77. data/lib/formtastic/inputs/datetime_select_input.rb +12 -0
  78. data/lib/formtastic/inputs/email_input.rb +41 -0
  79. data/lib/formtastic/inputs/file_input.rb +42 -0
  80. data/lib/formtastic/inputs/hidden_input.rb +62 -0
  81. data/lib/formtastic/inputs/number_input.rb +88 -0
  82. data/lib/formtastic/inputs/password_input.rb +41 -0
  83. data/lib/formtastic/inputs/phone_input.rb +42 -0
  84. data/lib/formtastic/inputs/radio_input.rb +163 -0
  85. data/lib/formtastic/inputs/range_input.rb +95 -0
  86. data/lib/formtastic/inputs/search_input.rb +41 -0
  87. data/lib/formtastic/inputs/select_input.rb +235 -0
  88. data/lib/formtastic/inputs/string_input.rb +36 -0
  89. data/lib/formtastic/inputs/text_input.rb +48 -0
  90. data/lib/formtastic/inputs/time_picker_input.rb +99 -0
  91. data/lib/formtastic/inputs/time_select_input.rb +38 -0
  92. data/lib/formtastic/inputs/time_zone_input.rb +58 -0
  93. data/lib/formtastic/inputs/url_input.rb +41 -0
  94. data/lib/formtastic/localized_string.rb +17 -0
  95. data/lib/formtastic/localizer.rb +152 -0
  96. data/lib/formtastic/namespaced_class_finder.rb +99 -0
  97. data/lib/formtastic/util.rb +35 -16
  98. data/lib/formtastic/version.rb +3 -0
  99. data/lib/generators/formtastic/form/form_generator.rb +64 -37
  100. data/lib/generators/formtastic/input/input_generator.rb +46 -0
  101. data/lib/generators/formtastic/install/install_generator.rb +13 -5
  102. data/lib/generators/templates/_form.html.erb +10 -4
  103. data/lib/generators/templates/_form.html.haml +8 -4
  104. data/lib/generators/templates/_form.html.slim +8 -0
  105. data/lib/generators/templates/formtastic.rb +77 -44
  106. data/lib/generators/templates/input.rb +19 -0
  107. data/lib/locale/en.yml +3 -0
  108. data/sample/basic_inputs.html +224 -0
  109. data/sample/config.ru +69 -0
  110. data/sample/index.html +14 -0
  111. data/spec/action_class_finder_spec.rb +12 -0
  112. data/spec/actions/button_action_spec.rb +63 -0
  113. data/spec/actions/generic_action_spec.rb +521 -0
  114. data/spec/actions/input_action_spec.rb +59 -0
  115. data/spec/actions/link_action_spec.rb +92 -0
  116. data/spec/builder/custom_builder_spec.rb +116 -0
  117. data/spec/builder/error_proc_spec.rb +27 -0
  118. data/spec/builder/semantic_fields_for_spec.rb +142 -0
  119. data/spec/fast_spec_helper.rb +12 -0
  120. data/spec/generators/formtastic/form/form_generator_spec.rb +131 -0
  121. data/spec/generators/formtastic/input/input_generator_spec.rb +124 -0
  122. data/spec/generators/formtastic/install/install_generator_spec.rb +47 -0
  123. data/spec/helpers/action_helper_spec.rb +19 -0
  124. data/spec/helpers/actions_helper_spec.rb +143 -0
  125. data/spec/helpers/form_helper_spec.rb +218 -0
  126. data/spec/helpers/input_helper_spec.rb +6 -0
  127. data/spec/helpers/inputs_helper_spec.rb +655 -0
  128. data/spec/helpers/namespaced_action_helper_spec.rb +43 -0
  129. data/spec/helpers/namespaced_input_helper_spec.rb +36 -0
  130. data/spec/helpers/reflection_helper_spec.rb +32 -0
  131. data/spec/helpers/semantic_errors_helper_spec.rb +112 -0
  132. data/spec/i18n_spec.rb +210 -0
  133. data/spec/input_class_finder_spec.rb +10 -0
  134. data/spec/inputs/base/collections_spec.rb +76 -0
  135. data/spec/inputs/base/validations_spec.rb +342 -0
  136. data/spec/inputs/boolean_input_spec.rb +254 -0
  137. data/spec/inputs/check_boxes_input_spec.rb +546 -0
  138. data/spec/inputs/color_input_spec.rb +97 -0
  139. data/spec/inputs/country_input_spec.rb +133 -0
  140. data/spec/inputs/custom_input_spec.rb +55 -0
  141. data/spec/inputs/datalist_input_spec.rb +61 -0
  142. data/spec/inputs/date_picker_input_spec.rb +449 -0
  143. data/spec/inputs/date_select_input_spec.rb +235 -0
  144. data/spec/inputs/datetime_picker_input_spec.rb +490 -0
  145. data/spec/inputs/datetime_select_input_spec.rb +193 -0
  146. data/spec/inputs/email_input_spec.rb +85 -0
  147. data/spec/inputs/file_input_spec.rb +89 -0
  148. data/spec/inputs/hidden_input_spec.rb +135 -0
  149. data/spec/inputs/include_blank_spec.rb +78 -0
  150. data/spec/inputs/label_spec.rb +149 -0
  151. data/spec/inputs/number_input_spec.rb +815 -0
  152. data/spec/inputs/password_input_spec.rb +99 -0
  153. data/spec/inputs/phone_input_spec.rb +85 -0
  154. data/spec/inputs/placeholder_spec.rb +71 -0
  155. data/spec/inputs/radio_input_spec.rb +328 -0
  156. data/spec/inputs/range_input_spec.rb +505 -0
  157. data/spec/inputs/readonly_spec.rb +50 -0
  158. data/spec/inputs/search_input_spec.rb +84 -0
  159. data/spec/inputs/select_input_spec.rb +615 -0
  160. data/spec/inputs/string_input_spec.rb +260 -0
  161. data/spec/inputs/text_input_spec.rb +187 -0
  162. data/spec/inputs/time_picker_input_spec.rb +455 -0
  163. data/spec/inputs/time_select_input_spec.rb +248 -0
  164. data/spec/inputs/time_zone_input_spec.rb +143 -0
  165. data/spec/inputs/url_input_spec.rb +85 -0
  166. data/spec/inputs/with_options_spec.rb +43 -0
  167. data/spec/localizer_spec.rb +130 -0
  168. data/spec/namespaced_class_finder_spec.rb +79 -0
  169. data/spec/spec.opts +2 -0
  170. data/spec/spec_helper.rb +525 -0
  171. data/spec/support/custom_macros.rb +564 -0
  172. data/spec/support/deprecation.rb +6 -0
  173. data/spec/support/shared_examples.rb +1313 -0
  174. data/spec/support/specialized_class_finder_shared_example.rb +27 -0
  175. data/spec/support/test_environment.rb +31 -0
  176. data/spec/util_spec.rb +66 -0
  177. metadata +434 -161
  178. data/README.textile +0 -682
  179. data/generators/form/USAGE +0 -16
  180. data/generators/form/form_generator.rb +0 -111
  181. data/generators/formtastic/formtastic_generator.rb +0 -26
  182. data/init.rb +0 -5
  183. data/lib/formtastic/layout_helper.rb +0 -12
  184. data/lib/formtastic/railtie.rb +0 -14
  185. data/lib/generators/templates/formtastic.css +0 -145
  186. data/lib/generators/templates/formtastic_changes.css +0 -14
  187. data/lib/generators/templates/rails2/_form.html.erb +0 -5
  188. data/lib/generators/templates/rails2/_form.html.haml +0 -4
  189. data/rails/init.rb +0 -2
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "*select: options[:include_blank]" do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ''
10
+ mock_everything
11
+
12
+ @new_post.stub(:author_id).and_return(nil)
13
+ @new_post.stub(:publish_at).and_return(nil)
14
+ end
15
+
16
+ SELECT_INPUT_TYPES = {
17
+ :select => :author,
18
+ :datetime_select => :publish_at,
19
+ :date_select => :publish_at,
20
+ :time_select => :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
42
+
43
+ after do
44
+ Formtastic::FormBuilder.include_blank_for_select_by_default = true
45
+ end
46
+ end
47
+
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
56
+
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
64
+ end
65
+
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
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,149 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe 'Formtastic::FormBuilder#label' do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ''
10
+ mock_everything
11
+ end
12
+
13
+ it 'should add "required string" only once with caching enabled' do
14
+ with_config :i18n_cache_lookups, true do
15
+ ::I18n.backend.store_translations :en, { :formtastic => { :labels => { :post => { :title => "I18n title" } } } }
16
+ required_string = "[req_string]"
17
+ default_required_str = Formtastic::FormBuilder.required_string
18
+ Formtastic::FormBuilder.required_string = required_string
19
+
20
+ concat(semantic_form_for(@new_post) do |builder|
21
+ builder.input(:title, :required => true, :label => true)
22
+ end)
23
+ output_buffer.replace ''
24
+ concat(semantic_form_for(@new_post) do |builder|
25
+ builder.input(:title, :required => true, :label => true)
26
+ end)
27
+
28
+ ::I18n.backend.store_translations :en, { :formtastic => { :labels => { :post => { :title => nil } } } }
29
+ Formtastic::FormBuilder.required_string = default_required_str
30
+
31
+ output_buffer.scan(required_string).count.should == 1
32
+ end
33
+ end
34
+
35
+ it 'should humanize the given attribute' do
36
+ concat(semantic_form_for(@new_post) do |builder|
37
+ builder.input(:title)
38
+ end)
39
+ output_buffer.should have_tag('label', /Title/)
40
+ end
41
+
42
+ it 'should use i18n instead of the method name when method given as a String' do
43
+ with_config :i18n_cache_lookups, true do
44
+ ::I18n.backend.store_translations :en, { :formtastic => { :labels => { :post => { :title => "I18n title" } } } }
45
+ concat(semantic_form_for(@new_post) do |builder|
46
+ builder.input("title")
47
+ end)
48
+ ::I18n.backend.store_translations :en, { :formtastic => { :labels => { :post => { :title => nil } } } }
49
+ output_buffer.should have_tag('label', /I18n title/)
50
+ end
51
+ end
52
+
53
+ it 'should humanize the given attribute for date fields' do
54
+ concat(semantic_form_for(@new_post) do |builder|
55
+ builder.input(:publish_at)
56
+ end)
57
+ output_buffer.should have_tag('label', /Publish at/)
58
+ end
59
+
60
+ describe 'when required is given' do
61
+ it 'should append a required note' do
62
+ concat(semantic_form_for(@new_post) do |builder|
63
+ builder.input(:title, :required => true)
64
+ end)
65
+ output_buffer.should have_tag('label abbr', '*')
66
+ end
67
+ end
68
+
69
+ describe 'when a collection is given' do
70
+ it 'should use a supplied label_method for simple collections' do
71
+ with_deprecation_silenced do
72
+ concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
73
+ concat(builder.input(:author_id, :as => :check_boxes, :collection => [:a, :b, :c], :member_value => :to_s, :member_label => proc {|f| ('Label_%s' % [f])}))
74
+ end)
75
+ end
76
+ output_buffer.should have_tag('form li fieldset ol li label', /Label_[abc]/, :count => 3)
77
+ end
78
+
79
+ it 'should use a supplied value_method for simple collections' do
80
+ with_deprecation_silenced do
81
+ concat(semantic_form_for(:project, :url => 'http://test.host') do |builder|
82
+ concat(builder.input(:author_id, :as => :check_boxes, :collection => [:a, :b, :c], :member_value => proc {|f| ('Value_%s' % [f.to_s])}))
83
+ end)
84
+ end
85
+ output_buffer.should have_tag('form li fieldset ol li label input[value="Value_a"]')
86
+ output_buffer.should have_tag('form li fieldset ol li label input[value="Value_b"]')
87
+ output_buffer.should have_tag('form li fieldset ol li label input[value="Value_c"]')
88
+ end
89
+ end
90
+
91
+ describe 'when label is given' do
92
+ it 'should allow the text to be given as label option' do
93
+ concat(semantic_form_for(@new_post) do |builder|
94
+ builder.input(:title, :label => 'My label')
95
+ end)
96
+ output_buffer.should have_tag('label', /My label/)
97
+ end
98
+
99
+ it 'should allow the text to be given as label option for date fields' do
100
+ concat(semantic_form_for(@new_post) do |builder|
101
+ builder.input(:publish_at, :label => 'My other label')
102
+ end)
103
+ output_buffer.should have_tag('label', /My other label/)
104
+ end
105
+
106
+ it 'should return nil if label is false' do
107
+ concat(semantic_form_for(@new_post) do |builder|
108
+ builder.input(:title, :label => false)
109
+ end)
110
+ output_buffer.should_not have_tag('label')
111
+ output_buffer.should_not include(">")
112
+ end
113
+
114
+ it 'should return nil if label is false for timeish fragments' do
115
+ concat(semantic_form_for(@new_post) do |builder|
116
+ builder.input(:title, :as => :time_select, :label => false)
117
+ end)
118
+ output_buffer.should_not have_tag('li.time > label')
119
+ output_buffer.should_not include(">")
120
+ end
121
+
122
+ it 'should html escape the label string by default' do
123
+ concat(semantic_form_for(@new_post) do |builder|
124
+ builder.input(:title, :label => '<b>My label</b>')
125
+ end)
126
+ output_buffer.should include('&lt;b&gt;')
127
+ output_buffer.should_not include('<b>')
128
+ end
129
+
130
+ it 'should not html escape the label if configured that way' do
131
+ Formtastic::FormBuilder.escape_html_entities_in_hints_and_labels = false
132
+ concat(semantic_form_for(@new_post) do |builder|
133
+ builder.input(:title, :label => '<b>My label</b>')
134
+ end)
135
+ output_buffer.should have_tag("label b", "My label")
136
+ end
137
+
138
+ it 'should not html escape the label string for html_safe strings' do
139
+ Formtastic::FormBuilder.escape_html_entities_in_hints_and_labels = true
140
+ concat(semantic_form_for(@new_post) do |builder|
141
+ builder.input(:title, :label => '<b>My label</b>'.html_safe)
142
+ end)
143
+ output_buffer.should have_tag('label b')
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+
@@ -0,0 +1,815 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe 'number input' do
5
+
6
+ include FormtasticSpecHelper
7
+
8
+ before do
9
+ @output_buffer = ''
10
+ mock_everything
11
+
12
+ @new_post.class.stub(:validators_on).with(:title).and_return([
13
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :greater_than=>2})
14
+ ])
15
+ end
16
+
17
+ describe "all cases" do
18
+
19
+ before do
20
+ concat(
21
+ semantic_form_for(@new_post) do |builder|
22
+ concat(builder.input(:title, :as => :number))
23
+ end
24
+ )
25
+ end
26
+
27
+ it_should_have_input_wrapper_with_class(:number)
28
+ it_should_have_input_wrapper_with_class(:input)
29
+ it_should_have_input_wrapper_with_class(:numeric)
30
+ it_should_have_input_wrapper_with_class(:stringish)
31
+ it_should_have_input_wrapper_with_id("post_title_input")
32
+ it_should_have_label_with_text(/Title/)
33
+ it_should_have_label_for("post_title")
34
+ it_should_have_input_with_id("post_title")
35
+ it_should_have_input_with_type(:number)
36
+ it_should_have_input_with_name("post[title]")
37
+ # @todo this is not testing what it should be testing!
38
+ # it_should_use_default_text_field_size_when_not_nil(:string)
39
+ # it_should_not_use_default_text_field_size_when_nil(:string)
40
+ # it_should_apply_custom_input_attributes_when_input_html_provided(:string)
41
+ # it_should_apply_custom_for_to_label_when_input_html_id_provided(:string)
42
+ it_should_apply_error_logic_for_input_type(:number)
43
+
44
+ end
45
+
46
+ describe "when no object is provided" do
47
+ before do
48
+ concat(semantic_form_for(:project, :url => 'http://test.host/') do |builder|
49
+ concat(builder.input(:title, :as => :number, :input_html => { :min => 1, :max => 2 }))
50
+ end)
51
+ end
52
+
53
+ it_should_have_label_with_text(/Title/)
54
+ it_should_have_label_for("project_title")
55
+ it_should_have_input_with_id("project_title")
56
+ it_should_have_input_with_type(:number)
57
+ it_should_have_input_with_name("project[title]")
58
+ end
59
+
60
+ describe "when namespace provided" do
61
+ before do
62
+ concat(semantic_form_for(@new_post, :namespace => :context2) do |builder|
63
+ concat(builder.input(:title, :as => :number))
64
+ end)
65
+ end
66
+
67
+ it_should_have_input_wrapper_with_id("context2_post_title_input")
68
+ it_should_have_label_and_input_with_id("context2_post_title")
69
+ end
70
+
71
+ describe "when index is provided" do
72
+
73
+ before do
74
+ @output_buffer = ''
75
+ mock_everything
76
+
77
+ concat(semantic_form_for(@new_post) do |builder|
78
+ concat(builder.fields_for(:author, :index => 3) do |author|
79
+ concat(author.input(:name, :as => :number))
80
+ end)
81
+ end)
82
+ end
83
+
84
+ it 'should index the id of the wrapper' do
85
+ output_buffer.should have_tag("li#post_author_attributes_3_name_input")
86
+ end
87
+
88
+ it 'should index the id of the select tag' do
89
+ output_buffer.should have_tag("input#post_author_attributes_3_name")
90
+ end
91
+
92
+ it 'should index the name of the select tag' do
93
+ output_buffer.should have_tag("input[@name='post[author_attributes][3][name]']")
94
+ end
95
+
96
+ end
97
+
98
+
99
+ describe "when required" do
100
+ it "should add the required attribute to the input's html options" do
101
+ with_config :use_required_attribute, true do
102
+ concat(semantic_form_for(@new_post) do |builder|
103
+ concat(builder.input(:title, :as => :number, :required => true))
104
+ end)
105
+ output_buffer.should have_tag("input[@required]")
106
+ end
107
+ end
108
+ end
109
+
110
+ describe "when validations require a minimum value (:greater_than)" do
111
+ before do
112
+ @new_post.class.stub(:validators_on).with(:title).and_return([
113
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :greater_than=>2})
114
+ ])
115
+ end
116
+
117
+ it "should allow :input_html to override :min" do
118
+ concat(semantic_form_for(@new_post) do |builder|
119
+ builder.input(:title, :as => :number, :input_html => { :min => 5 })
120
+ end)
121
+ output_buffer.should have_tag('input[@min="5"]')
122
+ end
123
+
124
+ it "should allow :input_html to override :min through :in" do
125
+ concat(semantic_form_for(@new_post) do |builder|
126
+ builder.input(:title, :as => :number, :input_html => { :in => 5..102 })
127
+ end)
128
+ output_buffer.should have_tag('input[@min="5"]')
129
+ end
130
+
131
+ it "should allow options to override :min" do
132
+ concat(semantic_form_for(@new_post) do |builder|
133
+ builder.input(:title, :as => :number, :min => 5)
134
+ end)
135
+ output_buffer.should have_tag('input[@min="5"]')
136
+ end
137
+
138
+ it "should allow options to override :min through :in" do
139
+ concat(semantic_form_for(@new_post) do |builder|
140
+ builder.input(:title, :as => :number, :in => 5..102)
141
+ end)
142
+ output_buffer.should have_tag('input[@min="5"]')
143
+ end
144
+
145
+ describe "and the column is an integer" do
146
+ before do
147
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :integer))
148
+ end
149
+
150
+ it "should add a min attribute to the input one greater than the validation" do
151
+ concat(semantic_form_for(@new_post) do |builder|
152
+ builder.input(:title, :as => :number)
153
+ end)
154
+ output_buffer.should have_tag('input[@min="3"]')
155
+ end
156
+ end
157
+
158
+ describe "and the column is a float" do
159
+ before do
160
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :float))
161
+ end
162
+
163
+ it "should raise an error" do
164
+ lambda {
165
+ concat(semantic_form_for(@new_post) do |builder|
166
+ builder.input(:title, :as => :number)
167
+ end)
168
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMinimumAttributeError)
169
+ end
170
+ end
171
+
172
+ describe "and the column is a big decimal" do
173
+ before do
174
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :decimal))
175
+ end
176
+
177
+ it "should raise an error" do
178
+ lambda {
179
+ concat(semantic_form_for(@new_post) do |builder|
180
+ builder.input(:title, :as => :number)
181
+ end)
182
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMinimumAttributeError)
183
+ end
184
+ end
185
+
186
+ end
187
+
188
+ describe "when validations require a minimum value (:greater_than) that takes a proc" do
189
+ before do
190
+ @new_post.class.stub(:validators_on).with(:title).and_return([
191
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :greater_than=> Proc.new {|post| 2}})
192
+ ])
193
+ end
194
+
195
+ it "should allow :input_html to override :min" do
196
+ concat(semantic_form_for(@new_post) do |builder|
197
+ builder.input(:title, :as => :number, :input_html => { :min => 5 })
198
+ end)
199
+ output_buffer.should have_tag('input[@min="5"]')
200
+ end
201
+
202
+ it "should allow :input_html to override :min through :in" do
203
+ concat(semantic_form_for(@new_post) do |builder|
204
+ builder.input(:title, :as => :number, :input_html => { :in => 5..102 })
205
+ end)
206
+ output_buffer.should have_tag('input[@min="5"]')
207
+ end
208
+
209
+ it "should allow options to override :min" do
210
+ concat(semantic_form_for(@new_post) do |builder|
211
+ builder.input(:title, :as => :number, :min => 5)
212
+ end)
213
+ output_buffer.should have_tag('input[@min="5"]')
214
+ end
215
+
216
+ it "should allow options to override :min through :in" do
217
+ concat(semantic_form_for(@new_post) do |builder|
218
+ builder.input(:title, :as => :number, :in => 5..102)
219
+ end)
220
+ output_buffer.should have_tag('input[@min="5"]')
221
+ end
222
+
223
+ describe "and the column is an integer" do
224
+ before do
225
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :integer))
226
+ end
227
+
228
+ it "should add a min attribute to the input one greater than the validation" do
229
+ concat(semantic_form_for(@new_post) do |builder|
230
+ builder.input(:title, :as => :number)
231
+ end)
232
+ output_buffer.should have_tag('input[@min="3"]')
233
+ end
234
+ end
235
+
236
+ describe "and the column is a float" do
237
+ before do
238
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :float))
239
+ end
240
+
241
+ it "should raise an error" do
242
+ lambda {
243
+ concat(semantic_form_for(@new_post) do |builder|
244
+ builder.input(:title, :as => :number)
245
+ end)
246
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMinimumAttributeError)
247
+ end
248
+ end
249
+
250
+ describe "and the column is a big decimal" do
251
+ before do
252
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :decimal))
253
+ end
254
+
255
+ it "should raise an error" do
256
+ lambda {
257
+ concat(semantic_form_for(@new_post) do |builder|
258
+ builder.input(:title, :as => :number)
259
+ end)
260
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMinimumAttributeError)
261
+ end
262
+ end
263
+
264
+ end
265
+
266
+ describe "when validations require a minimum value (:greater_than_or_equal_to)" do
267
+ before do
268
+ @new_post.class.stub(:validators_on).with(:title).and_return([
269
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :greater_than_or_equal_to=>2})
270
+ ])
271
+ end
272
+
273
+ it "should allow :input_html to override :min" do
274
+ concat(semantic_form_for(@new_post) do |builder|
275
+ builder.input(:title, :as => :number, :input_html => { :min => 5 })
276
+ end)
277
+ output_buffer.should have_tag('input[@min="5"]')
278
+ end
279
+
280
+ it "should allow options to override :min" do
281
+ concat(semantic_form_for(@new_post) do |builder|
282
+ builder.input(:title, :as => :number, :min => 5)
283
+ end)
284
+ output_buffer.should have_tag('input[@min="5"]')
285
+ end
286
+
287
+ it "should allow :input_html to override :min with :in" do
288
+ concat(semantic_form_for(@new_post) do |builder|
289
+ builder.input(:title, :as => :number, :input_html => { :in => 5..102 })
290
+ end)
291
+ output_buffer.should have_tag('input[@min="5"]')
292
+ end
293
+
294
+ it "should allow options to override :min with :in" do
295
+ concat(semantic_form_for(@new_post) do |builder|
296
+ builder.input(:title, :as => :number, :in => 5..102)
297
+ end)
298
+ output_buffer.should have_tag('input[@min="5"]')
299
+ end
300
+
301
+
302
+ [:integer, :decimal, :float].each do |column_type|
303
+ describe "and the column is a #{column_type}" do
304
+ before do
305
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => column_type))
306
+ end
307
+
308
+ it "should add a max attribute to the input equal to the validation" do
309
+ concat(semantic_form_for(@new_post) do |builder|
310
+ builder.input(:title, :as => :number)
311
+ end)
312
+ output_buffer.should have_tag('input[@min="2"]')
313
+ end
314
+ end
315
+ end
316
+
317
+ describe "and there is no column" do
318
+ before do
319
+ @new_post.stub(:column_for_attribute).with(:title).and_return(nil)
320
+ end
321
+
322
+ it "should add a max attribute to the input equal to the validation" do
323
+ concat(semantic_form_for(@new_post) do |builder|
324
+ builder.input(:title, :as => :number)
325
+ end)
326
+ output_buffer.should have_tag('input[@min="2"]')
327
+ end
328
+ end
329
+ end
330
+
331
+ describe "when validations require a minimum value (:greater_than_or_equal_to) that takes a Proc" do
332
+ before do
333
+ @new_post.class.stub(:validators_on).with(:title).and_return([
334
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :greater_than_or_equal_to=> Proc.new { |post| 2}})
335
+ ])
336
+ end
337
+
338
+ it "should allow :input_html to override :min" do
339
+ concat(semantic_form_for(@new_post) do |builder|
340
+ builder.input(:title, :as => :number, :input_html => { :min => 5 })
341
+ end)
342
+ output_buffer.should have_tag('input[@min="5"]')
343
+ end
344
+
345
+ it "should allow options to override :min" do
346
+ concat(semantic_form_for(@new_post) do |builder|
347
+ builder.input(:title, :as => :number, :min => 5)
348
+ end)
349
+ output_buffer.should have_tag('input[@min="5"]')
350
+ end
351
+
352
+ it "should allow :input_html to override :min with :in" do
353
+ concat(semantic_form_for(@new_post) do |builder|
354
+ builder.input(:title, :as => :number, :input_html => { :in => 5..102 })
355
+ end)
356
+ output_buffer.should have_tag('input[@min="5"]')
357
+ end
358
+
359
+ it "should allow options to override :min with :in" do
360
+ concat(semantic_form_for(@new_post) do |builder|
361
+ builder.input(:title, :as => :number, :in => 5..102)
362
+ end)
363
+ output_buffer.should have_tag('input[@min="5"]')
364
+ end
365
+
366
+
367
+ [:integer, :decimal, :float].each do |column_type|
368
+ describe "and the column is a #{column_type}" do
369
+ before do
370
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => column_type))
371
+ end
372
+
373
+ it "should add a max attribute to the input equal to the validation" do
374
+ concat(semantic_form_for(@new_post) do |builder|
375
+ builder.input(:title, :as => :number)
376
+ end)
377
+ output_buffer.should have_tag('input[@min="2"]')
378
+ end
379
+ end
380
+ end
381
+
382
+ describe "and there is no column" do
383
+ before do
384
+ @new_post.stub(:column_for_attribute).with(:title).and_return(nil)
385
+ end
386
+
387
+ it "should add a max attribute to the input equal to the validation" do
388
+ concat(semantic_form_for(@new_post) do |builder|
389
+ builder.input(:title, :as => :number)
390
+ end)
391
+ output_buffer.should have_tag('input[@min="2"]')
392
+ end
393
+ end
394
+ end
395
+
396
+ describe "when validations require a maximum value (:less_than)" do
397
+
398
+ before do
399
+ @new_post.class.stub(:validators_on).with(:title).and_return([
400
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :less_than=>20})
401
+ ])
402
+ end
403
+
404
+ it "should allow :input_html to override :max" do
405
+ concat(semantic_form_for(@new_post) do |builder|
406
+ builder.input(:title, :as => :number, :input_html => { :max => 102 })
407
+ end)
408
+ output_buffer.should have_tag('input[@max="102"]')
409
+ end
410
+
411
+ it "should allow option to override :max" do
412
+ concat(semantic_form_for(@new_post) do |builder|
413
+ builder.input(:title, :as => :number, :max => 102)
414
+ end)
415
+ output_buffer.should have_tag('input[@max="102"]')
416
+ end
417
+
418
+ it "should allow :input_html to override :max with :in" do
419
+ concat(semantic_form_for(@new_post) do |builder|
420
+ builder.input(:title, :as => :number, :input_html => { :in => 1..102 })
421
+ end)
422
+ output_buffer.should have_tag('input[@max="102"]')
423
+ end
424
+
425
+ it "should allow option to override :max with :in" do
426
+ concat(semantic_form_for(@new_post) do |builder|
427
+ builder.input(:title, :as => :number, :in => 1..102)
428
+ end)
429
+ output_buffer.should have_tag('input[@max="102"]')
430
+ end
431
+
432
+ describe "and the column is an integer" do
433
+ before do
434
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :integer))
435
+ end
436
+
437
+ it "should add a max attribute to the input one greater than the validation" do
438
+ concat(semantic_form_for(@new_post) do |builder|
439
+ builder.input(:title, :as => :number)
440
+ end)
441
+ output_buffer.should have_tag('input[@max="19"]')
442
+ end
443
+ end
444
+
445
+ describe "and the column is a float" do
446
+ before do
447
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :float))
448
+ end
449
+
450
+ it "should raise an error" do
451
+ lambda {
452
+ concat(semantic_form_for(@new_post) do |builder|
453
+ builder.input(:title, :as => :number)
454
+ end)
455
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMaximumAttributeError)
456
+ end
457
+ end
458
+
459
+ describe "and the column is a big decimal" do
460
+ before do
461
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :decimal))
462
+ end
463
+
464
+ it "should raise an error" do
465
+ lambda {
466
+ concat(semantic_form_for(@new_post) do |builder|
467
+ builder.input(:title, :as => :number)
468
+ end)
469
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMaximumAttributeError)
470
+ end
471
+ end
472
+ describe "and the validator takes a proc" do
473
+ before do
474
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :decimal))
475
+ end
476
+ end
477
+ end
478
+
479
+ describe "when validations require a maximum value (:less_than) that takes a Proc" do
480
+
481
+ before do
482
+ @new_post.class.stub(:validators_on).with(:title).and_return([
483
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :less_than=> Proc.new {|post| 20 }})
484
+ ])
485
+ end
486
+
487
+ it "should allow :input_html to override :max" do
488
+ concat(semantic_form_for(@new_post) do |builder|
489
+ builder.input(:title, :as => :number, :input_html => { :max => 102 })
490
+ end)
491
+ output_buffer.should have_tag('input[@max="102"]')
492
+ end
493
+
494
+ it "should allow option to override :max" do
495
+ concat(semantic_form_for(@new_post) do |builder|
496
+ builder.input(:title, :as => :number, :max => 102)
497
+ end)
498
+ output_buffer.should have_tag('input[@max="102"]')
499
+ end
500
+
501
+ it "should allow :input_html to override :max with :in" do
502
+ concat(semantic_form_for(@new_post) do |builder|
503
+ builder.input(:title, :as => :number, :input_html => { :in => 1..102 })
504
+ end)
505
+ output_buffer.should have_tag('input[@max="102"]')
506
+ end
507
+
508
+ it "should allow option to override :max with :in" do
509
+ concat(semantic_form_for(@new_post) do |builder|
510
+ builder.input(:title, :as => :number, :in => 1..102)
511
+ end)
512
+ output_buffer.should have_tag('input[@max="102"]')
513
+ end
514
+
515
+ describe "and the column is an integer" do
516
+ before do
517
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :integer))
518
+ end
519
+
520
+ it "should add a max attribute to the input one greater than the validation" do
521
+ concat(semantic_form_for(@new_post) do |builder|
522
+ builder.input(:title, :as => :number)
523
+ end)
524
+ output_buffer.should have_tag('input[@max="19"]')
525
+ end
526
+ end
527
+
528
+ describe "and the column is a float" do
529
+ before do
530
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :float))
531
+ end
532
+
533
+ it "should raise an error" do
534
+ lambda {
535
+ concat(semantic_form_for(@new_post) do |builder|
536
+ builder.input(:title, :as => :number)
537
+ end)
538
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMaximumAttributeError)
539
+ end
540
+ end
541
+
542
+ describe "and the column is a big decimal" do
543
+ before do
544
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :decimal))
545
+ end
546
+
547
+ it "should raise an error" do
548
+ lambda {
549
+ concat(semantic_form_for(@new_post) do |builder|
550
+ builder.input(:title, :as => :number)
551
+ end)
552
+ }.should raise_error(Formtastic::Inputs::Base::Validations::IndeterminableMaximumAttributeError)
553
+ end
554
+ end
555
+ describe "and the validator takes a proc" do
556
+ before do
557
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => :decimal))
558
+ end
559
+ end
560
+ end
561
+
562
+
563
+ describe "when validations require a maximum value (:less_than_or_equal_to)" do
564
+ before do
565
+ @new_post.class.stub(:validators_on).with(:title).and_return([
566
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :less_than_or_equal_to=>20})
567
+ ])
568
+ end
569
+
570
+ it "should allow :input_html to override :max" do
571
+ concat(semantic_form_for(@new_post) do |builder|
572
+ builder.input(:title, :as => :number, :input_html => { :max => 102 })
573
+ end)
574
+ output_buffer.should have_tag('input[@max="102"]')
575
+ end
576
+
577
+ it "should allow options to override :max" do
578
+ concat(semantic_form_for(@new_post) do |builder|
579
+ builder.input(:title, :as => :number, :max => 102)
580
+ end)
581
+ output_buffer.should have_tag('input[@max="102"]')
582
+ end
583
+
584
+ it "should allow :input_html to override :max with :in" do
585
+ concat(semantic_form_for(@new_post) do |builder|
586
+ builder.input(:title, :as => :number, :input_html => { :in => 1..102 })
587
+ end)
588
+ output_buffer.should have_tag('input[@max="102"]')
589
+ end
590
+
591
+ it "should allow options to override :max with :in" do
592
+ concat(semantic_form_for(@new_post) do |builder|
593
+ builder.input(:title, :as => :number, :in => 1..102)
594
+ end)
595
+ output_buffer.should have_tag('input[@max="102"]')
596
+ end
597
+
598
+ [:integer, :decimal, :float].each do |column_type|
599
+ describe "and the column is a #{column_type}" do
600
+ before do
601
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => column_type))
602
+ end
603
+
604
+ it "should add a max attribute to the input equal to the validation" do
605
+ concat(semantic_form_for(@new_post) do |builder|
606
+ builder.input(:title, :as => :number)
607
+ end)
608
+ output_buffer.should have_tag('input[@max="20"]')
609
+ end
610
+ end
611
+ end
612
+
613
+ describe "and there is no column" do
614
+ before do
615
+ @new_post.stub(:column_for_attribute).with(:title).and_return(nil)
616
+ end
617
+
618
+ it "should add a max attribute to the input equal to the validation" do
619
+ concat(semantic_form_for(@new_post) do |builder|
620
+ builder.input(:title, :as => :number)
621
+ end)
622
+ output_buffer.should have_tag('input[@max="20"]')
623
+ end
624
+ end
625
+ end
626
+
627
+ describe "when validations require a maximum value (:less_than_or_equal_to) that takes a proc" do
628
+ before do
629
+ @new_post.class.stub(:validators_on).with(:title).and_return([
630
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :less_than_or_equal_to=> Proc.new { |post| 20 }})
631
+ ])
632
+ end
633
+
634
+ it "should allow :input_html to override :max" do
635
+ concat(semantic_form_for(@new_post) do |builder|
636
+ builder.input(:title, :as => :number, :input_html => { :max => 102 })
637
+ end)
638
+ output_buffer.should have_tag('input[@max="102"]')
639
+ end
640
+
641
+ it "should allow options to override :max" do
642
+ concat(semantic_form_for(@new_post) do |builder|
643
+ builder.input(:title, :as => :number, :max => 102)
644
+ end)
645
+ output_buffer.should have_tag('input[@max="102"]')
646
+ end
647
+
648
+ it "should allow :input_html to override :max with :in" do
649
+ concat(semantic_form_for(@new_post) do |builder|
650
+ builder.input(:title, :as => :number, :input_html => { :in => 1..102 })
651
+ end)
652
+ output_buffer.should have_tag('input[@max="102"]')
653
+ end
654
+
655
+ it "should allow options to override :max with :in" do
656
+ concat(semantic_form_for(@new_post) do |builder|
657
+ builder.input(:title, :as => :number, :in => 1..102)
658
+ end)
659
+ output_buffer.should have_tag('input[@max="102"]')
660
+ end
661
+
662
+ [:integer, :decimal, :float].each do |column_type|
663
+ describe "and the column is a #{column_type}" do
664
+ before do
665
+ @new_post.stub(:column_for_attribute).with(:title).and_return(double('column', :type => column_type))
666
+ end
667
+
668
+ it "should add a max attribute to the input equal to the validation" do
669
+ concat(semantic_form_for(@new_post) do |builder|
670
+ builder.input(:title, :as => :number)
671
+ end)
672
+ output_buffer.should have_tag('input[@max="20"]')
673
+ end
674
+ end
675
+ end
676
+
677
+ describe "and there is no column" do
678
+ before do
679
+ @new_post.stub(:column_for_attribute).with(:title).and_return(nil)
680
+ end
681
+
682
+ it "should add a max attribute to the input equal to the validation" do
683
+ concat(semantic_form_for(@new_post) do |builder|
684
+ builder.input(:title, :as => :number)
685
+ end)
686
+ output_buffer.should have_tag('input[@max="20"]')
687
+ end
688
+ end
689
+ end
690
+
691
+ describe "when validations require conflicting minimum values (:greater_than, :greater_than_or_equal_to)" do
692
+ before do
693
+ @new_post.class.stub(:validators_on).with(:title).and_return([
694
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :greater_than => 20, :greater_than_or_equal_to=>2})
695
+ ])
696
+ end
697
+
698
+ it "should add a max attribute to the input equal to the :greater_than_or_equal_to validation" do
699
+ concat(semantic_form_for(@new_post) do |builder|
700
+ builder.input(:title, :as => :number)
701
+ end)
702
+ output_buffer.should have_tag('input[@min="2"]')
703
+ end
704
+ end
705
+
706
+ describe "when validations require conflicting maximum values (:less_than, :less_than_or_equal_to)" do
707
+ before do
708
+ @new_post.class.stub(:validators_on).with(:title).and_return([
709
+ active_model_numericality_validator([:title], {:only_integer=>false, :allow_nil=>false, :less_than => 20, :less_than_or_equal_to=>2})
710
+ ])
711
+ end
712
+
713
+ it "should add a max attribute to the input equal to the :greater_than_or_equal_to validation" do
714
+ concat(semantic_form_for(@new_post) do |builder|
715
+ builder.input(:title, :as => :number)
716
+ end)
717
+ output_buffer.should have_tag('input[@max="2"]')
718
+ end
719
+ end
720
+
721
+ describe "when validations require only an integer (:only_integer)" do
722
+
723
+ before do
724
+ @new_post.class.stub(:validators_on).with(:title).and_return([
725
+ active_model_numericality_validator([:title], {:allow_nil=>false, :only_integer=>true})
726
+ ])
727
+ end
728
+
729
+ it "should add a step=1 attribute to the input to signify that only whole numbers are allowed" do
730
+ concat(semantic_form_for(@new_post) do |builder|
731
+ builder.input(:title, :as => :number)
732
+ end)
733
+ output_buffer.should have_tag('input[@step="1"]')
734
+ end
735
+
736
+ it "should let input_html override :step" do
737
+ concat(semantic_form_for(@new_post) do |builder|
738
+ builder.input(:title, :as => :number, :input_html => { :step => 3 })
739
+ end)
740
+ output_buffer.should have_tag('input[@step="3"]')
741
+ end
742
+
743
+ it "should let options override :step" do
744
+ concat(semantic_form_for(@new_post) do |builder|
745
+ builder.input(:title, :as => :number, :step => 3)
746
+ end)
747
+ output_buffer.should have_tag('input[@step="3"]')
748
+ end
749
+
750
+ end
751
+
752
+ describe "when validations require a :step (non standard)" do
753
+
754
+ before do
755
+ @new_post.class.stub(:validators_on).with(:title).and_return([
756
+ active_model_numericality_validator([:title], {:allow_nil=>false, :only_integer=>true, :step=>2})
757
+ ])
758
+ end
759
+
760
+ it "should add a step=1 attribute to the input to signify that only whole numbers are allowed" do
761
+ concat(semantic_form_for(@new_post) do |builder|
762
+ builder.input(:title, :as => :number)
763
+ end)
764
+ output_buffer.should have_tag('input[@step="2"]')
765
+ end
766
+
767
+ it "should let input_html override :step" do
768
+ concat(semantic_form_for(@new_post) do |builder|
769
+ builder.input(:title, :as => :number, :input_html => { :step => 3 })
770
+ end)
771
+ output_buffer.should have_tag('input[@step="3"]')
772
+ end
773
+
774
+ it "should let options override :step" do
775
+ concat(semantic_form_for(@new_post) do |builder|
776
+ builder.input(:title, :as => :number, :step => 3)
777
+ end)
778
+ output_buffer.should have_tag('input[@step="3"]')
779
+ end
780
+
781
+ end
782
+
783
+ describe "when validations do not specify :step (non standard) or :only_integer" do
784
+
785
+ before do
786
+ @new_post.class.stub(:validators_on).with(:title).and_return([
787
+ active_model_numericality_validator([:title], {:allow_nil=>false})
788
+ ])
789
+ end
790
+
791
+ it "should default step to 'any'" do
792
+ concat(semantic_form_for(@new_post) do |builder|
793
+ builder.input(:title, :as => :number)
794
+ end)
795
+ output_buffer.should have_tag('input[@step="any"]')
796
+ end
797
+
798
+ it "should let input_html set :step" do
799
+ concat(semantic_form_for(@new_post) do |builder|
800
+ builder.input(:title, :as => :number, :input_html => { :step => 3 })
801
+ end)
802
+ output_buffer.should have_tag('input[@step="3"]')
803
+ end
804
+
805
+ it "should let options set :step" do
806
+ concat(semantic_form_for(@new_post) do |builder|
807
+ builder.input(:title, :as => :number, :step => 3)
808
+ end)
809
+ output_buffer.should have_tag('input[@step="3"]')
810
+ end
811
+
812
+ end
813
+
814
+ end
815
+