redirect_test.rb 7.4 KB
Newer Older
1
require 'abstract_unit'
D
Initial  
David Heinemeier Hansson 已提交
2

3 4 5 6 7 8 9 10 11
class WorkshopsController < ActionController::Base
end

class Workshop
  attr_accessor :id, :new_record

  def initialize(id, new_record)
    @id, @new_record = id, new_record
  end
12

13 14 15
  def new_record?
    @new_record
  end
16

17 18 19 20 21
  def to_s
    id.to_s
  end
end

22 23 24 25
class RedirectController < ActionController::Base
  def simple_redirect
    redirect_to :action => "hello_world"
  end
26

27
  def redirect_with_status
28
    redirect_to({:action => "hello_world", :status => 301})
29
  end
30 31 32

  def redirect_with_status_hash
    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 38 39
  end

  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 46
  end

47 48
  def relative_url_redirect_with_status_hash
    redirect_to("/things/stuff", {:status => 301})
49 50 51 52
  end

  def redirect_to_back_with_status
    redirect_to :back, :status => 307
53 54
  end

55 56 57 58
  def host_redirect
    redirect_to :action => "other_host", :only_path => false, :host => 'other.test.host'
  end

59 60 61 62
  def module_redirect
    redirect_to :controller => 'module_test/module_redirect', :action => "hello_world"
  end

63 64 65 66 67
  def redirect_with_assigns
    @hello = "world"
    redirect_to :action => "hello_world"
  end

68 69 70 71 72 73 74 75
  def redirect_to_url
    redirect_to "http://www.rubyonrails.org/"
  end

  def redirect_to_url_with_unescaped_query_string
    redirect_to "http://dev.rubyonrails.org/query?status=new"
  end

76 77 78 79
  def redirect_to_url_with_complex_scheme
    redirect_to "x-test+scheme.complex:redirect"
  end

80 81 82 83
  def redirect_to_back
    redirect_to :back
  end

84 85 86 87 88 89 90 91
  def redirect_to_existing_record
    redirect_to Workshop.new(5, false)
  end

  def redirect_to_new_record
    redirect_to Workshop.new(5, true)
  end

92 93 94 95
  def redirect_to_nil
    redirect_to nil
  end

96
  def rescue_errors(e) raise e end
97

98
  def rescue_action(e) raise end
99

100 101 102 103 104
  protected
    def dashbord_url(id, message)
      url_for :action => "dashboard", :params => { "id" => id, "message" => message }
    end
end
D
Initial  
David Heinemeier Hansson 已提交
105

106
class RedirectTest < Test::Unit::TestCase
D
Initial  
David Heinemeier Hansson 已提交
107
  def setup
108 109 110
    @controller = RedirectController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
D
Initial  
David Heinemeier Hansson 已提交
111 112 113
  end

  def test_simple_redirect
114
    get :simple_redirect
J
Jeremy Kemper 已提交
115 116
    assert_response :redirect
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
D
Initial  
David Heinemeier Hansson 已提交
117 118
  end

119 120 121 122 123 124
  def test_redirect_with_no_status
    get :simple_redirect
    assert_response 302
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
  end

125 126 127 128 129
  def test_redirect_with_status
    get :redirect_with_status
    assert_response 301
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
  end
130

131
  def test_redirect_with_status_hash
132
    get :redirect_with_status_hash
133 134 135 136 137 138 139 140
    assert_response 301
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
  end

  def test_url_redirect_with_status
    get :url_redirect_with_status
    assert_response 301
    assert_equal "http://www.example.com", redirect_to_url
141 142 143 144
  end

  def test_url_redirect_with_status_hash
    get :url_redirect_with_status_hash
145 146 147
    assert_response 301
    assert_equal "http://www.example.com", redirect_to_url
  end
148

149 150 151

  def test_relative_url_redirect_with_status
    get :relative_url_redirect_with_status
152
    assert_response 302
153 154 155
    assert_equal "http://test.host/things/stuff", redirect_to_url
  end

156 157
  def test_relative_url_redirect_with_status_hash
    get :relative_url_redirect_with_status_hash
158 159 160 161 162 163 164 165 166
    assert_response 301
    assert_equal "http://test.host/things/stuff", redirect_to_url
  end

  def test_redirect_to_back_with_status
    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
    get :redirect_to_back_with_status
    assert_response 307
    assert_equal "http://www.example.com/coming/from", redirect_to_url
167 168
  end

169 170
  def test_simple_redirect_using_options
    get :host_redirect
J
Jeremy Kemper 已提交
171
    assert_response :redirect
172 173
    assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
  end
174 175 176

  def test_module_redirect
    get :module_redirect
J
Jeremy Kemper 已提交
177 178
    assert_response :redirect
    assert_redirected_to "http://test.host/module_test/module_redirect/hello_world"
179 180 181 182
  end

  def test_module_redirect_using_options
    get :module_redirect
J
Jeremy Kemper 已提交
183
    assert_response :redirect
184 185
    assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
  end
186 187 188

  def test_redirect_with_assigns
    get :redirect_with_assigns
J
Jeremy Kemper 已提交
189
    assert_response :redirect
190 191
    assert_equal "world", assigns["hello"]
  end
192

193 194 195 196 197 198 199 200 201 202 203 204
  def test_redirect_to_url
    get :redirect_to_url
    assert_response :redirect
    assert_redirected_to "http://www.rubyonrails.org/"
  end

  def test_redirect_to_url_with_unescaped_query_string
    get :redirect_to_url_with_unescaped_query_string
    assert_response :redirect
    assert_redirected_to "http://dev.rubyonrails.org/query?status=new"
  end

205 206 207 208 209 210
  def test_redirect_to_url_with_complex_scheme
    get :redirect_to_url_with_complex_scheme
    assert_response :redirect
    assert_equal "x-test+scheme.complex:redirect", redirect_to_url
  end

211 212 213
  def test_redirect_to_back
    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
    get :redirect_to_back
J
Jeremy Kemper 已提交
214 215
    assert_response :redirect
    assert_equal "http://www.example.com/coming/from", redirect_to_url
216
  end
217

218 219 220 221 222 223
  def test_redirect_to_back_with_no_referer
    assert_raises(ActionController::RedirectBackError) {
      @request.env["HTTP_REFERER"] = nil
      get :redirect_to_back
    }
  end
224

225 226 227 228 229
  def test_redirect_to_record
    ActionController::Routing::Routes.draw do |map|
      map.resources :workshops
      map.connect ':controller/:action/:id'
    end
230

231 232
    get :redirect_to_existing_record
    assert_equal "http://test.host/workshops/5", redirect_to_url
233
    assert_redirected_to Workshop.new(5, false)
234 235 236

    get :redirect_to_new_record
    assert_equal "http://test.host/workshops", redirect_to_url
237
    assert_redirected_to Workshop.new(5, true)
238
  end
239

240 241 242 243 244
  def test_redirect_with_partial_params
    get :module_redirect
    assert_redirected_to :action => 'hello_world'
  end

245 246 247 248 249
  def test_redirect_to_nil
    assert_raises(ActionController::ActionControllerError) do
      get :redirect_to_nil
    end
  end
250
end
251 252 253 254 255 256 257 258 259 260 261 262 263 264

module ModuleTest
  class ModuleRedirectController < ::RedirectController
    def module_redirect
      redirect_to :controller => '/redirect', :action => "hello_world"
    end
  end

  class ModuleRedirectTest < Test::Unit::TestCase
    def setup
      @controller = ModuleRedirectController.new
      @request    = ActionController::TestRequest.new
      @response   = ActionController::TestResponse.new
    end
265

266 267
    def test_simple_redirect
      get :simple_redirect
J
Jeremy Kemper 已提交
268 269
      assert_response :redirect
      assert_equal "http://test.host/module_test/module_redirect/hello_world", redirect_to_url
270
    end
271

272 273
    def test_simple_redirect_using_options
      get :host_redirect
J
Jeremy Kemper 已提交
274
      assert_response :redirect
275 276 277 278 279
      assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
    end

    def test_module_redirect
      get :module_redirect
J
Jeremy Kemper 已提交
280 281
      assert_response :redirect
      assert_equal "http://test.host/redirect/hello_world", redirect_to_url
282 283 284 285
    end

    def test_module_redirect_using_options
      get :module_redirect
J
Jeremy Kemper 已提交
286
      assert_response :redirect
287
      assert_redirected_to :controller => '/redirect', :action => "hello_world"
288 289
    end
  end
290
end