aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/core_ext/object/to_query_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/test/core_ext/object/to_query_test.rb')
-rw-r--r--activesupport/test/core_ext/object/to_query_test.rb98
1 files changed, 98 insertions, 0 deletions
diff --git a/activesupport/test/core_ext/object/to_query_test.rb b/activesupport/test/core_ext/object/to_query_test.rb
new file mode 100644
index 0000000000..561dadbbcf
--- /dev/null
+++ b/activesupport/test/core_ext/object/to_query_test.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require "abstract_unit"
+require "active_support/ordered_hash"
+require "active_support/core_ext/object/to_query"
+require "active_support/core_ext/string/output_safety"
+
+class ToQueryTest < ActiveSupport::TestCase
+ def test_simple_conversion
+ assert_query_equal "a=10", a: 10
+ end
+
+ def test_cgi_escaping
+ assert_query_equal "a%3Ab=c+d", "a:b" => "c d"
+ end
+
+ def test_html_safe_parameter_key
+ assert_query_equal "a%3Ab=c+d", "a:b".html_safe => "c d"
+ end
+
+ def test_html_safe_parameter_value
+ assert_query_equal "a=%5B10%5D", "a" => "[10]".html_safe
+ end
+
+ def test_nil_parameter_value
+ empty = Object.new
+ def empty.to_param; nil end
+ assert_query_equal "a=", "a" => empty
+ end
+
+ def test_nested_conversion
+ assert_query_equal "person%5Blogin%5D=seckar&person%5Bname%5D=Nicholas",
+ person: Hash[:login, "seckar", :name, "Nicholas"]
+ end
+
+ def test_multiple_nested
+ assert_query_equal "account%5Bperson%5D%5Bid%5D=20&person%5Bid%5D=10",
+ Hash[:account, { person: { id: 20 } }, :person, { id: 10 }]
+ end
+
+ def test_array_values
+ assert_query_equal "person%5Bid%5D%5B%5D=10&person%5Bid%5D%5B%5D=20",
+ person: { id: [10, 20] }
+ end
+
+ def test_array_values_are_not_sorted
+ assert_query_equal "person%5Bid%5D%5B%5D=20&person%5Bid%5D%5B%5D=10",
+ person: { id: [20, 10] }
+ end
+
+ def test_empty_array
+ assert_equal "person%5B%5D=", [].to_query("person")
+ end
+
+ def test_nested_empty_hash
+ assert_equal "",
+ {}.to_query
+ assert_query_equal "a=1&b%5Bc%5D=3",
+ a: 1, b: { c: 3, d: {} }
+ assert_query_equal "",
+ a: { b: { c: {} } }
+ assert_query_equal "b%5Bc%5D=false&b%5Be%5D=&b%5Bf%5D=&p=12",
+ p: 12, b: { c: false, e: nil, f: "" }
+ assert_query_equal "b%5Bc%5D=3&b%5Bf%5D=",
+ b: { c: 3, k: {}, f: "" }
+ assert_query_equal "b=3",
+ a: [], b: 3
+ end
+
+ def test_hash_with_namespace
+ hash = { name: "Nakshay", nationality: "Indian" }
+ assert_equal "user%5Bname%5D=Nakshay&user%5Bnationality%5D=Indian", hash.to_query("user")
+ end
+
+ def test_hash_sorted_lexicographically
+ hash = { type: "human", name: "Nakshay" }
+ assert_equal "name=Nakshay&type=human", hash.to_query
+ end
+
+ def test_hash_not_sorted_lexicographically_for_nested_structure
+ params = {
+ "foo" => {
+ "contents" => [
+ { "name" => "gorby", "id" => "123" },
+ { "name" => "puff", "d" => "true" }
+ ]
+ }
+ }
+ expected = "foo[contents][][name]=gorby&foo[contents][][id]=123&foo[contents][][name]=puff&foo[contents][][d]=true"
+
+ assert_equal expected, URI.decode_www_form_component(params.to_query)
+ end
+
+ private
+ def assert_query_equal(expected, actual)
+ assert_equal expected.split("&"), actual.to_query.split("&")
+ end
+end