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

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class WorkshopsController < ActionController::Base
end

class Workshop
  attr_accessor :id, :new_record

  def initialize(id, new_record)
    @id, @new_record = id, new_record
  end
  
  def new_record?
    @new_record
  end
  
  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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
  def redirect_with_status 
    redirect_to({:action => "hello_world", :status => 301})
  end 

  def redirect_with_status_hash
    redirect_to({:action => "hello_world"}, {:status => 301})
  end 

  def url_redirect_with_status 
    redirect_to("http://www.example.com", :status => :moved_permanently)
  end 
   
  def url_redirect_with_status_hash 
    redirect_to("http://www.example.com", {:status => 301})
  end 

  def relative_url_redirect_with_status 
    redirect_to("/things/stuff", :status => :found)
  end 
   
  def relative_url_redirect_with_status_hash
    redirect_to("/things/stuff", {:status => 301})
  end 
   
  def redirect_to_back_with_status 
    redirect_to :back, :status => 307 
  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_back
    redirect_to :back
  end

80 81 82 83 84 85 86 87
  def redirect_to_existing_record
    redirect_to Workshop.new(5, false)
  end

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

88 89 90 91
  def redirect_to_nil
    redirect_to nil
  end

92
  def rescue_errors(e) raise e end
93 94
    
  def rescue_action(e) raise end
95 96 97 98 99 100
  
  protected
    def dashbord_url(id, message)
      url_for :action => "dashboard", :params => { "id" => id, "message" => message }
    end
end
D
Initial  
David Heinemeier Hansson 已提交
101

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

  def test_simple_redirect
110
    get :simple_redirect
J
Jeremy Kemper 已提交
111 112
    assert_response :redirect
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
D
Initial  
David Heinemeier Hansson 已提交
113 114
  end

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  def test_redirect_with_no_status
    get :simple_redirect
    assert_response 302
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
  end

  def test_redirect_with_status 
    get :redirect_with_status 
    assert_response 301 
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url 
  end 

  def test_redirect_with_status_hash 
    get :redirect_with_status_hash
    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 
  end 

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

  
  def test_relative_url_redirect_with_status 
    get :relative_url_redirect_with_status 
    assert_response 302
    assert_equal "http://test.host/things/stuff", redirect_to_url 
  end 
   
  def test_relative_url_redirect_with_status_hash
    get :relative_url_redirect_with_status_hash
    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 
  end

165 166
  def test_simple_redirect_using_options
    get :host_redirect
J
Jeremy Kemper 已提交
167
    assert_response :redirect
168 169
    assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
  end
170

171 172
  def test_redirect_error_with_pretty_diff
    get :host_redirect
J
Jeremy Kemper 已提交
173
    assert_response :redirect
174 175 176
    begin
      assert_redirected_to :action => "other_host", :only_path => true
    rescue Test::Unit::AssertionFailedError => err
177
      expected_msg, redirection_msg, diff_msg = err.message.scan(/<\{[^\}]+\}>/).collect { |s| s[2..-3] }
178 179 180
      assert_match %r("only_path"=>false),        redirection_msg
      assert_match %r("host"=>"other.test.host"), redirection_msg
      assert_match %r("action"=>"other_host"),    redirection_msg
181
      assert_match %r("only_path"=>false),        diff_msg
182
      assert_match %r("host"=>"other.test.host"), diff_msg
183 184 185
    end
  end

186 187
  def test_module_redirect
    get :module_redirect
J
Jeremy Kemper 已提交
188 189
    assert_response :redirect
    assert_redirected_to "http://test.host/module_test/module_redirect/hello_world"
190 191 192 193
  end

  def test_module_redirect_using_options
    get :module_redirect
J
Jeremy Kemper 已提交
194
    assert_response :redirect
195 196
    assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
  end
197 198 199

  def test_redirect_with_assigns
    get :redirect_with_assigns
J
Jeremy Kemper 已提交
200
    assert_response :redirect
201 202
    assert_equal "world", assigns["hello"]
  end
203

204 205 206 207 208 209 210 211 212 213 214 215
  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

216 217 218
  def test_redirect_to_back
    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
    get :redirect_to_back
J
Jeremy Kemper 已提交
219 220
    assert_response :redirect
    assert_equal "http://www.example.com/coming/from", redirect_to_url
221
  end
222 223 224 225 226 227 228
  
  def test_redirect_to_back_with_no_referer
    assert_raises(ActionController::RedirectBackError) {
      @request.env["HTTP_REFERER"] = nil
      get :redirect_to_back
    }
  end
229 230 231 232 233 234 235 236 237 238 239 240 241
  
  def test_redirect_to_record
    ActionController::Routing::Routes.draw do |map|
      map.resources :workshops
      map.connect ':controller/:action/:id'
    end
    
    get :redirect_to_existing_record
    assert_equal "http://test.host/workshops/5", redirect_to_url

    get :redirect_to_new_record
    assert_equal "http://test.host/workshops", redirect_to_url
  end
242 243 244 245 246 247 248

  def test_redirect_to_nil
    assert_raises(ActionController::ActionControllerError) do
      get :redirect_to_nil
    end
  end

249
end
250 251 252 253 254 255 256 257 258 259 260 261 262 263

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
264

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

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

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

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