actionpack 2.0.5 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. data/CHANGELOG +149 -7
  2. data/MIT-LICENSE +1 -1
  3. data/README +1 -1
  4. data/Rakefile +5 -6
  5. data/lib/action_controller.rb +2 -2
  6. data/lib/action_controller/assertions/model_assertions.rb +2 -1
  7. data/lib/action_controller/assertions/response_assertions.rb +4 -2
  8. data/lib/action_controller/assertions/routing_assertions.rb +3 -3
  9. data/lib/action_controller/assertions/selector_assertions.rb +30 -27
  10. data/lib/action_controller/assertions/tag_assertions.rb +3 -3
  11. data/lib/action_controller/base.rb +103 -129
  12. data/lib/action_controller/benchmarking.rb +3 -3
  13. data/lib/action_controller/caching.rb +41 -652
  14. data/lib/action_controller/caching/actions.rb +144 -0
  15. data/lib/action_controller/caching/fragments.rb +138 -0
  16. data/lib/action_controller/caching/pages.rb +154 -0
  17. data/lib/action_controller/caching/sql_cache.rb +18 -0
  18. data/lib/action_controller/caching/sweeping.rb +97 -0
  19. data/lib/action_controller/cgi_ext/cookie.rb +27 -23
  20. data/lib/action_controller/cgi_ext/stdinput.rb +1 -0
  21. data/lib/action_controller/cgi_process.rb +6 -4
  22. data/lib/action_controller/components.rb +7 -6
  23. data/lib/action_controller/cookies.rb +31 -19
  24. data/lib/action_controller/dispatcher.rb +51 -84
  25. data/lib/action_controller/filters.rb +295 -421
  26. data/lib/action_controller/flash.rb +1 -6
  27. data/lib/action_controller/headers.rb +31 -0
  28. data/lib/action_controller/helpers.rb +26 -9
  29. data/lib/action_controller/http_authentication.rb +1 -1
  30. data/lib/action_controller/integration.rb +65 -13
  31. data/lib/action_controller/layout.rb +24 -39
  32. data/lib/action_controller/mime_responds.rb +7 -3
  33. data/lib/action_controller/mime_type.rb +25 -9
  34. data/lib/action_controller/mime_types.rb +1 -1
  35. data/lib/action_controller/polymorphic_routes.rb +32 -17
  36. data/lib/action_controller/record_identifier.rb +10 -4
  37. data/lib/action_controller/request.rb +46 -30
  38. data/lib/action_controller/request_forgery_protection.rb +10 -9
  39. data/lib/action_controller/request_profiler.rb +29 -8
  40. data/lib/action_controller/rescue.rb +24 -24
  41. data/lib/action_controller/resources.rb +66 -23
  42. data/lib/action_controller/response.rb +2 -2
  43. data/lib/action_controller/routing.rb +113 -1229
  44. data/lib/action_controller/routing/builder.rb +204 -0
  45. data/lib/action_controller/{routing_optimisation.rb → routing/optimisations.rb} +13 -12
  46. data/lib/action_controller/routing/recognition_optimisation.rb +158 -0
  47. data/lib/action_controller/routing/route.rb +240 -0
  48. data/lib/action_controller/routing/route_set.rb +435 -0
  49. data/lib/action_controller/routing/routing_ext.rb +46 -0
  50. data/lib/action_controller/routing/segments.rb +283 -0
  51. data/lib/action_controller/session/active_record_store.rb +13 -8
  52. data/lib/action_controller/session/cookie_store.rb +20 -17
  53. data/lib/action_controller/session_management.rb +10 -3
  54. data/lib/action_controller/streaming.rb +45 -31
  55. data/lib/action_controller/test_case.rb +33 -23
  56. data/lib/action_controller/test_process.rb +39 -35
  57. data/lib/action_controller/url_rewriter.rb +18 -12
  58. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +1 -1
  59. data/lib/action_pack.rb +1 -1
  60. data/lib/action_pack/version.rb +2 -2
  61. data/lib/action_view.rb +11 -3
  62. data/lib/action_view/base.rb +73 -390
  63. data/lib/action_view/helpers/active_record_helper.rb +83 -62
  64. data/lib/action_view/helpers/asset_tag_helper.rb +101 -44
  65. data/lib/action_view/helpers/atom_feed_helper.rb +35 -7
  66. data/lib/action_view/helpers/benchmark_helper.rb +5 -3
  67. data/lib/action_view/helpers/cache_helper.rb +3 -2
  68. data/lib/action_view/helpers/capture_helper.rb +1 -2
  69. data/lib/action_view/helpers/date_helper.rb +104 -82
  70. data/lib/action_view/helpers/form_helper.rb +148 -75
  71. data/lib/action_view/helpers/form_options_helper.rb +44 -23
  72. data/lib/action_view/helpers/form_tag_helper.rb +22 -13
  73. data/lib/action_view/helpers/javascripts/controls.js +1 -1
  74. data/lib/action_view/helpers/javascripts/dragdrop.js +1 -1
  75. data/lib/action_view/helpers/javascripts/effects.js +1 -1
  76. data/lib/action_view/helpers/number_helper.rb +10 -3
  77. data/lib/action_view/helpers/prototype_helper.rb +61 -29
  78. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  79. data/lib/action_view/helpers/sanitize_helper.rb +23 -17
  80. data/lib/action_view/helpers/scriptaculous_helper.rb +86 -60
  81. data/lib/action_view/helpers/text_helper.rb +153 -125
  82. data/lib/action_view/helpers/url_helper.rb +83 -28
  83. data/lib/action_view/inline_template.rb +20 -0
  84. data/lib/action_view/partial_template.rb +70 -0
  85. data/lib/action_view/partials.rb +31 -73
  86. data/lib/action_view/template.rb +127 -0
  87. data/lib/action_view/template_error.rb +8 -7
  88. data/lib/action_view/template_finder.rb +177 -0
  89. data/lib/action_view/template_handler.rb +18 -1
  90. data/lib/action_view/template_handlers/builder.rb +10 -2
  91. data/lib/action_view/template_handlers/compilable.rb +128 -0
  92. data/lib/action_view/template_handlers/erb.rb +37 -2
  93. data/lib/action_view/template_handlers/rjs.rb +14 -1
  94. data/lib/action_view/test_case.rb +58 -0
  95. data/test/abstract_unit.rb +1 -1
  96. data/test/active_record_unit.rb +3 -6
  97. data/test/activerecord/active_record_store_test.rb +1 -2
  98. data/test/activerecord/render_partial_with_record_identification_test.rb +158 -41
  99. data/test/adv_attr_test.rb +20 -0
  100. data/test/controller/action_pack_assertions_test.rb +16 -19
  101. data/test/controller/addresses_render_test.rb +1 -1
  102. data/test/controller/assert_select_test.rb +13 -6
  103. data/test/controller/base_test.rb +48 -2
  104. data/test/controller/benchmark_test.rb +1 -2
  105. data/test/controller/caching_test.rb +282 -21
  106. data/test/controller/capture_test.rb +1 -1
  107. data/test/controller/cgi_test.rb +1 -1
  108. data/test/controller/components_test.rb +1 -1
  109. data/test/controller/content_type_test.rb +2 -2
  110. data/test/controller/cookie_test.rb +13 -2
  111. data/test/controller/custom_handler_test.rb +14 -10
  112. data/test/controller/deprecation/deprecated_base_methods_test.rb +1 -1
  113. data/test/controller/dispatcher_test.rb +31 -49
  114. data/test/controller/fake_controllers.rb +17 -0
  115. data/test/controller/fake_models.rb +6 -0
  116. data/test/controller/filter_params_test.rb +14 -8
  117. data/test/controller/filters_test.rb +44 -16
  118. data/test/controller/flash_test.rb +2 -2
  119. data/test/controller/header_test.rb +14 -0
  120. data/test/controller/helper_test.rb +19 -15
  121. data/test/controller/html-scanner/document_test.rb +1 -2
  122. data/test/controller/html-scanner/node_test.rb +1 -2
  123. data/test/controller/html-scanner/sanitizer_test.rb +8 -5
  124. data/test/controller/html-scanner/tag_node_test.rb +1 -2
  125. data/test/controller/html-scanner/text_node_test.rb +2 -3
  126. data/test/controller/html-scanner/tokenizer_test.rb +8 -2
  127. data/test/controller/http_authentication_test.rb +1 -1
  128. data/test/controller/integration_test.rb +14 -16
  129. data/test/controller/integration_upload_test.rb +43 -0
  130. data/test/controller/layout_test.rb +26 -6
  131. data/test/controller/mime_responds_test.rb +39 -7
  132. data/test/controller/mime_type_test.rb +29 -5
  133. data/test/controller/new_render_test.rb +105 -34
  134. data/test/controller/polymorphic_routes_test.rb +32 -20
  135. data/test/controller/record_identifier_test.rb +38 -2
  136. data/test/controller/redirect_test.rb +21 -1
  137. data/test/controller/render_test.rb +59 -15
  138. data/test/controller/request_forgery_protection_test.rb +92 -5
  139. data/test/controller/request_test.rb +64 -6
  140. data/test/controller/rescue_test.rb +22 -6
  141. data/test/controller/resources_test.rb +102 -14
  142. data/test/controller/routing_test.rb +231 -19
  143. data/test/controller/selector_test.rb +2 -2
  144. data/test/controller/send_file_test.rb +14 -3
  145. data/test/controller/session/cookie_store_test.rb +16 -4
  146. data/test/controller/session/mem_cache_store_test.rb +3 -4
  147. data/test/controller/session_fixation_test.rb +1 -1
  148. data/test/controller/session_management_test.rb +23 -1
  149. data/test/controller/test_test.rb +39 -18
  150. data/test/controller/url_rewriter_test.rb +35 -1
  151. data/test/controller/verification_test.rb +1 -1
  152. data/test/controller/view_paths_test.rb +15 -12
  153. data/test/controller/webservice_test.rb +48 -3
  154. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  155. data/test/fixtures/company.rb +1 -0
  156. data/test/fixtures/customers/_customer.html.erb +1 -0
  157. data/test/fixtures/db_definitions/sqlite.sql +6 -0
  158. data/test/fixtures/functional_caching/_partial.erb +3 -0
  159. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  160. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  161. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  162. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  163. data/test/fixtures/mascot.rb +3 -0
  164. data/test/fixtures/mascots.yml +4 -0
  165. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  166. data/test/fixtures/multipart/boundary_problem_file +10 -0
  167. data/test/fixtures/public/javascripts/application.js +1 -0
  168. data/test/fixtures/public/javascripts/controls.js +1 -0
  169. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  170. data/test/fixtures/public/javascripts/effects.js +1 -0
  171. data/test/fixtures/public/javascripts/prototype.js +1 -0
  172. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  173. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  174. data/test/fixtures/reply.rb +1 -0
  175. data/test/fixtures/shared.html.erb +1 -0
  176. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  177. data/test/fixtures/test/_customer_counter.erb +1 -0
  178. data/test/fixtures/test/_form.erb +1 -0
  179. data/test/fixtures/test/_labelling_form.erb +1 -0
  180. data/test/fixtures/test/_raise.html.erb +1 -0
  181. data/test/fixtures/test/greeting.js.rjs +1 -0
  182. data/test/fixtures/topics/_topic.html.erb +1 -0
  183. data/test/template/active_record_helper_test.rb +25 -8
  184. data/test/template/asset_tag_helper_test.rb +100 -17
  185. data/test/template/atom_feed_helper_test.rb +29 -1
  186. data/test/template/benchmark_helper_test.rb +10 -22
  187. data/test/template/date_helper_test.rb +455 -153
  188. data/test/template/erb_util_test.rb +10 -42
  189. data/test/template/form_helper_test.rb +192 -66
  190. data/test/template/form_options_helper_test.rb +19 -8
  191. data/test/template/form_tag_helper_test.rb +11 -8
  192. data/test/template/javascript_helper_test.rb +3 -9
  193. data/test/template/number_helper_test.rb +6 -3
  194. data/test/template/prototype_helper_test.rb +27 -40
  195. data/test/template/record_tag_helper_test.rb +54 -0
  196. data/test/template/sanitize_helper_test.rb +5 -6
  197. data/test/template/scriptaculous_helper_test.rb +7 -13
  198. data/test/template/tag_helper_test.rb +3 -6
  199. data/test/template/template_finder_test.rb +73 -0
  200. data/test/template/template_object_test.rb +95 -0
  201. data/test/template/test_test.rb +56 -0
  202. data/test/template/text_helper_test.rb +46 -33
  203. data/test/template/url_helper_test.rb +8 -10
  204. metadata +65 -12
  205. data/lib/action_view/compiled_templates.rb +0 -69
  206. data/test/action_view_test.rb +0 -44
  207. data/test/activerecord/fixtures_test.rb +0 -24
  208. data/test/controller/fragment_store_setting_test.rb +0 -47
  209. data/test/template/compiled_templates_test.rb +0 -197
  210. data/test/template/deprecate_ivars_test.rb +0 -51
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  class CaptureController < ActionController::Base
4
4
  def self.controller_name; "test"; end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
  require 'action_controller/cgi_process'
3
3
 
4
4
  class BaseCgiTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  class CallerController < ActionController::Base
4
4
  def calling_from_controller
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  class ContentTypeController < ActionController::Base
4
4
  def render_content_type_from_body
@@ -136,4 +136,4 @@ class ContentTypeTest < Test::Unit::TestCase
136
136
  get :render_default_content_types_for_respond_to
137
137
  assert_equal Mime::XML, @response.content_type
138
138
  end
139
- end
139
+ end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  class CookieTest < Test::Unit::TestCase
4
4
  class TestController < ActionController::Base
@@ -37,7 +37,7 @@ class CookieTest < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  def rescue_action(e)
40
- raise unless ActionController::MissingTemplate # No templates here, and we don't care about the output
40
+ raise unless ActionView::MissingTemplate # No templates here, and we don't care about the output
41
41
  end
42
42
  end
43
43
 
@@ -82,6 +82,7 @@ class CookieTest < Test::Unit::TestCase
82
82
  def test_expiring_cookie
83
83
  get :logout
84
84
  assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "", "expires" => Time.at(0)) ], @response.headers["cookie"]
85
+ assert_equal CGI::Cookie::new("name" => "user_name", "value" => "", "expires" => Time.at(0)).value, []
85
86
  end
86
87
 
87
88
  def test_cookiejar_accessor
@@ -132,4 +133,14 @@ class CookieTest < Test::Unit::TestCase
132
133
  assert cookie_str !~ /secure/
133
134
  assert cookie_str !~ /HttpOnly/
134
135
  end
136
+
137
+ def test_cookies_should_not_be_split_on_ampersand_values
138
+ cookies = CGI::Cookie.parse('return_to=http://rubyonrails.org/search?term=api&scope=all&global=true')
139
+ assert_equal({"return_to" => ["http://rubyonrails.org/search?term=api&scope=all&global=true"]}, cookies)
140
+ end
141
+
142
+ def test_cookies_should_not_be_split_on_values_with_newlines
143
+ cookies = CGI::Cookie.new("name" => "val", "value" => "this\nis\na\ntest")
144
+ assert cookies.size == 1
145
+ end
135
146
  end
@@ -1,33 +1,36 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
- class CustomHandler
3
+ class CustomHandler < ActionView::TemplateHandler
4
4
  def initialize( view )
5
5
  @view = view
6
6
  end
7
7
 
8
- def render( template, local_assigns )
9
- [ template,
10
- local_assigns,
8
+ def render( template )
9
+ [ template.source,
10
+ template.locals,
11
11
  @view ]
12
12
  end
13
13
  end
14
14
 
15
15
  class CustomHandlerTest < Test::Unit::TestCase
16
16
  def setup
17
- ActionView::Base.register_template_handler "foo", CustomHandler
18
- ActionView::Base.register_template_handler :foo2, CustomHandler
17
+ ActionView::Template.register_template_handler "foo", CustomHandler
18
+ ActionView::Template.register_template_handler :foo2, CustomHandler
19
19
  @view = ActionView::Base.new
20
20
  end
21
21
 
22
22
  def test_custom_render
23
- result = @view.render_template( "foo", "hello <%= one %>", nil, :one => "two" )
23
+ template = ActionView::InlineTemplate.new(@view, "hello <%= one %>", { :one => "two" }, "foo")
24
+
25
+ result = @view.render_template(template)
24
26
  assert_equal(
25
27
  [ "hello <%= one %>", { :one => "two" }, @view ],
26
28
  result )
27
29
  end
28
30
 
29
31
  def test_custom_render2
30
- result = @view.render_template( "foo2", "hello <%= one %>", nil, :one => "two" )
32
+ template = ActionView::InlineTemplate.new(@view, "hello <%= one %>", { :one => "two" }, "foo2")
33
+ result = @view.render_template(template)
31
34
  assert_equal(
32
35
  [ "hello <%= one %>", { :one => "two" }, @view ],
33
36
  result )
@@ -35,7 +38,8 @@ class CustomHandlerTest < Test::Unit::TestCase
35
38
 
36
39
  def test_unhandled_extension
37
40
  # uses the ERb handler by default if the extension isn't recognized
38
- result = @view.render_template( "bar", "hello <%= one %>", nil, :one => "two" )
41
+ template = ActionView::InlineTemplate.new(@view, "hello <%= one %>", { :one => "two" }, "bar")
42
+ result = @view.render_template(template)
39
43
  assert_equal "hello two", result
40
44
  end
41
45
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  class DeprecatedBaseMethodsTest < Test::Unit::TestCase
4
4
  class Target < ActionController::Base
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../abstract_unit"
1
+ require 'abstract_unit'
2
2
 
3
3
  uses_mocha 'dispatcher tests' do
4
4
 
@@ -11,107 +11,89 @@ class DispatcherTest < Test::Unit::TestCase
11
11
  @output = StringIO.new
12
12
  ENV['REQUEST_METHOD'] = 'GET'
13
13
 
14
- Dispatcher.callbacks[:prepare].clear
14
+ # Clear callbacks as they are redefined by Dispatcher#define_dispatcher_callbacks
15
+ Dispatcher.instance_variable_set("@prepare_dispatch_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
16
+ Dispatcher.instance_variable_set("@before_dispatch_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
17
+ Dispatcher.instance_variable_set("@after_dispatch_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
18
+
19
+ Dispatcher.stubs(:require_dependency)
20
+
15
21
  @dispatcher = Dispatcher.new(@output)
16
22
  end
17
23
 
18
24
  def teardown
19
- ENV['REQUEST_METHOD'] = nil
25
+ ENV.delete 'REQUEST_METHOD'
20
26
  end
21
27
 
22
28
  def test_clears_dependencies_after_dispatch_if_in_loading_mode
23
- Dependencies.stubs(:load?).returns(true)
24
-
25
29
  ActionController::Routing::Routes.expects(:reload).once
26
30
  Dependencies.expects(:clear).once
27
31
 
28
- dispatch
32
+ dispatch(@output, false)
29
33
  end
30
34
 
31
35
  def test_leaves_dependencies_after_dispatch_if_not_in_loading_mode
32
- Dependencies.stubs(:load?).returns(false)
33
-
34
36
  ActionController::Routing::Routes.expects(:reload).never
35
37
  Dependencies.expects(:clear).never
36
38
 
37
39
  dispatch
38
40
  end
39
41
 
42
+ # Stub out dispatch error logger
43
+ class << Dispatcher
44
+ def log_failsafe_exception(status, exception); end
45
+ end
46
+
40
47
  def test_failsafe_response
41
48
  CGI.expects(:new).raises('some multipart parsing failure')
42
-
43
- ActionController::Routing::Routes.stubs(:reload)
44
- Dispatcher.stubs(:log_failsafe_exception)
49
+ Dispatcher.expects(:log_failsafe_exception)
45
50
 
46
51
  assert_nothing_raised { dispatch }
47
52
 
48
53
  assert_equal "Status: 400 Bad Request\r\nContent-Type: text/html\r\n\r\n<html><body><h1>400 Bad Request</h1></body></html>", @output.string
49
54
  end
50
55
 
51
- def test_reload_application_sets_unprepared_if_loading_dependencies
52
- Dependencies.stubs(:load?).returns(false)
53
- ActionController::Routing::Routes.expects(:reload).never
54
- @dispatcher.unprepared = false
55
- @dispatcher.send!(:reload_application)
56
- assert !@dispatcher.unprepared
57
-
58
- Dependencies.stubs(:load?).returns(true)
59
- ActionController::Routing::Routes.expects(:reload).once
60
- @dispatcher.send!(:reload_application)
61
- assert @dispatcher.unprepared
62
- end
63
-
64
- def test_prepare_application_runs_callbacks_if_unprepared
56
+ def test_prepare_callbacks
65
57
  a = b = c = nil
66
- Dispatcher.to_prepare { a = b = c = 1 }
67
- Dispatcher.to_prepare { b = c = 2 }
68
- Dispatcher.to_prepare { c = 3 }
58
+ Dispatcher.to_prepare { |*args| a = b = c = 1 }
59
+ Dispatcher.to_prepare { |*args| b = c = 2 }
60
+ Dispatcher.to_prepare { |*args| c = 3 }
69
61
 
70
- # Skip the callbacks when already prepared.
71
- @dispatcher.unprepared = false
72
- @dispatcher.send! :prepare_application
62
+ # Ensure to_prepare callbacks are not run when defined
73
63
  assert_nil a || b || c
74
64
 
75
- # Perform the callbacks when unprepared.
76
- @dispatcher.unprepared = true
77
- @dispatcher.send! :prepare_application
65
+ # Run callbacks
66
+ @dispatcher.send :run_callbacks, :prepare_dispatch
67
+
78
68
  assert_equal 1, a
79
69
  assert_equal 2, b
80
70
  assert_equal 3, c
81
71
 
82
- # But when not :load, make sure they are only run once
72
+ # Make sure they are only run once
83
73
  a = b = c = nil
84
- @dispatcher.send! :prepare_application
74
+ @dispatcher.send :dispatch
85
75
  assert_nil a || b || c
86
76
  end
87
77
 
88
78
  def test_to_prepare_with_identifier_replaces
89
79
  a = b = nil
90
- Dispatcher.to_prepare(:unique_id) { a = b = 1 }
91
- Dispatcher.to_prepare(:unique_id) { a = 2 }
80
+ Dispatcher.to_prepare(:unique_id) { |*args| a = b = 1 }
81
+ Dispatcher.to_prepare(:unique_id) { |*args| a = 2 }
92
82
 
93
- @dispatcher.unprepared = true
94
- @dispatcher.send! :prepare_application
83
+ @dispatcher.send :run_callbacks, :prepare_dispatch
95
84
  assert_equal 2, a
96
85
  assert_equal nil, b
97
86
  end
98
87
 
99
- def test_to_prepare_only_runs_once_if_not_loading_dependencies
100
- Dependencies.stubs(:load?).returns(false)
101
- called = 0
102
- Dispatcher.to_prepare(:unprepared_test) { called += 1 }
103
- 2.times { dispatch }
104
- assert_equal 1, called
105
- end
106
-
107
88
  private
108
- def dispatch(output = @output)
89
+ def dispatch(output = @output, cache_classes = true)
109
90
  controller = mock
110
91
  controller.stubs(:process).returns(controller)
111
92
  controller.stubs(:out).with(output).returns('response')
112
93
 
113
94
  ActionController::Routing::Routes.stubs(:recognize).returns(controller)
114
95
 
96
+ Dispatcher.define_dispatcher_callbacks(cache_classes)
115
97
  Dispatcher.dispatch(nil, {}, output)
116
98
  end
117
99
 
@@ -10,6 +10,23 @@ module Admin
10
10
  class NewsFeedController < Class.new(ActionController::Base); end
11
11
  end
12
12
 
13
+ # For speed test
14
+ class SpeedController < ActionController::Base; end
15
+ class SearchController < SpeedController; end
16
+ class VideosController < SpeedController; end
17
+ class VideoFileController < SpeedController; end
18
+ class VideoSharesController < SpeedController; end
19
+ class VideoAbusesController < SpeedController; end
20
+ class VideoUploadsController < SpeedController; end
21
+ class VideoVisitsController < SpeedController; end
22
+ class UsersController < SpeedController; end
23
+ class SettingsController < SpeedController; end
24
+ class ChannelsController < SpeedController; end
25
+ class ChannelVideosController < SpeedController; end
26
+ class SessionsController < SpeedController; end
27
+ class LostPasswordsController < SpeedController; end
28
+ class PagesController < SpeedController; end
29
+
13
30
  ActionController::Routing::Routes.draw do |map|
14
31
  map.route_one 'route_one', :controller => 'elsewhere', :action => 'flash_me'
15
32
  map.connect ':controller/:action/:id'
@@ -3,3 +3,9 @@ class Customer < Struct.new(:name, :id)
3
3
  id.to_s
4
4
  end
5
5
  end
6
+
7
+ class BadCustomer < Customer
8
+ end
9
+
10
+ class GoodCustomer < Customer
11
+ end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  class FilterParamController < ActionController::Base
4
4
  end
@@ -7,14 +7,14 @@ class FilterParamTest < Test::Unit::TestCase
7
7
  def setup
8
8
  @controller = FilterParamController.new
9
9
  end
10
-
10
+
11
11
  def test_filter_parameters
12
12
  assert FilterParamController.respond_to?(:filter_parameter_logging)
13
13
  assert !@controller.respond_to?(:filter_parameters)
14
-
14
+
15
15
  FilterParamController.filter_parameter_logging
16
16
  assert @controller.respond_to?(:filter_parameters)
17
-
17
+
18
18
  test_hashes = [[{},{},[]],
19
19
  [{'foo'=>nil},{'foo'=>nil},[]],
20
20
  [{'foo'=>'bar'},{'foo'=>'bar'},[]],
@@ -24,11 +24,11 @@ class FilterParamTest < Test::Unit::TestCase
24
24
  [{'foo'=>'bar', 'baz'=>'foo'},{'foo'=>'[FILTERED]', 'baz'=>'[FILTERED]'},%w'foo baz'],
25
25
  [{'bar'=>{'foo'=>'bar','bar'=>'foo'}},{'bar'=>{'foo'=>'[FILTERED]','bar'=>'foo'}},%w'fo'],
26
26
  [{'foo'=>{'foo'=>'bar','bar'=>'foo'}},{'foo'=>'[FILTERED]'},%w'f banana']]
27
-
27
+
28
28
  test_hashes.each do |before_filter, after_filter, filter_words|
29
29
  FilterParamController.filter_parameter_logging(*filter_words)
30
- assert_equal after_filter, @controller.filter_parameters(before_filter)
31
-
30
+ assert_equal after_filter, @controller.send!(:filter_parameters, before_filter)
31
+
32
32
  filter_words.push('blah')
33
33
  FilterParamController.filter_parameter_logging(*filter_words) do |key, value|
34
34
  value.reverse! if key =~ /bargain/
@@ -37,7 +37,13 @@ class FilterParamTest < Test::Unit::TestCase
37
37
  before_filter['barg'] = {'bargain'=>'gain', 'blah'=>'bar', 'bar'=>{'bargain'=>{'blah'=>'foo'}}}
38
38
  after_filter['barg'] = {'bargain'=>'niag', 'blah'=>'[FILTERED]', 'bar'=>{'bargain'=>{'blah'=>'[FILTERED]'}}}
39
39
 
40
- assert_equal after_filter, @controller.filter_parameters(before_filter)
40
+ assert_equal after_filter, @controller.send!(:filter_parameters, before_filter)
41
41
  end
42
42
  end
43
+
44
+ def test_filter_parameters_is_protected
45
+ FilterParamController.filter_parameter_logging(:foo)
46
+ assert !FilterParamController.action_methods.include?('filter_parameters')
47
+ assert_raise(NoMethodError) { @controller.filter_parameters([{'password' => '[FILTERED]'}]) }
48
+ end
43
49
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../abstract_unit'
1
+ require 'abstract_unit'
2
2
 
3
3
  # FIXME: crashes Ruby 1.9
4
4
  class FilterTest < Test::Unit::TestCase
@@ -134,6 +134,11 @@ class FilterTest < Test::Unit::TestCase
134
134
  before_filter(ConditionalClassFilter, :ensure_login, Proc.new {|c| c.assigns["ran_proc_filter1"] = true }, :except => :show_without_filter) { |c| c.assigns["ran_proc_filter2"] = true}
135
135
  end
136
136
 
137
+ class ConditionalOptionsFilter < ConditionalFilterController
138
+ before_filter :ensure_login, :if => Proc.new { |c| true }
139
+ before_filter :clean_up_tmp, :if => Proc.new { |c| false }
140
+ end
141
+
137
142
  class EmptyFilterChainController < TestController
138
143
  self.filter_chain.clear
139
144
  def show
@@ -153,6 +158,30 @@ class FilterTest < Test::Unit::TestCase
153
158
  end
154
159
  end
155
160
 
161
+ class SkippingAndLimitedController < TestController
162
+ skip_before_filter :ensure_login
163
+ before_filter :ensure_login, :only => :index
164
+
165
+ def index
166
+ render :text => 'ok'
167
+ end
168
+
169
+ def public
170
+ end
171
+ end
172
+
173
+ class SkippingAndReorderingController < TestController
174
+ skip_before_filter :ensure_login
175
+ before_filter :find_record
176
+ before_filter :ensure_login
177
+
178
+ private
179
+ def find_record
180
+ @ran_filter ||= []
181
+ @ran_filter << "find_record"
182
+ end
183
+ end
184
+
156
185
  class ConditionalSkippingController < TestController
157
186
  skip_before_filter :ensure_login, :only => [ :login ]
158
187
  skip_after_filter :clean_up, :only => [ :login ]
@@ -466,6 +495,11 @@ class FilterTest < Test::Unit::TestCase
466
495
  assert !response.template.assigns["ran_proc_filter2"]
467
496
  end
468
497
 
498
+ def test_running_conditional_options
499
+ response = test_process(ConditionalOptionsFilter)
500
+ assert_equal %w( ensure_login ), response.template.assigns["ran_filter"]
501
+ end
502
+
469
503
  def test_running_collection_condition_filters
470
504
  assert_equal %w( ensure_login ), test_process(ConditionalCollectionFilterController).template.assigns["ran_filter"]
471
505
  assert_equal nil, test_process(ConditionalCollectionFilterController, "show_without_filter").template.assigns["ran_filter"]
@@ -499,13 +533,6 @@ class FilterTest < Test::Unit::TestCase
499
533
  assert_equal nil, test_process(BeforeAndAfterConditionController, "show_without_filter").template.assigns["ran_filter"]
500
534
  end
501
535
 
502
- def test_bad_filter
503
- bad_filter_controller = Class.new(ActionController::Base)
504
- assert_raises(ActionController::ActionControllerError) do
505
- bad_filter_controller.before_filter 2
506
- end
507
- end
508
-
509
536
  def test_around_filter
510
537
  controller = test_process(AroundFilterController)
511
538
  assert controller.template.assigns["before_ran"]
@@ -562,6 +589,15 @@ class FilterTest < Test::Unit::TestCase
562
589
  response = test_process(PrependingBeforeAndAfterController)
563
590
  assert_equal %w( before_all between_before_all_and_after_all after_all ), response.template.assigns["ran_filter"]
564
591
  end
592
+
593
+ def test_skipping_and_limiting_controller
594
+ assert_equal %w( ensure_login ), test_process(SkippingAndLimitedController, "index").template.assigns["ran_filter"]
595
+ assert_nil test_process(SkippingAndLimitedController, "public").template.assigns["ran_filter"]
596
+ end
597
+
598
+ def test_skipping_and_reordering_controller
599
+ assert_equal %w( find_record ensure_login ), test_process(SkippingAndReorderingController, "index").template.assigns["ran_filter"]
600
+ end
565
601
 
566
602
  def test_conditional_skipping_of_filters
567
603
  assert_nil test_process(ConditionalSkippingController, "login").template.assigns["ran_filter"]
@@ -746,14 +782,6 @@ class YieldingAroundFiltersTest < Test::Unit::TestCase
746
782
  assert_equal 4, ControllerWithAllTypesOfFilters.filter_chain.size
747
783
  end
748
784
 
749
- def test_wrong_filter_type
750
- assert_raise ArgumentError do
751
- Class.new PostsController do
752
- around_filter lambda { yield }
753
- end
754
- end
755
- end
756
-
757
785
  def test_base
758
786
  controller = PostsController
759
787
  assert_nothing_raised { test_process(controller,'no_raise') }