Blob Blame History Raw
From aeecb1809f82f6793b4c406115ce7b6e1e90bde1 Mon Sep 17 00:00:00 2001
From: Adam Tanner <adam@adamtanner.org>
Date: Fri, 15 Mar 2013 16:01:48 -0400
Subject: [PATCH] Don't clobber uri.query when it's present.

---
 lib/rack/test.rb       | 4 ++--
 spec/rack/test_spec.rb | 5 +++++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/lib/rack/test.rb b/lib/rack/test.rb
index 8877e7f..e33bf1b 100644
--- a/lib/rack/test.rb
+++ b/lib/rack/test.rb
@@ -209,8 +209,8 @@ def env_for(path, env)
           # merge :params with the query string
           if params = env[:params]
             params = parse_nested_query(params) if params.is_a?(String)
-            params.update(parse_nested_query(uri.query))
-            uri.query = build_nested_query(params)
+
+            uri.query = [uri.query, build_nested_query(params)].compact.join("&")
           end
         elsif !env.has_key?(:input)
           env["CONTENT_TYPE"] ||= "application/x-www-form-urlencoded"
diff --git a/spec/rack/test_spec.rb b/spec/rack/test_spec.rb
index a9e2136..c60b2cd 100644
--- a/spec/rack/test_spec.rb
+++ b/spec/rack/test_spec.rb
@@ -132,6 +132,11 @@
       expect(last_request.query_string).to eq("a=1&a=2&bar=1")
     end
 
+    it "does not overwrite multiple query string keys" do
+      request "/foo?a=1&a=2", :params => { :bar => 1 }
+      last_request.query_string.should == "a=1&a=2&bar=1"
+    end
+
     it "accepts params and builds url encoded params for POST requests" do
       request "/foo", :method => :post, :params => {:foo => {:bar => "1"}}
       expect(last_request.env["rack.input"].read).to eq("foo[bar]=1")