rack_test.rb 9.8 KB
Newer Older
E
Ezra Zygmuntowicz 已提交
1 2 3 4
require 'abstract_unit'

class BaseRackTest < Test::Unit::TestCase
  def setup
5 6 7 8
    @env = {
      "HTTP_MAX_FORWARDS" => "10",
      "SERVER_NAME" => "glu.ttono.us:8007",
      "FCGI_ROLE" => "RESPONDER",
9
      "AUTH_TYPE" => "Basic",
10
      "HTTP_X_FORWARDED_HOST" => "glu.ttono.us",
11
      "HTTP_ACCEPT_CHARSET" => "UTF-8",
12
      "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
13 14
      "HTTP_CACHE_CONTROL" => "no-cache, max-age=0",
      "HTTP_PRAGMA" => "no-cache",
15
      "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)",
16
      "PATH_INFO" => "/homepage/",
17
      "HTTP_ACCEPT_LANGUAGE" => "en",
18
      "HTTP_NEGOTIATE" => "trans",
19
      "HTTP_HOST" => "glu.ttono.us:8007",
20 21
      "HTTP_REFERER" => "http://www.google.com/search?q=glu.ttono.us",
      "HTTP_FROM" => "googlebot",
22 23 24 25 26
      "SERVER_PROTOCOL" => "HTTP/1.1",
      "REDIRECT_URI" => "/dispatch.fcgi",
      "SCRIPT_NAME" => "/dispatch.fcgi",
      "SERVER_ADDR" => "207.7.108.53",
      "REMOTE_ADDR" => "207.7.108.53",
27 28 29
      "REMOTE_HOST" => "google.com",
      "REMOTE_IDENT" => "kevin",
      "REMOTE_USER" => "kevin",
30 31 32 33 34
      "SERVER_SOFTWARE" => "lighttpd/1.4.5",
      "HTTP_COOKIE" => "_session_id=c84ace84796670c052c6ceb2451fb0f2; is_admin=yes",
      "HTTP_X_FORWARDED_SERVER" => "glu.ttono.us",
      "REQUEST_URI" => "/admin",
      "DOCUMENT_ROOT" => "/home/kevinc/sites/typo/public",
35
      "PATH_TRANSLATED" => "/home/kevinc/sites/typo/public/homepage/",
36 37 38 39 40 41 42 43 44 45
      "SERVER_PORT" => "8007",
      "QUERY_STRING" => "",
      "REMOTE_PORT" => "63137",
      "GATEWAY_INTERFACE" => "CGI/1.1",
      "HTTP_X_FORWARDED_FOR" => "65.88.180.234",
      "HTTP_ACCEPT" => "*/*",
      "SCRIPT_FILENAME" => "/home/kevinc/sites/typo/public/dispatch.fcgi",
      "REDIRECT_STATUS" => "200",
      "REQUEST_METHOD" => "GET"
    }
P
Pratik Naik 已提交
46
    @request = ActionController::Request.new(@env)
E
Ezra Zygmuntowicz 已提交
47 48
    # some Nokia phone browsers omit the space after the semicolon separator.
    # some developers have grown accustomed to using comma in cookie values.
P
Pratik Naik 已提交
49
    @alt_cookie_fmt_request = ActionController::Request.new(@env.merge({"HTTP_COOKIE"=>"_session_id=c84ace847,96670c052c6ceb2451fb0f2;is_admin=yes"}))
E
Ezra Zygmuntowicz 已提交
50 51 52
  end

  def default_test; end
53 54 55 56

  private

  def set_content_data(data)
P
Pratik Naik 已提交
57
    @request.env['REQUEST_METHOD'] = 'POST'
58 59 60 61
    @request.env['CONTENT_LENGTH'] = data.length
    @request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
    @request.env['RAW_POST_DATA'] = data
  end
E
Ezra Zygmuntowicz 已提交
62 63 64 65
end

class RackRequestTest < BaseRackTest
  def test_proxy_request
66
    assert_equal 'glu.ttono.us', @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
67 68 69 70 71
  end

  def test_http_host
    @env.delete "HTTP_X_FORWARDED_HOST"
    @env['HTTP_HOST'] = "rubyonrails.org:8080"
72 73
    assert_equal "rubyonrails.org", @request.host(true)
    assert_equal "rubyonrails.org:8080", @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
74 75

    @env['HTTP_X_FORWARDED_HOST'] = "www.firsthost.org, www.secondhost.org"
76
    assert_equal "www.secondhost.org", @request.host(true)
E
Ezra Zygmuntowicz 已提交
77 78 79 80 81
  end

  def test_http_host_with_default_port_overrides_server_port
    @env.delete "HTTP_X_FORWARDED_HOST"
    @env['HTTP_HOST'] = "rubyonrails.org"
82
    assert_equal "rubyonrails.org", @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
83 84 85 86 87
  end

  def test_host_with_port_defaults_to_server_name_if_no_host_headers
    @env.delete "HTTP_X_FORWARDED_HOST"
    @env.delete "HTTP_HOST"
88
    assert_equal "glu.ttono.us:8007", @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
89 90 91 92 93 94
  end

  def test_host_with_port_falls_back_to_server_addr_if_necessary
    @env.delete "HTTP_X_FORWARDED_HOST"
    @env.delete "HTTP_HOST"
    @env.delete "SERVER_NAME"
95 96 97
    assert_equal "207.7.108.53", @request.host(true)
    assert_equal 8007, @request.port(true)
    assert_equal "207.7.108.53:8007", @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
98 99 100 101
  end

  def test_host_with_port_if_http_standard_port_is_specified
    @env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:80"
102
    assert_equal "glu.ttono.us", @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
103 104 105 106 107
  end

  def test_host_with_port_if_https_standard_port_is_specified
    @env['HTTP_X_FORWARDED_PROTO'] = "https"
    @env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:443"
108
    assert_equal "glu.ttono.us", @request.host_with_port(true)
E
Ezra Zygmuntowicz 已提交
109 110 111 112 113
  end

  def test_host_if_ipv6_reference
    @env.delete "HTTP_X_FORWARDED_HOST"
    @env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]"
114
    assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host(true)
E
Ezra Zygmuntowicz 已提交
115 116 117 118 119
  end

  def test_host_if_ipv6_reference_with_port
    @env.delete "HTTP_X_FORWARDED_HOST"
    @env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]:8008"
120
    assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host(true)
E
Ezra Zygmuntowicz 已提交
121 122
  end

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
  def test_cgi_environment_variables
    assert_equal "Basic", @request.auth_type
    assert_equal 0, @request.content_length
    assert_equal nil, @request.content_type
    assert_equal "CGI/1.1", @request.gateway_interface
    assert_equal "*/*", @request.accept
    assert_equal "UTF-8", @request.accept_charset
    assert_equal "gzip, deflate", @request.accept_encoding
    assert_equal "en", @request.accept_language
    assert_equal "no-cache, max-age=0", @request.cache_control
    assert_equal "googlebot", @request.from
    assert_equal "glu.ttono.us", @request.host
    assert_equal "trans", @request.negotiate
    assert_equal "no-cache", @request.pragma
    assert_equal "http://www.google.com/search?q=glu.ttono.us", @request.referer
    assert_equal "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)", @request.user_agent
    assert_equal "/homepage/", @request.path_info
    assert_equal "/home/kevinc/sites/typo/public/homepage/", @request.path_translated
    assert_equal "", @request.query_string
    assert_equal "207.7.108.53", @request.remote_addr
    assert_equal "google.com", @request.remote_host
    assert_equal "kevin", @request.remote_ident
    assert_equal "kevin", @request.remote_user
    assert_equal :get, @request.request_method
    assert_equal "/dispatch.fcgi", @request.script_name
    assert_equal "glu.ttono.us:8007", @request.server_name
    assert_equal 8007, @request.server_port
    assert_equal "HTTP/1.1", @request.server_protocol
    assert_equal "lighttpd", @request.server_software
  end

E
Ezra Zygmuntowicz 已提交
154
  def test_cookie_syntax_resilience
155
    cookies = @request.cookies
156 157
    assert_equal "c84ace84796670c052c6ceb2451fb0f2", cookies["_session_id"], cookies.inspect
    assert_equal "yes", cookies["is_admin"], cookies.inspect
E
Ezra Zygmuntowicz 已提交
158

159
    alt_cookies = @alt_cookie_fmt_request.cookies
160 161
    #assert_equal "c84ace847,96670c052c6ceb2451fb0f2", alt_cookies["_session_id"], alt_cookies.inspect
    assert_equal "yes", alt_cookies["is_admin"], alt_cookies.inspect
E
Ezra Zygmuntowicz 已提交
162 163 164 165 166
  end
end

class RackRequestParamsParsingTest < BaseRackTest
  def test_doesnt_break_when_content_type_has_charset
P
Pratik Naik 已提交
167 168
    set_content_data 'flamenco=love'

E
Ezra Zygmuntowicz 已提交
169 170 171 172 173 174 175 176 177
    assert_equal({"flamenco"=> "love"}, @request.request_parameters)
  end

  def test_doesnt_interpret_request_uri_as_query_string_when_missing
    @request.env['REQUEST_URI'] = 'foo'
    assert_equal({}, @request.query_parameters)
  end
end

178 179 180 181 182 183 184 185 186 187 188 189
class RackRequestContentTypeTest < BaseRackTest
  def test_html_content_type_verification
    @request.env['CONTENT_TYPE'] = Mime::HTML.to_s
    assert @request.content_type.verify_request?
  end

  def test_xml_content_type_verification
    @request.env['CONTENT_TYPE'] = Mime::XML.to_s
    assert !@request.content_type.verify_request?
  end
end

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
class RackRequestMethodTest < BaseRackTest
  def test_get
    assert_equal :get, @request.request_method
  end

  def test_post
    @request.env['REQUEST_METHOD'] = 'POST'
    assert_equal :post, @request.request_method
  end

  def test_put
    set_content_data '_method=put'

    assert_equal :put, @request.request_method
  end

  def test_delete
    set_content_data '_method=delete'

    assert_equal :delete, @request.request_method
  end
end

E
Ezra Zygmuntowicz 已提交
213 214 215 216 217 218 219 220
class RackRequestNeedsRewoundTest < BaseRackTest
  def test_body_should_be_rewound
    data = 'foo'
    @env['rack.input'] = StringIO.new(data)
    @env['CONTENT_LENGTH'] = data.length
    @env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'

    # Read the request body by parsing params.
P
Pratik Naik 已提交
221
    request = ActionController::Request.new(@env)
E
Ezra Zygmuntowicz 已提交
222 223 224 225 226 227 228 229 230 231
    request.request_parameters

    # Should have rewound the body.
    assert_equal 0, request.body.pos
  end
end

class RackResponseTest < BaseRackTest
  def setup
    super
232
    @response = ActionController::Response.new
E
Ezra Zygmuntowicz 已提交
233 234 235 236
  end

  def test_simple_output
    @response.body = "Hello, World!"
237
    @response.prepare!
E
Ezra Zygmuntowicz 已提交
238

J
Joshua Peek 已提交
239
    status, headers, body = @response.to_a
240
    assert_equal 200, status
241
    assert_equal({
242
      "Content-Type" => "text/html; charset=utf-8",
243 244 245 246 247
      "Cache-Control" => "private, max-age=0, must-revalidate",
      "ETag" => '"65a8e27d8879283831b664bd8b7f0ad4"',
      "Set-Cookie" => [],
      "Content-Length" => "13"
    }, headers)
E
Ezra Zygmuntowicz 已提交
248 249 250 251 252 253 254 255 256 257

    parts = []
    body.each { |part| parts << part }
    assert_equal ["Hello, World!"], parts
  end

  def test_streaming_block
    @response.body = Proc.new do |response, output|
      5.times { |n| output.write(n) }
    end
258
    @response.prepare!
E
Ezra Zygmuntowicz 已提交
259

J
Joshua Peek 已提交
260
    status, headers, body = @response.to_a
261
    assert_equal 200, status
262
    assert_equal({"Content-Type" => "text/html; charset=utf-8", "Cache-Control" => "no-cache", "Set-Cookie" => []}, headers)
E
Ezra Zygmuntowicz 已提交
263 264 265 266 267 268

    parts = []
    body.each { |part| parts << part }
    assert_equal ["0", "1", "2", "3", "4"], parts
  end
end
269 270 271 272

class RackResponseHeadersTest < BaseRackTest
  def setup
    super
273
    @response = ActionController::Response.new
274
    @response.status = "200 OK"
275 276 277 278
  end

  def test_content_type
    [204, 304].each do |c|
279
      @response.status = c.to_s
280
      assert !response_headers.has_key?("Content-Type"), "#{c} should not have Content-Type header"
281 282 283
    end

    [200, 302, 404, 500].each do |c|
284
      @response.status = c.to_s
285
      assert response_headers.has_key?("Content-Type"), "#{c} did not have Content-Type header"
286 287
    end
  end
288 289 290 291 292 293

  def test_status
    assert !response_headers.has_key?('Status')
  end

  private
294 295
    def response_headers
      @response.prepare!
J
Joshua Peek 已提交
296
      @response.to_a[1]
297
    end
298
end