1 require 'abstract_unit'
3 class UrlEncodedParamsParsingTest
< ActionController
::IntegrationTest
4 class TestController
< ActionController
::Base
6 attr_accessor
:last_request_parameters, :last_request_type
10 self.class.last_request_parameters
= request
.request_parameters
16 TestController
.last_request_parameters
= nil
19 test
"parses unbalanced query string with array" do
21 {'location' => ["1", "2"], 'age_group' => ["2"]},
22 "location[]=1&location[]=2&age_group[]=2"
26 test
"parses nested hash" do
28 "note[viewers][viewer][][type]=User",
29 "note[viewers][viewer][][id]=1",
30 "note[viewers][viewer][][type]=Group",
31 "note[viewers][viewer][][id]=2"
34 expected
= { "note" => { "viewers"=>{"viewer"=>[{ "id"=>"1", "type"=>"User"}, {"type"=>"Group", "id"=>"2"} ]} } }
35 assert_parses(expected
, query
)
38 test
"parses more complex nesting" do
40 "customers[boston][first][name]=David",
41 "customers[boston][first][url]=http://David",
42 "customers[boston][second][name]=Allan",
43 "customers[boston][second][url]=http://Allan",
44 "something_else=blah",
47 "products[first]=Apple Computer",
48 "products[second]=Pc",
57 "url" => "http://David"
61 "url" => "http://Allan"
65 "something_else" => "blah",
66 "something_empty" => "",
67 "something_nil" => "",
69 "first" => "Apple Computer",
74 assert_parses expected
, query
77 test
"parses params with array" do
78 query
= "selected[]=1&selected[]=2&selected[]=3"
79 expected
= { "selected" => [ "1", "2", "3" ] }
80 assert_parses expected
, query
83 test
"parses params with nil key" do
84 query
= "=&test2=value1"
85 expected
= { "test2" => "value1" }
86 assert_parses expected
, query
89 test
"parses params with array prefix and hashes" do
91 expected
= {"a" => [{"b" => {"c" => "d"}}]}
92 assert_parses expected
, query
95 test
"parses params with complex nesting" do
96 query
= "a[][b][c][][d][]=e"
97 expected
= {"a" => [{"b" => {"c" => [{"d" => ["e"]}]}}]}
98 assert_parses expected
, query
101 test
"parses params with file path" do
103 "customers[boston][first][name]=David",
104 "something_else=blah",
105 "logo=#{File.expand_path(__FILE__)}"
116 "something_else" => "blah",
117 "logo" => File
.expand_path(__FILE__
),
120 assert_parses expected
, query
123 test
"parses params with Safari 2 trailing null character" do
124 query
= "selected[]=1&selected[]=2&selected[]=3\0"
125 expected
= { "selected" => [ "1", "2", "3" ] }
126 assert_parses expected
, query
129 test
"passes through rack middleware and parses params" do
130 with_muck_middleware
do
131 assert_parses({ "a" => { "b" => "c" } }, "a[b]=c")
135 # The lint wrapper is used in integration tests
136 # instead of a normal StringIO class
137 InputWrapper
= Rack
::Lint::InputWrapper
139 test
"passes through rack middleware and parses params with unwindable input" do
140 InputWrapper
.any_instance
.stubs(:rewind).raises(Errno
::ESPIPE)
141 with_muck_middleware
do
142 assert_parses({ "a" => { "b" => "c" } }, "a[b]=c")
153 req
= Rack
::Request.new(env)
154 req
.params
# Parse params
159 def with_muck_middleware
160 original_middleware
= ActionController
::Dispatcher.middleware
161 middleware
= original_middleware
.dup
162 middleware
.insert_after ActionController
::RewindableInput, MuckMiddleware
163 ActionController
::Dispatcher.middleware
= middleware
165 ActionController
::Dispatcher.middleware
= original_middleware
168 def with_test_routing
169 with_routing
do |set
|
171 map
.connect
':action', :controller => "url_encoded_params_parsing_test/test"
177 def assert_parses(expected
, actual
)
179 post
"/parse", actual
181 assert_equal(expected
, TestController
.last_request_parameters
)