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