From d3765bf5f9432f42c23f2d2a1f3fe75b1055c2fd Mon Sep 17 00:00:00 2001 From: Marcus Ilgner Date: Wed, 28 Mar 2018 11:18:51 +0200 Subject: [PATCH] Fix usage of exactly_one_of in shared params --- CHANGELOG.md | 1 + lib/grape/validations/params_scope.rb | 4 +- .../api/shared_helpers_exactly_one_of_spec.rb | 47 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 spec/grape/api/shared_helpers_exactly_one_of_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 66776fa8f..ec5319bff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ #### Fixes +* [#1755](https://github.com/ruby-grape/grape/pull/1755): Fix shared params with exactly_one_of - [@milgner](https://github.com/milgner). * [#1740](https://github.com/ruby-grape/grape/pull/1740): Fix dependent parameter validation using `given` when parameter is a `Hash` - [@jvortmann](https://github.com/jvortmann). * [#1737](https://github.com/ruby-grape/grape/pull/1737): Fix translating error when passing symbols as params in custom validations - [@mlzhuyi](https://github.com/mlzhuyi). * [#1749](https://github.com/ruby-grape/grape/pull/1749): Allow rescue from non-`StandardError` exceptions - [@dm1try](https://github.com/dm1try). diff --git a/lib/grape/validations/params_scope.rb b/lib/grape/validations/params_scope.rb index e385cb1f9..e34c2b623 100644 --- a/lib/grape/validations/params_scope.rb +++ b/lib/grape/validations/params_scope.rb @@ -40,7 +40,7 @@ def initialize(opts, &block) # validated def should_validate?(parameters) return false if @optional && (params(parameters).blank? || all_element_blank?(parameters)) - + return false unless meets_dependency?(params(parameters), parameters) return true if parent.nil? parent.should_validate?(parameters) end @@ -51,7 +51,7 @@ def meets_dependency?(params, request_params) end return true unless @dependent_on - + return params.any? { |param| meets_dependency?(param, request_params) } if params.is_a?(Array) params = params.with_indifferent_access @dependent_on.each do |dependency| diff --git a/spec/grape/api/shared_helpers_exactly_one_of_spec.rb b/spec/grape/api/shared_helpers_exactly_one_of_spec.rb new file mode 100644 index 000000000..a6d0cb22f --- /dev/null +++ b/spec/grape/api/shared_helpers_exactly_one_of_spec.rb @@ -0,0 +1,47 @@ +require 'spec_helper' + +describe Grape::API::Helpers do + subject do + shared_params = Module.new do + extend Grape::API::Helpers + + params :drink do + optional :beer + optional :wine + exactly_one_of :beer, :wine + end + end + + Class.new(Grape::API) do + helpers shared_params + format :json + + params do + requires :orderType, type: String, values: %w[food drink] + given orderType: ->(val) { val == 'food' } do + optional :pasta + optional :pizza + exactly_one_of :pasta, :pizza + end + given orderType: ->(val) { val == 'drink' } do + use :drink + end + end + get do + declared(params, include_missing: true) + end + end + end + + def app + subject + end + + it 'defines parameters' do + get '/', orderType: 'food', pizza: 'mista' + expect(last_response.status).to eq 200 + expect(last_response.body).to eq({ orderType: 'food', + pasta: nil, pizza: 'mista', + beer: nil, wine: nil }.to_json) + end +end