PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Languages/Ruby/Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/rack_test.rb

http://github.com/IronLanguages/main
Ruby | 203 lines | 173 code | 24 blank | 6 comment | 6 complexity | 84823ada1508a92ad91e64ba56759056 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. require 'abstract_unit'
  2. # TODO: Merge these tests into RequestTest
  3. class BaseRackTest < ActiveSupport::TestCase
  4. def setup
  5. @env = {
  6. "HTTP_MAX_FORWARDS" => "10",
  7. "SERVER_NAME" => "glu.ttono.us",
  8. "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. "HTTP_CACHE_CONTROL" => "no-cache, max-age=0",
  14. "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. "HTTP_REFERER" => "http://www.google.com/search?q=glu.ttono.us",
  21. "HTTP_FROM" => "googlebot",
  22. "SERVER_PROTOCOL" => "HTTP/1.1",
  23. "REDIRECT_URI" => "/dispatch.fcgi",
  24. "SCRIPT_NAME" => "/dispatch.fcgi",
  25. "SERVER_ADDR" => "207.7.108.53",
  26. "REMOTE_ADDR" => "207.7.108.53",
  27. "REMOTE_HOST" => "google.com",
  28. "REMOTE_IDENT" => "kevin",
  29. "REMOTE_USER" => "kevin",
  30. "SERVER_SOFTWARE" => "lighttpd/1.4.5",
  31. "HTTP_COOKIE" => "_session_id=c84ace84796670c052c6ceb2451fb0f2; is_admin=yes",
  32. "HTTP_X_FORWARDED_SERVER" => "glu.ttono.us",
  33. "REQUEST_URI" => "/admin",
  34. "DOCUMENT_ROOT" => "/home/kevinc/sites/typo/public",
  35. "PATH_TRANSLATED" => "/home/kevinc/sites/typo/public/homepage/",
  36. "SERVER_PORT" => "8007",
  37. "QUERY_STRING" => "",
  38. "REMOTE_PORT" => "63137",
  39. "GATEWAY_INTERFACE" => "CGI/1.1",
  40. "HTTP_X_FORWARDED_FOR" => "65.88.180.234",
  41. "HTTP_ACCEPT" => "*/*",
  42. "SCRIPT_FILENAME" => "/home/kevinc/sites/typo/public/dispatch.fcgi",
  43. "REDIRECT_STATUS" => "200",
  44. "REQUEST_METHOD" => "GET"
  45. }
  46. @request = ActionDispatch::Request.new(@env)
  47. # some Nokia phone browsers omit the space after the semicolon separator.
  48. # some developers have grown accustomed to using comma in cookie values.
  49. @alt_cookie_fmt_request = ActionDispatch::Request.new(@env.merge({"HTTP_COOKIE"=>"_session_id=c84ace847,96670c052c6ceb2451fb0f2;is_admin=yes"}))
  50. end
  51. private
  52. def set_content_data(data)
  53. @request.env['REQUEST_METHOD'] = 'POST'
  54. @request.env['CONTENT_LENGTH'] = data.length
  55. @request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
  56. @request.env['rack.input'] = StringIO.new(data)
  57. end
  58. end
  59. class RackRequestTest < BaseRackTest
  60. test "proxy request" do
  61. assert_equal 'glu.ttono.us', @request.host_with_port
  62. end
  63. test "http host" do
  64. @env.delete "HTTP_X_FORWARDED_HOST"
  65. @env['HTTP_HOST'] = "rubyonrails.org:8080"
  66. assert_equal "rubyonrails.org", @request.host
  67. assert_equal "rubyonrails.org:8080", @request.host_with_port
  68. @env['HTTP_X_FORWARDED_HOST'] = "www.firsthost.org, www.secondhost.org"
  69. assert_equal "www.secondhost.org", @request.host
  70. end
  71. test "http host with default port overrides server port" do
  72. @env.delete "HTTP_X_FORWARDED_HOST"
  73. @env['HTTP_HOST'] = "rubyonrails.org"
  74. assert_equal "rubyonrails.org", @request.host_with_port
  75. end
  76. test "host with port defaults to server name if no host headers" do
  77. @env.delete "HTTP_X_FORWARDED_HOST"
  78. @env.delete "HTTP_HOST"
  79. assert_equal "glu.ttono.us:8007", @request.host_with_port
  80. end
  81. test "host with port falls back to server addr if necessary" do
  82. @env.delete "HTTP_X_FORWARDED_HOST"
  83. @env.delete "HTTP_HOST"
  84. @env.delete "SERVER_NAME"
  85. assert_equal "207.7.108.53", @request.host
  86. assert_equal 8007, @request.port
  87. assert_equal "207.7.108.53:8007", @request.host_with_port
  88. end
  89. test "host with port if http standard port is specified" do
  90. @env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:80"
  91. assert_equal "glu.ttono.us", @request.host_with_port
  92. end
  93. test "host with port if https standard port is specified" do
  94. @env['HTTP_X_FORWARDED_PROTO'] = "https"
  95. @env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:443"
  96. assert_equal "glu.ttono.us", @request.host_with_port
  97. end
  98. test "host if ipv6 reference" do
  99. @env.delete "HTTP_X_FORWARDED_HOST"
  100. @env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]"
  101. assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
  102. end
  103. test "host if ipv6 reference with port" do
  104. @env.delete "HTTP_X_FORWARDED_HOST"
  105. @env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]:8008"
  106. assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
  107. end
  108. test "cgi environment variables" do
  109. assert_equal "Basic", @request.auth_type
  110. assert_equal 0, @request.content_length
  111. assert_equal nil, @request.content_mime_type
  112. assert_equal "CGI/1.1", @request.gateway_interface
  113. assert_equal "*/*", @request.accept
  114. assert_equal "UTF-8", @request.accept_charset
  115. assert_equal "gzip, deflate", @request.accept_encoding
  116. assert_equal "en", @request.accept_language
  117. assert_equal "no-cache, max-age=0", @request.cache_control
  118. assert_equal "googlebot", @request.from
  119. assert_equal "glu.ttono.us", @request.host
  120. assert_equal "trans", @request.negotiate
  121. assert_equal "no-cache", @request.pragma
  122. assert_equal "http://www.google.com/search?q=glu.ttono.us", @request.referer
  123. assert_equal "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)", @request.user_agent
  124. assert_equal "/homepage/", @request.path_info
  125. assert_equal "/home/kevinc/sites/typo/public/homepage/", @request.path_translated
  126. assert_equal "", @request.query_string
  127. assert_equal "207.7.108.53", @request.remote_addr
  128. assert_equal "google.com", @request.remote_host
  129. assert_equal "kevin", @request.remote_ident
  130. assert_equal "kevin", @request.remote_user
  131. assert_equal "GET", @request.request_method
  132. assert_equal "/dispatch.fcgi", @request.script_name
  133. assert_equal "glu.ttono.us", @request.server_name
  134. assert_equal 8007, @request.server_port
  135. assert_equal "HTTP/1.1", @request.server_protocol
  136. assert_equal "lighttpd", @request.server_software
  137. end
  138. test "cookie syntax resilience" do
  139. cookies = @request.cookies
  140. assert_equal "c84ace84796670c052c6ceb2451fb0f2", cookies["_session_id"], cookies.inspect
  141. assert_equal "yes", cookies["is_admin"], cookies.inspect
  142. alt_cookies = @alt_cookie_fmt_request.cookies
  143. #assert_equal "c84ace847,96670c052c6ceb2451fb0f2", alt_cookies["_session_id"], alt_cookies.inspect
  144. assert_equal "yes", alt_cookies["is_admin"], alt_cookies.inspect
  145. end
  146. end
  147. class RackRequestParamsParsingTest < BaseRackTest
  148. test "doesnt break when content type has charset" do
  149. set_content_data 'flamenco=love'
  150. assert_equal({"flamenco"=> "love"}, @request.request_parameters)
  151. end
  152. test "doesnt interpret request uri as query string when missing" do
  153. @request.env['REQUEST_URI'] = 'foo'
  154. assert_equal({}, @request.query_parameters)
  155. end
  156. end
  157. class RackRequestContentTypeTest < BaseRackTest
  158. test "html content type verification" do
  159. @request.env['CONTENT_TYPE'] = Mime::HTML.to_s
  160. assert @request.content_mime_type.verify_request?
  161. end
  162. test "xml content type verification" do
  163. @request.env['CONTENT_TYPE'] = Mime::XML.to_s
  164. assert !@request.content_mime_type.verify_request?
  165. end
  166. end
  167. class RackRequestNeedsRewoundTest < BaseRackTest
  168. test "body should be rewound" do
  169. data = 'foo'
  170. @env['rack.input'] = StringIO.new(data)
  171. @env['CONTENT_LENGTH'] = data.length
  172. @env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
  173. # Read the request body by parsing params.
  174. request = ActionDispatch::Request.new(@env)
  175. request.request_parameters
  176. # Should have rewound the body.
  177. assert_equal 0, request.body.pos
  178. end
  179. end