PageRenderTime 33ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/rails/actionpack/test/controller/request_test.rb

http://monkeycharger.googlecode.com/
Ruby | 770 lines | 670 code | 96 blank | 4 comment | 1 complexity | a4a86ffe4934380b62ddf01494afe54b MD5 | raw file
  1. require File.dirname(__FILE__) + '/../abstract_unit'
  2. class RequestTest < Test::Unit::TestCase
  3. def setup
  4. @request = ActionController::TestRequest.new
  5. end
  6. def test_remote_ip
  7. assert_equal '0.0.0.0', @request.remote_ip
  8. @request.remote_addr = '1.2.3.4'
  9. assert_equal '1.2.3.4', @request.remote_ip
  10. @request.env['HTTP_CLIENT_IP'] = '2.3.4.5'
  11. assert_equal '2.3.4.5', @request.remote_ip
  12. @request.env.delete 'HTTP_CLIENT_IP'
  13. @request.env['HTTP_X_FORWARDED_FOR'] = '3.4.5.6'
  14. assert_equal '3.4.5.6', @request.remote_ip
  15. @request.env['HTTP_X_FORWARDED_FOR'] = 'unknown,3.4.5.6'
  16. assert_equal '3.4.5.6', @request.remote_ip
  17. @request.env['HTTP_X_FORWARDED_FOR'] = '172.16.0.1,3.4.5.6'
  18. assert_equal '3.4.5.6', @request.remote_ip
  19. @request.env['HTTP_X_FORWARDED_FOR'] = '192.168.0.1,3.4.5.6'
  20. assert_equal '3.4.5.6', @request.remote_ip
  21. @request.env['HTTP_X_FORWARDED_FOR'] = '10.0.0.1,3.4.5.6'
  22. assert_equal '3.4.5.6', @request.remote_ip
  23. @request.env['HTTP_X_FORWARDED_FOR'] = '10.0.0.1, 10.0.0.1, 3.4.5.6'
  24. assert_equal '3.4.5.6', @request.remote_ip
  25. @request.env['HTTP_X_FORWARDED_FOR'] = '127.0.0.1,3.4.5.6'
  26. assert_equal '127.0.0.1', @request.remote_ip
  27. @request.env['HTTP_X_FORWARDED_FOR'] = 'unknown,192.168.0.1'
  28. assert_equal '1.2.3.4', @request.remote_ip
  29. @request.env.delete 'HTTP_X_FORWARDED_FOR'
  30. end
  31. def test_domains
  32. @request.host = "www.rubyonrails.org"
  33. assert_equal "rubyonrails.org", @request.domain
  34. @request.host = "www.rubyonrails.co.uk"
  35. assert_equal "rubyonrails.co.uk", @request.domain(2)
  36. @request.host = "192.168.1.200"
  37. assert_nil @request.domain
  38. @request.host = nil
  39. assert_nil @request.domain
  40. end
  41. def test_subdomains
  42. @request.host = "www.rubyonrails.org"
  43. assert_equal %w( www ), @request.subdomains
  44. @request.host = "www.rubyonrails.co.uk"
  45. assert_equal %w( www ), @request.subdomains(2)
  46. @request.host = "dev.www.rubyonrails.co.uk"
  47. assert_equal %w( dev www ), @request.subdomains(2)
  48. @request.host = "foobar.foobar.com"
  49. assert_equal %w( foobar ), @request.subdomains
  50. @request.host = nil
  51. assert_equal [], @request.subdomains
  52. end
  53. def test_port_string
  54. @request.port = 80
  55. assert_equal "", @request.port_string
  56. @request.port = 8080
  57. assert_equal ":8080", @request.port_string
  58. end
  59. def test_relative_url_root
  60. @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
  61. @request.env['SERVER_SOFTWARE'] = 'lighttpd/1.2.3'
  62. assert_equal '', @request.relative_url_root, "relative_url_root should be disabled on lighttpd"
  63. @request.env['SERVER_SOFTWARE'] = 'apache/1.2.3 some random text'
  64. @request.env['SCRIPT_NAME'] = nil
  65. assert_equal "", @request.relative_url_root
  66. @request.env['SCRIPT_NAME'] = "/dispatch.cgi"
  67. assert_equal "", @request.relative_url_root
  68. @request.env['SCRIPT_NAME'] = "/myapp.rb"
  69. assert_equal "", @request.relative_url_root
  70. @request.relative_url_root = nil
  71. @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
  72. assert_equal "/hieraki", @request.relative_url_root
  73. @request.relative_url_root = nil
  74. @request.env['SCRIPT_NAME'] = "/collaboration/hieraki/dispatch.cgi"
  75. assert_equal "/collaboration/hieraki", @request.relative_url_root
  76. # apache/scgi case
  77. @request.relative_url_root = nil
  78. @request.env['SCRIPT_NAME'] = "/collaboration/hieraki"
  79. assert_equal "/collaboration/hieraki", @request.relative_url_root
  80. @request.relative_url_root = nil
  81. @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
  82. @request.env['SERVER_SOFTWARE'] = 'lighttpd/1.2.3'
  83. @request.env['RAILS_RELATIVE_URL_ROOT'] = "/hieraki"
  84. assert_equal "/hieraki", @request.relative_url_root
  85. # @env overrides path guess
  86. @request.relative_url_root = nil
  87. @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
  88. @request.env['SERVER_SOFTWARE'] = 'apache/1.2.3 some random text'
  89. @request.env['RAILS_RELATIVE_URL_ROOT'] = "/real_url"
  90. assert_equal "/real_url", @request.relative_url_root
  91. end
  92. def test_request_uri
  93. @request.env['SERVER_SOFTWARE'] = 'Apache 42.342.3432'
  94. @request.relative_url_root = nil
  95. @request.set_REQUEST_URI "http://www.rubyonrails.org/path/of/some/uri?mapped=1"
  96. assert_equal "/path/of/some/uri?mapped=1", @request.request_uri
  97. assert_equal "/path/of/some/uri", @request.path
  98. @request.relative_url_root = nil
  99. @request.set_REQUEST_URI "http://www.rubyonrails.org/path/of/some/uri"
  100. assert_equal "/path/of/some/uri", @request.request_uri
  101. assert_equal "/path/of/some/uri", @request.path
  102. @request.relative_url_root = nil
  103. @request.set_REQUEST_URI "/path/of/some/uri"
  104. assert_equal "/path/of/some/uri", @request.request_uri
  105. assert_equal "/path/of/some/uri", @request.path
  106. @request.relative_url_root = nil
  107. @request.set_REQUEST_URI "/"
  108. assert_equal "/", @request.request_uri
  109. assert_equal "/", @request.path
  110. @request.relative_url_root = nil
  111. @request.set_REQUEST_URI "/?m=b"
  112. assert_equal "/?m=b", @request.request_uri
  113. assert_equal "/", @request.path
  114. @request.relative_url_root = nil
  115. @request.set_REQUEST_URI "/"
  116. @request.env['SCRIPT_NAME'] = "/dispatch.cgi"
  117. assert_equal "/", @request.request_uri
  118. assert_equal "/", @request.path
  119. @request.relative_url_root = nil
  120. @request.set_REQUEST_URI "/hieraki/"
  121. @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
  122. assert_equal "/hieraki/", @request.request_uri
  123. assert_equal "/", @request.path
  124. @request.relative_url_root = nil
  125. @request.set_REQUEST_URI "/collaboration/hieraki/books/edit/2"
  126. @request.env['SCRIPT_NAME'] = "/collaboration/hieraki/dispatch.cgi"
  127. assert_equal "/collaboration/hieraki/books/edit/2", @request.request_uri
  128. assert_equal "/books/edit/2", @request.path
  129. # The following tests are for when REQUEST_URI is not supplied (as in IIS)
  130. @request.relative_url_root = nil
  131. @request.set_REQUEST_URI nil
  132. @request.env['PATH_INFO'] = "/path/of/some/uri?mapped=1"
  133. @request.env['SCRIPT_NAME'] = nil #"/path/dispatch.rb"
  134. assert_equal "/path/of/some/uri?mapped=1", @request.request_uri
  135. assert_equal "/path/of/some/uri", @request.path
  136. @request.set_REQUEST_URI nil
  137. @request.relative_url_root = nil
  138. @request.env['PATH_INFO'] = "/path/of/some/uri?mapped=1"
  139. @request.env['SCRIPT_NAME'] = "/path/dispatch.rb"
  140. assert_equal "/path/of/some/uri?mapped=1", @request.request_uri
  141. assert_equal "/of/some/uri", @request.path
  142. @request.set_REQUEST_URI nil
  143. @request.relative_url_root = nil
  144. @request.env['PATH_INFO'] = "/path/of/some/uri"
  145. @request.env['SCRIPT_NAME'] = nil
  146. assert_equal "/path/of/some/uri", @request.request_uri
  147. assert_equal "/path/of/some/uri", @request.path
  148. @request.set_REQUEST_URI nil
  149. @request.relative_url_root = nil
  150. @request.env['PATH_INFO'] = "/"
  151. assert_equal "/", @request.request_uri
  152. assert_equal "/", @request.path
  153. @request.set_REQUEST_URI nil
  154. @request.relative_url_root = nil
  155. @request.env['PATH_INFO'] = "/?m=b"
  156. assert_equal "/?m=b", @request.request_uri
  157. assert_equal "/", @request.path
  158. @request.set_REQUEST_URI nil
  159. @request.relative_url_root = nil
  160. @request.env['PATH_INFO'] = "/"
  161. @request.env['SCRIPT_NAME'] = "/dispatch.cgi"
  162. assert_equal "/", @request.request_uri
  163. assert_equal "/", @request.path
  164. @request.set_REQUEST_URI nil
  165. @request.relative_url_root = nil
  166. @request.env['PATH_INFO'] = "/hieraki/"
  167. @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
  168. assert_equal "/hieraki/", @request.request_uri
  169. assert_equal "/", @request.path
  170. @request.set_REQUEST_URI '/hieraki/dispatch.cgi'
  171. @request.relative_url_root = '/hieraki'
  172. assert_equal "/dispatch.cgi", @request.path
  173. @request.relative_url_root = nil
  174. @request.set_REQUEST_URI '/hieraki/dispatch.cgi'
  175. @request.relative_url_root = '/foo'
  176. assert_equal "/hieraki/dispatch.cgi", @request.path
  177. @request.relative_url_root = nil
  178. # This test ensures that Rails uses REQUEST_URI over PATH_INFO
  179. @request.relative_url_root = nil
  180. @request.env['REQUEST_URI'] = "/some/path"
  181. @request.env['PATH_INFO'] = "/another/path"
  182. @request.env['SCRIPT_NAME'] = "/dispatch.cgi"
  183. assert_equal "/some/path", @request.request_uri
  184. assert_equal "/some/path", @request.path
  185. end
  186. def test_host_with_port
  187. @request.host = "rubyonrails.org"
  188. @request.port = 80
  189. assert_equal "rubyonrails.org", @request.host_with_port
  190. @request.host = "rubyonrails.org"
  191. @request.port = 81
  192. assert_equal "rubyonrails.org:81", @request.host_with_port
  193. end
  194. def test_server_software
  195. assert_equal nil, @request.server_software
  196. @request.env['SERVER_SOFTWARE'] = 'Apache3.422'
  197. assert_equal 'apache', @request.server_software
  198. @request.env['SERVER_SOFTWARE'] = 'lighttpd(1.1.4)'
  199. assert_equal 'lighttpd', @request.server_software
  200. end
  201. def test_xml_http_request
  202. assert !@request.xml_http_request?
  203. assert !@request.xhr?
  204. @request.env['HTTP_X_REQUESTED_WITH'] = "DefinitelyNotAjax1.0"
  205. assert !@request.xml_http_request?
  206. assert !@request.xhr?
  207. @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"
  208. assert @request.xml_http_request?
  209. assert @request.xhr?
  210. end
  211. def test_reports_ssl
  212. assert !@request.ssl?
  213. @request.env['HTTPS'] = 'on'
  214. assert @request.ssl?
  215. end
  216. def test_reports_ssl_when_proxied_via_lighttpd
  217. assert !@request.ssl?
  218. @request.env['HTTP_X_FORWARDED_PROTO'] = 'https'
  219. assert @request.ssl?
  220. end
  221. def test_symbolized_request_methods
  222. [:get, :post, :put, :delete].each do |method|
  223. set_request_method_to method
  224. assert_equal method, @request.method
  225. end
  226. end
  227. def test_allow_method_hacking_on_post
  228. set_request_method_to :post
  229. [:get, :put, :delete].each do |method|
  230. @request.instance_eval { @parameters = { :_method => method } ; @request_method = nil }
  231. assert_equal method, @request.method
  232. end
  233. end
  234. def test_restrict_method_hacking
  235. @request.instance_eval { @parameters = { :_method => 'put' } }
  236. [:get, :put, :delete].each do |method|
  237. set_request_method_to method
  238. assert_equal method, @request.method
  239. end
  240. end
  241. def test_head_masquarading_as_get
  242. set_request_method_to :head
  243. assert_equal :get, @request.method
  244. assert @request.get?
  245. assert @request.head?
  246. end
  247. def test_xml_format
  248. @request.instance_eval { @parameters = { :format => 'xml' } }
  249. assert_equal Mime::XML, @request.format
  250. end
  251. def test_xhtml_format
  252. @request.instance_eval { @parameters = { :format => 'xhtml' } }
  253. assert_equal Mime::HTML, @request.format
  254. end
  255. def test_txt_format
  256. @request.instance_eval { @parameters = { :format => 'txt' } }
  257. assert_equal Mime::TEXT, @request.format
  258. end
  259. def test_nil_format
  260. @request.instance_eval { @parameters = { :format => nil } }
  261. @request.env["HTTP_ACCEPT"] = "text/javascript"
  262. assert_equal Mime::JS, @request.format
  263. end
  264. def test_content_type
  265. @request.env["CONTENT_TYPE"] = "text/html"
  266. assert_equal Mime::HTML, @request.content_type
  267. end
  268. def test_content_no_type
  269. assert_equal nil, @request.content_type
  270. end
  271. def test_content_type_xml
  272. @request.env["CONTENT_TYPE"] = "application/xml"
  273. assert_equal Mime::XML, @request.content_type
  274. end
  275. def test_content_type_with_charset
  276. @request.env["CONTENT_TYPE"] = "application/xml; charset=UTF-8"
  277. assert_equal Mime::XML, @request.content_type
  278. end
  279. protected
  280. def set_request_method_to(method)
  281. @request.env['REQUEST_METHOD'] = method.to_s.upcase
  282. @request.instance_eval { @request_method = nil }
  283. end
  284. end
  285. class UrlEncodedRequestParameterParsingTest < Test::Unit::TestCase
  286. def setup
  287. @query_string = "action=create_customer&full_name=David%20Heinemeier%20Hansson&customerId=1"
  288. @query_string_with_empty = "action=create_customer&full_name="
  289. @query_string_with_array = "action=create_customer&selected[]=1&selected[]=2&selected[]=3"
  290. @query_string_with_amps = "action=create_customer&name=Don%27t+%26+Does"
  291. @query_string_with_multiple_of_same_name =
  292. "action=update_order&full_name=Lau%20Taarnskov&products=4&products=2&products=3"
  293. @query_string_with_many_equal = "action=create_customer&full_name=abc=def=ghi"
  294. @query_string_without_equal = "action"
  295. @query_string_with_many_ampersands =
  296. "&action=create_customer&&&full_name=David%20Heinemeier%20Hansson"
  297. @query_string_with_empty_key = "action=create_customer&full_name=David%20Heinemeier%20Hansson&=Save"
  298. end
  299. def test_query_string
  300. assert_equal(
  301. { "action" => "create_customer", "full_name" => "David Heinemeier Hansson", "customerId" => "1"},
  302. ActionController::AbstractRequest.parse_query_parameters(@query_string)
  303. )
  304. end
  305. def test_deep_query_string
  306. expected = {'x' => {'y' => {'z' => '10'}}}
  307. assert_equal(expected, ActionController::AbstractRequest.parse_query_parameters('x[y][z]=10'))
  308. end
  309. def test_deep_query_string_with_array
  310. assert_equal({'x' => {'y' => {'z' => ['10']}}}, ActionController::AbstractRequest.parse_query_parameters('x[y][z][]=10'))
  311. assert_equal({'x' => {'y' => {'z' => ['10', '5']}}}, ActionController::AbstractRequest.parse_query_parameters('x[y][z][]=10&x[y][z][]=5'))
  312. end
  313. def test_deep_query_string_with_array_of_hash
  314. assert_equal({'x' => {'y' => [{'z' => '10'}]}}, ActionController::AbstractRequest.parse_query_parameters('x[y][][z]=10'))
  315. assert_equal({'x' => {'y' => [{'z' => '10', 'w' => '10'}]}}, ActionController::AbstractRequest.parse_query_parameters('x[y][][z]=10&x[y][][w]=10'))
  316. end
  317. def test_deep_query_string_with_array_of_hashes_with_one_pair
  318. assert_equal({'x' => {'y' => [{'z' => '10'}, {'z' => '20'}]}}, ActionController::AbstractRequest.parse_query_parameters('x[y][][z]=10&x[y][][z]=20'))
  319. assert_equal("10", ActionController::AbstractRequest.parse_query_parameters('x[y][][z]=10&x[y][][z]=20')["x"]["y"].first["z"])
  320. assert_equal("10", ActionController::AbstractRequest.parse_query_parameters('x[y][][z]=10&x[y][][z]=20').with_indifferent_access[:x][:y].first[:z])
  321. end
  322. def test_deep_query_string_with_array_of_hashes_with_multiple_pairs
  323. assert_equal(
  324. {'x' => {'y' => [{'z' => '10', 'w' => 'a'}, {'z' => '20', 'w' => 'b'}]}},
  325. ActionController::AbstractRequest.parse_query_parameters('x[y][][z]=10&x[y][][w]=a&x[y][][z]=20&x[y][][w]=b')
  326. )
  327. end
  328. def test_query_string_with_nil
  329. assert_equal(
  330. { "action" => "create_customer", "full_name" => ''},
  331. ActionController::AbstractRequest.parse_query_parameters(@query_string_with_empty)
  332. )
  333. end
  334. def test_query_string_with_array
  335. assert_equal(
  336. { "action" => "create_customer", "selected" => ["1", "2", "3"]},
  337. ActionController::AbstractRequest.parse_query_parameters(@query_string_with_array)
  338. )
  339. end
  340. def test_query_string_with_amps
  341. assert_equal(
  342. { "action" => "create_customer", "name" => "Don't & Does"},
  343. ActionController::AbstractRequest.parse_query_parameters(@query_string_with_amps)
  344. )
  345. end
  346. def test_query_string_with_many_equal
  347. assert_equal(
  348. { "action" => "create_customer", "full_name" => "abc=def=ghi"},
  349. ActionController::AbstractRequest.parse_query_parameters(@query_string_with_many_equal)
  350. )
  351. end
  352. def test_query_string_without_equal
  353. assert_equal(
  354. { "action" => nil },
  355. ActionController::AbstractRequest.parse_query_parameters(@query_string_without_equal)
  356. )
  357. end
  358. def test_query_string_with_empty_key
  359. assert_equal(
  360. { "action" => "create_customer", "full_name" => "David Heinemeier Hansson" },
  361. ActionController::AbstractRequest.parse_query_parameters(@query_string_with_empty_key)
  362. )
  363. end
  364. def test_query_string_with_many_ampersands
  365. assert_equal(
  366. { "action" => "create_customer", "full_name" => "David Heinemeier Hansson"},
  367. ActionController::AbstractRequest.parse_query_parameters(@query_string_with_many_ampersands)
  368. )
  369. end
  370. def test_unbalanced_query_string_with_array
  371. assert_equal(
  372. {'location' => ["1", "2"], 'age_group' => ["2"]},
  373. ActionController::AbstractRequest.parse_query_parameters("location[]=1&location[]=2&age_group[]=2")
  374. )
  375. assert_equal(
  376. {'location' => ["1", "2"], 'age_group' => ["2"]},
  377. ActionController::AbstractRequest.parse_request_parameters({'location[]' => ["1", "2"],
  378. 'age_group[]' => ["2"]})
  379. )
  380. end
  381. def test_request_hash_parsing
  382. query = {
  383. "note[viewers][viewer][][type]" => ["User", "Group"],
  384. "note[viewers][viewer][][id]" => ["1", "2"]
  385. }
  386. expected = { "note" => { "viewers"=>{"viewer"=>[{ "id"=>"1", "type"=>"User"}, {"type"=>"Group", "id"=>"2"} ]} } }
  387. assert_equal(expected, ActionController::AbstractRequest.parse_request_parameters(query))
  388. end
  389. def test_parse_params
  390. input = {
  391. "customers[boston][first][name]" => [ "David" ],
  392. "customers[boston][first][url]" => [ "http://David" ],
  393. "customers[boston][second][name]" => [ "Allan" ],
  394. "customers[boston][second][url]" => [ "http://Allan" ],
  395. "something_else" => [ "blah" ],
  396. "something_nil" => [ nil ],
  397. "something_empty" => [ "" ],
  398. "products[first]" => [ "Apple Computer" ],
  399. "products[second]" => [ "Pc" ],
  400. "" => [ 'Save' ]
  401. }
  402. expected_output = {
  403. "customers" => {
  404. "boston" => {
  405. "first" => {
  406. "name" => "David",
  407. "url" => "http://David"
  408. },
  409. "second" => {
  410. "name" => "Allan",
  411. "url" => "http://Allan"
  412. }
  413. }
  414. },
  415. "something_else" => "blah",
  416. "something_empty" => "",
  417. "something_nil" => "",
  418. "products" => {
  419. "first" => "Apple Computer",
  420. "second" => "Pc"
  421. }
  422. }
  423. assert_equal expected_output, ActionController::AbstractRequest.parse_request_parameters(input)
  424. end
  425. def test_parse_params_from_multipart_upload
  426. mockup = Struct.new(:content_type, :original_filename, :read, :rewind)
  427. file = mockup.new('img/jpeg', 'foo.jpg')
  428. ie_file = mockup.new('img/jpeg', 'c:\\Documents and Settings\\foo\\Desktop\\bar.jpg')
  429. non_file_text_part = mockup.new('text/plain', '', 'abc')
  430. input = {
  431. "something" => [ StringIO.new("") ],
  432. "array_of_stringios" => [[ StringIO.new("One"), StringIO.new("Two") ]],
  433. "mixed_types_array" => [[ StringIO.new("Three"), "NotStringIO" ]],
  434. "mixed_types_as_checkboxes[strings][nested]" => [[ file, "String", StringIO.new("StringIO")]],
  435. "ie_mixed_types_as_checkboxes[strings][nested]" => [[ ie_file, "String", StringIO.new("StringIO")]],
  436. "products[string]" => [ StringIO.new("Apple Computer") ],
  437. "products[file]" => [ file ],
  438. "ie_products[string]" => [ StringIO.new("Microsoft") ],
  439. "ie_products[file]" => [ ie_file ],
  440. "text_part" => [non_file_text_part]
  441. }
  442. expected_output = {
  443. "something" => "",
  444. "array_of_stringios" => ["One", "Two"],
  445. "mixed_types_array" => [ "Three", "NotStringIO" ],
  446. "mixed_types_as_checkboxes" => {
  447. "strings" => {
  448. "nested" => [ file, "String", "StringIO" ]
  449. },
  450. },
  451. "ie_mixed_types_as_checkboxes" => {
  452. "strings" => {
  453. "nested" => [ ie_file, "String", "StringIO" ]
  454. },
  455. },
  456. "products" => {
  457. "string" => "Apple Computer",
  458. "file" => file
  459. },
  460. "ie_products" => {
  461. "string" => "Microsoft",
  462. "file" => ie_file
  463. },
  464. "text_part" => "abc"
  465. }
  466. params = ActionController::AbstractRequest.parse_request_parameters(input)
  467. assert_equal expected_output, params
  468. # Lone filenames are preserved.
  469. assert_equal 'foo.jpg', params['mixed_types_as_checkboxes']['strings']['nested'].first.original_filename
  470. assert_equal 'foo.jpg', params['products']['file'].original_filename
  471. # But full Windows paths are reduced to their basename.
  472. assert_equal 'bar.jpg', params['ie_mixed_types_as_checkboxes']['strings']['nested'].first.original_filename
  473. assert_equal 'bar.jpg', params['ie_products']['file'].original_filename
  474. end
  475. def test_parse_params_with_file
  476. input = {
  477. "customers[boston][first][name]" => [ "David" ],
  478. "something_else" => [ "blah" ],
  479. "logo" => [ File.new(File.dirname(__FILE__) + "/cgi_test.rb").path ]
  480. }
  481. expected_output = {
  482. "customers" => {
  483. "boston" => {
  484. "first" => {
  485. "name" => "David"
  486. }
  487. }
  488. },
  489. "something_else" => "blah",
  490. "logo" => File.new(File.dirname(__FILE__) + "/cgi_test.rb").path,
  491. }
  492. assert_equal expected_output, ActionController::AbstractRequest.parse_request_parameters(input)
  493. end
  494. def test_parse_params_with_array
  495. input = { "selected[]" => [ "1", "2", "3" ] }
  496. expected_output = { "selected" => [ "1", "2", "3" ] }
  497. assert_equal expected_output, ActionController::AbstractRequest.parse_request_parameters(input)
  498. end
  499. def test_parse_params_with_non_alphanumeric_name
  500. input = { "a/b[c]" => %w(d) }
  501. expected = { "a/b" => { "c" => "d" }}
  502. assert_equal expected, ActionController::AbstractRequest.parse_request_parameters(input)
  503. end
  504. def test_parse_params_with_single_brackets_in_middle
  505. input = { "a/b[c]d" => %w(e) }
  506. expected = { "a/b" => {} }
  507. assert_equal expected, ActionController::AbstractRequest.parse_request_parameters(input)
  508. end
  509. def test_parse_params_with_separated_brackets
  510. input = { "a/b@[c]d[e]" => %w(f) }
  511. expected = { "a/b@" => { }}
  512. assert_equal expected, ActionController::AbstractRequest.parse_request_parameters(input)
  513. end
  514. def test_parse_params_with_separated_brackets_and_array
  515. input = { "a/b@[c]d[e][]" => %w(f) }
  516. expected = { "a/b@" => { }}
  517. assert_equal expected , ActionController::AbstractRequest.parse_request_parameters(input)
  518. end
  519. def test_parse_params_with_unmatched_brackets_and_array
  520. input = { "a/b@[c][d[e][]" => %w(f) }
  521. expected = { "a/b@" => { "c" => { }}}
  522. assert_equal expected, ActionController::AbstractRequest.parse_request_parameters(input)
  523. end
  524. def test_parse_params_with_nil_key
  525. input = { nil => nil, "test2" => %w(value1) }
  526. expected = { "test2" => "value1" }
  527. assert_equal expected, ActionController::AbstractRequest.parse_request_parameters(input)
  528. end
  529. end
  530. class MultipartRequestParameterParsingTest < Test::Unit::TestCase
  531. FIXTURE_PATH = File.dirname(__FILE__) + '/../fixtures/multipart'
  532. def test_single_parameter
  533. params = process('single_parameter')
  534. assert_equal({ 'foo' => 'bar' }, params)
  535. end
  536. def test_bracketed_param
  537. assert_equal({ 'foo' => { 'baz' => 'bar'}}, process('bracketed_param'))
  538. end
  539. def test_text_file
  540. params = process('text_file')
  541. assert_equal %w(file foo), params.keys.sort
  542. assert_equal 'bar', params['foo']
  543. file = params['file']
  544. assert_kind_of StringIO, file
  545. assert_equal 'file.txt', file.original_filename
  546. assert_equal "text/plain\r", file.content_type
  547. assert_equal 'contents', file.read
  548. end
  549. def test_large_text_file
  550. params = process('large_text_file')
  551. assert_equal %w(file foo), params.keys.sort
  552. assert_equal 'bar', params['foo']
  553. file = params['file']
  554. assert_kind_of Tempfile, file
  555. assert_equal 'file.txt', file.original_filename
  556. assert_equal "text/plain\r", file.content_type
  557. assert ('a' * 20480) == file.read
  558. end
  559. def test_binary_file
  560. params = process('binary_file')
  561. assert_equal %w(file flowers foo), params.keys.sort
  562. assert_equal 'bar', params['foo']
  563. file = params['file']
  564. assert_kind_of StringIO, file
  565. assert_equal 'file.csv', file.original_filename
  566. assert_equal '', file.content_type
  567. assert_equal 'contents', file.read
  568. file = params['flowers']
  569. assert_kind_of StringIO, file
  570. assert_equal 'flowers.jpg', file.original_filename
  571. assert_equal "image/jpeg\r", file.content_type
  572. assert_equal 19512, file.size
  573. #assert_equal File.read(File.dirname(__FILE__) + '/../../../activerecord/test/fixtures/flowers.jpg'), file.read
  574. end
  575. def test_mixed_files
  576. params = process('mixed_files')
  577. assert_equal %w(files foo), params.keys.sort
  578. assert_equal 'bar', params['foo']
  579. # Ruby CGI doesn't handle multipart/mixed for us.
  580. assert_kind_of String, params['files']
  581. assert_equal 19756, params['files'].size
  582. end
  583. private
  584. def process(name)
  585. File.open(File.join(FIXTURE_PATH, name), 'rb') do |file|
  586. ActionController::AbstractRequest.parse_multipart_form_parameters(file, 'AaB03x', file.stat.size, {})
  587. end
  588. end
  589. end
  590. class XmlParamsParsingTest < Test::Unit::TestCase
  591. def test_single_file
  592. person = parse_body("<person><name>David</name><avatar type='file' name='me.jpg' content_type='image/jpg'>#{Base64.encode64('ABC')}</avatar></person>")
  593. assert_equal "image/jpg", person['person']['avatar'].content_type
  594. assert_equal "me.jpg", person['person']['avatar'].original_filename
  595. assert_equal "ABC", person['person']['avatar'].read
  596. end
  597. def test_multiple_files
  598. person = parse_body(<<-end_body)
  599. <person>
  600. <name>David</name>
  601. <avatars>
  602. <avatar type='file' name='me.jpg' content_type='image/jpg'>#{Base64.encode64('ABC')}</avatar>
  603. <avatar type='file' name='you.gif' content_type='image/gif'>#{Base64.encode64('DEF')}</avatar>
  604. </avatars>
  605. </person>
  606. end_body
  607. assert_equal "image/jpg", person['person']['avatars']['avatar'].first.content_type
  608. assert_equal "me.jpg", person['person']['avatars']['avatar'].first.original_filename
  609. assert_equal "ABC", person['person']['avatars']['avatar'].first.read
  610. assert_equal "image/gif", person['person']['avatars']['avatar'].last.content_type
  611. assert_equal "you.gif", person['person']['avatars']['avatar'].last.original_filename
  612. assert_equal "DEF", person['person']['avatars']['avatar'].last.read
  613. end
  614. private
  615. def parse_body(body)
  616. env = { 'CONTENT_TYPE' => 'application/xml',
  617. 'CONTENT_LENGTH' => body.size.to_s }
  618. cgi = ActionController::Integration::Session::MockCGI.new(env, body)
  619. ActionController::CgiRequest.new(cgi).request_parameters
  620. end
  621. end
  622. class LegacyXmlParamsParsingTest < XmlParamsParsingTest
  623. private
  624. def parse_body(body)
  625. env = { 'HTTP_X_POST_DATA_FORMAT' => 'xml',
  626. 'CONTENT_LENGTH' => body.size.to_s }
  627. cgi = ActionController::Integration::Session::MockCGI.new(env, body)
  628. ActionController::CgiRequest.new(cgi).request_parameters
  629. end
  630. end