spec/grape/validations/validators/values_spec.rb in grape-1.6.0 vs spec/grape/validations/validators/values_spec.rb in grape-1.6.1
- old
+ new
@@ -1,14 +1,15 @@
# frozen_string_literal: true
require 'spec_helper'
-describe Grape::Validations::ValuesValidator do
- module ValidationsSpec
- class ValuesModel
+describe Grape::Validations::Validators::ValuesValidator do
+ let_it_be(:values_model) do
+ Class.new do
DEFAULT_VALUES = %w[valid-type1 valid-type2 valid-type3].freeze
DEFAULT_EXCEPTS = %w[invalid-type1 invalid-type2 invalid-type3].freeze
+
class << self
def values
@values ||= []
[DEFAULT_VALUES + @values].flatten.uniq
end
@@ -31,218 +32,219 @@
def include?(value)
values.include?(value)
end
end
end
+ end
- module ValuesValidatorSpec
- class API < Grape::API
- default_format :json
+ before do
+ stub_const('ValuesModel', values_model)
+ end
- resources :custom_message do
- params do
- requires :type, values: { value: ValuesModel.values, message: 'value does not include in values' }
- end
- get '/' do
- { type: params[:type] }
- end
+ let_it_be(:app) do
+ ValuesModel = values_model
+ Class.new(Grape::API) do
+ default_format :json
- params do
- optional :type, values: { value: -> { ValuesModel.values }, message: 'value does not include in values' }, default: 'valid-type2'
- end
- get '/lambda' do
- { type: params[:type] }
- end
-
- params do
- requires :type, values: { except: ValuesModel.excepts, except_message: 'value is on exclusions list', message: 'default exclude message' }
- end
- get '/exclude/exclude_message'
-
- params do
- requires :type, values: { except: -> { ValuesModel.excepts }, except_message: 'value is on exclusions list' }
- end
- get '/exclude/lambda/exclude_message'
-
- params do
- requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' }
- end
- get '/exclude/fallback_message'
- end
-
+ resources :custom_message do
params do
- requires :type, values: ValuesModel.values
+ requires :type, values: { value: ValuesModel.values, message: 'value does not include in values' }
end
get '/' do
{ type: params[:type] }
end
params do
- requires :type, values: []
+ optional :type, values: { value: -> { ValuesModel.values }, message: 'value does not include in values' }, default: 'valid-type2'
end
- get '/empty'
-
- params do
- optional :type, values: { value: ValuesModel.values }, default: 'valid-type2'
- end
- get '/default/hash/valid' do
+ get '/lambda' do
{ type: params[:type] }
end
params do
- optional :type, values: ValuesModel.values, default: 'valid-type2'
+ requires :type, values: { except: ValuesModel.excepts, except_message: 'value is on exclusions list', message: 'default exclude message' }
end
- get '/default/valid' do
- { type: params[:type] }
- end
+ get '/exclude/exclude_message'
params do
- optional :type, values: { except: ValuesModel.excepts }, default: 'valid-type2'
+ requires :type, values: { except: -> { ValuesModel.excepts }, except_message: 'value is on exclusions list' }
end
- get '/default/except' do
- { type: params[:type] }
- end
+ get '/exclude/lambda/exclude_message'
params do
- optional :type, values: -> { ValuesModel.values }, default: 'valid-type2'
+ requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' }
end
- get '/lambda' do
- { type: params[:type] }
- end
+ get '/exclude/fallback_message'
+ end
- params do
- requires :type, values: ->(v) { ValuesModel.include? v }
- end
- get '/lambda_val' do
- { type: params[:type] }
- end
+ params do
+ requires :type, values: ValuesModel.values
+ end
+ get '/' do
+ { type: params[:type] }
+ end
- params do
- requires :number, type: Integer, values: ->(v) { v > 0 }
- end
- get '/lambda_int_val' do
- { number: params[:number] }
- end
+ params do
+ requires :type, values: []
+ end
+ get '/empty'
- params do
- requires :type, values: -> { [] }
- end
- get '/empty_lambda'
+ params do
+ optional :type, values: { value: ValuesModel.values }, default: 'valid-type2'
+ end
+ get '/default/hash/valid' do
+ { type: params[:type] }
+ end
- params do
- optional :type, values: ValuesModel.values, default: -> { ValuesModel.values.sample }
- end
- get '/default_lambda' do
- { type: params[:type] }
- end
+ params do
+ optional :type, values: ValuesModel.values, default: 'valid-type2'
+ end
+ get '/default/valid' do
+ { type: params[:type] }
+ end
- params do
- optional :type, values: -> { ValuesModel.values }, default: -> { ValuesModel.values.sample }
- end
- get '/default_and_values_lambda' do
- { type: params[:type] }
- end
+ params do
+ optional :type, values: { except: ValuesModel.excepts }, default: 'valid-type2'
+ end
+ get '/default/except' do
+ { type: params[:type] }
+ end
- params do
- optional :type, type: Boolean, desc: 'A boolean', values: [true]
- end
- get '/values/optional_boolean' do
- { type: params[:type] }
- end
+ params do
+ optional :type, values: -> { ValuesModel.values }, default: 'valid-type2'
+ end
+ get '/lambda' do
+ { type: params[:type] }
+ end
- params do
- requires :type, type: Integer, desc: 'An integer', values: [10, 11], default: 10
- end
- get '/values/coercion' do
- { type: params[:type] }
- end
+ params do
+ requires :type, values: ->(v) { ValuesModel.include? v }
+ end
+ get '/lambda_val' do
+ { type: params[:type] }
+ end
- params do
- requires :type, type: Array[Integer], desc: 'An integer', values: [10, 11], default: 10
- end
- get '/values/array_coercion' do
- { type: params[:type] }
- end
+ params do
+ requires :number, type: Integer, values: ->(v) { v > 0 }
+ end
+ get '/lambda_int_val' do
+ { number: params[:number] }
+ end
- params do
- optional :optional, type: Array do
- requires :type, values: %w[a b]
- end
- end
- get '/optional_with_required_values'
+ params do
+ requires :type, values: -> { [] }
+ end
+ get '/empty_lambda'
- params do
- requires :type, values: { except: ValuesModel.excepts }
- end
- get '/except/exclusive' do
- { type: params[:type] }
- end
+ params do
+ optional :type, values: ValuesModel.values, default: -> { ValuesModel.values.sample }
+ end
+ get '/default_lambda' do
+ { type: params[:type] }
+ end
- params do
- requires :type, type: String, values: { except: ValuesModel.excepts }
- end
- get '/except/exclusive/type' do
- { type: params[:type] }
- end
+ params do
+ optional :type, values: -> { ValuesModel.values }, default: -> { ValuesModel.values.sample }
+ end
+ get '/default_and_values_lambda' do
+ { type: params[:type] }
+ end
- params do
- requires :type, values: { except: -> { ValuesModel.excepts } }
- end
- get '/except/exclusive/lambda' do
- { type: params[:type] }
- end
+ params do
+ optional :type, type: Grape::API::Boolean, desc: 'A boolean', values: [true]
+ end
+ get '/values/optional_boolean' do
+ { type: params[:type] }
+ end
- params do
- requires :type, type: String, values: { except: -> { ValuesModel.excepts } }
- end
- get '/except/exclusive/lambda/type' do
- { type: params[:type] }
- end
+ params do
+ requires :type, type: Integer, desc: 'An integer', values: [10, 11], default: 10
+ end
+ get '/values/coercion' do
+ { type: params[:type] }
+ end
- params do
- requires :type, type: Integer, values: { except: -> { [3, 4, 5] } }
- end
- get '/except/exclusive/lambda/coercion' do
- { type: params[:type] }
- end
+ params do
+ requires :type, type: Array[Integer], desc: 'An integer', values: [10, 11], default: 10
+ end
+ get '/values/array_coercion' do
+ { type: params[:type] }
+ end
- params do
- requires :type, type: Integer, values: { value: 1..5, except: [3] }
+ params do
+ optional :optional, type: Array do
+ requires :type, values: %w[a b]
end
- get '/mixed/value/except' do
- { type: params[:type] }
- end
+ end
+ get '/optional_with_required_values'
- params do
- optional :optional, type: Array[String], values: %w[a b c]
- end
- put '/optional_with_array_of_string_values'
+ params do
+ requires :type, values: { except: ValuesModel.excepts }
+ end
+ get '/except/exclusive' do
+ { type: params[:type] }
+ end
- params do
- requires :type, values: { proc: ->(v) { ValuesModel.include? v } }
- end
- get '/proc' do
- { type: params[:type] }
- end
+ params do
+ requires :type, type: String, values: { except: ValuesModel.excepts }
+ end
+ get '/except/exclusive/type' do
+ { type: params[:type] }
+ end
- params do
- requires :type, values: { proc: ->(v) { ValuesModel.include? v }, message: 'failed check' }
- end
- get '/proc/message'
+ params do
+ requires :type, values: { except: -> { ValuesModel.excepts } }
+ end
+ get '/except/exclusive/lambda' do
+ { type: params[:type] }
+ end
- params do
- optional :name, type: String, values: %w[a b], allow_blank: true
- end
- get '/allow_blank'
+ params do
+ requires :type, type: String, values: { except: -> { ValuesModel.excepts } }
end
+ get '/except/exclusive/lambda/type' do
+ { type: params[:type] }
+ end
+
+ params do
+ requires :type, type: Integer, values: { except: -> { [3, 4, 5] } }
+ end
+ get '/except/exclusive/lambda/coercion' do
+ { type: params[:type] }
+ end
+
+ params do
+ requires :type, type: Integer, values: { value: 1..5, except: [3] }
+ end
+ get '/mixed/value/except' do
+ { type: params[:type] }
+ end
+
+ params do
+ optional :optional, type: Array[String], values: %w[a b c]
+ end
+ put '/optional_with_array_of_string_values'
+
+ params do
+ requires :type, values: { proc: ->(v) { ValuesModel.include? v } }
+ end
+ get '/proc' do
+ { type: params[:type] }
+ end
+
+ params do
+ requires :type, values: { proc: ->(v) { ValuesModel.include? v }, message: 'failed check' }
+ end
+ get '/proc/message'
+
+ params do
+ optional :name, type: String, values: %w[a b], allow_blank: true
+ end
+ get '/allow_blank'
end
end
- def app
- ValidationsSpec::ValuesValidatorSpec::API
- end
-
context 'with a custom validation message' do
it 'allows a valid value for a parameter' do
get('/custom_message', type: 'valid-type1')
expect(last_response.status).to eq 200
expect(last_response.body).to eq({ type: 'valid-type1' }.to_json)
@@ -253,11 +255,11 @@
expect(last_response.status).to eq 400
expect(last_response.body).to eq({ error: 'type value does not include in values' }.to_json)
end
it 'validates against values in a proc' do
- ValidationsSpec::ValuesModel.add_value('valid-type4')
+ ValuesModel.add_value('valid-type4')
get('/custom_message/lambda', type: 'valid-type4')
expect(last_response.status).to eq 200
expect(last_response.body).to eq({ type: 'valid-type4' }.to_json)
end
@@ -352,19 +354,18 @@
expect(last_response.status).to eq 200
expect(last_response.body).to eq({ type: 'valid-type1' }.to_json)
end
it 'does not validate updated values without proc' do
- ValidationsSpec::ValuesModel.add_value('valid-type4')
-
+ ValuesModel.add_value('valid-type4')
get('/', type: 'valid-type4')
expect(last_response.status).to eq 400
expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json)
end
it 'validates against values in a proc' do
- ValidationsSpec::ValuesModel.add_value('valid-type4')
+ ValuesModel.add_value('valid-type4')
get('/lambda', type: 'valid-type4')
expect(last_response.status).to eq 200
expect(last_response.body).to eq({ type: 'valid-type4' }.to_json)
end
@@ -422,10 +423,10 @@
end
it 'raises IncompatibleOptionValues on an invalid default value from proc' do
subject = Class.new(Grape::API)
expect do
- subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], default: "#{ValidationsSpec::ValuesModel.values.sample}_invalid" }
+ subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], default: "#{ValuesModel.values.sample}_invalid" }
end.to raise_error Grape::Exceptions::IncompatibleOptionValues
end
it 'raises IncompatibleOptionValues on an invalid default value' do
subject = Class.new(Grape::API)