Merged updates from trunk into stable branch
[feedcatcher.git] / vendor / rails / actionpack / test / controller / redirect_test.rb
1 require 'abstract_unit'
2
3 class WorkshopsController < ActionController::Base
4 end
5
6 class Workshop
7 attr_accessor :id, :new_record
8
9 def initialize(id, new_record)
10 @id, @new_record = id, new_record
11 end
12
13 def new_record?
14 @new_record
15 end
16
17 def to_s
18 id.to_s
19 end
20 end
21
22 class RedirectController < ActionController::Base
23 def simple_redirect
24 redirect_to :action => "hello_world"
25 end
26
27 def redirect_with_status
28 redirect_to({:action => "hello_world", :status => 301})
29 end
30
31 def redirect_with_status_hash
32 redirect_to({:action => "hello_world"}, {:status => 301})
33 end
34
35 def url_redirect_with_status
36 redirect_to("http://www.example.com", :status => :moved_permanently)
37 end
38
39 def url_redirect_with_status_hash
40 redirect_to("http://www.example.com", {:status => 301})
41 end
42
43 def relative_url_redirect_with_status
44 redirect_to("/things/stuff", :status => :found)
45 end
46
47 def relative_url_redirect_with_status_hash
48 redirect_to("/things/stuff", {:status => 301})
49 end
50
51 def redirect_to_back_with_status
52 redirect_to :back, :status => 307
53 end
54
55 def host_redirect
56 redirect_to :action => "other_host", :only_path => false, :host => 'other.test.host'
57 end
58
59 def module_redirect
60 redirect_to :controller => 'module_test/module_redirect', :action => "hello_world"
61 end
62
63 def redirect_with_assigns
64 @hello = "world"
65 redirect_to :action => "hello_world"
66 end
67
68 def redirect_to_url
69 redirect_to "http://www.rubyonrails.org/"
70 end
71
72 def redirect_to_url_with_unescaped_query_string
73 redirect_to "http://dev.rubyonrails.org/query?status=new"
74 end
75
76 def redirect_to_url_with_complex_scheme
77 redirect_to "x-test+scheme.complex:redirect"
78 end
79
80 def redirect_to_back
81 redirect_to :back
82 end
83
84 def redirect_to_existing_record
85 redirect_to Workshop.new(5, false)
86 end
87
88 def redirect_to_new_record
89 redirect_to Workshop.new(5, true)
90 end
91
92 def redirect_to_nil
93 redirect_to nil
94 end
95
96 def rescue_errors(e) raise e end
97
98 def rescue_action(e) raise end
99
100 protected
101 def dashbord_url(id, message)
102 url_for :action => "dashboard", :params => { "id" => id, "message" => message }
103 end
104 end
105
106 class RedirectTest < ActionController::TestCase
107 tests RedirectController
108
109 def test_simple_redirect
110 get :simple_redirect
111 assert_response :redirect
112 assert_equal "http://test.host/redirect/hello_world", redirect_to_url
113 end
114
115 def test_redirect_with_no_status
116 get :simple_redirect
117 assert_response 302
118 assert_equal "http://test.host/redirect/hello_world", redirect_to_url
119 end
120
121 def test_redirect_with_status
122 get :redirect_with_status
123 assert_response 301
124 assert_equal "http://test.host/redirect/hello_world", redirect_to_url
125 end
126
127 def test_redirect_with_status_hash
128 get :redirect_with_status_hash
129 assert_response 301
130 assert_equal "http://test.host/redirect/hello_world", redirect_to_url
131 end
132
133 def test_url_redirect_with_status
134 get :url_redirect_with_status
135 assert_response 301
136 assert_equal "http://www.example.com", redirect_to_url
137 end
138
139 def test_url_redirect_with_status_hash
140 get :url_redirect_with_status_hash
141 assert_response 301
142 assert_equal "http://www.example.com", redirect_to_url
143 end
144
145
146 def test_relative_url_redirect_with_status
147 get :relative_url_redirect_with_status
148 assert_response 302
149 assert_equal "http://test.host/things/stuff", redirect_to_url
150 end
151
152 def test_relative_url_redirect_with_status_hash
153 get :relative_url_redirect_with_status_hash
154 assert_response 301
155 assert_equal "http://test.host/things/stuff", redirect_to_url
156 end
157
158 def test_redirect_to_back_with_status
159 @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
160 get :redirect_to_back_with_status
161 assert_response 307
162 assert_equal "http://www.example.com/coming/from", redirect_to_url
163 end
164
165 def test_simple_redirect_using_options
166 get :host_redirect
167 assert_response :redirect
168 assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
169 end
170
171 def test_module_redirect
172 get :module_redirect
173 assert_response :redirect
174 assert_redirected_to "http://test.host/module_test/module_redirect/hello_world"
175 end
176
177 def test_module_redirect_using_options
178 get :module_redirect
179 assert_response :redirect
180 assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
181 end
182
183 def test_redirect_with_assigns
184 get :redirect_with_assigns
185 assert_response :redirect
186 assert_equal "world", assigns["hello"]
187 end
188
189 def test_redirect_to_url
190 get :redirect_to_url
191 assert_response :redirect
192 assert_redirected_to "http://www.rubyonrails.org/"
193 end
194
195 def test_redirect_to_url_with_unescaped_query_string
196 get :redirect_to_url_with_unescaped_query_string
197 assert_response :redirect
198 assert_redirected_to "http://dev.rubyonrails.org/query?status=new"
199 end
200
201 def test_redirect_to_url_with_complex_scheme
202 get :redirect_to_url_with_complex_scheme
203 assert_response :redirect
204 assert_equal "x-test+scheme.complex:redirect", redirect_to_url
205 end
206
207 def test_redirect_to_back
208 @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
209 get :redirect_to_back
210 assert_response :redirect
211 assert_equal "http://www.example.com/coming/from", redirect_to_url
212 end
213
214 def test_redirect_to_back_with_no_referer
215 assert_raise(ActionController::RedirectBackError) {
216 @request.env["HTTP_REFERER"] = nil
217 get :redirect_to_back
218 }
219 end
220
221 def test_redirect_to_record
222 ActionController::Routing::Routes.draw do |map|
223 map.resources :workshops
224 map.connect ':controller/:action/:id'
225 end
226
227 get :redirect_to_existing_record
228 assert_equal "http://test.host/workshops/5", redirect_to_url
229 assert_redirected_to Workshop.new(5, false)
230
231 get :redirect_to_new_record
232 assert_equal "http://test.host/workshops", redirect_to_url
233 assert_redirected_to Workshop.new(5, true)
234 end
235
236 def test_redirect_with_partial_params
237 get :module_redirect
238 assert_redirected_to :action => 'hello_world'
239 end
240
241 def test_redirect_to_nil
242 assert_raise(ActionController::ActionControllerError) do
243 get :redirect_to_nil
244 end
245 end
246 end
247
248 module ModuleTest
249 class ModuleRedirectController < ::RedirectController
250 def module_redirect
251 redirect_to :controller => '/redirect', :action => "hello_world"
252 end
253 end
254
255 class ModuleRedirectTest < ActionController::TestCase
256 tests ModuleRedirectController
257
258 def test_simple_redirect
259 get :simple_redirect
260 assert_response :redirect
261 assert_equal "http://test.host/module_test/module_redirect/hello_world", redirect_to_url
262 end
263
264 def test_simple_redirect_using_options
265 get :host_redirect
266 assert_response :redirect
267 assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
268 end
269
270 def test_module_redirect
271 get :module_redirect
272 assert_response :redirect
273 assert_equal "http://test.host/redirect/hello_world", redirect_to_url
274 end
275
276 def test_module_redirect_using_options
277 get :module_redirect
278 assert_response :redirect
279 assert_redirected_to :controller => '/redirect', :action => "hello_world"
280 end
281 end
282 end