aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller/redirect_test.rb
blob: 4a3b8254aaf3f4e953bc6fe340c98dc4efdd49d9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
require File.dirname(__FILE__) + '/../abstract_unit'

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

class RedirectController < ActionController::Base
  def simple_redirect
    redirect_to :action => "hello_world"
  end

  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

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

  def module_redirect
    redirect_to :controller => 'module_test/module_redirect', :action => "hello_world"
  end

  def redirect_with_assigns
    @hello = "world"
    redirect_to :action => "hello_world"
  end

  def redirect_to_back
    redirect_to :back
  end

  def redirect_to_existing_record
    redirect_to Workshop.new(5, false)
  end

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

  def rescue_errors(e) raise e end
    
  def rescue_action(e) raise end
  
  protected
    def dashbord_url(id, message)
      url_for :action => "dashboard", :params => { "id" => id, "message" => message }
    end
end

class RedirectTest < Test::Unit::TestCase
  def setup
    @controller = RedirectController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
  end

  def test_simple_redirect
    get :simple_redirect
    assert_response :redirect
    assert_equal "http://test.host/redirect/hello_world", redirect_to_url
  end

  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

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

  def test_redirect_error_with_pretty_diff
    get :host_redirect
    assert_response :redirect
    begin
      assert_redirected_to :action => "other_host", :only_path => true
    rescue Test::Unit::AssertionFailedError => err
      expected_msg, 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"=>false),        diff_msg
      assert_match %r("host"=>"other.test.host"), diff_msg
    end
  end

  def test_module_redirect
    get :module_redirect
    assert_response :redirect
    assert_redirected_to "http://test.host/module_test/module_redirect/hello_world"
  end

  def test_module_redirect_using_options
    get :module_redirect
    assert_response :redirect
    assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
  end

  def test_redirect_with_assigns
    get :redirect_with_assigns
    assert_response :redirect
    assert_equal "world", assigns["hello"]
  end

  def test_redirect_to_back
    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from"
    get :redirect_to_back
    assert_response :redirect
    assert_equal "http://www.example.com/coming/from", redirect_to_url
  end
  
  def test_redirect_to_back_with_no_referer
    assert_raises(ActionController::RedirectBackError) {
      @request.env["HTTP_REFERER"] = nil
      get :redirect_to_back
    }
  end
  
  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
end

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_response :redirect
      assert_equal "http://test.host/module_test/module_redirect/hello_world", redirect_to_url
    end

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

    def test_module_redirect
      get :module_redirect
      assert_response :redirect
      assert_equal "http://test.host/redirect/hello_world", redirect_to_url
    end

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