Refactor api validator to separate class
This commit is contained in:
parent
d4e26636e7
commit
bf1ed85a9d
4 changed files with 77 additions and 8 deletions
|
@ -10,8 +10,21 @@ module API
|
||||||
raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:absence)
|
raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: message(:absence)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class IntegerNoneAny < Grape::Validations::Base
|
||||||
|
def validate_param!(attr_name, params)
|
||||||
|
value = params[attr_name]
|
||||||
|
|
||||||
|
return if value.is_a?(Integer) ||
|
||||||
|
[IssuableFinder::FILTER_NONE, IssuableFinder::FILTER_ANY].include?(value)
|
||||||
|
|
||||||
|
raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)],
|
||||||
|
message: "should be an integer, 'None' or 'Any'"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Grape::Validations.register_validator(:absence, ::API::Helpers::CustomValidators::Absence)
|
Grape::Validations.register_validator(:absence, ::API::Helpers::CustomValidators::Absence)
|
||||||
|
Grape::Validations.register_validator(:integer_none_any, ::API::Helpers::CustomValidators::IntegerNoneAny)
|
||||||
|
|
|
@ -40,10 +40,7 @@ module API
|
||||||
optional :updated_after, type: DateTime, desc: 'Return issues updated after the specified time'
|
optional :updated_after, type: DateTime, desc: 'Return issues updated after the specified time'
|
||||||
optional :updated_before, type: DateTime, desc: 'Return issues updated before the specified time'
|
optional :updated_before, type: DateTime, desc: 'Return issues updated before the specified time'
|
||||||
optional :author_id, type: Integer, desc: 'Return issues which are authored by the user with the given ID'
|
optional :author_id, type: Integer, desc: 'Return issues which are authored by the user with the given ID'
|
||||||
optional :assignee_id, types: [Integer, String],
|
optional :assignee_id, types: [Integer, String], integer_none_any: true,
|
||||||
values: -> (v) {
|
|
||||||
v.is_a?(Integer) || [IssuableFinder::FILTER_NONE, IssuableFinder::FILTER_ANY].include?(v)
|
|
||||||
},
|
|
||||||
desc: 'Return issues which are assigned to the user with the given ID'
|
desc: 'Return issues which are assigned to the user with the given ID'
|
||||||
optional :scope, type: String, values: %w[created-by-me assigned-to-me created_by_me assigned_to_me all],
|
optional :scope, type: String, values: %w[created-by-me assigned-to-me created_by_me assigned_to_me all],
|
||||||
desc: 'Return issues for the given scope: `created_by_me`, `assigned_to_me` or `all`'
|
desc: 'Return issues for the given scope: `created_by_me`, `assigned_to_me` or `all`'
|
||||||
|
|
|
@ -89,10 +89,7 @@ module API
|
||||||
optional :updated_before, type: DateTime, desc: 'Return merge requests updated before the specified time'
|
optional :updated_before, type: DateTime, desc: 'Return merge requests updated before the specified time'
|
||||||
optional :view, type: String, values: %w[simple], desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request'
|
optional :view, type: String, values: %w[simple], desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request'
|
||||||
optional :author_id, type: Integer, desc: 'Return merge requests which are authored by the user with the given ID'
|
optional :author_id, type: Integer, desc: 'Return merge requests which are authored by the user with the given ID'
|
||||||
optional :assignee_id, types: [Integer, String],
|
optional :assignee_id, types: [Integer, String], integer_none_any: true,
|
||||||
values: -> (v) {
|
|
||||||
v.is_a?(Integer) || [IssuableFinder::FILTER_NONE, IssuableFinder::FILTER_ANY].include?(v)
|
|
||||||
},
|
|
||||||
desc: 'Return merge requests which are assigned to the user with the given ID'
|
desc: 'Return merge requests which are assigned to the user with the given ID'
|
||||||
optional :scope, type: String, values: %w[created-by-me assigned-to-me created_by_me assigned_to_me all],
|
optional :scope, type: String, values: %w[created-by-me assigned-to-me created_by_me assigned_to_me all],
|
||||||
desc: 'Return merge requests for the given scope: `created_by_me`, `assigned_to_me` or `all`'
|
desc: 'Return merge requests for the given scope: `created_by_me`, `assigned_to_me` or `all`'
|
||||||
|
|
62
spec/lib/api/helpers/custom_validators_spec.rb
Normal file
62
spec/lib/api/helpers/custom_validators_spec.rb
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe API::Helpers::CustomValidators do
|
||||||
|
let(:scope) do
|
||||||
|
Struct.new(:opts) do
|
||||||
|
def full_name(attr_name)
|
||||||
|
attr_name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe API::Helpers::CustomValidators::Absence do
|
||||||
|
subject do
|
||||||
|
described_class.new(['test'], {}, false, scope.new)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'empty param' do
|
||||||
|
it 'does not raise a validation error' do
|
||||||
|
expect_no_validation_error({})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'invalid parameters' do
|
||||||
|
it 'should raise a validation error' do
|
||||||
|
expect_validation_error({ 'test' => 'some_value' })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe API::Helpers::CustomValidators::IntegerNoneAny do
|
||||||
|
subject do
|
||||||
|
described_class.new(['test'], {}, false, scope.new)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'valid parameters' do
|
||||||
|
it 'does not raise a validation error' do
|
||||||
|
expect_no_validation_error({ 'test' => 2 })
|
||||||
|
expect_no_validation_error({ 'test' => 100 })
|
||||||
|
expect_no_validation_error({ 'test' => 'None' })
|
||||||
|
expect_no_validation_error({ 'test' => 'Any' })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'invalid parameters' do
|
||||||
|
it 'should raise a validation error' do
|
||||||
|
expect_validation_error({ 'test' => 'some_other_string' })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def expect_no_validation_error(params)
|
||||||
|
expect { validate_test_param!(params) }.not_to raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
def expect_validation_error(params)
|
||||||
|
expect { validate_test_param!(params) }.to raise_error(Grape::Exceptions::Validation)
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_test_param!(params)
|
||||||
|
subject.validate_param!('test', params)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue