actionpack 2.1.0 → 2.1.1
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.
- data/CHANGELOG +17 -0
- data/Rakefile +10 -6
- data/lib/action_controller.rb +0 -0
- data/lib/action_controller/assertions/response_assertions.rb +1 -1
- data/lib/action_controller/assertions/selector_assertions.rb +26 -46
- data/lib/action_controller/base.rb +8 -4
- data/lib/action_controller/dispatcher.rb +1 -1
- data/lib/action_controller/filters.rb +194 -195
- data/lib/action_controller/polymorphic_routes.rb +25 -12
- data/lib/action_controller/record_identifier.rb +20 -13
- data/lib/action_controller/request.rb +9 -6
- data/lib/action_controller/request_profiler.rb +0 -0
- data/lib/action_controller/response.rb +0 -0
- data/lib/action_controller/routing.rb +5 -1
- data/lib/action_controller/routing/builder.rb +1 -2
- data/lib/action_controller/routing/segments.rb +1 -1
- data/lib/action_controller/templates/rescues/layout.erb +1 -1
- data/lib/action_controller/test_process.rb +4 -2
- data/lib/action_controller/vendor/html-scanner/html/document.rb +1 -1
- data/lib/action_controller/verification.rb +1 -1
- data/lib/action_pack/version.rb +1 -1
- data/lib/action_view/base.rb +7 -3
- data/lib/action_view/helpers/asset_tag_helper.rb +14 -11
- data/lib/action_view/helpers/date_helper.rb +3 -3
- data/lib/action_view/helpers/form_helper.rb +5 -1
- data/lib/action_view/helpers/form_options_helper.rb +2 -2
- data/lib/action_view/helpers/form_tag_helper.rb +5 -3
- data/lib/action_view/helpers/javascript_helper.rb +4 -4
- data/lib/action_view/helpers/prototype_helper.rb +7 -7
- data/lib/action_view/helpers/tag_helper.rb +4 -3
- data/lib/action_view/helpers/text_helper.rb +1 -1
- data/lib/action_view/helpers/url_helper.rb +3 -5
- data/lib/action_view/partial_template.rb +1 -1
- data/test/controller/action_pack_assertions_test.rb +24 -5
- data/test/controller/assert_select_test.rb +6 -1
- data/test/controller/base_test.rb +37 -1
- data/test/controller/cgi_test.rb +0 -0
- data/test/controller/dispatcher_test.rb +2 -2
- data/test/controller/html-scanner/document_test.rb +25 -0
- data/test/controller/integration_upload_test.rb +1 -1
- data/test/controller/new_render_test.rb +22 -3
- data/test/controller/polymorphic_routes_test.rb +33 -0
- data/test/controller/redirect_test.rb +0 -0
- data/test/controller/render_test.rb +1 -1
- data/test/controller/request_test.rb +6 -0
- data/test/controller/resources_test.rb +15 -17
- data/test/controller/routing_test.rb +22 -2
- data/test/controller/session/cookie_store_test.rb +0 -0
- data/test/controller/test_test.rb +11 -2
- data/test/controller/verification_test.rb +34 -17
- data/test/fixtures/test/render_file_from_template.html.erb +1 -0
- data/test/template/date_helper_test.rb +59 -8
- data/test/template/deprecated_erb_variable_test.rb +9 -0
- data/test/template/form_options_helper_test.rb +505 -514
- data/test/template/form_tag_helper_test.rb +13 -0
- data/test/template/javascript_helper_test.rb +7 -4
- data/test/template/prototype_helper_test.rb +14 -6
- data/test/template/text_helper_test.rb +1 -0
- data/test/template/url_helper_test.rb +11 -1
- metadata +8 -4
File without changes
|
@@ -103,7 +103,7 @@ class TestController < ActionController::Base
|
|
103
103
|
def render_line_offset
|
104
104
|
begin
|
105
105
|
render :inline => '<% raise %>', :locals => {:foo => 'bar'}
|
106
|
-
rescue => exc
|
106
|
+
rescue RuntimeError => exc
|
107
107
|
end
|
108
108
|
line = exc.backtrace.first
|
109
109
|
render :text => line
|
@@ -12,6 +12,9 @@ class RequestTest < Test::Unit::TestCase
|
|
12
12
|
@request.remote_addr = '1.2.3.4'
|
13
13
|
assert_equal '1.2.3.4', @request.remote_ip
|
14
14
|
|
15
|
+
@request.remote_addr = '1.2.3.4,3.4.5.6'
|
16
|
+
assert_equal '1.2.3.4', @request.remote_ip
|
17
|
+
|
15
18
|
@request.env['HTTP_CLIENT_IP'] = '2.3.4.5'
|
16
19
|
assert_equal '1.2.3.4', @request.remote_ip
|
17
20
|
|
@@ -59,6 +62,9 @@ class RequestTest < Test::Unit::TestCase
|
|
59
62
|
assert_match /HTTP_X_FORWARDED_FOR="9.9.9.9, 3.4.5.6, 10.0.0.1, 172.31.4.4"/, e.message
|
60
63
|
assert_match /HTTP_CLIENT_IP="8.8.8.8"/, e.message
|
61
64
|
|
65
|
+
@request.env['HTTP_X_FORWARDED_FOR'] = '8.8.8.8, 9.9.9.9'
|
66
|
+
assert_equal '8.8.8.8', @request.remote_ip
|
67
|
+
|
62
68
|
@request.env.delete 'HTTP_CLIENT_IP'
|
63
69
|
@request.env.delete 'HTTP_X_FORWARDED_FOR'
|
64
70
|
end
|
@@ -28,18 +28,16 @@ module Backoffice
|
|
28
28
|
end
|
29
29
|
|
30
30
|
class ResourcesTest < Test::Unit::TestCase
|
31
|
-
|
32
|
-
|
33
31
|
# The assertions in these tests are incompatible with the hash method
|
34
32
|
# optimisation. This could indicate user level problems
|
35
33
|
def setup
|
36
34
|
ActionController::Base.optimise_named_routes = false
|
37
35
|
end
|
38
|
-
|
39
|
-
def
|
36
|
+
|
37
|
+
def teardown
|
40
38
|
ActionController::Base.optimise_named_routes = true
|
41
39
|
end
|
42
|
-
|
40
|
+
|
43
41
|
def test_should_arrange_actions
|
44
42
|
resource = ActionController::Resources::Resource.new(:messages,
|
45
43
|
:collection => { :rss => :get, :reorder => :post, :csv => :post },
|
@@ -159,14 +157,14 @@ class ResourcesTest < Test::Unit::TestCase
|
|
159
157
|
|
160
158
|
def test_with_collection_actions_and_name_prefix
|
161
159
|
actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete }
|
162
|
-
|
160
|
+
|
163
161
|
with_restful_routing :messages, :path_prefix => '/threads/:thread_id', :name_prefix => "thread_", :collection => actions do
|
164
162
|
assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options|
|
165
163
|
actions.each do |action, method|
|
166
164
|
assert_recognizes(options.merge(:action => action), :path => "/threads/1/messages/#{action}", :method => method)
|
167
165
|
end
|
168
166
|
end
|
169
|
-
|
167
|
+
|
170
168
|
assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options|
|
171
169
|
actions.keys.each do |action|
|
172
170
|
assert_named_route "/threads/1/messages/#{action}", "#{action}_thread_messages_path", :action => action
|
@@ -177,14 +175,14 @@ class ResourcesTest < Test::Unit::TestCase
|
|
177
175
|
|
178
176
|
def test_with_collection_action_and_name_prefix_and_formatted
|
179
177
|
actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete }
|
180
|
-
|
178
|
+
|
181
179
|
with_restful_routing :messages, :path_prefix => '/threads/:thread_id', :name_prefix => "thread_", :collection => actions do
|
182
180
|
assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options|
|
183
181
|
actions.each do |action, method|
|
184
182
|
assert_recognizes(options.merge(:action => action, :format => 'xml'), :path => "/threads/1/messages/#{action}.xml", :method => method)
|
185
183
|
end
|
186
184
|
end
|
187
|
-
|
185
|
+
|
188
186
|
assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options|
|
189
187
|
actions.keys.each do |action|
|
190
188
|
assert_named_route "/threads/1/messages/#{action}.xml", "formatted_#{action}_thread_messages_path", :action => action, :format => 'xml'
|
@@ -279,7 +277,7 @@ class ResourcesTest < Test::Unit::TestCase
|
|
279
277
|
end
|
280
278
|
end
|
281
279
|
end
|
282
|
-
|
280
|
+
|
283
281
|
def test_with_new_action_with_name_prefix
|
284
282
|
with_restful_routing :messages, :new => { :preview => :post }, :path_prefix => '/threads/:thread_id', :name_prefix => 'thread_' do
|
285
283
|
preview_options = {:action => 'preview', :thread_id => '1'}
|
@@ -293,7 +291,7 @@ class ResourcesTest < Test::Unit::TestCase
|
|
293
291
|
end
|
294
292
|
end
|
295
293
|
end
|
296
|
-
|
294
|
+
|
297
295
|
def test_with_formatted_new_action_with_name_prefix
|
298
296
|
with_restful_routing :messages, :new => { :preview => :post }, :path_prefix => '/threads/:thread_id', :name_prefix => 'thread_' do
|
299
297
|
preview_options = {:action => 'preview', :thread_id => '1', :format => 'xml'}
|
@@ -307,7 +305,7 @@ class ResourcesTest < Test::Unit::TestCase
|
|
307
305
|
end
|
308
306
|
end
|
309
307
|
end
|
310
|
-
|
308
|
+
|
311
309
|
def test_override_new_method
|
312
310
|
with_restful_routing :messages do
|
313
311
|
assert_restful_routes_for :messages do |options|
|
@@ -524,9 +522,9 @@ class ResourcesTest < Test::Unit::TestCase
|
|
524
522
|
map.resources :messages, :collection => {:search => :get}, :new => {:preview => :any}, :name_prefix => 'thread_', :path_prefix => '/threads/:thread_id'
|
525
523
|
map.resource :account, :member => {:login => :get}, :new => {:preview => :any}, :name_prefix => 'admin_', :path_prefix => '/admin'
|
526
524
|
end
|
527
|
-
|
525
|
+
|
528
526
|
action_separator = ActionController::Base.resource_action_separator
|
529
|
-
|
527
|
+
|
530
528
|
assert_simply_restful_for :messages, :name_prefix => 'thread_', :path_prefix => 'threads/1/', :options => { :thread_id => '1' }
|
531
529
|
assert_named_route "/threads/1/messages#{action_separator}search", "search_thread_messages_path", {}
|
532
530
|
assert_named_route "/threads/1/messages/new", "new_thread_message_path", {}
|
@@ -623,7 +621,7 @@ class ResourcesTest < Test::Unit::TestCase
|
|
623
621
|
assert_simply_restful_for :products, :controller => "backoffice/products"
|
624
622
|
end
|
625
623
|
end
|
626
|
-
|
624
|
+
|
627
625
|
def test_nested_resources_using_namespace
|
628
626
|
with_routing do |set|
|
629
627
|
set.draw do |map|
|
@@ -795,7 +793,7 @@ class ResourcesTest < Test::Unit::TestCase
|
|
795
793
|
|
796
794
|
yield options[:options] if block_given?
|
797
795
|
end
|
798
|
-
|
796
|
+
|
799
797
|
def assert_singleton_routes_for(singleton_name, options = {})
|
800
798
|
options[:options] ||= {}
|
801
799
|
options[:options][:controller] = options[:controller] || singleton_name.to_s.pluralize
|
@@ -855,7 +853,7 @@ class ResourcesTest < Test::Unit::TestCase
|
|
855
853
|
actual = @controller.send(route, options) rescue $!.class.name
|
856
854
|
assert_equal expected, actual, "Error on route: #{route}(#{options.inspect})"
|
857
855
|
end
|
858
|
-
|
856
|
+
|
859
857
|
def assert_resource_methods(expected, resource, action_method, method)
|
860
858
|
assert_equal expected.length, resource.send("#{action_method}_methods")[method].size, "#{resource.send("#{action_method}_methods")[method].inspect}"
|
861
859
|
expected.each do |action|
|
@@ -1983,6 +1983,26 @@ class RouteSetTest < Test::Unit::TestCase
|
|
1983
1983
|
Object.send(:remove_const, :Api)
|
1984
1984
|
end
|
1985
1985
|
|
1986
|
+
def test_namespace_with_path_prefix
|
1987
|
+
Object.const_set(:Api, Module.new { |m| m.const_set(:ProductsController, Class.new) })
|
1988
|
+
|
1989
|
+
set.draw do |map|
|
1990
|
+
|
1991
|
+
map.namespace 'api', :path_prefix => 'prefix' do |api|
|
1992
|
+
api.route 'inventory', :controller => "products", :action => 'inventory'
|
1993
|
+
end
|
1994
|
+
|
1995
|
+
end
|
1996
|
+
|
1997
|
+
request.path = "/prefix/inventory"
|
1998
|
+
request.method = :get
|
1999
|
+
assert_nothing_raised { set.recognize(request) }
|
2000
|
+
assert_equal("api/products", request.path_parameters[:controller])
|
2001
|
+
assert_equal("inventory", request.path_parameters[:action])
|
2002
|
+
ensure
|
2003
|
+
Object.send(:remove_const, :Api)
|
2004
|
+
end
|
2005
|
+
|
1986
2006
|
def test_generate_finds_best_fit
|
1987
2007
|
set.draw do |map|
|
1988
2008
|
map.connect "/people", :controller => "people", :action => "index"
|
@@ -2392,10 +2412,10 @@ uses_mocha 'route loading' do
|
|
2392
2412
|
end
|
2393
2413
|
|
2394
2414
|
def test_adding_inflections_forces_reload
|
2395
|
-
Inflector::Inflections.instance.expects(:uncountable).with('equipment')
|
2415
|
+
ActiveSupport::Inflector::Inflections.instance.expects(:uncountable).with('equipment')
|
2396
2416
|
routes.expects(:reload!)
|
2397
2417
|
|
2398
|
-
Inflector.inflections { |inflect| inflect.uncountable('equipment') }
|
2418
|
+
ActiveSupport::Inflector.inflections { |inflect| inflect.uncountable('equipment') }
|
2399
2419
|
end
|
2400
2420
|
|
2401
2421
|
def test_load_with_configuration
|
File without changes
|
@@ -531,6 +531,11 @@ XML
|
|
531
531
|
assert_equal content_type, file.content_type
|
532
532
|
assert_equal file.path, file.local_path
|
533
533
|
assert_equal expected, file.read
|
534
|
+
|
535
|
+
new_content_type = "new content_type"
|
536
|
+
file.content_type = new_content_type
|
537
|
+
assert_equal new_content_type, file.content_type
|
538
|
+
|
534
539
|
end
|
535
540
|
|
536
541
|
def test_test_uploaded_file_with_binary
|
@@ -571,7 +576,9 @@ XML
|
|
571
576
|
get :redirect_to_same_controller
|
572
577
|
assert_response :redirect
|
573
578
|
assert_redirected_to :controller => 'test_test/test', :action => 'test_uri', :id => 5
|
574
|
-
|
579
|
+
assert_deprecated 'follow_redirect' do
|
580
|
+
assert_nothing_raised { follow_redirect }
|
581
|
+
end
|
575
582
|
end
|
576
583
|
end
|
577
584
|
|
@@ -580,7 +587,9 @@ XML
|
|
580
587
|
get :redirect_to_different_controller
|
581
588
|
assert_response :redirect
|
582
589
|
assert_redirected_to :controller => 'fail', :id => 5
|
583
|
-
assert_raise(RuntimeError)
|
590
|
+
assert_raise(RuntimeError) do
|
591
|
+
assert_deprecated { follow_redirect }
|
592
|
+
end
|
584
593
|
end
|
585
594
|
end
|
586
595
|
|
@@ -21,10 +21,10 @@ class VerificationTest < Test::Unit::TestCase
|
|
21
21
|
|
22
22
|
verify :only => :guarded_by_method, :method => :post,
|
23
23
|
:redirect_to => { :action => "unguarded" }
|
24
|
-
|
24
|
+
|
25
25
|
verify :only => :guarded_by_xhr, :xhr => true,
|
26
26
|
:redirect_to => { :action => "unguarded" }
|
27
|
-
|
27
|
+
|
28
28
|
verify :only => :guarded_by_not_xhr, :xhr => false,
|
29
29
|
:redirect_to => { :action => "unguarded" }
|
30
30
|
|
@@ -39,10 +39,13 @@ class VerificationTest < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
verify :only => :no_default_action, :params => "santa"
|
41
41
|
|
42
|
+
verify :only => :guarded_with_back, :method => :post,
|
43
|
+
:redirect_to => :back
|
44
|
+
|
42
45
|
def guarded_one
|
43
46
|
render :text => "#{params[:one]}"
|
44
47
|
end
|
45
|
-
|
48
|
+
|
46
49
|
def guarded_one_for_named_route_test
|
47
50
|
render :text => "#{params[:one]}"
|
48
51
|
end
|
@@ -70,11 +73,11 @@ class VerificationTest < Test::Unit::TestCase
|
|
70
73
|
def guarded_by_method
|
71
74
|
render :text => "#{request.method}"
|
72
75
|
end
|
73
|
-
|
76
|
+
|
74
77
|
def guarded_by_xhr
|
75
78
|
render :text => "#{request.xhr?}"
|
76
79
|
end
|
77
|
-
|
80
|
+
|
78
81
|
def guarded_by_not_xhr
|
79
82
|
render :text => "#{request.xhr?}"
|
80
83
|
end
|
@@ -86,15 +89,19 @@ class VerificationTest < Test::Unit::TestCase
|
|
86
89
|
def two_redirects
|
87
90
|
render :nothing => true
|
88
91
|
end
|
89
|
-
|
92
|
+
|
90
93
|
def must_be_post
|
91
94
|
render :text => "Was a post!"
|
92
95
|
end
|
93
|
-
|
96
|
+
|
97
|
+
def guarded_with_back
|
98
|
+
render :text => "#{params[:one]}"
|
99
|
+
end
|
100
|
+
|
94
101
|
def no_default_action
|
95
102
|
# Will never run
|
96
103
|
end
|
97
|
-
|
104
|
+
|
98
105
|
protected
|
99
106
|
def rescue_action(e) raise end
|
100
107
|
|
@@ -109,7 +116,17 @@ class VerificationTest < Test::Unit::TestCase
|
|
109
116
|
@response = ActionController::TestResponse.new
|
110
117
|
ActionController::Routing::Routes.add_named_route :foo, '/foo', :controller => 'test', :action => 'foo'
|
111
118
|
end
|
112
|
-
|
119
|
+
|
120
|
+
def test_using_symbol_back_with_no_referrer
|
121
|
+
assert_raise(ActionController::RedirectBackError) { get :guarded_with_back }
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_using_symbol_back_redirects_to_referrer
|
125
|
+
@request.env["HTTP_REFERER"] = "/foo"
|
126
|
+
get :guarded_with_back
|
127
|
+
assert_redirected_to '/foo'
|
128
|
+
end
|
129
|
+
|
113
130
|
def test_no_deprecation_warning_for_named_route
|
114
131
|
assert_not_deprecated do
|
115
132
|
get :guarded_one_for_named_route_test, :two => "not one"
|
@@ -209,44 +226,44 @@ class VerificationTest < Test::Unit::TestCase
|
|
209
226
|
get :guarded_by_method
|
210
227
|
assert_redirected_to :action => "unguarded"
|
211
228
|
end
|
212
|
-
|
229
|
+
|
213
230
|
def test_guarded_by_xhr_with_prereqs
|
214
231
|
xhr :post, :guarded_by_xhr
|
215
232
|
assert_equal "true", @response.body
|
216
233
|
end
|
217
|
-
|
234
|
+
|
218
235
|
def test_guarded_by_xhr_without_prereqs
|
219
236
|
get :guarded_by_xhr
|
220
237
|
assert_redirected_to :action => "unguarded"
|
221
238
|
end
|
222
|
-
|
239
|
+
|
223
240
|
def test_guarded_by_not_xhr_with_prereqs
|
224
241
|
get :guarded_by_not_xhr
|
225
242
|
assert_equal "false", @response.body
|
226
243
|
end
|
227
|
-
|
244
|
+
|
228
245
|
def test_guarded_by_not_xhr_without_prereqs
|
229
246
|
xhr :post, :guarded_by_not_xhr
|
230
247
|
assert_redirected_to :action => "unguarded"
|
231
248
|
end
|
232
|
-
|
249
|
+
|
233
250
|
def test_guarded_post_and_calls_render_succeeds
|
234
251
|
post :must_be_post
|
235
252
|
assert_equal "Was a post!", @response.body
|
236
253
|
end
|
237
|
-
|
254
|
+
|
238
255
|
def test_default_failure_should_be_a_bad_request
|
239
256
|
post :no_default_action
|
240
257
|
assert_response :bad_request
|
241
258
|
end
|
242
|
-
|
259
|
+
|
243
260
|
def test_guarded_post_and_calls_render_fails_and_sets_allow_header
|
244
261
|
get :must_be_post
|
245
262
|
assert_response 405
|
246
263
|
assert_equal "Must be post", @response.body
|
247
264
|
assert_equal "POST", @response.headers["Allow"]
|
248
265
|
end
|
249
|
-
|
266
|
+
|
250
267
|
def test_second_redirect
|
251
268
|
assert_nothing_raised { get :two_redirects }
|
252
269
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :file => @path %>
|
@@ -1157,6 +1157,32 @@ class DateHelperTest < ActionView::TestCase
|
|
1157
1157
|
assert_dom_equal expected, date_select("post", "written_on", {}, :class => 'selector')
|
1158
1158
|
end
|
1159
1159
|
|
1160
|
+
def test_date_select_with_html_options_within_fields_for
|
1161
|
+
@post = Post.new
|
1162
|
+
@post.written_on = Date.new(2004, 6, 15)
|
1163
|
+
|
1164
|
+
_erbout = ''
|
1165
|
+
|
1166
|
+
fields_for :post, @post do |f|
|
1167
|
+
_erbout.concat f.date_select(:written_on, {}, :class => 'selector')
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
expected = %{<select id="post_written_on_1i" name="post[written_on(1i)]" class="selector">\n}
|
1171
|
+
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}
|
1172
|
+
expected << "</select>\n"
|
1173
|
+
|
1174
|
+
expected << %{<select id="post_written_on_2i" name="post[written_on(2i)]" class="selector">\n}
|
1175
|
+
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}
|
1176
|
+
expected << "</select>\n"
|
1177
|
+
|
1178
|
+
expected << %{<select id="post_written_on_3i" name="post[written_on(3i)]" class="selector">\n}
|
1179
|
+
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}
|
1180
|
+
|
1181
|
+
expected << "</select>\n"
|
1182
|
+
|
1183
|
+
assert_dom_equal expected, _erbout
|
1184
|
+
end
|
1185
|
+
|
1160
1186
|
def test_time_select
|
1161
1187
|
@post = Post.new
|
1162
1188
|
@post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
|
@@ -1218,6 +1244,31 @@ class DateHelperTest < ActionView::TestCase
|
|
1218
1244
|
assert_dom_equal expected, time_select("post", "written_on", {}, :class => 'selector')
|
1219
1245
|
end
|
1220
1246
|
|
1247
|
+
def test_time_select_with_html_options_within_fields_for
|
1248
|
+
@post = Post.new
|
1249
|
+
@post.written_on = Time.local(2004, 6, 15, 15, 16, 35)
|
1250
|
+
|
1251
|
+
_erbout = ''
|
1252
|
+
|
1253
|
+
fields_for :post, @post do |f|
|
1254
|
+
_erbout.concat f.time_select(:written_on, {}, :class => 'selector')
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
expected = %{<input type="hidden" id="post_written_on_1i" name="post[written_on(1i)]" value="2004" />\n}
|
1258
|
+
expected << %{<input type="hidden" id="post_written_on_2i" name="post[written_on(2i)]" value="6" />\n}
|
1259
|
+
expected << %{<input type="hidden" id="post_written_on_3i" name="post[written_on(3i)]" value="15" />\n}
|
1260
|
+
|
1261
|
+
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) }
|
1263
|
+
expected << "</select>\n"
|
1264
|
+
expected << " : "
|
1265
|
+
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) }
|
1267
|
+
expected << "</select>\n"
|
1268
|
+
|
1269
|
+
assert_dom_equal expected, _erbout
|
1270
|
+
end
|
1271
|
+
|
1221
1272
|
def test_datetime_select
|
1222
1273
|
@post = Post.new
|
1223
1274
|
@post.updated_at = Time.local(2004, 6, 15, 16, 35)
|
@@ -1283,23 +1334,23 @@ class DateHelperTest < ActionView::TestCase
|
|
1283
1334
|
end
|
1284
1335
|
end
|
1285
1336
|
|
1286
|
-
def
|
1337
|
+
def test_datetime_select_with_html_options_within_fields_for
|
1287
1338
|
@post = Post.new
|
1288
1339
|
@post.updated_at = Time.local(2004, 6, 15, 16, 35)
|
1289
1340
|
|
1290
1341
|
_erbout = ''
|
1291
1342
|
|
1292
1343
|
fields_for :post, @post do |f|
|
1293
|
-
_erbout.concat f.datetime_select(:updated_at)
|
1344
|
+
_erbout.concat f.datetime_select(:updated_at, {}, :class => 'selector')
|
1294
1345
|
end
|
1295
1346
|
|
1296
|
-
expected = "<select id='post_updated_at_1i' name='post[updated_at(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"
|
1297
|
-
expected << "<select id='post_updated_at_2i' name='post[updated_at(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"
|
1298
|
-
expected << "<select id='post_updated_at_3i' name='post[updated_at(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"
|
1299
|
-
|
1300
|
-
|
1347
|
+
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"
|
1348
|
+
expected << "<select id='post_updated_at_2i' name='post[updated_at(2i)]' class='selector'>\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"
|
1349
|
+
expected << "<select id='post_updated_at_3i' name='post[updated_at(3i)]' class='selector'>\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"
|
1350
|
+
expected << " — <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
|
+
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"
|
1301
1352
|
|
1302
|
-
assert_dom_equal
|
1353
|
+
assert_dom_equal expected, _erbout
|
1303
1354
|
end
|
1304
1355
|
|
1305
1356
|
def test_date_select_with_zero_value_and_no_start_year
|