redirect_test.rb 4.1 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 48
    get :simple_redirect
    assert_redirect_url "http://test.host/redirect/hello_world"
D
Initial  
David Heinemeier Hansson 已提交
49 50 51
  end

  def test_redirect_with_method_reference_and_parameters
52
    get :method_redirect
D
David Heinemeier Hansson 已提交
53
    assert_redirect_url "http://test.host/redirect/dashboard/1?message=hello"
D
Initial  
David Heinemeier Hansson 已提交
54
  end
55 56 57 58 59

  def test_simple_redirect_using_options
    get :host_redirect
    assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
  end
60

61 62 63 64 65 66 67 68 69 70 71 72 73 74
  def test_redirect_error_with_pretty_diff
    get :host_redirect
    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] }
      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
    end
  end

75 76 77 78 79 80 81 82 83
  def test_module_redirect
    get :module_redirect
    assert_redirect_url "http://test.host/module_test/module_redirect/hello_world"
  end

  def test_module_redirect_using_options
    get :module_redirect
    assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
  end
84 85 86 87 88

  def test_redirect_with_assigns
    get :redirect_with_assigns
    assert_equal "world", assigns["hello"]
  end
89 90 91 92 93 94

  def test_redirect_to_back
    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
    get :redirect_to_back
    assert_redirect_url "http://www.example.com/coming/from"
  end
95 96 97 98 99 100 101
  
  def test_redirect_to_back_with_no_referer
    assert_raises(ActionController::RedirectBackError) {
      @request.env["HTTP_REFERER"] = nil
      get :redirect_to_back
    }
  end
102
end
103 104 105 106 107 108 109 110 111 112 113 114 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

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
      assert_redirect_url "http://test.host/module_test/module_redirect/hello_world"
    end
  
    def test_redirect_with_method_reference_and_parameters
      get :method_redirect
      assert_redirect_url "http://test.host/module_test/module_redirect/dashboard/1?message=hello"
    end
    
    def test_simple_redirect_using_options
      get :host_redirect
      assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host'
    end

    def test_module_redirect
      get :module_redirect
      assert_redirect_url "http://test.host/redirect/hello_world"
    end

    def test_module_redirect_using_options
      get :module_redirect
      assert_redirected_to :controller => 'redirect', :action => "hello_world"
    end
  end
143
end