4
4
module ValidationsSpec
5
5
class ValuesModel
6
6
DEFAULT_VALUES = [ 'valid-type1' , 'valid-type2' , 'valid-type3' ] . freeze
7
+ DEFAULT_EXCEPTS = [ 'invalid-type1' , 'invalid-type2' , 'invalid-type3' ] . freeze
7
8
class << self
8
9
def values
9
10
@values ||= [ ]
@@ -14,6 +15,16 @@ def add_value(value)
14
15
@values ||= [ ]
15
16
@values << value
16
17
end
18
+
19
+ def excepts
20
+ @excepts ||= [ ]
21
+ [ DEFAULT_EXCEPTS + @excepts ] . flatten . uniq
22
+ end
23
+
24
+ def add_except ( except )
25
+ @excepts ||= [ ]
26
+ @excepts << except
27
+ end
17
28
end
18
29
end
19
30
@@ -35,6 +46,20 @@ class API < Grape::API
35
46
get '/lambda' do
36
47
{ type : params [ :type ] }
37
48
end
49
+
50
+ params do
51
+ requires :type , values : { except : ValuesModel . excepts , except_message : 'value is on exclusions list' , message : 'default exclude message' }
52
+ end
53
+ get '/exclude/exclude_message' do
54
+ { type : params [ :type ] }
55
+ end
56
+
57
+ params do
58
+ requires :type , values : { except : ValuesModel . excepts , message : 'default exclude message' }
59
+ end
60
+ get '/exclude/fallback_message' do
61
+ { type : params [ :type ] }
62
+ end
38
63
end
39
64
40
65
params do
@@ -99,6 +124,20 @@ class API < Grape::API
99
124
end
100
125
end
101
126
get '/optional_with_required_values'
127
+
128
+ params do
129
+ requires :type , values : { except : ValuesModel . excepts }
130
+ end
131
+ get '/except/exclusive' do
132
+ { type : params [ :type ] }
133
+ end
134
+
135
+ params do
136
+ requires :type , type : Integer , values : { value : 1 ..5 , except : [ 3 ] }
137
+ end
138
+ get '/mixed/value/except' do
139
+ { type : params [ :type ] }
140
+ end
102
141
end
103
142
end
104
143
end
@@ -135,6 +174,22 @@ def app
135
174
end
136
175
end
137
176
177
+ context 'with a custom exclude validation message' do
178
+ it 'does not allow an invalid value for a parameter' do
179
+ get ( '/custom_message/exclude/exclude_message' , type : 'invalid-type1' )
180
+ expect ( last_response . status ) . to eq 400
181
+ expect ( last_response . body ) . to eq ( { error : 'type value is on exclusions list' } . to_json )
182
+ end
183
+ end
184
+
185
+ context 'exclude with a standard custom validation message' do
186
+ it 'does not allow an invalid value for a parameter' do
187
+ get ( '/custom_message/exclude/fallback_message' , type : 'invalid-type1' )
188
+ expect ( last_response . status ) . to eq 400
189
+ expect ( last_response . body ) . to eq ( { error : 'type default exclude message' } . to_json )
190
+ end
191
+ end
192
+
138
193
it 'allows a valid value for a parameter' do
139
194
get ( '/' , type : 'valid-type1' )
140
195
expect ( last_response . status ) . to eq 200
@@ -321,4 +376,38 @@ def app
321
376
expect ( last_response . body ) . to eq ( 'values does not have a valid value' )
322
377
end
323
378
end
379
+
380
+ context 'exclusive excepts' do
381
+ it 'allows any other value outside excepts' do
382
+ get '/except/exclusive' , type : 'value'
383
+ expect ( last_response . status ) . to eq 200
384
+ expect ( last_response . body ) . to eq ( { type : 'value' } . to_json )
385
+ end
386
+
387
+ it 'rejects values that matches except' do
388
+ get '/except/exclusive' , type : 'invalid-type1'
389
+ expect ( last_response . status ) . to eq 400
390
+ expect ( last_response . body ) . to eq ( { error : 'type has a value not allowed' } . to_json )
391
+ end
392
+ end
393
+
394
+ context 'with mixed values and excepts' do
395
+ it 'allows value, but not in except' do
396
+ get '/mixed/value/except' , type : 2
397
+ expect ( last_response . status ) . to eq 200
398
+ expect ( last_response . body ) . to eq ( { type : 2 } . to_json )
399
+ end
400
+
401
+ it 'rejects except' do
402
+ get '/mixed/value/except' , type : 3
403
+ expect ( last_response . status ) . to eq 400
404
+ expect ( last_response . body ) . to eq ( { error : 'type has a value not allowed' } . to_json )
405
+ end
406
+
407
+ it 'rejects outside except and outside value' do
408
+ get '/mixed/value/except' , type : 10
409
+ expect ( last_response . status ) . to eq 400
410
+ expect ( last_response . body ) . to eq ( { error : 'type does not have a valid value' } . to_json )
411
+ end
412
+ end
324
413
end
0 commit comments