From 8c984f1c4e30fef886772073193b3166a425c2f7 Mon Sep 17 00:00:00 2001 From: Pavel Bezpalov Date: Wed, 26 Oct 2016 13:32:04 +0300 Subject: [PATCH 1/3] Clean out uploaded data from arrays --- lib/rspec_api_documentation/client_base.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/rspec_api_documentation/client_base.rb b/lib/rspec_api_documentation/client_base.rb index 6a70e566..2f66d8ad 100644 --- a/lib/rspec_api_documentation/client_base.rb +++ b/lib/rspec_api_documentation/client_base.rb @@ -96,14 +96,16 @@ def record_response_body(response_content_type, response_body) end def clean_out_uploaded_data(params, request_body) - params.each do |_, value| + params.each do |value| if value.is_a?(Hash) if value.has_key?(:tempfile) data = value[:tempfile].read request_body = request_body.gsub(data, "[uploaded data]") else - request_body = clean_out_uploaded_data(value,request_body) + request_body = clean_out_uploaded_data(value, request_body) end + elsif value.is_a?(Array) + request_body = clean_out_uploaded_data(value, request_body) end end request_body From 1135b12fb5f452421a8ece12c11812ab48ba5ffa Mon Sep 17 00:00:00 2001 From: Pavel Bezpalov Date: Wed, 26 Oct 2016 13:46:28 +0300 Subject: [PATCH 2/3] Refactor code --- lib/rspec_api_documentation/client_base.rb | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/rspec_api_documentation/client_base.rb b/lib/rspec_api_documentation/client_base.rb index 2f66d8ad..d234391b 100644 --- a/lib/rspec_api_documentation/client_base.rb +++ b/lib/rspec_api_documentation/client_base.rb @@ -97,15 +97,13 @@ def record_response_body(response_content_type, response_body) def clean_out_uploaded_data(params, request_body) params.each do |value| - if value.is_a?(Hash) - if value.has_key?(:tempfile) - data = value[:tempfile].read - request_body = request_body.gsub(data, "[uploaded data]") - else - request_body = clean_out_uploaded_data(value, request_body) - end - elsif value.is_a?(Array) - request_body = clean_out_uploaded_data(value, request_body) + if [Hash, Array].member? value.class + request_body = if value.respond_to?(:has_key?) && value.has_key?(:tempfile) + data = value[:tempfile].read + request_body.gsub(data, "[uploaded data]") + else + clean_out_uploaded_data(value, request_body) + end end end request_body From c9df0405321c0a0af94dc2c4da7bc050d2b700f1 Mon Sep 17 00:00:00 2001 From: Pavel Bezpalov Date: Wed, 14 Dec 2016 07:47:39 +0200 Subject: [PATCH 3/3] Add test for uploading files in arrays --- features/upload_file.feature | 51 ++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/features/upload_file.feature b/features/upload_file.feature index b0ea9999..8b018942 100644 --- a/features/upload_file.feature +++ b/features/upload_file.feature @@ -21,7 +21,18 @@ Feature: Uploading a file [200, {}, [request.params["post"]["file"][:filename]]] end end - """ + """ + Given a file named "nested_param_in_array.rb" with: + """ + require 'rack' + + class App + def self.call(env) + request = Rack::Request.new(env) + [200, {}, [request.params["post"]["files"][0][:filename]]] + end + end + """ Scenario: Uploading a text file with nested parameters Given a file named "file.txt" with: @@ -40,7 +51,7 @@ Feature: Uploading a file resource "FooBars" do post "/foobar" do - parameter :post, "Post paramter" + parameter :post, "Post parameter" let(:post) do { @@ -161,6 +172,42 @@ Feature: Uploading a file When I run `rspec app_spec.rb --require ./nestedparam.rb --format RspecApiDocumentation::ApiFormatter` + Then the output should contain "1 example, 0 failures" + And the exit status should be 0 + And the generated documentation should be encoded correctly + + Scenario: Uploading an image file in params array + Given I move the sample image into the workspace + And a file named "app_spec.rb" with: + """ + require "rspec_api_documentation" + require "rspec_api_documentation/dsl" + require "rack/test" + + RspecApiDocumentation.configure do |config| + config.app = App + end + + resource "FooBars" do + post "/foobar" do + parameter :post, "Post parameter" + + let(:post) do + { + id: 10, + files: [ Rack::Test::UploadedFile.new("file.png", "image/png") ] + } + end + + example_request "Uploading a file" do + expect(response_body).to eq("file.png") + end + end + end + """ + + When I run `rspec app_spec.rb --require ./nested_param_in_array.rb --format RspecApiDocumentation::ApiFormatter` + Then the output should contain "1 example, 0 failures" And the exit status should be 0 And the generated documentation should be encoded correctly \ No newline at end of file