actionpack 2.1.2 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (200) hide show
  1. data/CHANGELOG +223 -7
  2. data/README +6 -12
  3. data/Rakefile +11 -11
  4. data/lib/action_controller.rb +9 -9
  5. data/lib/action_controller/assertions/response_assertions.rb +29 -78
  6. data/lib/action_controller/assertions/routing_assertions.rb +33 -33
  7. data/lib/action_controller/assertions/selector_assertions.rb +9 -5
  8. data/lib/action_controller/base.rb +227 -161
  9. data/lib/action_controller/benchmarking.rb +37 -24
  10. data/lib/action_controller/caching/actions.rb +53 -21
  11. data/lib/action_controller/caching/fragments.rb +10 -36
  12. data/lib/action_controller/caching/sweeping.rb +3 -3
  13. data/lib/action_controller/cgi_ext/session.rb +2 -22
  14. data/lib/action_controller/cgi_process.rb +8 -46
  15. data/lib/action_controller/components.rb +4 -1
  16. data/lib/action_controller/cookies.rb +10 -0
  17. data/lib/action_controller/dispatcher.rb +49 -15
  18. data/lib/action_controller/filters.rb +48 -10
  19. data/lib/action_controller/headers.rb +16 -14
  20. data/lib/action_controller/helpers.rb +2 -2
  21. data/lib/action_controller/http_authentication.rb +1 -1
  22. data/lib/action_controller/integration.rb +57 -60
  23. data/lib/action_controller/layout.rb +27 -53
  24. data/lib/action_controller/mime_responds.rb +5 -1
  25. data/lib/action_controller/mime_type.rb +64 -42
  26. data/lib/action_controller/mime_types.rb +2 -1
  27. data/lib/action_controller/performance_test.rb +16 -0
  28. data/lib/action_controller/polymorphic_routes.rb +16 -9
  29. data/lib/action_controller/rack_process.rb +303 -0
  30. data/lib/action_controller/request.rb +205 -97
  31. data/lib/action_controller/request_forgery_protection.rb +2 -2
  32. data/lib/action_controller/request_profiler.rb +0 -0
  33. data/lib/action_controller/rescue.rb +20 -115
  34. data/lib/action_controller/resources.rb +186 -83
  35. data/lib/action_controller/response.rb +140 -26
  36. data/lib/action_controller/routing.rb +28 -30
  37. data/lib/action_controller/routing/builder.rb +45 -54
  38. data/lib/action_controller/routing/optimisations.rb +31 -21
  39. data/lib/action_controller/routing/recognition_optimisation.rb +33 -27
  40. data/lib/action_controller/routing/route.rb +162 -147
  41. data/lib/action_controller/routing/route_set.rb +8 -7
  42. data/lib/action_controller/routing/routing_ext.rb +4 -1
  43. data/lib/action_controller/routing/segments.rb +50 -21
  44. data/lib/action_controller/session/cookie_store.rb +3 -2
  45. data/lib/action_controller/session/drb_server.rb +7 -7
  46. data/lib/action_controller/session_management.rb +6 -2
  47. data/lib/action_controller/streaming.rb +15 -8
  48. data/lib/action_controller/templates/rescues/diagnostics.erb +2 -2
  49. data/lib/action_controller/templates/rescues/template_error.erb +2 -2
  50. data/lib/action_controller/test_case.rb +66 -2
  51. data/lib/action_controller/test_process.rb +71 -66
  52. data/lib/action_controller/translation.rb +13 -0
  53. data/lib/action_controller/url_rewriter.rb +90 -13
  54. data/lib/action_controller/vendor/html-scanner/html/node.rb +9 -2
  55. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +1 -1
  56. data/lib/action_controller/vendor/html-scanner/html/selector.rb +2 -2
  57. data/lib/action_controller/verification.rb +2 -2
  58. data/lib/action_pack/version.rb +1 -1
  59. data/lib/action_view.rb +19 -11
  60. data/lib/action_view/base.rb +184 -150
  61. data/lib/action_view/helpers.rb +38 -0
  62. data/lib/action_view/helpers/active_record_helper.rb +56 -27
  63. data/lib/action_view/helpers/asset_tag_helper.rb +356 -153
  64. data/lib/action_view/helpers/atom_feed_helper.rb +74 -19
  65. data/lib/action_view/helpers/benchmark_helper.rb +3 -3
  66. data/lib/action_view/helpers/cache_helper.rb +1 -2
  67. data/lib/action_view/helpers/capture_helper.rb +19 -44
  68. data/lib/action_view/helpers/date_helper.rb +486 -296
  69. data/lib/action_view/helpers/debug_helper.rb +20 -13
  70. data/lib/action_view/helpers/form_helper.rb +71 -30
  71. data/lib/action_view/helpers/form_options_helper.rb +15 -85
  72. data/lib/action_view/helpers/form_tag_helper.rb +61 -38
  73. data/lib/action_view/helpers/javascript_helper.rb +80 -89
  74. data/lib/action_view/helpers/number_helper.rb +179 -74
  75. data/lib/action_view/helpers/prototype_helper.rb +216 -201
  76. data/lib/action_view/helpers/record_tag_helper.rb +4 -5
  77. data/lib/action_view/helpers/sanitize_helper.rb +65 -33
  78. data/lib/action_view/helpers/scriptaculous_helper.rb +2 -2
  79. data/lib/action_view/helpers/tag_helper.rb +39 -22
  80. data/lib/action_view/helpers/text_helper.rb +212 -118
  81. data/lib/action_view/helpers/translation_helper.rb +21 -0
  82. data/lib/action_view/helpers/url_helper.rb +100 -58
  83. data/lib/action_view/inline_template.rb +13 -14
  84. data/lib/action_view/locale/en.yml +91 -0
  85. data/lib/action_view/partials.rb +100 -55
  86. data/lib/action_view/paths.rb +125 -0
  87. data/lib/action_view/renderable.rb +102 -0
  88. data/lib/action_view/renderable_partial.rb +48 -0
  89. data/lib/action_view/template.rb +90 -101
  90. data/lib/action_view/template_error.rb +11 -21
  91. data/lib/action_view/template_handler.rb +8 -28
  92. data/lib/action_view/template_handlers.rb +45 -0
  93. data/lib/action_view/template_handlers/builder.rb +5 -15
  94. data/lib/action_view/template_handlers/erb.rb +9 -6
  95. data/lib/action_view/template_handlers/rjs.rb +2 -17
  96. data/lib/action_view/test_case.rb +7 -4
  97. data/test/abstract_unit.rb +4 -1
  98. data/test/active_record_unit.rb +28 -30
  99. data/test/activerecord/render_partial_with_record_identification_test.rb +25 -12
  100. data/test/controller/action_pack_assertions_test.rb +8 -37
  101. data/test/controller/addresses_render_test.rb +0 -3
  102. data/test/controller/assert_select_test.rb +51 -24
  103. data/test/controller/base_test.rb +4 -4
  104. data/test/controller/caching_test.rb +136 -66
  105. data/test/controller/capture_test.rb +1 -21
  106. data/test/controller/cgi_test.rb +157 -10
  107. data/test/controller/components_test.rb +41 -25
  108. data/test/controller/content_type_test.rb +49 -17
  109. data/test/controller/cookie_test.rb +1 -1
  110. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -3
  111. data/test/controller/dispatcher_test.rb +9 -1
  112. data/test/controller/filter_params_test.rb +2 -2
  113. data/test/controller/filters_test.rb +13 -13
  114. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  115. data/test/controller/html-scanner/node_test.rb +21 -0
  116. data/test/controller/html-scanner/sanitizer_test.rb +14 -0
  117. data/test/controller/integration_test.rb +167 -6
  118. data/test/controller/layout_test.rb +11 -68
  119. data/test/controller/logging_test.rb +46 -0
  120. data/test/controller/mime_responds_test.rb +61 -59
  121. data/test/controller/mime_type_test.rb +6 -6
  122. data/test/controller/polymorphic_routes_test.rb +37 -2
  123. data/test/controller/rack_test.rb +323 -0
  124. data/test/controller/redirect_test.rb +72 -71
  125. data/test/controller/render_test.rb +1120 -108
  126. data/test/controller/request_forgery_protection_test.rb +66 -52
  127. data/test/controller/request_test.rb +103 -146
  128. data/test/controller/rescue_test.rb +20 -24
  129. data/test/controller/resources_test.rb +408 -25
  130. data/test/controller/routing_test.rb +1774 -1774
  131. data/test/controller/send_file_test.rb +0 -4
  132. data/test/controller/session/cookie_store_test.rb +53 -1
  133. data/test/controller/test_test.rb +15 -37
  134. data/test/controller/translation_test.rb +26 -0
  135. data/test/controller/url_rewriter_test.rb +27 -28
  136. data/test/controller/view_paths_test.rb +48 -47
  137. data/test/fixtures/_top_level_partial.html.erb +1 -0
  138. data/test/fixtures/_top_level_partial_only.erb +1 -0
  139. data/test/fixtures/developers/_developer.erb +1 -0
  140. data/test/fixtures/fun/games/_game.erb +1 -0
  141. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  142. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  143. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  144. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  145. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  146. data/test/fixtures/layouts/_column.html.erb +2 -0
  147. data/test/fixtures/projects/_project.erb +1 -0
  148. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  149. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  150. data/test/fixtures/replies/_reply.erb +1 -0
  151. data/test/fixtures/test/_counter.html.erb +1 -0
  152. data/test/fixtures/test/_customer.erb +1 -1
  153. data/test/fixtures/test/_customer_with_var.erb +1 -0
  154. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  155. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  156. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  157. data/test/fixtures/test/hello.builder +1 -1
  158. data/test/fixtures/test/hyphen-ated.erb +1 -0
  159. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  160. data/test/fixtures/test/nested_layout.erb +3 -0
  161. data/test/fixtures/test/non_erb_block_content_for.builder +1 -1
  162. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  163. data/test/fixtures/test/template.erb +1 -0
  164. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  165. data/test/template/active_record_helper_i18n_test.rb +46 -0
  166. data/test/template/active_record_helper_test.rb +24 -24
  167. data/test/template/asset_tag_helper_test.rb +161 -29
  168. data/test/template/atom_feed_helper_test.rb +114 -5
  169. data/test/template/compiled_templates_test.rb +59 -0
  170. data/test/template/date_helper_i18n_test.rb +113 -0
  171. data/test/template/date_helper_test.rb +403 -109
  172. data/test/template/form_helper_test.rb +213 -154
  173. data/test/template/form_options_helper_test.rb +249 -897
  174. data/test/template/form_tag_helper_test.rb +80 -32
  175. data/test/template/javascript_helper_test.rb +17 -18
  176. data/test/template/number_helper_i18n_test.rb +54 -0
  177. data/test/template/number_helper_test.rb +43 -13
  178. data/test/template/prototype_helper_test.rb +101 -84
  179. data/test/template/record_tag_helper_test.rb +24 -20
  180. data/test/template/render_test.rb +193 -0
  181. data/test/template/sanitize_helper_test.rb +3 -3
  182. data/test/template/tag_helper_test.rb +34 -14
  183. data/test/template/text_helper_test.rb +83 -9
  184. data/test/template/translation_helper_test.rb +28 -0
  185. data/test/template/url_helper_test.rb +55 -18
  186. metadata +57 -18
  187. data/lib/action_view/helpers/javascripts/controls.js +0 -963
  188. data/lib/action_view/helpers/javascripts/dragdrop.js +0 -972
  189. data/lib/action_view/helpers/javascripts/effects.js +0 -1120
  190. data/lib/action_view/helpers/javascripts/prototype.js +0 -4225
  191. data/lib/action_view/partial_template.rb +0 -70
  192. data/lib/action_view/template_finder.rb +0 -177
  193. data/lib/action_view/template_handlers/compilable.rb +0 -128
  194. data/test/controller/custom_handler_test.rb +0 -45
  195. data/test/controller/new_render_test.rb +0 -945
  196. data/test/fixtures/test/block_content_for.erb +0 -2
  197. data/test/fixtures/test/erb_content_for.erb +0 -2
  198. data/test/template/deprecated_erb_variable_test.rb +0 -9
  199. data/test/template/template_finder_test.rb +0 -73
  200. data/test/template/template_object_test.rb +0 -95
@@ -0,0 +1,59 @@
1
+ require 'abstract_unit'
2
+ require 'controller/fake_models'
3
+
4
+ uses_mocha 'TestTemplateRecompilation' do
5
+ class CompiledTemplatesTest < Test::Unit::TestCase
6
+ def setup
7
+ @compiled_templates = ActionView::Base::CompiledTemplates
8
+ @compiled_templates.instance_methods.each do |m|
9
+ @compiled_templates.send(:remove_method, m) if m =~ /^_run_/
10
+ end
11
+ end
12
+
13
+ def test_template_gets_compiled
14
+ assert_equal 0, @compiled_templates.instance_methods.size
15
+ assert_deprecated do
16
+ assert_equal "Hello world!", render("test/hello_world.erb")
17
+ end
18
+ assert_equal 1, @compiled_templates.instance_methods.size
19
+ end
20
+
21
+ def test_template_gets_recompiled_when_using_different_keys_in_local_assigns
22
+ assert_equal 0, @compiled_templates.instance_methods.size
23
+ assert_deprecated do
24
+ assert_equal "Hello world!", render("test/hello_world.erb")
25
+ assert_equal "Hello world!", render("test/hello_world.erb", {:foo => "bar"})
26
+ end
27
+ assert_equal 2, @compiled_templates.instance_methods.size
28
+ end
29
+
30
+ def test_compiled_template_will_not_be_recompiled_when_rendered_with_identical_local_assigns
31
+ assert_equal 0, @compiled_templates.instance_methods.size
32
+ assert_deprecated do
33
+ assert_equal "Hello world!", render("test/hello_world.erb")
34
+ ActionView::Template.any_instance.expects(:compile!).never
35
+ assert_equal "Hello world!", render("test/hello_world.erb")
36
+ end
37
+ end
38
+
39
+ def test_compiled_template_will_always_be_recompiled_when_eager_loaded_templates_is_off
40
+ ActionView::PathSet::Path.expects(:eager_load_templates?).times(4).returns(false)
41
+ assert_equal 0, @compiled_templates.instance_methods.size
42
+
43
+ assert_deprecated do
44
+ assert_equal "Hello world!", render("#{FIXTURE_LOAD_PATH}/test/hello_world.erb")
45
+ end
46
+
47
+ ActionView::Template.any_instance.expects(:compile!).times(3)
48
+ assert_deprecated do
49
+ 3.times { assert_equal "Hello world!", render("#{FIXTURE_LOAD_PATH}/test/hello_world.erb") }
50
+ end
51
+ assert_equal 1, @compiled_templates.instance_methods.size
52
+ end
53
+
54
+ private
55
+ def render(*args)
56
+ ActionView::Base.new(ActionController::Base.view_paths, {}).render(*args)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,113 @@
1
+ require 'abstract_unit'
2
+
3
+ class DateHelperDistanceOfTimeInWordsI18nTests < Test::Unit::TestCase
4
+ include ActionView::Helpers::DateHelper
5
+ attr_reader :request
6
+
7
+ def setup
8
+ @from = Time.mktime(2004, 6, 6, 21, 45, 0)
9
+ end
10
+
11
+ uses_mocha 'date_helper_distance_of_time_in_words_i18n_test' do
12
+ # distance_of_time_in_words
13
+
14
+ def test_distance_of_time_in_words_calls_i18n
15
+ { # with include_seconds
16
+ [2.seconds, true] => [:'less_than_x_seconds', 5],
17
+ [9.seconds, true] => [:'less_than_x_seconds', 10],
18
+ [19.seconds, true] => [:'less_than_x_seconds', 20],
19
+ [30.seconds, true] => [:'half_a_minute', nil],
20
+ [59.seconds, true] => [:'less_than_x_minutes', 1],
21
+ [60.seconds, true] => [:'x_minutes', 1],
22
+
23
+ # without include_seconds
24
+ [29.seconds, false] => [:'less_than_x_minutes', 1],
25
+ [60.seconds, false] => [:'x_minutes', 1],
26
+ [44.minutes, false] => [:'x_minutes', 44],
27
+ [61.minutes, false] => [:'about_x_hours', 1],
28
+ [24.hours, false] => [:'x_days', 1],
29
+ [30.days, false] => [:'about_x_months', 1],
30
+ [60.days, false] => [:'x_months', 2],
31
+ [1.year, false] => [:'about_x_years', 1],
32
+ [3.years, false] => [:'over_x_years', 3]
33
+
34
+ }.each do |passed, expected|
35
+ assert_distance_of_time_in_words_translates_key passed, expected
36
+ end
37
+ end
38
+
39
+ def assert_distance_of_time_in_words_translates_key(passed, expected)
40
+ diff, include_seconds = *passed
41
+ key, count = *expected
42
+ to = @from + diff
43
+
44
+ options = {:locale => 'en', :scope => :'datetime.distance_in_words'}
45
+ options[:count] = count if count
46
+
47
+ I18n.expects(:t).with(key, options)
48
+ distance_of_time_in_words(@from, to, include_seconds, :locale => 'en')
49
+ end
50
+
51
+ def test_distance_of_time_pluralizations
52
+ { [:'less_than_x_seconds', 1] => 'less than 1 second',
53
+ [:'less_than_x_seconds', 2] => 'less than 2 seconds',
54
+ [:'less_than_x_minutes', 1] => 'less than a minute',
55
+ [:'less_than_x_minutes', 2] => 'less than 2 minutes',
56
+ [:'x_minutes', 1] => '1 minute',
57
+ [:'x_minutes', 2] => '2 minutes',
58
+ [:'about_x_hours', 1] => 'about 1 hour',
59
+ [:'about_x_hours', 2] => 'about 2 hours',
60
+ [:'x_days', 1] => '1 day',
61
+ [:'x_days', 2] => '2 days',
62
+ [:'about_x_years', 1] => 'about 1 year',
63
+ [:'about_x_years', 2] => 'about 2 years',
64
+ [:'over_x_years', 1] => 'over 1 year',
65
+ [:'over_x_years', 2] => 'over 2 years'
66
+
67
+ }.each do |args, expected|
68
+ key, count = *args
69
+ assert_equal expected, I18n.t(key, :count => count, :scope => 'datetime.distance_in_words')
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ class DateHelperSelectTagsI18nTests < Test::Unit::TestCase
76
+ include ActionView::Helpers::DateHelper
77
+ attr_reader :request
78
+
79
+ uses_mocha 'date_helper_select_tags_i18n_tests' do
80
+ def setup
81
+ I18n.stubs(:translate).with(:'date.month_names', :locale => 'en').returns Date::MONTHNAMES
82
+ end
83
+
84
+ # select_month
85
+
86
+ def test_select_month_given_use_month_names_option_does_not_translate_monthnames
87
+ I18n.expects(:translate).never
88
+ select_month(8, :locale => 'en', :use_month_names => Date::MONTHNAMES)
89
+ end
90
+
91
+ def test_select_month_translates_monthnames
92
+ I18n.expects(:translate).with(:'date.month_names', :locale => 'en').returns Date::MONTHNAMES
93
+ select_month(8, :locale => 'en')
94
+ end
95
+
96
+ def test_select_month_given_use_short_month_option_translates_abbr_monthnames
97
+ I18n.expects(:translate).with(:'date.abbr_month_names', :locale => 'en').returns Date::ABBR_MONTHNAMES
98
+ select_month(8, :locale => 'en', :use_short_month => true)
99
+ end
100
+
101
+ # date_or_time_select
102
+
103
+ def test_date_or_time_select_given_an_order_options_does_not_translate_order
104
+ I18n.expects(:translate).never
105
+ datetime_select('post', 'updated_at', :order => [:year, :month, :day], :locale => 'en')
106
+ end
107
+
108
+ def test_date_or_time_select_given_no_order_options_translates_order
109
+ I18n.expects(:translate).with(:'date.order', :locale => 'en').returns [:year, :month, :day]
110
+ datetime_select('post', 'updated_at', :locale => 'en')
111
+ end
112
+ end
113
+ end
@@ -17,7 +17,7 @@ class DateHelperTest < ActionView::TestCase
17
17
  end
18
18
  end
19
19
  end
20
-
20
+
21
21
  def assert_distance_of_time_in_words(from, to=nil)
22
22
  to ||= from
23
23
 
@@ -86,13 +86,13 @@ class DateHelperTest < ActionView::TestCase
86
86
  from = Time.mktime(2004, 6, 6, 21, 45, 0)
87
87
  assert_distance_of_time_in_words(from)
88
88
  end
89
-
89
+
90
90
  def test_distance_in_words_with_time_zones
91
91
  from = Time.mktime(2004, 6, 6, 21, 45, 0)
92
92
  assert_distance_of_time_in_words(from.in_time_zone('Alaska'))
93
93
  assert_distance_of_time_in_words(from.in_time_zone('Hawaii'))
94
94
  end
95
-
95
+
96
96
  def test_distance_in_words_with_different_time_zones
97
97
  from = Time.mktime(2004, 6, 6, 21, 45, 0)
98
98
  assert_distance_of_time_in_words(
@@ -100,13 +100,13 @@ class DateHelperTest < ActionView::TestCase
100
100
  from.in_time_zone('Hawaii')
101
101
  )
102
102
  end
103
-
103
+
104
104
  def test_distance_in_words_with_dates
105
105
  start_date = Date.new 1975, 1, 31
106
106
  end_date = Date.new 1977, 1, 31
107
107
  assert_equal("over 2 years", distance_of_time_in_words(start_date, end_date))
108
108
  end
109
-
109
+
110
110
  def test_distance_in_words_with_integers
111
111
  assert_equal "less than a minute", distance_of_time_in_words(59)
112
112
  assert_equal "about 1 hour", distance_of_time_in_words(60*60)
@@ -557,11 +557,8 @@ class DateHelperTest < ActionView::TestCase
557
557
  end
558
558
 
559
559
  def test_select_date_with_incomplete_order
560
- expected = %(<select id="date_first_day" name="date[first][day]">\n)
561
- expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
562
- expected << "</select>\n"
563
-
564
- expected << %(<select id="date_first_year" name="date[first][year]">\n)
560
+ # NOTE: modified this test because of minimal API change
561
+ expected = %(<select id="date_first_year" name="date[first][year]">\n)
565
562
  expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
566
563
  expected << "</select>\n"
567
564
 
@@ -569,6 +566,10 @@ class DateHelperTest < ActionView::TestCase
569
566
  expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n)
570
567
  expected << "</select>\n"
571
568
 
569
+ expected << %(<select id="date_first_day" name="date[first][day]">\n)
570
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
571
+ expected << "</select>\n"
572
+
572
573
  assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :order => [:day])
573
574
  end
574
575
 
@@ -757,6 +758,26 @@ class DateHelperTest < ActionView::TestCase
757
758
  assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), {:start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => "selector")
758
759
  end
759
760
 
761
+ def test_select_date_with_separator
762
+ expected = %(<select id="date_first_year" name="date[first][year]">\n)
763
+ expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
764
+ expected << "</select>\n"
765
+
766
+ expected << " / "
767
+
768
+ expected << %(<select id="date_first_month" name="date[first][month]">\n)
769
+ expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n)
770
+ expected << "</select>\n"
771
+
772
+ expected << " / "
773
+
774
+ expected << %(<select id="date_first_day" name="date[first][day]">\n)
775
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
776
+ expected << "</select>\n"
777
+
778
+ assert_dom_equal expected, select_date(Time.mktime(2003, 8, 16), { :date_separator => " / ", :start_year => 2003, :end_year => 2005, :prefix => "date[first]"})
779
+ end
780
+
760
781
  def test_select_datetime
761
782
  expected = %(<select id="date_first_year" name="date[first][year]">\n)
762
783
  expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
@@ -857,6 +878,42 @@ class DateHelperTest < ActionView::TestCase
857
878
  assert_dom_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), {:start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => 'selector')
858
879
  end
859
880
 
881
+ def test_select_datetime_with_all_separators
882
+ expected = %(<select id="date_first_year" name="date[first][year]" class="selector">\n)
883
+ expected << %(<option value="2003" selected="selected">2003</option>\n<option value="2004">2004</option>\n<option value="2005">2005</option>\n)
884
+ expected << "</select>\n"
885
+
886
+ expected << "/"
887
+
888
+ expected << %(<select id="date_first_month" name="date[first][month]" class="selector">\n)
889
+ expected << %(<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8" selected="selected">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n)
890
+ expected << "</select>\n"
891
+
892
+ expected << "/"
893
+
894
+ expected << %(<select id="date_first_day" name="date[first][day]" class="selector">\n)
895
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16" selected="selected">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
896
+ expected << "</select>\n"
897
+
898
+ expected << "&mdash;"
899
+
900
+ expected << %(<select id="date_first_hour" name="date[first][hour]" class="selector">\n)
901
+ expected << %(<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08" selected="selected">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n)
902
+ expected << "</select>\n"
903
+
904
+ expected << ":"
905
+
906
+ expected << %(<select id="date_first_minute" name="date[first][minute]" class="selector">\n)
907
+ expected << %(<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04" selected="selected">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n<option value="32">32</option>\n<option value="33">33</option>\n<option value="34">34</option>\n<option value="35">35</option>\n<option value="36">36</option>\n<option value="37">37</option>\n<option value="38">38</option>\n<option value="39">39</option>\n<option value="40">40</option>\n<option value="41">41</option>\n<option value="42">42</option>\n<option value="43">43</option>\n<option value="44">44</option>\n<option value="45">45</option>\n<option value="46">46</option>\n<option value="47">47</option>\n<option value="48">48</option>\n<option value="49">49</option>\n<option value="50">50</option>\n<option value="51">51</option>\n<option value="52">52</option>\n<option value="53">53</option>\n<option value="54">54</option>\n<option value="55">55</option>\n<option value="56">56</option>\n<option value="57">57</option>\n<option value="58">58</option>\n<option value="59">59</option>\n)
908
+ expected << "</select>\n"
909
+
910
+ assert_dom_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), { :datetime_separator => "&mdash;", :date_separator => "/", :time_separator => ":", :start_year => 2003, :end_year => 2005, :prefix => "date[first]"}, :class => 'selector')
911
+ end
912
+
913
+ def test_select_datetime_should_work_with_date
914
+ assert_nothing_raised { select_datetime(Date.today) }
915
+ end
916
+
860
917
  def test_select_time
861
918
  expected = %(<select id="date_hour" name="date[hour]">\n)
862
919
  expected << %(<option value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08" selected="selected">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n)
@@ -933,32 +990,9 @@ class DateHelperTest < ActionView::TestCase
933
990
  assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), {}, :class => 'selector')
934
991
  assert_dom_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), {:include_seconds => false}, :class => 'selector')
935
992
  end
936
-
937
- uses_mocha 'TestDatetimeAndTimeSelectUseTimeCurrentAsDefault' do
938
- def test_select_datetime_uses_time_current_as_default
939
- time = stub(:year => 2004, :month => 6, :day => 15, :hour => 16, :min => 35, :sec => 0)
940
- Time.expects(:current).returns time
941
- expects(:select_date).with(time, anything, anything).returns('')
942
- expects(:select_time).with(time, anything, anything).returns('')
943
- select_datetime
944
- end
945
-
946
- def test_select_time_uses_time_current_as_default
947
- time = stub(:year => 2004, :month => 6, :day => 15, :hour => 16, :min => 35, :sec => 0)
948
- Time.expects(:current).returns time
949
- expects(:select_hour).with(time, anything, anything).returns('')
950
- expects(:select_minute).with(time, anything, anything).returns('')
951
- select_time
952
- end
953
-
954
- def test_select_date_uses_date_current_as_default
955
- date = stub(:year => 2004, :month => 6, :day => 15)
956
- Date.expects(:current).returns date
957
- expects(:select_year).with(date, anything, anything).returns('')
958
- expects(:select_month).with(date, anything, anything).returns('')
959
- expects(:select_day).with(date, anything, anything).returns('')
960
- select_date
961
- end
993
+
994
+ def test_select_time_should_work_with_date
995
+ assert_nothing_raised { select_time(Date.today) }
962
996
  end
963
997
 
964
998
  def test_date_select
@@ -1002,17 +1036,15 @@ class DateHelperTest < ActionView::TestCase
1002
1036
  @post = Post.new
1003
1037
  @post.written_on = Date.new(2004, 6, 15)
1004
1038
 
1005
- _erbout = ''
1006
-
1007
1039
  fields_for :post, @post do |f|
1008
- _erbout.concat f.date_select(:written_on)
1040
+ concat f.date_select(:written_on)
1009
1041
  end
1010
1042
 
1011
1043
  expected = "<select id='post_written_on_1i' name='post[written_on(1i)]'>\n<option value='1999'>1999</option>\n<option value='2000'>2000</option>\n<option value='2001'>2001</option>\n<option value='2002'>2002</option>\n<option value='2003'>2003</option>\n<option selected='selected' value='2004'>2004</option>\n<option value='2005'>2005</option>\n<option value='2006'>2006</option>\n<option value='2007'>2007</option>\n<option value='2008'>2008</option>\n<option value='2009'>2009</option>\n</select>\n"
1012
1044
  expected << "<select id='post_written_on_2i' name='post[written_on(2i)]'>\n<option value='1'>January</option>\n<option value='2'>February</option>\n<option value='3'>March</option>\n<option value='4'>April</option>\n<option value='5'>May</option>\n<option selected='selected' value='6'>June</option>\n<option value='7'>July</option>\n<option value='8'>August</option>\n<option value='9'>September</option>\n<option value='10'>October</option>\n<option value='11'>November</option>\n<option value='12'>December</option>\n</select>\n"
1013
1045
  expected << "<select id='post_written_on_3i' name='post[written_on(3i)]'>\n<option value='1'>1</option>\n<option value='2'>2</option>\n<option value='3'>3</option>\n<option value='4'>4</option>\n<option value='5'>5</option>\n<option value='6'>6</option>\n<option value='7'>7</option>\n<option value='8'>8</option>\n<option value='9'>9</option>\n<option value='10'>10</option>\n<option value='11'>11</option>\n<option value='12'>12</option>\n<option value='13'>13</option>\n<option value='14'>14</option>\n<option selected='selected' value='15'>15</option>\n<option value='16'>16</option>\n<option value='17'>17</option>\n<option value='18'>18</option>\n<option value='19'>19</option>\n<option value='20'>20</option>\n<option value='21'>21</option>\n<option value='22'>22</option>\n<option value='23'>23</option>\n<option value='24'>24</option>\n<option value='25'>25</option>\n<option value='26'>26</option>\n<option value='27'>27</option>\n<option value='28'>28</option>\n<option value='29'>29</option>\n<option value='30'>30</option>\n<option value='31'>31</option>\n</select>\n"
1014
1046
 
1015
- assert_dom_equal(expected, _erbout)
1047
+ assert_dom_equal(expected, output_buffer)
1016
1048
  end
1017
1049
 
1018
1050
  def test_date_select_with_index
@@ -1117,6 +1149,46 @@ class DateHelperTest < ActionView::TestCase
1117
1149
 
1118
1150
  assert_dom_equal expected, date_select("post", "written_on", :include_blank => true)
1119
1151
  end
1152
+
1153
+ def test_date_select_with_nil_and_blank_and_order
1154
+ @post = Post.new
1155
+
1156
+ start_year = Time.now.year-5
1157
+ end_year = Time.now.year+5
1158
+
1159
+ expected = '<input name="post[written_on(3i)]" type="hidden" id="post_written_on_3i"/>' + "\n"
1160
+ expected << %{<select id="post_written_on_1i" name="post[written_on(1i)]">\n}
1161
+ expected << "<option value=\"\"></option>\n"
1162
+ start_year.upto(end_year) { |i| expected << %(<option value="#{i}">#{i}</option>\n) }
1163
+ expected << "</select>\n"
1164
+
1165
+ expected << %{<select id="post_written_on_2i" name="post[written_on(2i)]">\n}
1166
+ expected << "<option value=\"\"></option>\n"
1167
+ 1.upto(12) { |i| expected << %(<option value="#{i}">#{Date::MONTHNAMES[i]}</option>\n) }
1168
+ expected << "</select>\n"
1169
+
1170
+ assert_dom_equal expected, date_select("post", "written_on", :order=>[:year, :month], :include_blank=>true)
1171
+ end
1172
+
1173
+ def test_date_select_with_nil_and_blank_and_order
1174
+ @post = Post.new
1175
+
1176
+ start_year = Time.now.year-5
1177
+ end_year = Time.now.year+5
1178
+
1179
+ expected = '<input name="post[written_on(3i)]" type="hidden" id="post_written_on_3i"/>' + "\n"
1180
+ expected << %{<select id="post_written_on_1i" name="post[written_on(1i)]">\n}
1181
+ expected << "<option value=\"\"></option>\n"
1182
+ start_year.upto(end_year) { |i| expected << %(<option value="#{i}">#{i}</option>\n) }
1183
+ expected << "</select>\n"
1184
+
1185
+ expected << %{<select id="post_written_on_2i" name="post[written_on(2i)]">\n}
1186
+ expected << "<option value=\"\"></option>\n"
1187
+ 1.upto(12) { |i| expected << %(<option value="#{i}">#{Date::MONTHNAMES[i]}</option>\n) }
1188
+ expected << "</select>\n"
1189
+
1190
+ assert_dom_equal expected, date_select("post", "written_on", :order=>[:year, :month], :include_blank=>true)
1191
+ end
1120
1192
 
1121
1193
  def test_date_select_cant_override_discard_hour
1122
1194
  @post = Post.new
@@ -1161,10 +1233,8 @@ class DateHelperTest < ActionView::TestCase
1161
1233
  @post = Post.new
1162
1234
  @post.written_on = Date.new(2004, 6, 15)
1163
1235
 
1164
- _erbout = ''
1165
-
1166
1236
  fields_for :post, @post do |f|
1167
- _erbout.concat f.date_select(:written_on, {}, :class => 'selector')
1237
+ concat f.date_select(:written_on, {}, :class => 'selector')
1168
1238
  end
1169
1239
 
1170
1240
  expected = %{<select id="post_written_on_1i" name="post[written_on(1i)]" class="selector">\n}
@@ -1180,7 +1250,31 @@ class DateHelperTest < ActionView::TestCase
1180
1250
 
1181
1251
  expected << "</select>\n"
1182
1252
 
1183
- assert_dom_equal expected, _erbout
1253
+ assert_dom_equal expected, output_buffer
1254
+ end
1255
+
1256
+ def test_date_select_with_separator
1257
+ @post = Post.new
1258
+ @post.written_on = Date.new(2004, 6, 15)
1259
+
1260
+ expected = %{<select id="post_written_on_1i" name="post[written_on(1i)]">\n}
1261
+ expected << %{<option value="1999">1999</option>\n<option value="2000">2000</option>\n<option value="2001">2001</option>\n<option value="2002">2002</option>\n<option value="2003">2003</option>\n<option value="2004" selected="selected">2004</option>\n<option value="2005">2005</option>\n<option value="2006">2006</option>\n<option value="2007">2007</option>\n<option value="2008">2008</option>\n<option value="2009">2009</option>\n}
1262
+ expected << "</select>\n"
1263
+
1264
+ expected << " / "
1265
+
1266
+ expected << %{<select id="post_written_on_2i" name="post[written_on(2i)]">\n}
1267
+ expected << %{<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6" selected="selected">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n}
1268
+ expected << "</select>\n"
1269
+
1270
+ expected << " / "
1271
+
1272
+ expected << %{<select id="post_written_on_3i" name="post[written_on(3i)]">\n}
1273
+ expected << %{<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15" selected="selected">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n}
1274
+
1275
+ expected << "</select>\n"
1276
+
1277
+ assert_dom_equal expected, date_select("post", "written_on", { :date_separator => " / " })
1184
1278
  end
1185
1279
 
1186
1280
  def test_time_select
@@ -1192,16 +1286,31 @@ class DateHelperTest < ActionView::TestCase
1192
1286
  expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
1193
1287
 
1194
1288
  expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
1195
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1289
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1196
1290
  expected << "</select>\n"
1197
1291
  expected << " : "
1198
1292
  expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
1199
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1293
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1200
1294
  expected << "</select>\n"
1201
1295
 
1202
1296
  assert_dom_equal expected, time_select("post", "written_on")
1203
1297
  end
1204
1298
 
1299
+ def test_time_select_without_date_hidden_fields
1300
+ @post = Post.new
1301
+ @post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
1302
+
1303
+ expected = %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
1304
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1305
+ expected << "</select>\n"
1306
+ expected << " : "
1307
+ expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
1308
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1309
+ expected << "</select>\n"
1310
+
1311
+ assert_dom_equal expected, time_select("post", "written_on", :ignore_date => true)
1312
+ end
1313
+
1205
1314
  def test_time_select_with_seconds
1206
1315
  @post = Post.new
1207
1316
  @post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
@@ -1211,15 +1320,15 @@ class DateHelperTest < ActionView::TestCase
1211
1320
  expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
1212
1321
 
1213
1322
  expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
1214
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1323
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1215
1324
  expected << "</select>\n"
1216
1325
  expected << " : "
1217
1326
  expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
1218
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1327
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1219
1328
  expected << "</select>\n"
1220
1329
  expected << " : "
1221
1330
  expected << %(<select id="post_written_on_6i" name="post[written_on(6i)]">\n)
1222
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 35}>#{leading_zero_on_single_digits(i)}</option>\n) }
1331
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 35}>#{sprintf("%02d", i)}</option>\n) }
1223
1332
  expected << "</select>\n"
1224
1333
 
1225
1334
  assert_dom_equal expected, time_select("post", "written_on", :include_seconds => true)
@@ -1234,11 +1343,11 @@ class DateHelperTest < ActionView::TestCase
1234
1343
  expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
1235
1344
 
1236
1345
  expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]" class="selector">\n)
1237
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1346
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1238
1347
  expected << "</select>\n"
1239
1348
  expected << " : "
1240
1349
  expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]" class="selector">\n)
1241
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1350
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1242
1351
  expected << "</select>\n"
1243
1352
 
1244
1353
  assert_dom_equal expected, time_select("post", "written_on", {}, :class => 'selector')
@@ -1248,10 +1357,8 @@ class DateHelperTest < ActionView::TestCase
1248
1357
  @post = Post.new
1249
1358
  @post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
1250
1359
 
1251
- _erbout = ''
1252
-
1253
1360
  fields_for :post, @post do |f|
1254
- _erbout.concat f.time_select(:written_on, {}, :class => 'selector')
1361
+ concat f.time_select(:written_on, {}, :class => 'selector')
1255
1362
  end
1256
1363
 
1257
1364
  expected = %{<input type="hidden" id="post_written_on_1i" name="post[written_on(1i)]" value="2004" />\n}
@@ -1259,14 +1366,41 @@ class DateHelperTest < ActionView::TestCase
1259
1366
  expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
1260
1367
 
1261
1368
  expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]" class="selector">\n)
1262
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1369
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1263
1370
  expected << "</select>\n"
1264
1371
  expected << " : "
1265
1372
  expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]" class="selector">\n)
1266
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1373
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1374
+ expected << "</select>\n"
1375
+
1376
+ assert_dom_equal expected, output_buffer
1377
+ end
1378
+
1379
+ def test_time_select_with_separator
1380
+ @post = Post.new
1381
+ @post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
1382
+
1383
+ expected = %{<input type="hidden" id="post_written_on_1i" name="post[written_on(1i)]" value="2004" />\n}
1384
+ expected << %{<input type="hidden" id="post_written_on_2i" name="post[written_on(2i)]" value="6" />\n}
1385
+ expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
1386
+
1387
+ expected << %(<select id="post_written_on_4i" name="post[written_on(4i)]">\n)
1388
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1389
+ expected << "</select>\n"
1390
+
1391
+ expected << " - "
1392
+
1393
+ expected << %(<select id="post_written_on_5i" name="post[written_on(5i)]">\n)
1394
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1267
1395
  expected << "</select>\n"
1268
1396
 
1269
- assert_dom_equal expected, _erbout
1397
+ expected << " - "
1398
+
1399
+ expected << %(<select id="post_written_on_6i" name="post[written_on(6i)]">\n)
1400
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 35}>#{sprintf("%02d", i)}</option>\n) }
1401
+ expected << "</select>\n"
1402
+
1403
+ assert_dom_equal expected, time_select("post", "written_on", { :time_separator => " - ", :include_seconds => true })
1270
1404
  end
1271
1405
 
1272
1406
  def test_datetime_select
@@ -1297,7 +1431,7 @@ class DateHelperTest < ActionView::TestCase
1297
1431
 
1298
1432
  assert_dom_equal expected, datetime_select("post", "updated_at")
1299
1433
  end
1300
-
1434
+
1301
1435
  uses_mocha 'TestDatetimeSelectDefaultsToTimeZoneNowWhenConfigTimeZoneIsSet' do
1302
1436
  def test_datetime_select_defaults_to_time_zone_now_when_config_time_zone_is_set
1303
1437
  time = stub(:year => 2004, :month => 6, :day => 15, :hour => 16, :min => 35, :sec => 0)
@@ -1338,10 +1472,8 @@ class DateHelperTest < ActionView::TestCase
1338
1472
  @post = Post.new
1339
1473
  @post.updated_at = Time.local(2004, 6, 15, 16, 35)
1340
1474
 
1341
- _erbout = ''
1342
-
1343
1475
  fields_for :post, @post do |f|
1344
- _erbout.concat f.datetime_select(:updated_at, {}, :class => 'selector')
1476
+ concat f.datetime_select(:updated_at, {}, :class => 'selector')
1345
1477
  end
1346
1478
 
1347
1479
  expected = "<select id='post_updated_at_1i' name='post[updated_at(1i)]' class='selector'>\n<option value='1999'>1999</option>\n<option value='2000'>2000</option>\n<option value='2001'>2001</option>\n<option value='2002'>2002</option>\n<option value='2003'>2003</option>\n<option selected='selected' value='2004'>2004</option>\n<option value='2005'>2005</option>\n<option value='2006'>2006</option>\n<option value='2007'>2007</option>\n<option value='2008'>2008</option>\n<option value='2009'>2009</option>\n</select>\n"
@@ -1350,7 +1482,48 @@ class DateHelperTest < ActionView::TestCase
1350
1482
  expected << " &mdash; <select id='post_updated_at_4i' name='post[updated_at(4i)]' class='selector'>\n<option value='00'>00</option>\n<option value='01'>01</option>\n<option value='02'>02</option>\n<option value='03'>03</option>\n<option value='04'>04</option>\n<option value='05'>05</option>\n<option value='06'>06</option>\n<option value='07'>07</option>\n<option value='08'>08</option>\n<option value='09'>09</option>\n<option value='10'>10</option>\n<option value='11'>11</option>\n<option value='12'>12</option>\n<option value='13'>13</option>\n<option value='14'>14</option>\n<option value='15'>15</option>\n<option selected='selected' value='16'>16</option>\n<option value='17'>17</option>\n<option value='18'>18</option>\n<option value='19'>19</option>\n<option value='20'>20</option>\n<option value='21'>21</option>\n<option value='22'>22</option>\n<option value='23'>23</option>\n</select>\n"
1351
1483
  expected << " : <select id='post_updated_at_5i' name='post[updated_at(5i)]' class='selector'>\n<option value='00'>00</option>\n<option value='01'>01</option>\n<option value='02'>02</option>\n<option value='03'>03</option>\n<option value='04'>04</option>\n<option value='05'>05</option>\n<option value='06'>06</option>\n<option value='07'>07</option>\n<option value='08'>08</option>\n<option value='09'>09</option>\n<option value='10'>10</option>\n<option value='11'>11</option>\n<option value='12'>12</option>\n<option value='13'>13</option>\n<option value='14'>14</option>\n<option value='15'>15</option>\n<option value='16'>16</option>\n<option value='17'>17</option>\n<option value='18'>18</option>\n<option value='19'>19</option>\n<option value='20'>20</option>\n<option value='21'>21</option>\n<option value='22'>22</option>\n<option value='23'>23</option>\n<option value='24'>24</option>\n<option value='25'>25</option>\n<option value='26'>26</option>\n<option value='27'>27</option>\n<option value='28'>28</option>\n<option value='29'>29</option>\n<option value='30'>30</option>\n<option value='31'>31</option>\n<option value='32'>32</option>\n<option value='33'>33</option>\n<option value='34'>34</option>\n<option selected='selected' value='35'>35</option>\n<option value='36'>36</option>\n<option value='37'>37</option>\n<option value='38'>38</option>\n<option value='39'>39</option>\n<option value='40'>40</option>\n<option value='41'>41</option>\n<option value='42'>42</option>\n<option value='43'>43</option>\n<option value='44'>44</option>\n<option value='45'>45</option>\n<option value='46'>46</option>\n<option value='47'>47</option>\n<option value='48'>48</option>\n<option value='49'>49</option>\n<option value='50'>50</option>\n<option value='51'>51</option>\n<option value='52'>52</option>\n<option value='53'>53</option>\n<option value='54'>54</option>\n<option value='55'>55</option>\n<option value='56'>56</option>\n<option value='57'>57</option>\n<option value='58'>58</option>\n<option value='59'>59</option>\n</select>\n"
1352
1484
 
1353
- assert_dom_equal expected, _erbout
1485
+ assert_dom_equal expected, output_buffer
1486
+ end
1487
+
1488
+ def test_datetime_select_with_separators
1489
+ @post = Post.new
1490
+ @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35)
1491
+
1492
+ expected = %{<select id="post_updated_at_1i" name="post[updated_at(1i)]">\n}
1493
+ expected << %{<option value="1999">1999</option>\n<option value="2000">2000</option>\n<option value="2001">2001</option>\n<option value="2002">2002</option>\n<option value="2003">2003</option>\n<option value="2004" selected="selected">2004</option>\n<option value="2005">2005</option>\n<option value="2006">2006</option>\n<option value="2007">2007</option>\n<option value="2008">2008</option>\n<option value="2009">2009</option>\n}
1494
+ expected << "</select>\n"
1495
+
1496
+ expected << " / "
1497
+
1498
+ expected << %{<select id="post_updated_at_2i" name="post[updated_at(2i)]">\n}
1499
+ expected << %{<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6" selected="selected">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12">December</option>\n}
1500
+ expected << "</select>\n"
1501
+
1502
+ expected << " / "
1503
+
1504
+ expected << %{<select id="post_updated_at_3i" name="post[updated_at(3i)]">\n}
1505
+ expected << %{<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15" selected="selected">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n}
1506
+ expected << "</select>\n"
1507
+
1508
+ expected << " , "
1509
+
1510
+ expected << %(<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n)
1511
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1512
+ expected << "</select>\n"
1513
+
1514
+ expected << " - "
1515
+
1516
+ expected << %(<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n)
1517
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1518
+ expected << "</select>\n"
1519
+
1520
+ expected << " - "
1521
+
1522
+ expected << %(<select id="post_updated_at_6i" name="post[updated_at(6i)]">\n)
1523
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 35}>#{sprintf("%02d", i)}</option>\n) }
1524
+ expected << "</select>\n"
1525
+
1526
+ assert_dom_equal expected, datetime_select("post", "updated_at", { :date_separator => " / ", :datetime_separator => " , ", :time_separator => " - ", :include_seconds => true })
1354
1527
  end
1355
1528
 
1356
1529
  def test_date_select_with_zero_value_and_no_start_year
@@ -1363,8 +1536,7 @@ class DateHelperTest < ActionView::TestCase
1363
1536
  expected << "</select>\n"
1364
1537
 
1365
1538
  expected << %(<select id="date_first_day" name="date[first][day]">\n)
1366
- expected <<
1367
- %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1539
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1368
1540
  expected << "</select>\n"
1369
1541
 
1370
1542
  assert_dom_equal expected, select_date(0, :end_year => Date.today.year+1, :prefix => "date[first]")
@@ -1381,8 +1553,7 @@ class DateHelperTest < ActionView::TestCase
1381
1553
  expected << "</select>\n"
1382
1554
 
1383
1555
  expected << %(<select id="date_first_day" name="date[first][day]">\n)
1384
- expected <<
1385
- %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1556
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1386
1557
  expected << "</select>\n"
1387
1558
 
1388
1559
  assert_dom_equal expected, select_date(0, :start_year => 2003, :prefix => "date[first]")
@@ -1398,8 +1569,7 @@ class DateHelperTest < ActionView::TestCase
1398
1569
  expected << "</select>\n"
1399
1570
 
1400
1571
  expected << %(<select id="date_first_day" name="date[first][day]">\n)
1401
- expected <<
1402
- %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1572
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1403
1573
  expected << "</select>\n"
1404
1574
 
1405
1575
  assert_dom_equal expected, select_date(0, :prefix => "date[first]")
@@ -1415,8 +1585,7 @@ class DateHelperTest < ActionView::TestCase
1415
1585
  expected << "</select>\n"
1416
1586
 
1417
1587
  expected << %(<select id="date_first_day" name="date[first][day]">\n)
1418
- expected <<
1419
- %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1588
+ expected << %(<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31">31</option>\n)
1420
1589
  expected << "</select>\n"
1421
1590
 
1422
1591
  assert_dom_equal expected, select_date(nil, :prefix => "date[first]")
@@ -1523,15 +1692,15 @@ class DateHelperTest < ActionView::TestCase
1523
1692
  expected << " &mdash; "
1524
1693
 
1525
1694
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1526
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1695
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1527
1696
  expected << "</select>\n"
1528
1697
  expected << " : "
1529
1698
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1530
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1699
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1531
1700
  expected << "</select>\n"
1532
1701
  expected << " : "
1533
1702
  expected << %{<select id="post_updated_at_6i" name="post[updated_at(6i)]">\n}
1534
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 35}>#{leading_zero_on_single_digits(i)}</option>\n) }
1703
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 35}>#{sprintf("%02d", i)}</option>\n) }
1535
1704
  expected << "</select>\n"
1536
1705
 
1537
1706
  assert_dom_equal expected, datetime_select("post", "updated_at", :include_seconds => true)
@@ -1552,11 +1721,11 @@ class DateHelperTest < ActionView::TestCase
1552
1721
  expected << " &mdash; "
1553
1722
 
1554
1723
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1555
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1724
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1556
1725
  expected << "</select>\n"
1557
1726
  expected << " : "
1558
1727
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1559
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1728
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1560
1729
  expected << "</select>\n"
1561
1730
 
1562
1731
  assert_dom_equal expected, datetime_select("post", "updated_at", :discard_year => true)
@@ -1575,11 +1744,11 @@ class DateHelperTest < ActionView::TestCase
1575
1744
  expected << " &mdash; "
1576
1745
 
1577
1746
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1578
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1747
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1579
1748
  expected << "</select>\n"
1580
1749
  expected << " : "
1581
1750
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1582
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1751
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1583
1752
  expected << "</select>\n"
1584
1753
 
1585
1754
  assert_dom_equal expected, datetime_select("post", "updated_at", :discard_month => true)
@@ -1594,11 +1763,11 @@ class DateHelperTest < ActionView::TestCase
1594
1763
  expected << %{<input type="hidden" id="post_updated_at_3i" name="post[updated_at(3i)]" value="15" />\n}
1595
1764
 
1596
1765
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1597
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1766
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1598
1767
  expected << "</select>\n"
1599
1768
  expected << " : "
1600
1769
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1601
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1770
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1602
1771
  expected << "</select>\n"
1603
1772
 
1604
1773
  assert_dom_equal expected, datetime_select("post", "updated_at", :discard_year => true, :discard_month => true)
@@ -1621,11 +1790,11 @@ class DateHelperTest < ActionView::TestCase
1621
1790
  expected << " &mdash; "
1622
1791
 
1623
1792
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1624
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1793
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1625
1794
  expected << "</select>\n"
1626
1795
  expected << " : "
1627
1796
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1628
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1797
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1629
1798
  expected << "</select>\n"
1630
1799
 
1631
1800
  assert_dom_equal expected, datetime_select("post", "updated_at", :order => [:minute, :day, :hour, :month, :year, :second])
@@ -1646,11 +1815,11 @@ class DateHelperTest < ActionView::TestCase
1646
1815
  expected << " &mdash; "
1647
1816
 
1648
1817
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1649
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1818
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1650
1819
  expected << "</select>\n"
1651
1820
  expected << " : "
1652
1821
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1653
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1822
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1654
1823
  expected << "</select>\n"
1655
1824
 
1656
1825
  assert_dom_equal expected, datetime_select("post", "updated_at", :order => [:day, :month])
@@ -1673,11 +1842,11 @@ class DateHelperTest < ActionView::TestCase
1673
1842
  expected << " &mdash; "
1674
1843
 
1675
1844
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1676
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 15}>#{leading_zero_on_single_digits(i)}</option>\n) }
1845
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 15}>#{sprintf("%02d", i)}</option>\n) }
1677
1846
  expected << "</select>\n"
1678
1847
  expected << " : "
1679
1848
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1680
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 16}>#{leading_zero_on_single_digits(i)}</option>\n) }
1849
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 16}>#{sprintf("%02d", i)}</option>\n) }
1681
1850
  expected << "</select>\n"
1682
1851
 
1683
1852
  assert_dom_equal expected, datetime_select("post", "updated_at", :default => Time.local(2006, 9, 19, 15, 16, 35))
@@ -1720,11 +1889,11 @@ class DateHelperTest < ActionView::TestCase
1720
1889
  expected << " &mdash; "
1721
1890
 
1722
1891
  expected << %{<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n}
1723
- 0.upto(23) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 9}>#{leading_zero_on_single_digits(i)}</option>\n) }
1892
+ 0.upto(23) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 9}>#{sprintf("%02d", i)}</option>\n) }
1724
1893
  expected << "</select>\n"
1725
1894
  expected << " : "
1726
1895
  expected << %{<select id="post_updated_at_5i" name="post[updated_at(5i)]">\n}
1727
- 0.upto(59) { |i| expected << %(<option value="#{leading_zero_on_single_digits(i)}"#{' selected="selected"' if i == 42}>#{leading_zero_on_single_digits(i)}</option>\n) }
1896
+ 0.upto(59) { |i| expected << %(<option value="#{sprintf("%02d", i)}"#{' selected="selected"' if i == 42}>#{sprintf("%02d", i)}</option>\n) }
1728
1897
  expected << "</select>\n"
1729
1898
 
1730
1899
  assert_dom_equal expected, datetime_select("post", "updated_at", :default => { :month => 10, :minute => 42, :hour => 9 })
@@ -1759,33 +1928,158 @@ class DateHelperTest < ActionView::TestCase
1759
1928
  assert_dom_equal expected, datetime_select("post", "updated_at", {}, :class => 'selector')
1760
1929
  end
1761
1930
 
1762
- uses_mocha 'TestInstanceTagDefaultTimeFromOptions' do
1763
- def test_instance_tag_default_time_from_options_uses_time_current_as_default_when_hash_passed_as_arg
1764
- dummy_instance_tag = ActionView::Helpers::InstanceTag.new(1,2,3)
1765
- Time.expects(:current).returns Time.now
1766
- dummy_instance_tag.send!(:default_time_from_options, :hour => 2)
1767
- end
1768
-
1769
- def test_instance_tag_default_time_from_options_respects_hash_arg_settings_when_time_falls_in_system_local_dst_spring_gap
1770
- with_env_tz('US/Central') do
1771
- dummy_instance_tag = ActionView::Helpers::InstanceTag.new(1,2,3)
1772
- Time.stubs(:now).returns Time.local(2006, 4, 2, 1)
1773
- assert_equal 2, dummy_instance_tag.send!(:default_time_from_options, :hour => 2).hour
1774
- end
1775
- end
1776
-
1777
- def test_instance_tag_default_time_from_options_handles_far_future_date
1778
- dummy_instance_tag = ActionView::Helpers::InstanceTag.new(1,2,3)
1779
- time = dummy_instance_tag.send!(:default_time_from_options, :year => 2050, :month => 2, :day => 10, :hour => 15, :min => 30, :sec => 45)
1780
- assert_equal 2050, time.year
1781
- end
1931
+ def test_date_select_should_not_change_passed_options_hash
1932
+ @post = Post.new
1933
+ @post.updated_at = Time.local(2008, 7, 16, 23, 30)
1934
+
1935
+ options = {
1936
+ :order => [ :year, :month, :day ],
1937
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
1938
+ :discard_type => false,
1939
+ :include_blank => false,
1940
+ :ignore_date => false,
1941
+ :include_seconds => true
1942
+ }
1943
+ date_select(@post, :updated_at, options)
1944
+
1945
+ # note: the literal hash is intentional to show that the actual options hash isn't modified
1946
+ # don't change this!
1947
+ assert_equal({
1948
+ :order => [ :year, :month, :day ],
1949
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
1950
+ :discard_type => false,
1951
+ :include_blank => false,
1952
+ :ignore_date => false,
1953
+ :include_seconds => true
1954
+ }, options)
1955
+ end
1956
+
1957
+ def test_datetime_select_should_not_change_passed_options_hash
1958
+ @post = Post.new
1959
+ @post.updated_at = Time.local(2008, 7, 16, 23, 30)
1960
+
1961
+ options = {
1962
+ :order => [ :year, :month, :day ],
1963
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
1964
+ :discard_type => false,
1965
+ :include_blank => false,
1966
+ :ignore_date => false,
1967
+ :include_seconds => true
1968
+ }
1969
+ datetime_select(@post, :updated_at, options)
1970
+
1971
+ # note: the literal hash is intentional to show that the actual options hash isn't modified
1972
+ # don't change this!
1973
+ assert_equal({
1974
+ :order => [ :year, :month, :day ],
1975
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
1976
+ :discard_type => false,
1977
+ :include_blank => false,
1978
+ :ignore_date => false,
1979
+ :include_seconds => true
1980
+ }, options)
1981
+ end
1982
+
1983
+ def test_time_select_should_not_change_passed_options_hash
1984
+ @post = Post.new
1985
+ @post.updated_at = Time.local(2008, 7, 16, 23, 30)
1986
+
1987
+ options = {
1988
+ :order => [ :year, :month, :day ],
1989
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
1990
+ :discard_type => false,
1991
+ :include_blank => false,
1992
+ :ignore_date => false,
1993
+ :include_seconds => true
1994
+ }
1995
+ time_select(@post, :updated_at, options)
1996
+
1997
+ # note: the literal hash is intentional to show that the actual options hash isn't modified
1998
+ # don't change this!
1999
+ assert_equal({
2000
+ :order => [ :year, :month, :day ],
2001
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2002
+ :discard_type => false,
2003
+ :include_blank => false,
2004
+ :ignore_date => false,
2005
+ :include_seconds => true
2006
+ }, options)
2007
+ end
2008
+
2009
+ def test_select_date_should_not_change_passed_options_hash
2010
+ options = {
2011
+ :order => [ :year, :month, :day ],
2012
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2013
+ :discard_type => false,
2014
+ :include_blank => false,
2015
+ :ignore_date => false,
2016
+ :include_seconds => true
2017
+ }
2018
+ select_date(Date.today, options)
2019
+
2020
+ # note: the literal hash is intentional to show that the actual options hash isn't modified
2021
+ # don't change this!
2022
+ assert_equal({
2023
+ :order => [ :year, :month, :day ],
2024
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2025
+ :discard_type => false,
2026
+ :include_blank => false,
2027
+ :ignore_date => false,
2028
+ :include_seconds => true
2029
+ }, options)
2030
+ end
2031
+
2032
+ def test_select_datetime_should_not_change_passed_options_hash
2033
+ options = {
2034
+ :order => [ :year, :month, :day ],
2035
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2036
+ :discard_type => false,
2037
+ :include_blank => false,
2038
+ :ignore_date => false,
2039
+ :include_seconds => true
2040
+ }
2041
+ select_datetime(Time.now, options)
2042
+
2043
+ # note: the literal hash is intentional to show that the actual options hash isn't modified
2044
+ # don't change this!
2045
+ assert_equal({
2046
+ :order => [ :year, :month, :day ],
2047
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2048
+ :discard_type => false,
2049
+ :include_blank => false,
2050
+ :ignore_date => false,
2051
+ :include_seconds => true
2052
+ }, options)
2053
+ end
2054
+
2055
+ def test_select_time_should_not_change_passed_options_hash
2056
+ options = {
2057
+ :order => [ :year, :month, :day ],
2058
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2059
+ :discard_type => false,
2060
+ :include_blank => false,
2061
+ :ignore_date => false,
2062
+ :include_seconds => true
2063
+ }
2064
+ select_time(Time.now, options)
2065
+
2066
+ # note: the literal hash is intentional to show that the actual options hash isn't modified
2067
+ # don't change this!
2068
+ assert_equal({
2069
+ :order => [ :year, :month, :day ],
2070
+ :default => { :year => 2008, :month => 7, :day => 16, :hour => 23, :minute => 30, :second => 1 },
2071
+ :discard_type => false,
2072
+ :include_blank => false,
2073
+ :ignore_date => false,
2074
+ :include_seconds => true
2075
+ }, options)
1782
2076
  end
1783
-
2077
+
1784
2078
  protected
1785
2079
  def with_env_tz(new_tz = 'US/Eastern')
1786
2080
  old_tz, ENV['TZ'] = ENV['TZ'], new_tz
1787
2081
  yield
1788
2082
  ensure
1789
2083
  old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
1790
- end
2084
+ end
1791
2085
  end