From cc2162f8419c8241588a0782ebe6455b368b8166 Mon Sep 17 00:00:00 2001 From: Oleksandr Rohachev Date: Fri, 19 Jul 2024 15:17:55 +0300 Subject: [PATCH] Added check for CONTENT_TYPE header that has to be present for wrapping to work --- lib/rage/controller/api.rb | 23 ++-- spec/controller/api/wrap_parameters_spec.rb | 124 +++++++++++++------- 2 files changed, 95 insertions(+), 52 deletions(-) diff --git a/lib/rage/controller/api.rb b/lib/rage/controller/api.rb index 92454158..8e0fb33b 100644 --- a/lib/rage/controller/api.rb +++ b/lib/rage/controller/api.rb @@ -79,17 +79,20 @@ def __register_action(action) wrap_parameters_chunk = if __wrap_parameters_key <<~RUBY - options = self.class.__wrap_parameters_options - - wrapped_params = if options[:include] - @__params.slice(*[options[:include]].flatten) - elsif options[:exclude] - @__params.except(*[options[:exclude]].flatten) - else - @__params + wrap_key = self.class.__wrap_parameters_key + if !@__params.key?(wrap_key) && @__env['CONTENT_TYPE'] + wrap_options = self.class.__wrap_parameters_options + + wrapped_params = if wrap_options[:include] + @__params.slice(*[wrap_options[:include]].flatten) + elsif wrap_options[:exclude] + @__params.except(*[wrap_options[:exclude]].flatten) + else + @__params + end + + @__params = @__params.merge({wrap_key => wrapped_params}) end - - @__params = @__params.merge({self.class.__wrap_parameters_key => wrapped_params}) RUBY end diff --git a/spec/controller/api/wrap_parameters_spec.rb b/spec/controller/api/wrap_parameters_spec.rb index e72397ec..f3a79104 100644 --- a/spec/controller/api/wrap_parameters_spec.rb +++ b/spec/controller/api/wrap_parameters_spec.rb @@ -13,9 +13,8 @@ def index initial_params = {param: :value} expected_result = {param: :value} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end @@ -31,24 +30,40 @@ def index end context "and wrapping root doesn't conflict with parameter key" do - it 'wraps the parameters into a nested hash' do - initial_params = {param: :value} - expected_result = {param: :value, root: {param: :value}} + context 'and CONTENT_TYPE header is blank' do + it "doesn't wrap the parameters into a nested hash" do + initial_params = {param: :value} + expected_result = {param: :value} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) + end + end + + context 'and CONTENT_TYPE header is present' do + it 'wraps the parameters into a nested hash' do + initial_params = {param: :value} + expected_result = {param: :value, root: {param: :value}} + + response = run_action( + controller, + :index, + params: initial_params, + env: {'CONTENT_TYPE' => "application/json"} + ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) + end end end context 'and wrapping root conflicts with parameter key' do - it 'wraps the parameters into a nested hash and overrides the conflicting key' do + it "doesn't wrap the parameters into a nested hash" do initial_params = {root: :value, param: :value} - expected_result = {root: {root: :value, param: :value}, param: :value} + expected_result = {root: :value, param: :value} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end end @@ -69,9 +84,8 @@ def index initial_params = {param_a: :value, param_b: :value} expected_result = {param_a: :value, param_b: :value, root: {param_a: :value}} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end @@ -95,9 +109,8 @@ def index root: {param_a: :value, param_b: :value} } - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end end @@ -118,9 +131,8 @@ def index initial_params = {param_a: :value, param_b: :value} expected_result = {param_a: :value, param_b: :value, root: {param_b: :value}} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end @@ -139,9 +151,8 @@ def index initial_params = {param_a: :value, param_b: :value, param_c: :value} expected_result = {param_a: :value, param_b: :value, param_c: :value, root: {param_c: :value}} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end end @@ -161,9 +172,8 @@ def index initial_params = {param_a: :value, param_b: :value} expected_result = {param_a: :value, param_b: :value, root: {param_a: :value}} - expect(run_action(controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action(controller, :index, params: initial_params, env: {'CONTENT_TYPE' => "application/json"}) + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end end @@ -210,15 +220,25 @@ def index end it 'wraps params of child controller using wrapping key of child controller without options' do - expect(run_action(child_controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] + response = run_action( + child_controller, + :index, + params: initial_params, + env: {'CONTENT_TYPE' => "application/json"} ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end it 'wraps params of grandchild controller using wrapping key of child controller without options' do - expect(run_action(grandchild_controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] + response = run_action( + grandchild_controller, + :index, + params: initial_params, + env: {'CONTENT_TYPE' => "application/json"} ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end @@ -237,15 +257,25 @@ def index let(:expected_result) { {parent_param: :value, child_param: :value, child_root: {child_param: :value}} } it 'wraps params of child controller using wrapping key and options of child controller' do - expect(run_action(child_controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] + response = run_action( + child_controller, + :index, + params: initial_params, + env: { 'CONTENT_TYPE' => "application/json" } ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end it 'wraps params of grandchild controller using wrapping key and options of child controller' do - expect(run_action(grandchild_controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] + response = run_action( + grandchild_controller, + :index, + params: initial_params, + env: {'CONTENT_TYPE' => "application/json"} ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end end @@ -263,15 +293,25 @@ def index let(:expected_result) { {parent_param: :value, child_param: :value, parent_root: {parent_param: :value}} } it 'wraps params of child controller using wrapping key and options of parent controller' do - expect(run_action(child_controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] - ) + response = run_action( + child_controller, + :index, + params: initial_params, + env: {'CONTENT_TYPE' => "application/json"} + ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end it 'wraps params of grandchild controller using wrapping key and options of parent controller' do - expect(run_action(child_controller, :index, params: initial_params)).to match( - [200, instance_of(Hash), [expected_result.to_json]] + response = run_action( + child_controller, + :index, + params: initial_params, + env: {'CONTENT_TYPE' => "application/json"} ) + + expect(response).to match([200, instance_of(Hash), [expected_result.to_json]]) end end end