mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Refactor request query string parsing tests
This commit is contained in:
parent
e1f73aab8c
commit
282c1d6159
3 changed files with 122 additions and 106 deletions
|
@ -412,9 +412,11 @@ EOM
|
|||
@parser.body
|
||||
end
|
||||
|
||||
def query_parameters
|
||||
# Override Rack's GET method to support nested query strings
|
||||
def GET
|
||||
@parser.query_parameters
|
||||
end
|
||||
alias_method :query_parameters, :GET
|
||||
|
||||
def request_parameters
|
||||
@parser.request_parameters
|
||||
|
|
118
actionpack/test/controller/query_string_parsing_test.rb
Normal file
118
actionpack/test/controller/query_string_parsing_test.rb
Normal file
|
@ -0,0 +1,118 @@
|
|||
class QueryStringParsingTest <ActionController::IntegrationTest
|
||||
class TestController < ActionController::Base
|
||||
class << self
|
||||
attr_accessor :last_query_parameters
|
||||
end
|
||||
|
||||
def parse
|
||||
self.class.last_query_parameters = request.query_parameters
|
||||
head :ok
|
||||
end
|
||||
end
|
||||
|
||||
def teardown
|
||||
TestController.last_query_parameters = nil
|
||||
end
|
||||
|
||||
test "query string" do
|
||||
assert_parses(
|
||||
{"action" => "create_customer", "full_name" => "David Heinemeier Hansson", "customerId" => "1"},
|
||||
"action=create_customer&full_name=David%20Heinemeier%20Hansson&customerId=1"
|
||||
)
|
||||
end
|
||||
|
||||
test "deep query string" do
|
||||
assert_parses(
|
||||
{'x' => {'y' => {'z' => '10'}}},
|
||||
"x[y][z]=10"
|
||||
)
|
||||
end
|
||||
|
||||
test "deep query string with array" do
|
||||
assert_parses({'x' => {'y' => {'z' => ['10']}}}, 'x[y][z][]=10')
|
||||
assert_parses({'x' => {'y' => {'z' => ['10', '5']}}}, 'x[y][z][]=10&x[y][z][]=5')
|
||||
end
|
||||
|
||||
test "deep query string with array of hash" do
|
||||
assert_parses({'x' => {'y' => [{'z' => '10'}]}}, 'x[y][][z]=10')
|
||||
assert_parses({'x' => {'y' => [{'z' => '10', 'w' => '10'}]}}, 'x[y][][z]=10&x[y][][w]=10')
|
||||
assert_parses({'x' => {'y' => [{'z' => '10', 'v' => {'w' => '10'}}]}}, 'x[y][][z]=10&x[y][][v][w]=10')
|
||||
end
|
||||
|
||||
test "deep query string with array of hashes with one pair" do
|
||||
assert_parses({'x' => {'y' => [{'z' => '10'}, {'z' => '20'}]}}, 'x[y][][z]=10&x[y][][z]=20')
|
||||
end
|
||||
|
||||
test "deep query string with array of hashes with multiple pairs" do
|
||||
assert_parses(
|
||||
{'x' => {'y' => [{'z' => '10', 'w' => 'a'}, {'z' => '20', 'w' => 'b'}]}},
|
||||
'x[y][][z]=10&x[y][][w]=a&x[y][][z]=20&x[y][][w]=b'
|
||||
)
|
||||
end
|
||||
|
||||
test "query string with nil" do
|
||||
assert_parses(
|
||||
{ "action" => "create_customer", "full_name" => ''},
|
||||
"action=create_customer&full_name="
|
||||
)
|
||||
end
|
||||
|
||||
test "query string with array" do
|
||||
assert_parses(
|
||||
{ "action" => "create_customer", "selected" => ["1", "2", "3"]},
|
||||
"action=create_customer&selected[]=1&selected[]=2&selected[]=3"
|
||||
)
|
||||
end
|
||||
|
||||
test "query string with amps" do
|
||||
assert_parses(
|
||||
{ "action" => "create_customer", "name" => "Don't & Does"},
|
||||
"action=create_customer&name=Don%27t+%26+Does"
|
||||
)
|
||||
end
|
||||
|
||||
test "query string with many equal" do
|
||||
assert_parses(
|
||||
{ "action" => "create_customer", "full_name" => "abc=def=ghi"},
|
||||
"action=create_customer&full_name=abc=def=ghi"
|
||||
)
|
||||
end
|
||||
|
||||
test "query string without equal" do
|
||||
assert_parses({ "action" => nil }, "action")
|
||||
end
|
||||
|
||||
test "query string with empty key" do
|
||||
assert_parses(
|
||||
{ "action" => "create_customer", "full_name" => "David Heinemeier Hansson" },
|
||||
"action=create_customer&full_name=David%20Heinemeier%20Hansson&=Save"
|
||||
)
|
||||
end
|
||||
|
||||
test "query string with many ampersands" do
|
||||
assert_parses(
|
||||
{ "action" => "create_customer", "full_name" => "David Heinemeier Hansson"},
|
||||
"&action=create_customer&&&full_name=David%20Heinemeier%20Hansson"
|
||||
)
|
||||
end
|
||||
|
||||
test "unbalanced query string with array" do
|
||||
assert_parses(
|
||||
{'location' => ["1", "2"], 'age_group' => ["2"]},
|
||||
"location[]=1&location[]=2&age_group[]=2"
|
||||
)
|
||||
end
|
||||
|
||||
private
|
||||
def assert_parses(expected, actual)
|
||||
with_routing do |set|
|
||||
set.draw do |map|
|
||||
map.connect ':action', :controller => "query_string_parsing_test/test"
|
||||
end
|
||||
|
||||
get "/parse", actual
|
||||
assert_response :ok
|
||||
assert_equal(expected, TestController.last_query_parameters)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -407,114 +407,10 @@ class RequestTest < ActiveSupport::TestCase
|
|||
end
|
||||
|
||||
class UrlEncodedRequestParameterParsingTest < ActiveSupport::TestCase
|
||||
def setup
|
||||
@query_string = "action=create_customer&full_name=David%20Heinemeier%20Hansson&customerId=1"
|
||||
@query_string_with_empty = "action=create_customer&full_name="
|
||||
@query_string_with_array = "action=create_customer&selected[]=1&selected[]=2&selected[]=3"
|
||||
@query_string_with_amps = "action=create_customer&name=Don%27t+%26+Does"
|
||||
@query_string_with_multiple_of_same_name =
|
||||
"action=update_order&full_name=Lau%20Taarnskov&products=4&products=2&products=3"
|
||||
@query_string_with_many_equal = "action=create_customer&full_name=abc=def=ghi"
|
||||
@query_string_without_equal = "action"
|
||||
@query_string_with_many_ampersands =
|
||||
"&action=create_customer&&&full_name=David%20Heinemeier%20Hansson"
|
||||
@query_string_with_empty_key = "action=create_customer&full_name=David%20Heinemeier%20Hansson&=Save"
|
||||
end
|
||||
|
||||
def test_query_string
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "full_name" => "David Heinemeier Hansson", "customerId" => "1"},
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string)
|
||||
)
|
||||
end
|
||||
|
||||
def test_deep_query_string
|
||||
expected = {'x' => {'y' => {'z' => '10'}}}
|
||||
assert_equal(expected, ActionController::RequestParser.parse_query_parameters('x[y][z]=10'))
|
||||
end
|
||||
|
||||
def test_deep_query_string_with_array
|
||||
assert_equal({'x' => {'y' => {'z' => ['10']}}}, ActionController::RequestParser.parse_query_parameters('x[y][z][]=10'))
|
||||
assert_equal({'x' => {'y' => {'z' => ['10', '5']}}}, ActionController::RequestParser.parse_query_parameters('x[y][z][]=10&x[y][z][]=5'))
|
||||
end
|
||||
|
||||
def test_deep_query_string_with_array_of_hash
|
||||
assert_equal({'x' => {'y' => [{'z' => '10'}]}}, ActionController::RequestParser.parse_query_parameters('x[y][][z]=10'))
|
||||
assert_equal({'x' => {'y' => [{'z' => '10', 'w' => '10'}]}}, ActionController::RequestParser.parse_query_parameters('x[y][][z]=10&x[y][][w]=10'))
|
||||
assert_equal({'x' => {'y' => [{'z' => '10', 'v' => {'w' => '10'}}]}}, ActionController::RequestParser.parse_query_parameters('x[y][][z]=10&x[y][][v][w]=10'))
|
||||
end
|
||||
|
||||
def test_deep_query_string_with_array_of_hashes_with_one_pair
|
||||
assert_equal({'x' => {'y' => [{'z' => '10'}, {'z' => '20'}]}}, ActionController::RequestParser.parse_query_parameters('x[y][][z]=10&x[y][][z]=20'))
|
||||
assert_equal("10", ActionController::RequestParser.parse_query_parameters('x[y][][z]=10&x[y][][z]=20')["x"]["y"].first["z"])
|
||||
assert_equal("10", ActionController::RequestParser.parse_query_parameters('x[y][][z]=10&x[y][][z]=20').with_indifferent_access[:x][:y].first[:z])
|
||||
end
|
||||
|
||||
def test_deep_query_string_with_array_of_hashes_with_multiple_pairs
|
||||
assert_equal(
|
||||
{'x' => {'y' => [{'z' => '10', 'w' => 'a'}, {'z' => '20', 'w' => 'b'}]}},
|
||||
ActionController::RequestParser.parse_query_parameters('x[y][][z]=10&x[y][][w]=a&x[y][][z]=20&x[y][][w]=b')
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_with_nil
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "full_name" => ''},
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_with_empty)
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_with_array
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "selected" => ["1", "2", "3"]},
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_with_array)
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_with_amps
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "name" => "Don't & Does"},
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_with_amps)
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_with_many_equal
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "full_name" => "abc=def=ghi"},
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_with_many_equal)
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_without_equal
|
||||
assert_equal(
|
||||
{ "action" => nil },
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_without_equal)
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_with_empty_key
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "full_name" => "David Heinemeier Hansson" },
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_with_empty_key)
|
||||
)
|
||||
end
|
||||
|
||||
def test_query_string_with_many_ampersands
|
||||
assert_equal(
|
||||
{ "action" => "create_customer", "full_name" => "David Heinemeier Hansson"},
|
||||
ActionController::RequestParser.parse_query_parameters(@query_string_with_many_ampersands)
|
||||
)
|
||||
end
|
||||
|
||||
def test_unbalanced_query_string_with_array
|
||||
assert_equal(
|
||||
{'location' => ["1", "2"], 'age_group' => ["2"]},
|
||||
ActionController::RequestParser.parse_query_parameters("location[]=1&location[]=2&age_group[]=2")
|
||||
)
|
||||
assert_equal(
|
||||
{'location' => ["1", "2"], 'age_group' => ["2"]},
|
||||
ActionController::RequestParser.parse_request_parameters({'location[]' => ["1", "2"],
|
||||
'age_group[]' => ["2"]})
|
||||
ActionController::RequestParser.parse_request_parameters({'location[]' => ["1", "2"], 'age_group[]' => ["2"]})
|
||||
)
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue