actionpack 1.12.5 → 1.13.0

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 (179) hide show
  1. data/CHANGELOG +517 -15
  2. data/MIT-LICENSE +1 -1
  3. data/README +18 -20
  4. data/Rakefile +7 -4
  5. data/examples/address_book_controller.rb +3 -3
  6. data/examples/blog_controller.cgi +3 -3
  7. data/examples/debate_controller.cgi +5 -5
  8. data/lib/action_controller.rb +2 -2
  9. data/lib/action_controller/assertions.rb +73 -311
  10. data/lib/action_controller/{deprecated_assertions.rb → assertions/deprecated_assertions.rb} +32 -8
  11. data/lib/action_controller/assertions/dom_assertions.rb +25 -0
  12. data/lib/action_controller/assertions/model_assertions.rb +12 -0
  13. data/lib/action_controller/assertions/response_assertions.rb +140 -0
  14. data/lib/action_controller/assertions/routing_assertions.rb +82 -0
  15. data/lib/action_controller/assertions/selector_assertions.rb +571 -0
  16. data/lib/action_controller/assertions/tag_assertions.rb +117 -0
  17. data/lib/action_controller/base.rb +334 -163
  18. data/lib/action_controller/benchmarking.rb +3 -6
  19. data/lib/action_controller/caching.rb +83 -22
  20. data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -7
  21. data/lib/action_controller/cgi_ext/cgi_methods.rb +167 -173
  22. data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +43 -22
  23. data/lib/action_controller/cgi_process.rb +50 -27
  24. data/lib/action_controller/components.rb +21 -25
  25. data/lib/action_controller/cookies.rb +10 -9
  26. data/lib/action_controller/{dependencies.rb → deprecated_dependencies.rb} +9 -27
  27. data/lib/action_controller/filters.rb +448 -225
  28. data/lib/action_controller/flash.rb +24 -20
  29. data/lib/action_controller/helpers.rb +2 -5
  30. data/lib/action_controller/integration.rb +40 -16
  31. data/lib/action_controller/layout.rb +11 -8
  32. data/lib/action_controller/macros/auto_complete.rb +3 -2
  33. data/lib/action_controller/macros/in_place_editing.rb +3 -2
  34. data/lib/action_controller/mime_responds.rb +41 -29
  35. data/lib/action_controller/mime_type.rb +68 -10
  36. data/lib/action_controller/pagination.rb +4 -3
  37. data/lib/action_controller/request.rb +22 -14
  38. data/lib/action_controller/rescue.rb +25 -22
  39. data/lib/action_controller/resources.rb +302 -0
  40. data/lib/action_controller/response.rb +20 -2
  41. data/lib/action_controller/response.rb.rej +17 -0
  42. data/lib/action_controller/routing.rb +1165 -567
  43. data/lib/action_controller/scaffolding.rb +30 -31
  44. data/lib/action_controller/session/active_record_store.rb +2 -0
  45. data/lib/action_controller/session/drb_store.rb +4 -0
  46. data/lib/action_controller/session/mem_cache_store.rb +4 -0
  47. data/lib/action_controller/session_management.rb +6 -9
  48. data/lib/action_controller/status_codes.rb +89 -0
  49. data/lib/action_controller/streaming.rb +6 -15
  50. data/lib/action_controller/templates/rescues/_request_and_response.rhtml +5 -5
  51. data/lib/action_controller/templates/rescues/diagnostics.rhtml +2 -2
  52. data/lib/action_controller/templates/rescues/routing_error.rhtml +4 -4
  53. data/lib/action_controller/templates/rescues/template_error.rhtml +1 -1
  54. data/lib/action_controller/templates/scaffolds/list.rhtml +1 -1
  55. data/lib/action_controller/test_process.rb +52 -30
  56. data/lib/action_controller/url_rewriter.rb +63 -29
  57. data/lib/action_controller/vendor/html-scanner/html/document.rb +1 -0
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +3 -4
  59. data/lib/action_controller/vendor/html-scanner/html/selector.rb +822 -0
  60. data/lib/action_controller/verification.rb +22 -11
  61. data/lib/action_pack.rb +1 -1
  62. data/lib/action_pack/version.rb +2 -2
  63. data/lib/action_view.rb +1 -1
  64. data/lib/action_view/base.rb +46 -43
  65. data/lib/action_view/compiled_templates.rb +1 -1
  66. data/lib/action_view/helpers/active_record_helper.rb +54 -17
  67. data/lib/action_view/helpers/asset_tag_helper.rb +97 -46
  68. data/lib/action_view/helpers/capture_helper.rb +1 -1
  69. data/lib/action_view/helpers/date_helper.rb +258 -136
  70. data/lib/action_view/helpers/debug_helper.rb +1 -1
  71. data/lib/action_view/helpers/deprecated_helper.rb +34 -0
  72. data/lib/action_view/helpers/form_helper.rb +75 -35
  73. data/lib/action_view/helpers/form_options_helper.rb +7 -5
  74. data/lib/action_view/helpers/form_tag_helper.rb +44 -6
  75. data/lib/action_view/helpers/java_script_macros_helper.rb +59 -46
  76. data/lib/action_view/helpers/javascript_helper.rb +71 -10
  77. data/lib/action_view/helpers/javascripts/controls.js +41 -23
  78. data/lib/action_view/helpers/javascripts/dragdrop.js +105 -76
  79. data/lib/action_view/helpers/javascripts/effects.js +293 -163
  80. data/lib/action_view/helpers/javascripts/prototype.js +897 -389
  81. data/lib/action_view/helpers/javascripts/prototype.js.rej +561 -0
  82. data/lib/action_view/helpers/number_helper.rb +111 -65
  83. data/lib/action_view/helpers/prototype_helper.rb +84 -109
  84. data/lib/action_view/helpers/scriptaculous_helper.rb +5 -0
  85. data/lib/action_view/helpers/tag_helper.rb +69 -16
  86. data/lib/action_view/helpers/text_helper.rb +149 -112
  87. data/lib/action_view/helpers/url_helper.rb +200 -107
  88. data/lib/action_view/template_error.rb +66 -42
  89. data/test/abstract_unit.rb +4 -2
  90. data/test/active_record_unit.rb +84 -56
  91. data/test/activerecord/active_record_assertions_test.rb +26 -18
  92. data/test/activerecord/active_record_store_test.rb +4 -36
  93. data/test/activerecord/pagination_test.rb +1 -6
  94. data/test/controller/action_pack_assertions_test.rb +230 -113
  95. data/test/controller/addresses_render_test.rb +2 -6
  96. data/test/controller/assert_select_test.rb +576 -0
  97. data/test/controller/base_test.rb +73 -3
  98. data/test/controller/caching_test.rb +228 -0
  99. data/test/controller/capture_test.rb +12 -10
  100. data/test/controller/cgi_test.rb +89 -12
  101. data/test/controller/components_test.rb +24 -2
  102. data/test/controller/content_type_test.rb +139 -0
  103. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  104. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  105. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  106. data/test/controller/cookie_test.rb +33 -25
  107. data/test/controller/deprecated_instance_variables_test.rb +48 -0
  108. data/test/controller/deprecation/deprecated_base_methods_test.rb +60 -0
  109. data/test/controller/fake_controllers.rb +0 -1
  110. data/test/controller/filters_test.rb +301 -16
  111. data/test/controller/flash_test.rb +19 -2
  112. data/test/controller/helper_test.rb +2 -2
  113. data/test/controller/integration_test.rb +154 -0
  114. data/test/controller/layout_test.rb +115 -1
  115. data/test/controller/mime_responds_test.rb +94 -0
  116. data/test/controller/mime_type_test.rb +9 -0
  117. data/test/controller/new_render_test.rb +161 -11
  118. data/test/controller/raw_post_test.rb +52 -15
  119. data/test/controller/redirect_test.rb +27 -14
  120. data/test/controller/render_test.rb +76 -29
  121. data/test/controller/request_test.rb +55 -4
  122. data/test/controller/resources_test.rb +274 -0
  123. data/test/controller/routing_test.rb +1533 -824
  124. data/test/controller/selector_test.rb +628 -0
  125. data/test/controller/send_file_test.rb +9 -1
  126. data/test/controller/session_management_test.rb +51 -0
  127. data/test/controller/test_test.rb +113 -29
  128. data/test/controller/url_rewriter_test.rb +86 -17
  129. data/test/controller/verification_test.rb +19 -17
  130. data/test/controller/webservice_test.rb +0 -7
  131. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  132. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  133. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  134. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  135. data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +1 -0
  136. data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +1 -0
  137. data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +1 -0
  138. data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +1 -0
  139. data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +1 -0
  140. data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +1 -0
  141. data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +1 -0
  142. data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +1 -0
  143. data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +1 -0
  144. data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +1 -0
  145. data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +1 -0
  146. data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +1 -0
  147. data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +1 -0
  148. data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +1 -0
  149. data/test/fixtures/multipart/binary_file +0 -0
  150. data/test/fixtures/public/javascripts/application.js +1 -0
  151. data/test/fixtures/test/_hello.rxml +1 -0
  152. data/test/fixtures/test/hello_world_container.rxml +3 -0
  153. data/test/fixtures/topic.rb +2 -2
  154. data/test/template/active_record_helper_test.rb +83 -12
  155. data/test/template/asset_tag_helper_test.rb +75 -95
  156. data/test/template/compiled_templates_test.rb +1 -0
  157. data/test/template/date_helper_test.rb +873 -181
  158. data/test/template/deprecated_helper_test.rb +36 -0
  159. data/test/template/deprecated_instance_variables_test.rb +43 -0
  160. data/test/template/form_helper_test.rb +77 -1
  161. data/test/template/form_options_helper_test.rb +4 -0
  162. data/test/template/form_tag_helper_test.rb +66 -2
  163. data/test/template/java_script_macros_helper_test.rb +4 -1
  164. data/test/template/javascript_helper_test.rb +29 -0
  165. data/test/template/number_helper_test.rb +63 -27
  166. data/test/template/prototype_helper_test.rb +77 -34
  167. data/test/template/tag_helper_test.rb +34 -6
  168. data/test/template/text_helper_test.rb +69 -34
  169. data/test/template/url_helper_test.rb +168 -16
  170. data/test/testing_sandbox.rb +7 -22
  171. metadata +66 -20
  172. data/filler.txt +0 -50
  173. data/lib/action_controller/code_generation.rb +0 -235
  174. data/lib/action_controller/vendor/xml_simple.rb +0 -1019
  175. data/test/controller/caching_filestore.rb +0 -74
  176. data/test/fixtures/application_root/app/controllers/a_class_that_contains_a_controller/poorly_placed_controller.rb +0 -7
  177. data/test/fixtures/application_root/app/controllers/module_that_holds_controllers/nested_controller.rb +0 -3
  178. data/test/fixtures/application_root/app/models/a_class_that_contains_a_controller.rb +0 -7
  179. data/test/fixtures/dont_load.rb +0 -3
@@ -46,7 +46,7 @@ end
46
46
 
47
47
  class CalleeController < ActionController::Base
48
48
  def being_called
49
- render_text "#{@params["name"] || "Lady"} of the House, speaking"
49
+ render_text "#{params[:name] || "Lady"} of the House, speaking"
50
50
  end
51
51
 
52
52
  def blowing_up
@@ -126,4 +126,26 @@ class ComponentsTest < Test::Unit::TestCase
126
126
 
127
127
  assert_equal "Lady of the House, speaking", @response.body
128
128
  end
129
- end
129
+ end
130
+
131
+ module A
132
+ module B
133
+ module C
134
+ class NestedController < ActionController::Base
135
+ # Stub for uses_component_template_root
136
+ def self.caller
137
+ [ '/path/to/active_support/deprecation.rb:93:in `uses_component_template_root',
138
+ './test/fixtures/a/b/c/nested_controller.rb' ]
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ class UsesComponentTemplateRootTest < Test::Unit::TestCase
146
+ def test_uses_component_template_root
147
+ assert_deprecated 'uses_component_template_root' do
148
+ assert_equal './test/fixtures/', A::B::C::NestedController.uses_component_template_root
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,139 @@
1
+ require File.dirname(__FILE__) + '/../abstract_unit'
2
+
3
+ class ContentTypeController < ActionController::Base
4
+ def render_content_type_from_body
5
+ response.content_type = Mime::RSS
6
+ render :text => "hello world!"
7
+ end
8
+
9
+ def render_defaults
10
+ render :text => "hello world!"
11
+ end
12
+
13
+ def render_content_type_from_render
14
+ render :text => "hello world!", :content_type => Mime::RSS
15
+ end
16
+
17
+ def render_charset_from_body
18
+ response.charset = "utf-16"
19
+ render :text => "hello world!"
20
+ end
21
+
22
+ def render_default_for_rhtml
23
+ end
24
+
25
+ def render_default_for_rxml
26
+ end
27
+
28
+ def render_default_for_rjs
29
+ end
30
+
31
+ def render_change_for_rxml
32
+ response.content_type = Mime::HTML
33
+ render :action => "render_default_for_rxml"
34
+ end
35
+
36
+ def render_default_content_types_for_respond_to
37
+ respond_to do |format|
38
+ format.html { render :text => "hello world!" }
39
+ format.xml { render :action => "render_default_content_types_for_respond_to.rhtml" }
40
+ format.js { render :text => "hello world!" }
41
+ format.rss { render :text => "hello world!", :content_type => Mime::XML }
42
+ end
43
+ end
44
+
45
+ def rescue_action(e) raise end
46
+ end
47
+
48
+ ContentTypeController.template_root = File.dirname(__FILE__) + "/../fixtures/"
49
+
50
+ class ContentTypeTest < Test::Unit::TestCase
51
+ def setup
52
+ @controller = ContentTypeController.new
53
+
54
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
55
+ # a more accurate simulation of what happens in "real life".
56
+ @controller.logger = Logger.new(nil)
57
+
58
+ @request = ActionController::TestRequest.new
59
+ @response = ActionController::TestResponse.new
60
+ end
61
+
62
+ def test_render_defaults
63
+ get :render_defaults
64
+ assert_equal "utf-8", @response.charset
65
+ assert_equal Mime::HTML, @response.content_type
66
+ end
67
+
68
+ def test_render_changed_charset_default
69
+ ContentTypeController.default_charset = "utf-16"
70
+ get :render_defaults
71
+ assert_equal "utf-16", @response.charset
72
+ assert_equal Mime::HTML, @response.content_type
73
+ ContentTypeController.default_charset = "utf-8"
74
+ end
75
+
76
+ def test_content_type_from_body
77
+ get :render_content_type_from_body
78
+ assert_equal "application/rss+xml", @response.content_type
79
+ assert_equal "utf-8", @response.charset
80
+ end
81
+
82
+ def test_content_type_from_render
83
+ get :render_content_type_from_render
84
+ assert_equal "application/rss+xml", @response.content_type
85
+ assert_equal "utf-8", @response.charset
86
+ end
87
+
88
+ def test_charset_from_body
89
+ get :render_charset_from_body
90
+ assert_equal "utf-16", @response.charset
91
+ assert_equal Mime::HTML, @response.content_type
92
+ end
93
+
94
+ def test_default_for_rhtml
95
+ get :render_default_for_rhtml
96
+ assert_equal Mime::HTML, @response.content_type
97
+ assert_equal "utf-8", @response.charset
98
+ end
99
+
100
+ def test_default_for_rxml
101
+ get :render_default_for_rxml
102
+ assert_equal Mime::XML, @response.content_type
103
+ assert_equal "utf-8", @response.charset
104
+ end
105
+
106
+ def test_default_for_rjs
107
+ xhr :post, :render_default_for_rjs
108
+ assert_equal Mime::JS, @response.content_type
109
+ assert_equal "utf-8", @response.charset
110
+ end
111
+
112
+ def test_change_for_rxml
113
+ get :render_change_for_rxml
114
+ assert_equal Mime::HTML, @response.content_type
115
+ assert_equal "utf-8", @response.charset
116
+ end
117
+
118
+ def test_render_default_content_types_for_respond_to
119
+ @request.env["HTTP_ACCEPT"] = Mime::HTML.to_s
120
+ get :render_default_content_types_for_respond_to
121
+ assert_equal Mime::HTML, @response.content_type
122
+
123
+ @request.env["HTTP_ACCEPT"] = Mime::JS.to_s
124
+ get :render_default_content_types_for_respond_to
125
+ assert_equal Mime::JS, @response.content_type
126
+ end
127
+
128
+ def test_render_default_content_types_for_respond_to_with_template
129
+ @request.env["HTTP_ACCEPT"] = Mime::XML.to_s
130
+ get :render_default_content_types_for_respond_to
131
+ assert_equal Mime::XML, @response.content_type
132
+ end
133
+
134
+ def test_render_default_content_types_for_respond_to_with_overwrite
135
+ @request.env["HTTP_ACCEPT"] = Mime::RSS.to_s
136
+ get :render_default_content_types_for_respond_to
137
+ assert_equal Mime::XML, @response.content_type
138
+ end
139
+ end
@@ -4,77 +4,85 @@ class CookieTest < Test::Unit::TestCase
4
4
  class TestController < ActionController::Base
5
5
  def authenticate_with_deprecated_writer
6
6
  cookie "name" => "user_name", "value" => "david"
7
- render_text "hello world"
8
7
  end
9
8
 
10
9
  def authenticate
11
10
  cookies["user_name"] = "david"
12
- render_text "hello world"
13
11
  end
14
12
 
15
13
  def authenticate_for_fourten_days
16
14
  cookies["user_name"] = { "value" => "david", "expires" => Time.local(2005, 10, 10) }
17
- render_text "hello world"
18
15
  end
19
16
 
20
17
  def authenticate_for_fourten_days_with_symbols
21
18
  cookies[:user_name] = { :value => "david", :expires => Time.local(2005, 10, 10) }
22
- render_text "hello world"
23
19
  end
24
20
 
25
21
  def set_multiple_cookies
26
22
  cookies["user_name"] = { "value" => "david", "expires" => Time.local(2005, 10, 10) }
27
23
  cookies["login"] = "XJ-122"
28
- render_text "hello world"
29
24
  end
30
25
 
31
26
  def access_frozen_cookies
32
- @cookies["will"] = "work"
33
- render_text "hello world"
27
+ cookies["will"] = "work"
34
28
  end
35
29
 
36
- def rescue_action(e) raise end
30
+ def logout
31
+ cookies.delete("user_name")
32
+ end
33
+
34
+ def rescue_action(e)
35
+ raise unless ActionController::MissingTemplate # No templates here, and we don't care about the output
36
+ end
37
37
  end
38
38
 
39
39
  def setup
40
40
  @request = ActionController::TestRequest.new
41
41
  @response = ActionController::TestResponse.new
42
42
 
43
+ @controller = TestController.new
43
44
  @request.host = "www.nextangle.com"
44
45
  end
45
46
 
46
47
  def test_setting_cookie_with_deprecated_writer
47
- @request.action = "authenticate_with_deprecated_writer"
48
- assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ], process_request.headers["cookie"]
48
+ get :authenticate_with_deprecated_writer
49
+ assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ], @response.headers["cookie"]
49
50
  end
50
51
 
51
52
  def test_setting_cookie
52
- @request.action = "authenticate"
53
- assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ], process_request.headers["cookie"]
53
+ get :authenticate
54
+ assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ], @response.headers["cookie"]
54
55
  end
55
56
 
56
57
  def test_setting_cookie_for_fourteen_days
57
- @request.action = "authenticate_for_fourten_days"
58
- assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david", "expires" => Time.local(2005, 10, 10)) ], process_request.headers["cookie"]
58
+ get :authenticate_for_fourten_days
59
+ assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david", "expires" => Time.local(2005, 10, 10)) ], @response.headers["cookie"]
59
60
  end
60
61
 
61
62
  def test_setting_cookie_for_fourteen_days_with_symbols
62
- @request.action = "authenticate_for_fourten_days"
63
- assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david", "expires" => Time.local(2005, 10, 10)) ], process_request.headers["cookie"]
63
+ get :authenticate_for_fourten_days
64
+ assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david", "expires" => Time.local(2005, 10, 10)) ], @response.headers["cookie"]
64
65
  end
65
66
 
66
67
  def test_multiple_cookies
67
- @request.action = "set_multiple_cookies"
68
- assert_equal 2, process_request.headers["cookie"].size
68
+ get :set_multiple_cookies
69
+ assert_equal 2, @response.cookies.size
69
70
  end
70
71
 
71
72
  def test_setting_test_cookie
72
- @request.action = "access_frozen_cookies"
73
- assert_nothing_raised { process_request }
73
+ assert_nothing_raised { get :access_frozen_cookies }
74
+ end
75
+
76
+ def test_expiring_cookie
77
+ get :logout
78
+ assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "", "expires" => Time.at(0)) ], @response.headers["cookie"]
79
+ end
80
+
81
+ def test_cookiejar_accessor
82
+ @request.cookies["user_name"] = CGI::Cookie.new("name" => "user_name", "value" => "david", "expires" => Time.local(2025, 10, 10))
83
+ @controller.request = @request
84
+ jar = ActionController::CookieJar.new(@controller)
85
+ assert_equal "david", jar["user_name"]
86
+ assert_equal nil, jar["something_else"]
74
87
  end
75
-
76
- private
77
- def process_request
78
- TestController.process(@request, @response)
79
- end
80
88
  end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../abstract_unit'
2
+
3
+ class DeprecatedControllerInstanceVariablesTest < Test::Unit::TestCase
4
+ class Target < ActionController::Base
5
+ def initialize(run = nil)
6
+ instance_eval(run) if run
7
+ super()
8
+ end
9
+
10
+ def noop
11
+ render :nothing => true
12
+ end
13
+
14
+ ActionController::Base::DEPRECATED_INSTANCE_VARIABLES.each do |var|
15
+ class_eval "def old_#{var}; render :text => @#{var}.to_s end"
16
+ class_eval "def new_#{var}; render :text => #{var}.to_s end"
17
+ class_eval "def internal_#{var}; render :text => @_#{var}.to_s end"
18
+ end
19
+
20
+ def rescue_action(e) raise e end
21
+ end
22
+
23
+ def setup
24
+ @request = ActionController::TestRequest.new
25
+ @response = ActionController::TestResponse.new
26
+ @controller = Target.new
27
+ end
28
+
29
+ ActionController::Base::DEPRECATED_INSTANCE_VARIABLES.each do |var|
30
+ class_eval <<-end_eval, __FILE__, __LINE__
31
+ def test_old_#{var}_is_deprecated
32
+ assert_deprecated('@#{var}') { get :old_#{var} }
33
+ end
34
+ def test_new_#{var}_isnt_deprecated
35
+ assert_not_deprecated { get :new_#{var} }
36
+ end
37
+ def test_internal_#{var}_isnt_deprecated
38
+ assert_not_deprecated { get :internal_#{var} }
39
+ end
40
+ def test_#{var}_raises_if_already_set
41
+ assert_raise(RuntimeError) do
42
+ @controller = Target.new '@#{var} = Object.new'
43
+ get :noop
44
+ end
45
+ end
46
+ end_eval
47
+ end
48
+ end
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/../../abstract_unit'
2
+
3
+ class DeprecatedBaseMethodsTest < Test::Unit::TestCase
4
+ class Target < ActionController::Base
5
+ def deprecated_symbol_parameter_to_url_for
6
+ redirect_to(url_for(:home_url, "superstars"))
7
+ end
8
+
9
+ def deprecated_render_parameters
10
+ render "fun/games/hello_world"
11
+ end
12
+
13
+ def home_url(greeting)
14
+ "http://example.com/#{greeting}"
15
+ end
16
+
17
+ def raises_name_error
18
+ this_method_doesnt_exist
19
+ end
20
+
21
+ def rescue_action(e) raise e end
22
+ end
23
+
24
+ Target.template_root = File.dirname(__FILE__) + "/../../fixtures"
25
+
26
+ def setup
27
+ @request = ActionController::TestRequest.new
28
+ @response = ActionController::TestResponse.new
29
+ @controller = Target.new
30
+ end
31
+
32
+ def test_deprecated_symbol_parameter_to_url_for
33
+ assert_deprecated("url_for(:home_url)") do
34
+ get :deprecated_symbol_parameter_to_url_for
35
+ end
36
+
37
+ assert_redirected_to "http://example.com/superstars"
38
+ end
39
+
40
+ def test_deprecated_render_parameters
41
+ assert_deprecated("render('fun/games/hello_world')") do
42
+ get :deprecated_render_parameters
43
+ end
44
+
45
+ assert_equal "Living in a nested world", @response.body
46
+ end
47
+
48
+ def test_log_error_silences_deprecation_warnings
49
+ get :raises_name_error
50
+ rescue => e
51
+ assert_not_deprecated { @controller.send :log_error, e }
52
+ end
53
+
54
+ def test_assertion_failed_error_silences_deprecation_warnings
55
+ get :raises_name_error
56
+ rescue => e
57
+ error = Test::Unit::Error.new('testing ur doodz', e)
58
+ assert_not_deprecated { error.message }
59
+ end
60
+ end
@@ -6,7 +6,6 @@ class NotAController
6
6
  end
7
7
  module Admin
8
8
  class << self; alias_method :const_available?, :const_defined?; end
9
- SomeConstant = 10
10
9
  class UserController < Class.new(ActionController::Base); end
11
10
  class NewsFeedController < Class.new(ActionController::Base); end
12
11
  end
@@ -21,6 +21,34 @@ class FilterTest < Test::Unit::TestCase
21
21
  end
22
22
  end
23
23
 
24
+ class ChangingTheRequirementsController < TestController
25
+ before_filter :ensure_login, :except => [:go_wild]
26
+
27
+ def go_wild
28
+ render :text => "gobble"
29
+ end
30
+ end
31
+
32
+ class TestMultipleFiltersController < ActionController::Base
33
+ before_filter :try_1
34
+ before_filter :try_2
35
+ before_filter :try_3
36
+
37
+ (1..3).each do |i|
38
+ define_method "fail_#{i}" do
39
+ render :text => i.to_s
40
+ end
41
+ end
42
+
43
+ protected
44
+ (1..3).each do |i|
45
+ define_method "try_#{i}" do
46
+ instance_variable_set :@try, i
47
+ action_name != "fail_#{i}"
48
+ end
49
+ end
50
+ end
51
+
24
52
  class RenderingController < ActionController::Base
25
53
  before_filter :render_something_else
26
54
 
@@ -134,7 +162,7 @@ class FilterTest < Test::Unit::TestCase
134
162
  @ran_filter << "find_user"
135
163
  end
136
164
  end
137
-
165
+
138
166
  class ConditionalParentOfConditionalSkippingController < ConditionalFilterController
139
167
  before_filter :conditional_in_parent, :only => [:show, :another_action]
140
168
  after_filter :conditional_in_parent, :only => [:show, :another_action]
@@ -152,6 +180,10 @@ class FilterTest < Test::Unit::TestCase
152
180
  skip_after_filter :conditional_in_parent, :only => :another_action
153
181
  end
154
182
 
183
+ class AnotherChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController
184
+ skip_before_filter :conditional_in_parent, :only => :show
185
+ end
186
+
155
187
  class ProcController < PrependingController
156
188
  before_filter(proc { |c| c.assigns["ran_proc_filter"] = true })
157
189
  end
@@ -198,15 +230,6 @@ class FilterTest < Test::Unit::TestCase
198
230
  end
199
231
  end
200
232
 
201
- class BadFilterController < ActionController::Base
202
- before_filter 2
203
-
204
- def show() "show" end
205
-
206
- protected
207
- def rescue_action(e) raise(e) end
208
- end
209
-
210
233
  class AroundFilterController < PrependingController
211
234
  around_filter AroundFilter.new
212
235
  end
@@ -336,19 +359,20 @@ class FilterTest < Test::Unit::TestCase
336
359
  assert_equal %w( ensure_login clean_up_tmp), test_process(BeforeAndAfterConditionController).template.assigns["ran_filter"]
337
360
  assert_equal nil, test_process(BeforeAndAfterConditionController, "show_without_filter").template.assigns["ran_filter"]
338
361
  end
339
-
362
+
340
363
  def test_bad_filter
341
- assert_raises(ActionController::ActionControllerError) {
342
- test_process(BadFilterController)
343
- }
364
+ bad_filter_controller = Class.new(ActionController::Base)
365
+ assert_raises(ActionController::ActionControllerError) do
366
+ bad_filter_controller.before_filter 2
367
+ end
344
368
  end
345
-
369
+
346
370
  def test_around_filter
347
371
  controller = test_process(AroundFilterController)
348
372
  assert controller.template.assigns["before_ran"]
349
373
  assert controller.template.assigns["after_ran"]
350
374
  end
351
-
375
+
352
376
  def test_having_properties_in_around_filter
353
377
  controller = test_process(AroundFilterController)
354
378
  assert_equal "before and after", controller.template.assigns["execution_log"]
@@ -401,6 +425,16 @@ class FilterTest < Test::Unit::TestCase
401
425
  assert_nil test_process(ChildOfConditionalParentController, 'another_action').template.assigns['ran_filter']
402
426
  end
403
427
 
428
+ def test_condition_skipping_of_filters_when_siblings_also_have_conditions
429
+ assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter'], "1"
430
+ assert_equal nil, test_process(AnotherChildOfConditionalParentController).template.assigns['ran_filter']
431
+ assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter']
432
+ end
433
+
434
+ def test_changing_the_requirements
435
+ assert_equal nil, test_process(ChangingTheRequirementsController, "go_wild").template.assigns['ran_filter']
436
+ end
437
+
404
438
  private
405
439
  def test_process(controller, action = "show")
406
440
  request = ActionController::TestRequest.new
@@ -408,3 +442,254 @@ class FilterTest < Test::Unit::TestCase
408
442
  controller.process(request, ActionController::TestResponse.new)
409
443
  end
410
444
  end
445
+
446
+
447
+
448
+ class PostsController < ActionController::Base
449
+ def rescue_action(e); raise e; end
450
+
451
+ module AroundExceptions
452
+ class Error < StandardError ; end
453
+ class Before < Error ; end
454
+ class After < Error ; end
455
+ end
456
+ include AroundExceptions
457
+
458
+ class DefaultFilter
459
+ include AroundExceptions
460
+ end
461
+
462
+ module_eval %w(raises_before raises_after raises_both no_raise no_filter).map { |action| "def #{action}; default_action end" }.join("\n")
463
+
464
+ private
465
+ def default_action
466
+ render :inline => "#{action_name} called"
467
+ end
468
+ end
469
+
470
+ class ControllerWithSymbolAsFilter < PostsController
471
+ around_filter :raise_before, :only => :raises_before
472
+ around_filter :raise_after, :only => :raises_after
473
+ around_filter :without_exception, :only => :no_raise
474
+
475
+ private
476
+ def raise_before
477
+ raise Before
478
+ yield
479
+ end
480
+
481
+ def raise_after
482
+ yield
483
+ raise After
484
+ end
485
+
486
+ def without_exception
487
+ # Do stuff...
488
+ 1 + 1
489
+
490
+ yield
491
+
492
+ # Do stuff...
493
+ 1 + 1
494
+ end
495
+ end
496
+
497
+ class ControllerWithFilterClass < PostsController
498
+ class YieldingFilter < DefaultFilter
499
+ def self.filter(controller)
500
+ yield
501
+ raise After
502
+ end
503
+ end
504
+
505
+ around_filter YieldingFilter, :only => :raises_after
506
+ end
507
+
508
+ class ControllerWithFilterInstance < PostsController
509
+ class YieldingFilter < DefaultFilter
510
+ def filter(controller)
511
+ yield
512
+ raise After
513
+ end
514
+ end
515
+
516
+ around_filter YieldingFilter.new, :only => :raises_after
517
+ end
518
+
519
+ class ControllerWithFilterMethod < PostsController
520
+ class YieldingFilter < DefaultFilter
521
+ def filter(controller)
522
+ yield
523
+ raise After
524
+ end
525
+ end
526
+
527
+ around_filter YieldingFilter.new.method(:filter), :only => :raises_after
528
+ end
529
+
530
+ class ControllerWithProcFilter < PostsController
531
+ around_filter(:only => :no_raise) do |c,b|
532
+ c.assigns['before'] = true
533
+ b.call
534
+ c.assigns['after'] = true
535
+ end
536
+ end
537
+
538
+ class ControllerWithWrongFilterType < PostsController
539
+ around_filter lambda { yield }, :only => :no_raise
540
+ end
541
+
542
+ class ControllerWithNestedFilters < ControllerWithSymbolAsFilter
543
+ around_filter :raise_before, :raise_after, :without_exception, :only => :raises_both
544
+ end
545
+
546
+ class ControllerWithAllTypesOfFilters < PostsController
547
+ before_filter :before
548
+ around_filter :around
549
+ after_filter :after
550
+ around_filter :around_again
551
+
552
+ private
553
+ def before
554
+ @ran_filter ||= []
555
+ @ran_filter << 'before'
556
+ end
557
+
558
+ def around
559
+ @ran_filter << 'around (before yield)'
560
+ yield
561
+ @ran_filter << 'around (after yield)'
562
+ end
563
+
564
+ def after
565
+ @ran_filter << 'after'
566
+ end
567
+
568
+ def around_again
569
+ @ran_filter << 'around_again (before yield)'
570
+ yield
571
+ @ran_filter << 'around_again (after yield)'
572
+ end
573
+ end
574
+
575
+ class ControllerWithTwoLessFilters < ControllerWithAllTypesOfFilters
576
+ skip_filter :around_again
577
+ skip_filter :after
578
+ end
579
+
580
+ class YieldingAroundFiltersTest < Test::Unit::TestCase
581
+ include PostsController::AroundExceptions
582
+
583
+ def test_filters_registering
584
+ assert_equal 1, ControllerWithFilterMethod.filter_chain.size
585
+ assert_equal 1, ControllerWithFilterClass.filter_chain.size
586
+ assert_equal 1, ControllerWithFilterInstance.filter_chain.size
587
+ assert_equal 3, ControllerWithSymbolAsFilter.filter_chain.size
588
+ assert_equal 1, ControllerWithWrongFilterType.filter_chain.size
589
+ assert_equal 6, ControllerWithNestedFilters.filter_chain.size
590
+ assert_equal 4, ControllerWithAllTypesOfFilters.filter_chain.size
591
+ end
592
+
593
+ def test_wrong_filter_type
594
+ assert_raise(ActionController::ActionControllerError) do
595
+ test_process(ControllerWithWrongFilterType,'no_raise')
596
+ end
597
+ end
598
+
599
+ def test_base
600
+ controller = PostsController
601
+ assert_nothing_raised { test_process(controller,'no_raise') }
602
+ assert_nothing_raised { test_process(controller,'raises_before') }
603
+ assert_nothing_raised { test_process(controller,'raises_after') }
604
+ assert_nothing_raised { test_process(controller,'no_filter') }
605
+ end
606
+
607
+ def test_with_symbol
608
+ controller = ControllerWithSymbolAsFilter
609
+ assert_nothing_raised { test_process(controller,'no_raise') }
610
+ assert_raise(Before) { test_process(controller,'raises_before') }
611
+ assert_raise(After) { test_process(controller,'raises_after') }
612
+ assert_nothing_raised { test_process(controller,'no_raise') }
613
+ end
614
+
615
+ def test_with_class
616
+ controller = ControllerWithFilterClass
617
+ assert_nothing_raised { test_process(controller,'no_raise') }
618
+ assert_raise(After) { test_process(controller,'raises_after') }
619
+ end
620
+
621
+ def test_with_instance
622
+ controller = ControllerWithFilterInstance
623
+ assert_nothing_raised { test_process(controller,'no_raise') }
624
+ assert_raise(After) { test_process(controller,'raises_after') }
625
+ end
626
+
627
+ def test_with_method
628
+ controller = ControllerWithFilterMethod
629
+ assert_nothing_raised { test_process(controller,'no_raise') }
630
+ assert_raise(After) { test_process(controller,'raises_after') }
631
+ end
632
+
633
+ def test_with_proc
634
+ controller = test_process(ControllerWithProcFilter,'no_raise')
635
+ assert controller.template.assigns['before']
636
+ assert controller.template.assigns['after']
637
+ end
638
+
639
+ def test_nested_filters
640
+ controller = ControllerWithNestedFilters
641
+ assert_nothing_raised do
642
+ begin
643
+ test_process(controller,'raises_both')
644
+ rescue Before, After
645
+ end
646
+ end
647
+ assert_raise Before do
648
+ begin
649
+ test_process(controller,'raises_both')
650
+ rescue After
651
+ end
652
+ end
653
+ end
654
+
655
+ def test_filter_order_with_all_filter_types
656
+ controller = test_process(ControllerWithAllTypesOfFilters,'no_raise')
657
+ assert_equal 'before around (before yield) around_again (before yield) around_again (after yield) around (after yield) after',controller.template.assigns['ran_filter'].join(' ')
658
+ end
659
+
660
+ def test_filter_order_with_skip_filter_method
661
+ controller = test_process(ControllerWithTwoLessFilters,'no_raise')
662
+ assert_equal 'before around (before yield) around (after yield)',controller.template.assigns['ran_filter'].join(' ')
663
+ end
664
+
665
+ def test_first_filter_in_multiple_before_filter_chain_halts
666
+ controller = ::FilterTest::TestMultipleFiltersController.new
667
+ response = test_process(controller, 'fail_1')
668
+ assert_equal '', response.body
669
+ assert_equal 1, controller.instance_variable_get(:@try)
670
+ assert controller.instance_variable_get(:@before_filter_chain_aborted)
671
+ end
672
+
673
+ def test_second_filter_in_multiple_before_filter_chain_halts
674
+ controller = ::FilterTest::TestMultipleFiltersController.new
675
+ response = test_process(controller, 'fail_2')
676
+ assert_equal '', response.body
677
+ assert_equal 2, controller.instance_variable_get(:@try)
678
+ assert controller.instance_variable_get(:@before_filter_chain_aborted)
679
+ end
680
+
681
+ def test_last_filter_in_multiple_before_filter_chain_halts
682
+ controller = ::FilterTest::TestMultipleFiltersController.new
683
+ response = test_process(controller, 'fail_3')
684
+ assert_equal '', response.body
685
+ assert_equal 3, controller.instance_variable_get(:@try)
686
+ assert controller.instance_variable_get(:@before_filter_chain_aborted)
687
+ end
688
+
689
+ protected
690
+ def test_process(controller, action = "show")
691
+ request = ActionController::TestRequest.new
692
+ request.action = action
693
+ controller.process(request, ActionController::TestResponse.new)
694
+ end
695
+ end