spec/grape/api/custom_validations_spec.rb in grape-1.6.0 vs spec/grape/api/custom_validations_spec.rb in grape-1.6.1

- old
+ new

@@ -2,22 +2,10 @@ require 'spec_helper' describe Grape::Validations do context 'using a custom length validator' do - before do - module CustomValidationsSpec - class DefaultLength < Grape::Validations::Base - def validate_param!(attr_name, params) - @option = params[:max].to_i if params.key?(:max) - return if params[attr_name].length <= @option - - raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long") - end - end - end - end subject do Class.new(Grape::API) do params do requires :text, default_length: 140 end @@ -25,41 +13,53 @@ 'bacon' end end end + let(:default_length_validator) do + Class.new(Grape::Validations::Validators::Base) do + def validate_param!(attr_name, params) + @option = params[:max].to_i if params.key?(:max) + return if params[attr_name].length <= @option + + raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long") + end + end + end + + before do + described_class.register_validator('default_length', default_length_validator) + end + + after do + described_class.deregister_validator('default_length') + end + def app subject end it 'under 140 characters' do get '/', text: 'abc' expect(last_response.status).to eq 200 expect(last_response.body).to eq 'bacon' end + it 'over 140 characters' do get '/', text: 'a' * 141 expect(last_response.status).to eq 400 expect(last_response.body).to eq 'text must be at the most 140 characters long' end + it 'specified in the query string' do get '/', text: 'a' * 141, max: 141 expect(last_response.status).to eq 200 expect(last_response.body).to eq 'bacon' end end context 'using a custom body-only validator' do - before do - module CustomValidationsSpec - class InBody < Grape::Validations::PresenceValidator - def validate(request) - validate!(request.env['api.request.body']) - end - end - end - end subject do Class.new(Grape::API) do params do requires :text, in_body: true end @@ -67,36 +67,44 @@ 'bacon' end end end + let(:in_body_validator) do + Class.new(Grape::Validations::Validators::PresenceValidator) do + def validate(request) + validate!(request.env['api.request.body']) + end + end + end + + before do + described_class.register_validator('in_body', in_body_validator) + end + + after do + described_class.deregister_validator('in_body') + end + def app subject end it 'allows field in body' do get '/', text: 'abc' expect(last_response.status).to eq 200 expect(last_response.body).to eq 'bacon' end + it 'ignores field in query' do get '/', nil, text: 'abc' expect(last_response.status).to eq 400 expect(last_response.body).to eq 'text is missing' end end context 'using a custom validator with message_key' do - before do - module CustomValidationsSpec - class WithMessageKey < Grape::Validations::PresenceValidator - def validate_param!(attr_name, _params) - raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: :presence) - end - end - end - end subject do Class.new(Grape::API) do params do requires :text, with_message_key: true end @@ -104,10 +112,26 @@ 'bacon' end end end + let(:message_key_validator) do + Class.new(Grape::Validations::Validators::PresenceValidator) do + def validate_param!(attr_name, _params) + raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: :presence) + end + end + end + + before do + described_class.register_validator('with_message_key', message_key_validator) + end + + after do + described_class.deregister_validator('with_message_key') + end + def app subject end it 'fails with message' do @@ -116,26 +140,10 @@ expect(last_response.body).to eq 'text is missing' end end context 'using a custom request/param validator' do - before do - module CustomValidationsSpec - class Admin < Grape::Validations::Base - def validate(request) - # return if the param we are checking was not in request - # @attrs is a list containing the attribute we are currently validating - return unless request.params.key? @attrs.first - # check if admin flag is set to true - return unless @option - # check if user is admin or not - # as an example get a token from request and check if it's admin or not - raise Grape::Exceptions::Validation.new(params: @attrs, message: 'Can not set Admin only field.') unless request.headers['X-Access-Token'] == 'admin' - end - end - end - end subject do Class.new(Grape::API) do params do optional :admin_field, type: String, admin: true optional :non_admin_field, type: String @@ -143,9 +151,32 @@ end get do 'bacon' end end + end + + let(:admin_validator) do + Class.new(Grape::Validations::Validators::Base) do + def validate(request) + # return if the param we are checking was not in request + # @attrs is a list containing the attribute we are currently validating + return unless request.params.key? @attrs.first + # check if admin flag is set to true + return unless @option + # check if user is admin or not + # as an example get a token from request and check if it's admin or not + raise Grape::Exceptions::Validation.new(params: @attrs, message: 'Can not set Admin only field.') unless request.headers['X-Access-Token'] == 'admin' + end + end + end + + before do + described_class.register_validator('admin', admin_validator) + end + + after do + described_class.deregister_validator('admin') end def app subject end