spec/grape/validations/validators/values_spec.rb in grape-0.19.1 vs spec/grape/validations/validators/values_spec.rb in grape-0.19.2

- old
+ new

@@ -48,37 +48,36 @@ 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' do - { type: params[:type] } - 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' do - { type: params[:type] } - end + get '/exclude/lambda/exclude_message' params do requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' } end - get '/exclude/fallback_message' do - { type: params[:type] } - end + get '/exclude/fallback_message' end params do requires :type, values: ValuesModel.values end get '/' do { type: params[:type] } end params do + requires :type, values: [] + end + get '/empty' + + params do optional :type, values: ValuesModel.values, default: 'valid-type2' end get '/default/valid' do { type: params[:type] } end @@ -89,10 +88,15 @@ get '/lambda' do { type: params[:type] } end params do + requires :type, values: -> { [] } + end + get '/empty_lambda' + + params do optional :type, values: ValuesModel.values, default: -> { ValuesModel.values.sample } end get '/default_lambda' do { type: params[:type] } end @@ -157,10 +161,27 @@ 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.values.include? v } } + end + get '/proc' do + { type: params[:type] } + end + + params do + requires :type, values: { proc: ->(v) { ValuesModel.values.include? v }, message: 'failed check' } + end + get '/proc/message' end end end def app @@ -229,10 +250,16 @@ get('/', type: 'invalid-type') 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 'rejects all values if values is an empty array' do + get('/empty', type: 'invalid-type') + expect(last_response.status).to eq 400 + expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json) + end + context 'nil value for a parameter' do it 'does not allow for root params scope' do get('/', type: nil) expect(last_response.status).to eq 400 expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json) @@ -240,10 +267,15 @@ it 'allows for a required param in child scope' do get('/optional_with_required_values') expect(last_response.status).to eq 200 end + + it 'allows for an optional param with a list of values' do + put('/optional_with_array_of_string_values', optional: nil) + expect(last_response.status).to eq 200 + end end it 'allows a valid default value' do get('/default/valid') expect(last_response.status).to eq 200 @@ -276,10 +308,16 @@ get('/lambda', type: 'invalid-type') 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 an empty array in a proc' do + get('/empty_lambda', type: 'any') + 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 default value from proc' do get('/default_lambda') expect(last_response.status).to eq 200 end @@ -416,10 +454,16 @@ it 'rejects values that matches except' do get '/except/exclusive', type: 'invalid-type1' expect(last_response.status).to eq 400 expect(last_response.body).to eq({ error: 'type has a value not allowed' }.to_json) end + + it 'rejects an array of values if any of them matches except' do + get '/except/exclusive', type: %w(valid1 valid2 invalid-type1 valid4) + expect(last_response.status).to eq 400 + expect(last_response.body).to eq({ error: 'type has a value not allowed' }.to_json) + end end context 'exclusive excepts with lambda' do it 'allows any other value outside excepts' do get '/except/exclusive/lambda', type: 'value' @@ -463,8 +507,40 @@ it 'rejects outside except and outside value' do get '/mixed/value/except', type: 10 expect(last_response.status).to eq 400 expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json) + end + end + + context 'custom validation using proc' do + it 'accepts a single valid value' do + get '/proc', type: 'valid-type1' + expect(last_response.status).to eq 200 + expect(last_response.body).to eq({ type: 'valid-type1' }.to_json) + end + + it 'accepts multiple valid values' do + get '/proc', type: ['valid-type1', 'valid-type3'] + expect(last_response.status).to eq 200 + expect(last_response.body).to eq({ type: ['valid-type1', 'valid-type3'] }.to_json) + end + + it 'rejects a single invalid value' do + get '/proc', type: 'invalid-type1' + 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 'rejects an invalid value among valid ones' do + get '/proc', type: ['valid-type1', 'invalid-type1', 'valid-type3'] + 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 'uses supplied message' do + get '/proc/message', type: 'invalid-type1' + expect(last_response.status).to eq 400 + expect(last_response.body).to eq({ error: 'type failed check' }.to_json) end end end