# 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 private def assert_query_equal(expected, actual) assert_equal expected.split("&"), actual.to_query.split("&") end end