Skip to content

Commit 0d34dbc

Browse files
committed
Serialize request parameters for GET requests properly, using ActiveSupport and to_query.
1 parent 4c76c40 commit 0d34dbc

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

lib/rspec_api_documentation.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'active_support/inflector'
33
require 'cgi'
44
require 'json'
5+
require 'active_support/core_ext/object/to_query'
56

67
module RspecApiDocumentation
78
extend ActiveSupport::Autoload

lib/rspec_api_documentation/dsl/endpoint.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,7 @@ def do_request(extra_params = {})
4545
end
4646

4747
def query_string
48-
query = params.to_a.map do |param|
49-
param.map! { |a| CGI.escape(a.to_s) }
50-
param.join("=")
51-
end
52-
query.join("&")
48+
(params || {}).to_query
5349
end
5450

5551
def params

spec/dsl_spec.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,41 @@
380380
end
381381
end
382382

383+
context "proper query_string serialization" do
384+
get "/orders" do
385+
context "with an array parameter" do
386+
parameter :id_eq, "List of IDs"
387+
388+
let(:id_eq) { [1, 2] }
389+
390+
example "parsed properly" do
391+
client.should_receive(:get).with do |path, data, headers|
392+
Addressable::URI.parse(path).query_values.should eq({"id_eq"=>['1', '2']})
393+
end
394+
do_request
395+
end
396+
end
397+
398+
context "with a deep nested parameter, including Hashes and Arrays" do
399+
parameter :within_id, "Fancy search condition"
400+
401+
let(:within_id) { {"first" => 1, "last" => 10, "exclude" => [3,5,7]} }
402+
scope_parameters :search, :all
403+
404+
example "parsed properly" do
405+
client.should_receive(:get).with do |path, data, headers|
406+
Addressable::URI.parse(path).query_values.should eq({
407+
"search" => { "within_id" => {"first" => '1', "last" => '10', "exclude" => ['3','5','7']}}
408+
})
409+
end
410+
do_request
411+
end
412+
end
413+
end
414+
end
415+
416+
417+
383418
context "auto request" do
384419
post "/orders" do
385420
parameter :order_type, "Type of order"

0 commit comments

Comments
 (0)