redirect_test.rb 4.6 KB
Newer Older
D
Initial  
David Heinemeier Hansson 已提交
1 2
require File.dirname(__FILE__) + '/../abstract_unit'

3 4 5 6 7 8 9
class RedirectController < ActionController::Base
  def simple_redirect
    redirect_to :action => "hello_world"
  end
  
  def method_redirect
    redirect_to :dashbord_url, 1, "hello"
D
Initial  
David Heinemeier Hansson 已提交
10
  end
11
  
12 13 14 15
  def host_redirect
    redirect_to :action => "other_host", :only_path => false, :host => 'other.test.host'
  end

16 17 18 19
  def module_redirect
    redirect_to :controller => 'module_test/module_redirect', :action => "hello_world"
  end

20 21 22 23 24
  def redirect_with_assigns
    @hello = "world"
    redirect_to :action => "hello_world"
  end

25 26 27 28
  def redirect_to_back
    redirect_to :back
  end

29
  def rescue_errors(e) raise e end
30 31
    
  def rescue_action(e) raise end
32 33 34 35 36 37
  
  protected
    def dashbord_url(id, message)
      url_for :action => "dashboard", :params => { "id" => id, "message" => message }
    end
end
D
Initial  
David Heinemeier Hansson 已提交
38

39
class RedirectTest < Test::Unit::TestCase
D
Initial  
David Heinemeier Hansson 已提交
40
  def setup
41 42 43
    @controller = RedirectController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
D
Initial  
David Heinemeier Hansson 已提交
44 45 46
  end

  def test_simple_redirect
47
    get :simple_redirect
J
Jeremy Kemper 已提交
48 49
    assert_response :redirect
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
D
Initial  
David Heinemeier Hansson 已提交
50 51 52
  end

  def test_redirect_with_method_reference_and_parameters
J
Jeremy Kemper 已提交
53 54 55
    assert_deprecated(/redirect_to/) { get :method_redirect }
    assert_response :redirect
    assert_equal "http://test.host/redirect/dashboard/1?message=hello", redirect_to_url
D
Initial  
David Heinemeier Hansson 已提交
56
  end
57 58 59

  def test_simple_redirect_using_options
    get :host_redirect
J
Jeremy Kemper 已提交
60
    assert_response :redirect
61 62
    assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
  end
63

64 65
  def test_redirect_error_with_pretty_diff
    get :host_redirect
J
Jeremy Kemper 已提交
66
    assert_response :redirect
67 68 69 70
    begin
      assert_redirected_to :action => "other_host", :only_path => true
    rescue Test::Unit::AssertionFailedError => err
      redirection_msg, diff_msg = err.message.scan(/<\{[^\}]+\}>/).collect { |s| s[2..-3] }
71 72 73 74 75
      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
      assert_match %r("only_path"=>true),         diff_msg
      assert_match %r("host"=>"other.test.host"), diff_msg
76 77 78
    end
  end

79 80
  def test_module_redirect
    get :module_redirect
J
Jeremy Kemper 已提交
81 82
    assert_response :redirect
    assert_redirected_to "http://test.host/module_test/module_redirect/hello_world"
83 84 85 86
  end

  def test_module_redirect_using_options
    get :module_redirect
J
Jeremy Kemper 已提交
87
    assert_response :redirect
88 89
    assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
  end
90 91 92

  def test_redirect_with_assigns
    get :redirect_with_assigns
J
Jeremy Kemper 已提交
93
    assert_response :redirect
94 95
    assert_equal "world", assigns["hello"]
  end
96 97 98 99

  def test_redirect_to_back
    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
    get :redirect_to_back
J
Jeremy Kemper 已提交
100 101
    assert_response :redirect
    assert_equal "http://www.example.com/coming/from", redirect_to_url
102
  end
103 104 105 106 107 108 109
  
  def test_redirect_to_back_with_no_referer
    assert_raises(ActionController::RedirectBackError) {
      @request.env["HTTP_REFERER"] = nil
      get :redirect_to_back
    }
  end
110
end
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

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
  
    def test_simple_redirect
      get :simple_redirect
J
Jeremy Kemper 已提交
128 129
      assert_response :redirect
      assert_equal "http://test.host/module_test/module_redirect/hello_world", redirect_to_url
130 131 132
    end
  
    def test_redirect_with_method_reference_and_parameters
J
Jeremy Kemper 已提交
133 134 135
      assert_deprecated(/redirect_to/) { get :method_redirect }
      assert_response :redirect
      assert_equal "http://test.host/module_test/module_redirect/dashboard/1?message=hello", redirect_to_url
136 137 138 139
    end
    
    def test_simple_redirect_using_options
      get :host_redirect
J
Jeremy Kemper 已提交
140
      assert_response :redirect
141 142 143 144 145
      assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
    end

    def test_module_redirect
      get :module_redirect
J
Jeremy Kemper 已提交
146 147
      assert_response :redirect
      assert_equal "http://test.host/redirect/hello_world", redirect_to_url
148 149 150 151
    end

    def test_module_redirect_using_options
      get :module_redirect
J
Jeremy Kemper 已提交
152
      assert_response :redirect
153 154 155
      assert_redirected_to :controller => 'redirect', :action => "hello_world"
    end
  end
156
end