1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
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, 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
get do
'bacon'
end
end
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
get do
'bacon'
end
end
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, 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
get do
'bacon'
end
end
end
def app
subject
end
it 'fails with message' do
get '/', text: 'foobar'
expect(last_response.status).to eq 400
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, 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
optional :admin_false_field, type: String, admin: false
end
get do
'bacon'
end
end
end
def app
subject
end
it 'fail when non-admin user sets an admin field' do
get '/', admin_field: 'tester', non_admin_field: 'toaster'
expect(last_response.status).to eq 400
expect(last_response.body).to include 'Can not set Admin only field.'
end
it 'does not fail when we send non-admin fields only' do
get '/', non_admin_field: 'toaster'
expect(last_response.status).to eq 200
expect(last_response.body).to eq 'bacon'
end
it 'does not fail when we send non-admin and admin=false fields only' do
get '/', non_admin_field: 'toaster', admin_false_field: 'test'
expect(last_response.status).to eq 200
expect(last_response.body).to eq 'bacon'
end
it 'does not fail when we send admin fields and we are admin' do
header 'X-Access-Token', 'admin'
get '/', admin_field: 'tester', non_admin_field: 'toaster', admin_false_field: 'test'
expect(last_response.status).to eq 200
expect(last_response.body).to eq 'bacon'
end
it 'fails when we send admin fields and we are not admin' do
header 'X-Access-Token', 'user'
get '/', admin_field: 'tester', non_admin_field: 'toaster', admin_false_field: 'test'
expect(last_response.status).to eq 400
expect(last_response.body).to include 'Can not set Admin only field.'
end
end
end
|