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.
- data/CHANGELOG +517 -15
- data/MIT-LICENSE +1 -1
- data/README +18 -20
- data/Rakefile +7 -4
- data/examples/address_book_controller.rb +3 -3
- data/examples/blog_controller.cgi +3 -3
- data/examples/debate_controller.cgi +5 -5
- data/lib/action_controller.rb +2 -2
- data/lib/action_controller/assertions.rb +73 -311
- data/lib/action_controller/{deprecated_assertions.rb → assertions/deprecated_assertions.rb} +32 -8
- data/lib/action_controller/assertions/dom_assertions.rb +25 -0
- data/lib/action_controller/assertions/model_assertions.rb +12 -0
- data/lib/action_controller/assertions/response_assertions.rb +140 -0
- data/lib/action_controller/assertions/routing_assertions.rb +82 -0
- data/lib/action_controller/assertions/selector_assertions.rb +571 -0
- data/lib/action_controller/assertions/tag_assertions.rb +117 -0
- data/lib/action_controller/base.rb +334 -163
- data/lib/action_controller/benchmarking.rb +3 -6
- data/lib/action_controller/caching.rb +83 -22
- data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -7
- data/lib/action_controller/cgi_ext/cgi_methods.rb +167 -173
- data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +43 -22
- data/lib/action_controller/cgi_process.rb +50 -27
- data/lib/action_controller/components.rb +21 -25
- data/lib/action_controller/cookies.rb +10 -9
- data/lib/action_controller/{dependencies.rb → deprecated_dependencies.rb} +9 -27
- data/lib/action_controller/filters.rb +448 -225
- data/lib/action_controller/flash.rb +24 -20
- data/lib/action_controller/helpers.rb +2 -5
- data/lib/action_controller/integration.rb +40 -16
- data/lib/action_controller/layout.rb +11 -8
- data/lib/action_controller/macros/auto_complete.rb +3 -2
- data/lib/action_controller/macros/in_place_editing.rb +3 -2
- data/lib/action_controller/mime_responds.rb +41 -29
- data/lib/action_controller/mime_type.rb +68 -10
- data/lib/action_controller/pagination.rb +4 -3
- data/lib/action_controller/request.rb +22 -14
- data/lib/action_controller/rescue.rb +25 -22
- data/lib/action_controller/resources.rb +302 -0
- data/lib/action_controller/response.rb +20 -2
- data/lib/action_controller/response.rb.rej +17 -0
- data/lib/action_controller/routing.rb +1165 -567
- data/lib/action_controller/scaffolding.rb +30 -31
- data/lib/action_controller/session/active_record_store.rb +2 -0
- data/lib/action_controller/session/drb_store.rb +4 -0
- data/lib/action_controller/session/mem_cache_store.rb +4 -0
- data/lib/action_controller/session_management.rb +6 -9
- data/lib/action_controller/status_codes.rb +89 -0
- data/lib/action_controller/streaming.rb +6 -15
- data/lib/action_controller/templates/rescues/_request_and_response.rhtml +5 -5
- data/lib/action_controller/templates/rescues/diagnostics.rhtml +2 -2
- data/lib/action_controller/templates/rescues/routing_error.rhtml +4 -4
- data/lib/action_controller/templates/rescues/template_error.rhtml +1 -1
- data/lib/action_controller/templates/scaffolds/list.rhtml +1 -1
- data/lib/action_controller/test_process.rb +52 -30
- data/lib/action_controller/url_rewriter.rb +63 -29
- data/lib/action_controller/vendor/html-scanner/html/document.rb +1 -0
- data/lib/action_controller/vendor/html-scanner/html/node.rb +3 -4
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +822 -0
- data/lib/action_controller/verification.rb +22 -11
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/version.rb +2 -2
- data/lib/action_view.rb +1 -1
- data/lib/action_view/base.rb +46 -43
- data/lib/action_view/compiled_templates.rb +1 -1
- data/lib/action_view/helpers/active_record_helper.rb +54 -17
- data/lib/action_view/helpers/asset_tag_helper.rb +97 -46
- data/lib/action_view/helpers/capture_helper.rb +1 -1
- data/lib/action_view/helpers/date_helper.rb +258 -136
- data/lib/action_view/helpers/debug_helper.rb +1 -1
- data/lib/action_view/helpers/deprecated_helper.rb +34 -0
- data/lib/action_view/helpers/form_helper.rb +75 -35
- data/lib/action_view/helpers/form_options_helper.rb +7 -5
- data/lib/action_view/helpers/form_tag_helper.rb +44 -6
- data/lib/action_view/helpers/java_script_macros_helper.rb +59 -46
- data/lib/action_view/helpers/javascript_helper.rb +71 -10
- data/lib/action_view/helpers/javascripts/controls.js +41 -23
- data/lib/action_view/helpers/javascripts/dragdrop.js +105 -76
- data/lib/action_view/helpers/javascripts/effects.js +293 -163
- data/lib/action_view/helpers/javascripts/prototype.js +897 -389
- data/lib/action_view/helpers/javascripts/prototype.js.rej +561 -0
- data/lib/action_view/helpers/number_helper.rb +111 -65
- data/lib/action_view/helpers/prototype_helper.rb +84 -109
- data/lib/action_view/helpers/scriptaculous_helper.rb +5 -0
- data/lib/action_view/helpers/tag_helper.rb +69 -16
- data/lib/action_view/helpers/text_helper.rb +149 -112
- data/lib/action_view/helpers/url_helper.rb +200 -107
- data/lib/action_view/template_error.rb +66 -42
- data/test/abstract_unit.rb +4 -2
- data/test/active_record_unit.rb +84 -56
- data/test/activerecord/active_record_assertions_test.rb +26 -18
- data/test/activerecord/active_record_store_test.rb +4 -36
- data/test/activerecord/pagination_test.rb +1 -6
- data/test/controller/action_pack_assertions_test.rb +230 -113
- data/test/controller/addresses_render_test.rb +2 -6
- data/test/controller/assert_select_test.rb +576 -0
- data/test/controller/base_test.rb +73 -3
- data/test/controller/caching_test.rb +228 -0
- data/test/controller/capture_test.rb +12 -10
- data/test/controller/cgi_test.rb +89 -12
- data/test/controller/components_test.rb +24 -2
- data/test/controller/content_type_test.rb +139 -0
- data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
- data/test/controller/cookie_test.rb +33 -25
- data/test/controller/deprecated_instance_variables_test.rb +48 -0
- data/test/controller/deprecation/deprecated_base_methods_test.rb +60 -0
- data/test/controller/fake_controllers.rb +0 -1
- data/test/controller/filters_test.rb +301 -16
- data/test/controller/flash_test.rb +19 -2
- data/test/controller/helper_test.rb +2 -2
- data/test/controller/integration_test.rb +154 -0
- data/test/controller/layout_test.rb +115 -1
- data/test/controller/mime_responds_test.rb +94 -0
- data/test/controller/mime_type_test.rb +9 -0
- data/test/controller/new_render_test.rb +161 -11
- data/test/controller/raw_post_test.rb +52 -15
- data/test/controller/redirect_test.rb +27 -14
- data/test/controller/render_test.rb +76 -29
- data/test/controller/request_test.rb +55 -4
- data/test/controller/resources_test.rb +274 -0
- data/test/controller/routing_test.rb +1533 -824
- data/test/controller/selector_test.rb +628 -0
- data/test/controller/send_file_test.rb +9 -1
- data/test/controller/session_management_test.rb +51 -0
- data/test/controller/test_test.rb +113 -29
- data/test/controller/url_rewriter_test.rb +86 -17
- data/test/controller/verification_test.rb +19 -17
- data/test/controller/webservice_test.rb +0 -7
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
- data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
- data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +1 -0
- data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +1 -0
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/public/javascripts/application.js +1 -0
- data/test/fixtures/test/_hello.rxml +1 -0
- data/test/fixtures/test/hello_world_container.rxml +3 -0
- data/test/fixtures/topic.rb +2 -2
- data/test/template/active_record_helper_test.rb +83 -12
- data/test/template/asset_tag_helper_test.rb +75 -95
- data/test/template/compiled_templates_test.rb +1 -0
- data/test/template/date_helper_test.rb +873 -181
- data/test/template/deprecated_helper_test.rb +36 -0
- data/test/template/deprecated_instance_variables_test.rb +43 -0
- data/test/template/form_helper_test.rb +77 -1
- data/test/template/form_options_helper_test.rb +4 -0
- data/test/template/form_tag_helper_test.rb +66 -2
- data/test/template/java_script_macros_helper_test.rb +4 -1
- data/test/template/javascript_helper_test.rb +29 -0
- data/test/template/number_helper_test.rb +63 -27
- data/test/template/prototype_helper_test.rb +77 -34
- data/test/template/tag_helper_test.rb +34 -6
- data/test/template/text_helper_test.rb +69 -34
- data/test/template/url_helper_test.rb +168 -16
- data/test/testing_sandbox.rb +7 -22
- metadata +66 -20
- data/filler.txt +0 -50
- data/lib/action_controller/code_generation.rb +0 -235
- data/lib/action_controller/vendor/xml_simple.rb +0 -1019
- data/test/controller/caching_filestore.rb +0 -74
- data/test/fixtures/application_root/app/controllers/a_class_that_contains_a_controller/poorly_placed_controller.rb +0 -7
- data/test/fixtures/application_root/app/controllers/module_that_holds_controllers/nested_controller.rb +0 -3
- data/test/fixtures/application_root/app/models/a_class_that_contains_a_controller.rb +0 -7
- 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 "#{
|
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
|
File without changes
|
File without changes
|
File without changes
|
@@ -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
|
-
|
33
|
-
render_text "hello world"
|
27
|
+
cookies["will"] = "work"
|
34
28
|
end
|
35
29
|
|
36
|
-
def
|
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
|
-
|
48
|
-
assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ],
|
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
|
-
|
53
|
-
assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david") ],
|
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
|
-
|
58
|
-
assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david", "expires" => Time.local(2005, 10, 10)) ],
|
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
|
-
|
63
|
-
assert_equal [ CGI::Cookie::new("name" => "user_name", "value" => "david", "expires" => Time.local(2005, 10, 10)) ],
|
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
|
-
|
68
|
-
assert_equal 2,
|
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
|
-
|
73
|
-
|
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
|
-
|
342
|
-
|
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
|