committee 3.0.0.alpha → 3.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/committee/drivers/hyper_schema.rb +8 -2
- data/lib/committee/drivers/open_api_2.rb +7 -2
- data/lib/committee/drivers/open_api_3.rb +9 -4
- data/lib/committee/drivers.rb +46 -0
- data/lib/committee/middleware/base.rb +9 -11
- data/lib/committee/middleware/response_validation.rb +8 -5
- data/lib/committee/request_unpacker.rb +4 -1
- data/lib/committee/{parameter_coercer.rb → schema_validator/hyper_schema/parameter_coercer.rb} +1 -2
- data/lib/committee/schema_validator/hyper_schema/request_validator.rb +1 -5
- data/lib/committee/schema_validator/hyper_schema/response_validator.rb +3 -9
- data/lib/committee/schema_validator/hyper_schema/router.rb +1 -1
- data/lib/committee/schema_validator/hyper_schema.rb +5 -4
- data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +46 -19
- data/lib/committee/schema_validator/open_api_3/request_validator.rb +14 -4
- data/lib/committee/schema_validator/open_api_3/response_validator.rb +9 -20
- data/lib/committee/schema_validator/open_api_3/router.rb +15 -4
- data/lib/committee/schema_validator/open_api_3.rb +14 -5
- data/lib/committee/schema_validator/option.rb +2 -5
- data/lib/committee/schema_validator/schema_validator.rb +15 -0
- data/lib/committee/test/methods.rb +3 -5
- data/lib/committee.rb +3 -1
- data/test/drivers/open_api_3_test.rb +2 -1
- data/test/drivers_test.rb +69 -0
- data/test/middleware/base_test.rb +20 -5
- data/test/middleware/request_validation_open_api_3_test.rb +136 -259
- data/test/middleware/request_validation_test.rb +18 -3
- data/test/middleware/response_validation_open_api_3_test.rb +83 -16
- data/test/middleware/response_validation_test.rb +19 -7
- data/test/middleware/stub_test.rb +1 -1
- data/test/{parameter_coercer_test.rb → schema_validator/hyper_schema/parameter_coercer_test.rb} +3 -3
- data/test/schema_validator/hyper_schema/router_test.rb +6 -0
- data/test/schema_validator/open_api_3/operation_wrapper_test.rb +29 -13
- data/test/schema_validator/open_api_3/request_validator_test.rb +31 -132
- data/test/schema_validator/open_api_3/response_validator_test.rb +19 -5
- data/test/test/methods_new_version_test.rb +19 -3
- data/test/test/methods_test.rb +15 -8
- data/test/test_helper.rb +15 -16
- metadata +8 -7
@@ -7,53 +7,8 @@ describe Committee::Middleware::RequestValidation do
|
|
7
7
|
@app
|
8
8
|
end
|
9
9
|
|
10
|
-
ARRAY_PROPERTY = [
|
11
|
-
{
|
12
|
-
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
13
|
-
"per_page" => 1,
|
14
|
-
"nested_coercer_object" => {
|
15
|
-
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
16
|
-
"threshold" => 1.5
|
17
|
-
},
|
18
|
-
"nested_no_coercer_object" => {
|
19
|
-
"per_page" => 1,
|
20
|
-
"threshold" => 1.5
|
21
|
-
},
|
22
|
-
"nested_coercer_array" => [
|
23
|
-
{
|
24
|
-
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
25
|
-
"threshold" => 1.5
|
26
|
-
}
|
27
|
-
],
|
28
|
-
"nested_no_coercer_array" => [
|
29
|
-
{
|
30
|
-
"per_page" => 1,
|
31
|
-
"threshold" => 1.5
|
32
|
-
}
|
33
|
-
],
|
34
|
-
"integer_array" => [
|
35
|
-
1, 2, 3
|
36
|
-
],
|
37
|
-
"datetime_array" => [
|
38
|
-
"2016-04-01T16:00:00.000+09:00",
|
39
|
-
"2016-04-01T17:00:00.000+09:00",
|
40
|
-
"2016-04-01T18:00:00.000+09:00"
|
41
|
-
]
|
42
|
-
},
|
43
|
-
{
|
44
|
-
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
45
|
-
"per_page" => 1,
|
46
|
-
"threshold" => 1.5
|
47
|
-
},
|
48
|
-
{
|
49
|
-
"threshold" => 1.5,
|
50
|
-
"per_page" => 1
|
51
|
-
}
|
52
|
-
]
|
53
|
-
|
54
|
-
|
55
10
|
it "OpenAPI3 pass through a valid request" do
|
56
|
-
@app = new_rack_app(
|
11
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
57
12
|
params = {
|
58
13
|
"string_post_1" => "cloudnasium"
|
59
14
|
}
|
@@ -68,7 +23,7 @@ describe Committee::Middleware::RequestValidation do
|
|
68
23
|
[200, {integer: 1}, []]
|
69
24
|
}
|
70
25
|
|
71
|
-
@app = new_rack_app_with_lambda(check_parameter_string,
|
26
|
+
@app = new_rack_app_with_lambda(check_parameter_string, schema: open_api_3_schema)
|
72
27
|
|
73
28
|
put "/validate_no_parameter", {no_schema: 'no'}
|
74
29
|
end
|
@@ -81,7 +36,7 @@ describe Committee::Middleware::RequestValidation do
|
|
81
36
|
[200, {}, []]
|
82
37
|
}
|
83
38
|
|
84
|
-
@app = new_rack_app_with_lambda(check_parameter,
|
39
|
+
@app = new_rack_app_with_lambda(check_parameter, schema: open_api_3_schema, coerce_date_times: true)
|
85
40
|
|
86
41
|
get "/string_params_coercer", params
|
87
42
|
assert_equal 200, last_response.status
|
@@ -132,26 +87,24 @@ describe Committee::Middleware::RequestValidation do
|
|
132
87
|
[200, {}, []]
|
133
88
|
}
|
134
89
|
|
135
|
-
@app = new_rack_app_with_lambda(check_parameter,
|
90
|
+
@app = new_rack_app_with_lambda(check_parameter, schema: open_api_3_schema, coerce_date_times: true, coerce_recursive: true)
|
136
91
|
|
137
|
-
|
92
|
+
header "Content-Type", "application/json"
|
93
|
+
post "/string_params_coercer", JSON.generate(params)
|
138
94
|
|
139
95
|
assert_equal 200, last_response.status
|
140
96
|
end
|
141
97
|
|
142
|
-
# TODO: support date-time object format check
|
143
|
-
=begin
|
144
98
|
it "passes given an invalid datetime string with coerce_date_times enabled" do
|
145
|
-
@app = new_rack_app(
|
99
|
+
@app = new_rack_app(schema: open_api_3_schema, coerce_date_times: true)
|
146
100
|
params = {
|
147
101
|
"datetime_string" => "invalid_datetime_format"
|
148
102
|
}
|
149
|
-
get "/string_params_coercer",
|
103
|
+
get "/string_params_coercer", params
|
150
104
|
|
151
105
|
assert_equal 400, last_response.status
|
152
|
-
assert_match(/
|
106
|
+
assert_match(/invalid_datetime/i, last_response.body)
|
153
107
|
end
|
154
|
-
=end
|
155
108
|
|
156
109
|
it "passes a nested object with recursive option" do
|
157
110
|
params = {
|
@@ -175,136 +128,84 @@ describe Committee::Middleware::RequestValidation do
|
|
175
128
|
coerce_query_params: true,
|
176
129
|
coerce_recursive: true,
|
177
130
|
coerce_date_times: true,
|
178
|
-
|
131
|
+
schema: open_api_3_schema)
|
179
132
|
|
180
133
|
get "/string_params_coercer", params
|
181
134
|
|
182
135
|
assert_equal 200, last_response.status
|
183
136
|
end
|
184
137
|
|
185
|
-
=begin
|
186
|
-
it "passes a nested object with coerce_recursive default(true)" do
|
187
|
-
key_name = "update_time"
|
188
|
-
params = {
|
189
|
-
key_name => "2016-04-01T16:00:00.000+09:00",
|
190
|
-
"query" => "cloudnasium",
|
191
|
-
"array_property" => ARRAY_PROPERTY
|
192
|
-
}
|
193
|
-
|
194
|
-
@app = new_rack_app(coerce_query_params: true, coerce_date_times: true, schema: hyper_schema)
|
195
|
-
|
196
|
-
get "/search/apps", params
|
197
|
-
assert_equal 200, last_response.status # schema expect integer but we don't convert string to integer, so 400
|
198
|
-
end
|
199
|
-
|
200
|
-
it "passes given a nested datetime and with coerce_recursive=true and coerce_date_times=true on POST endpoint" do
|
201
|
-
key_name = "update_time"
|
202
|
-
params = {
|
203
|
-
key_name => "2016-04-01T16:00:00.000+09:00",
|
204
|
-
"array_property" => ARRAY_PROPERTY
|
205
|
-
}
|
206
|
-
|
207
|
-
check_parameter = lambda { |env|
|
208
|
-
hash = env['committee.params']
|
209
|
-
assert_equal DateTime, hash['array_property'].first['update_time'].class
|
210
|
-
assert_equal 1, hash['array_property'].first['per_page']
|
211
|
-
assert_equal DateTime, hash['array_property'].first['nested_coercer_object']['update_time'].class
|
212
|
-
assert_equal 1, hash['array_property'].first['nested_no_coercer_object']['per_page']
|
213
|
-
assert_equal 2, hash['array_property'].first['integer_array'][1]
|
214
|
-
assert_equal DateTime, hash['array_property'].first['datetime_array'][0].class
|
215
|
-
assert_equal DateTime, env['committee.params'][key_name].class
|
216
|
-
[200, {}, []]
|
217
|
-
}
|
218
|
-
|
219
|
-
@app = new_rack_app_with_lambda(check_parameter, coerce_date_times: true, coerce_recursive: true, schema: hyper_schema)
|
220
|
-
|
221
|
-
header "Content-Type", "application/json"
|
222
|
-
post "/apps", JSON.generate(params)
|
223
|
-
assert_equal 200, last_response.status
|
224
|
-
end
|
225
|
-
|
226
138
|
it "passes given a nested datetime and with coerce_recursive=true and coerce_date_times=true on POST endpoint" do
|
227
|
-
key_name = "update_time"
|
228
139
|
params = {
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
header "Content-Type", "application/json"
|
274
|
-
post "/apps", JSON.generate(params)
|
275
|
-
assert_equal 200, last_response.status
|
276
|
-
end
|
277
|
-
|
278
|
-
|
279
|
-
it "OpenAPI3 passes given a nested datetime and with coerce_recursive=false and coerce_date_times=false on POST endpoint" do
|
280
|
-
key_name = "update_time"
|
281
|
-
params = {
|
282
|
-
key_name => "2016-04-01T16:00:00.000+09:00",
|
283
|
-
"array_property" => ARRAY_PROPERTY
|
140
|
+
"nested_array" => [
|
141
|
+
{
|
142
|
+
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
143
|
+
"per_page" => 1,
|
144
|
+
"nested_coercer_object" => {
|
145
|
+
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
146
|
+
"threshold" => 1.5
|
147
|
+
},
|
148
|
+
"nested_no_coercer_object" => {
|
149
|
+
"per_page" => 1,
|
150
|
+
"threshold" => 1.5
|
151
|
+
},
|
152
|
+
"nested_coercer_array" => [
|
153
|
+
{
|
154
|
+
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
155
|
+
"threshold" => 1.5
|
156
|
+
}
|
157
|
+
],
|
158
|
+
"nested_no_coercer_array" => [
|
159
|
+
{
|
160
|
+
"per_page" => 1,
|
161
|
+
"threshold" => 1.5
|
162
|
+
}
|
163
|
+
],
|
164
|
+
"integer_array" => [
|
165
|
+
1, 2, 3
|
166
|
+
],
|
167
|
+
"datetime_array" => [
|
168
|
+
"2016-04-01T16:00:00.000+09:00",
|
169
|
+
"2016-04-01T17:00:00.000+09:00",
|
170
|
+
"2016-04-01T18:00:00.000+09:00"
|
171
|
+
]
|
172
|
+
},
|
173
|
+
{
|
174
|
+
"update_time" => "2016-04-01T16:00:00.000+09:00",
|
175
|
+
"per_page" => 1,
|
176
|
+
"threshold" => 1.5
|
177
|
+
},
|
178
|
+
{
|
179
|
+
"threshold" => 1.5,
|
180
|
+
"per_page" => 1
|
181
|
+
}
|
182
|
+
]
|
284
183
|
}
|
285
184
|
|
286
185
|
check_parameter = lambda { |env|
|
287
186
|
hash = env['committee.params']
|
288
|
-
|
289
|
-
|
290
|
-
assert_equal
|
291
|
-
assert_equal 1,
|
292
|
-
assert_equal
|
293
|
-
assert_equal
|
294
|
-
assert_equal
|
187
|
+
array = hash['nested_array']
|
188
|
+
|
189
|
+
assert_equal DateTime, array.first['update_time'].class
|
190
|
+
assert_equal 1, array.first['per_page']
|
191
|
+
assert_equal DateTime, array.first['nested_coercer_object']['update_time'].class
|
192
|
+
assert_equal 1, array.first['nested_no_coercer_object']['per_page']
|
193
|
+
assert_equal 2, array.first['integer_array'][1]
|
194
|
+
assert_equal DateTime, array.first['datetime_array'][0].class
|
295
195
|
[200, {}, []]
|
296
196
|
}
|
297
197
|
|
298
|
-
@app = new_rack_app_with_lambda(check_parameter,
|
198
|
+
@app = new_rack_app_with_lambda(check_parameter,
|
199
|
+
coerce_date_times: true,
|
200
|
+
schema: open_api_3_schema)
|
299
201
|
|
300
202
|
header "Content-Type", "application/json"
|
301
|
-
post "/
|
203
|
+
post "/string_params_coercer", JSON.generate(params)
|
302
204
|
assert_equal 200, last_response.status
|
303
205
|
end
|
304
|
-
=end
|
305
206
|
|
306
207
|
it "OpenAPI3 detects an invalid request" do
|
307
|
-
@app = new_rack_app(
|
208
|
+
@app = new_rack_app(schema: open_api_3_schema, strict: true)
|
308
209
|
header "Content-Type", "application/json"
|
309
210
|
params = {
|
310
211
|
"string_post_1" => 1
|
@@ -316,7 +217,7 @@ describe Committee::Middleware::RequestValidation do
|
|
316
217
|
end
|
317
218
|
|
318
219
|
it "rescues JSON errors" do
|
319
|
-
@app = new_rack_app(
|
220
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
320
221
|
header "Content-Type", "application/json"
|
321
222
|
post "/apps", "{x:y}"
|
322
223
|
assert_equal 400, last_response.status
|
@@ -324,7 +225,7 @@ describe Committee::Middleware::RequestValidation do
|
|
324
225
|
end
|
325
226
|
|
326
227
|
it "take a prefix" do
|
327
|
-
@app = new_rack_app(prefix: "/v1",
|
228
|
+
@app = new_rack_app(prefix: "/v1", schema: open_api_3_schema)
|
328
229
|
params = {
|
329
230
|
"string_post_1" => "cloudnasium"
|
330
231
|
}
|
@@ -333,147 +234,104 @@ describe Committee::Middleware::RequestValidation do
|
|
333
234
|
assert_equal 200, last_response.status
|
334
235
|
end
|
335
236
|
|
237
|
+
it "take a prefix with invalid data" do
|
238
|
+
@app = new_rack_app(prefix: "/v1", schema: open_api_3_schema)
|
239
|
+
params = {
|
240
|
+
"string_post_1" => 1
|
241
|
+
}
|
242
|
+
header "Content-Type", "application/json"
|
243
|
+
post "/v1/characters", JSON.generate(params)
|
244
|
+
assert_equal 400, last_response.status
|
245
|
+
assert_match(/1 class is/i, last_response.body)
|
246
|
+
end
|
247
|
+
|
336
248
|
it "ignores paths outside the prefix" do
|
337
|
-
@app = new_rack_app(prefix: "/v1",
|
338
|
-
|
339
|
-
|
249
|
+
@app = new_rack_app(prefix: "/v1", schema: open_api_3_schema)
|
250
|
+
params = {
|
251
|
+
"string_post_1" => 1
|
252
|
+
}
|
253
|
+
header "Content-Type", "application/json"
|
254
|
+
post "/characters", JSON.generate(params)
|
255
|
+
assert_equal 200, last_response.status
|
256
|
+
end
|
257
|
+
|
258
|
+
it "don't check prefix with no option" do
|
259
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
260
|
+
params = {
|
261
|
+
"string_post_1" => 1
|
262
|
+
}
|
263
|
+
header "Content-Type", "application/json"
|
264
|
+
post "/v1/characters", JSON.generate(params)
|
340
265
|
assert_equal 200, last_response.status
|
341
266
|
end
|
342
267
|
|
343
268
|
it "OpenAPI3 pass not exist href" do
|
344
|
-
@app = new_rack_app(
|
269
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
345
270
|
get "/unknown"
|
346
271
|
assert_equal 200, last_response.status
|
347
272
|
end
|
348
273
|
|
349
274
|
it "OpenAPI3 pass not exist href in strict mode" do
|
350
|
-
@app = new_rack_app(
|
275
|
+
@app = new_rack_app(schema: open_api_3_schema, strict: true)
|
351
276
|
get "/unknown"
|
352
277
|
assert_equal 404, last_response.status
|
353
278
|
end
|
354
279
|
|
355
280
|
it "optionally raises an error" do
|
356
|
-
@app = new_rack_app(raise: true,
|
281
|
+
@app = new_rack_app(raise: true, schema: open_api_3_schema)
|
357
282
|
header "Content-Type", "application/json"
|
358
283
|
assert_raises(Committee::InvalidRequest) do
|
359
284
|
post "/characters", "{x:y}"
|
360
285
|
end
|
361
286
|
end
|
362
287
|
|
363
|
-
# TODO: support check_content_type
|
364
|
-
it "OpenAPI not support check_content_type" do
|
365
|
-
@app = new_rack_app(open_api_3: open_api_3_schema, check_content_type: true)
|
366
|
-
|
367
|
-
e = assert_raises(RuntimeError) {
|
368
|
-
post "/characters", {}
|
369
|
-
}
|
370
|
-
|
371
|
-
assert_equal 'OpenAPI3 not support @check_content_type option', e.message
|
372
|
-
end
|
373
|
-
=begin
|
374
|
-
it "optionally content_type check" do
|
375
|
-
@app = new_rack_app(check_content_type: true, open_api_3: open_api_3_schema)
|
376
|
-
params = {
|
377
|
-
"string_post_1" => "cloudnasium"
|
378
|
-
}
|
379
|
-
header "Content-Type", "text/html"
|
380
|
-
post "/characters", JSON.generate(params)
|
381
|
-
assert_equal 400, last_response.status
|
382
|
-
end
|
383
|
-
=end
|
384
|
-
|
385
|
-
it "optionally skip content_type check" do
|
386
|
-
@app = new_rack_app(check_content_type: false, open_api_3: open_api_3_schema)
|
387
|
-
params = {
|
388
|
-
"string_post_1" => "cloudnasium"
|
389
|
-
}
|
390
|
-
header "Content-Type", "text/html"
|
391
|
-
post "/characters", JSON.generate(params)
|
392
|
-
assert_equal 200, last_response.status
|
393
|
-
end
|
394
|
-
|
395
288
|
it "optionally coerces query params" do
|
396
|
-
@app = new_rack_app(coerce_query_params: true,
|
289
|
+
@app = new_rack_app(coerce_query_params: true, schema: open_api_3_schema)
|
397
290
|
header "Content-Type", "application/json"
|
398
291
|
get "/string_params_coercer", {"integer_1" => "1"}
|
399
292
|
assert_equal 200, last_response.status
|
400
293
|
end
|
401
294
|
|
402
|
-
=begin
|
403
295
|
it "still raises an error if query param coercion is not possible" do
|
404
|
-
@app = new_rack_app(coerce_query_params:
|
296
|
+
@app = new_rack_app(coerce_query_params: false, schema: open_api_3_schema)
|
405
297
|
header "Content-Type", "application/json"
|
406
|
-
get "/
|
298
|
+
get "/string_params_coercer", {"integer_1" => "1"}
|
299
|
+
|
407
300
|
assert_equal 400, last_response.status
|
408
|
-
assert_match(/
|
301
|
+
assert_match(/1 class/i, last_response.body)
|
409
302
|
end
|
410
303
|
|
411
|
-
it "passes through a valid request for
|
304
|
+
it "passes through a valid request for OpenAPI3" do
|
412
305
|
check_parameter = lambda { |env|
|
413
306
|
assert_equal 3, env['rack.request.query_hash']['limit']
|
414
307
|
[200, {}, []]
|
415
308
|
}
|
416
309
|
|
417
|
-
@app = new_rack_app_with_lambda(check_parameter, schema:
|
418
|
-
get "/
|
310
|
+
@app = new_rack_app_with_lambda(check_parameter, schema: open_api_3_schema)
|
311
|
+
get "/characters?limit=3"
|
419
312
|
assert_equal 200, last_response.status
|
420
313
|
end
|
421
314
|
|
422
315
|
it "detects an invalid request for OpenAPI" do
|
423
|
-
@app = new_rack_app(schema:
|
424
|
-
get "/
|
425
|
-
assert_equal 400, last_response.status
|
426
|
-
assert_match(/invalid request/i, last_response.body)
|
427
|
-
end
|
316
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
317
|
+
get "/characters?limit=foo"
|
428
318
|
|
429
|
-
it "passes through a valid request for OpenAPI including path parameters" do
|
430
|
-
@app = new_rack_app(schema: open_api_2_schema)
|
431
|
-
# not that ID is expect to be an integer
|
432
|
-
get "/api/pets/123"
|
433
|
-
assert_equal 200, last_response.status
|
434
|
-
end
|
435
|
-
|
436
|
-
it "detects an invalid request for OpenAPI including path parameters" do
|
437
|
-
@app = new_rack_app(schema: open_api_2_schema)
|
438
|
-
# not that ID is expect to be an integer
|
439
|
-
get "/api/pets/not-integer"
|
440
319
|
assert_equal 400, last_response.status
|
441
|
-
assert_match(/
|
320
|
+
assert_match(/foo class/i, last_response.body)
|
442
321
|
end
|
443
|
-
=end
|
444
|
-
|
445
|
-
describe "coerce_path_params" do
|
446
|
-
it "coerce string to integer" do
|
447
|
-
check_parameter_string = lambda { |env|
|
448
|
-
assert env['committee.params']['integer'].is_a?(Integer)
|
449
|
-
[200, {}, []]
|
450
|
-
}
|
451
322
|
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
it "path parameter validation" do
|
458
|
-
@app = new_rack_app(open_api_3: open_api_3_schema, coerce_path_params: false)
|
459
|
-
get "/coerce_path_params/1"
|
323
|
+
it "coerce string to integer" do
|
324
|
+
check_parameter_string = lambda { |env|
|
325
|
+
assert env['committee.params']['integer'].is_a?(Integer)
|
326
|
+
[200, {}, []]
|
327
|
+
}
|
460
328
|
|
461
|
-
|
462
|
-
|
463
|
-
=begin
|
464
|
-
it "path parameter validation" do
|
465
|
-
@app = new_rack_app_with_lambda(check_parameter_string, open_api_3: open_api_3_schema, coerce_path_params: false)
|
466
|
-
e = assert_raises(RuntimeError) {
|
467
|
-
get "/coerce_path_params/1"
|
468
|
-
}
|
469
|
-
|
470
|
-
assert_equal 'OpenAPI3 not support @coerce_query_params option', e.message
|
471
|
-
end
|
472
|
-
=end
|
329
|
+
@app = new_rack_app_with_lambda(check_parameter_string, schema: open_api_3_schema, coerce_path_params: true)
|
330
|
+
get "/coerce_path_params/1"
|
473
331
|
end
|
474
332
|
|
475
333
|
it "OpenAPI3 raise not support method" do
|
476
|
-
@app = new_rack_app(
|
334
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
477
335
|
|
478
336
|
e = assert_raises(RuntimeError) {
|
479
337
|
head "/characters", {}
|
@@ -482,6 +340,25 @@ describe Committee::Middleware::RequestValidation do
|
|
482
340
|
assert_equal 'Committee OpenAPI3 not support head method', e.message
|
483
341
|
end
|
484
342
|
|
343
|
+
describe 'check header' do
|
344
|
+
it 'no required header' do
|
345
|
+
@app = new_rack_app(schema: open_api_3_schema, check_header: true)
|
346
|
+
|
347
|
+
get "/header"
|
348
|
+
|
349
|
+
assert_equal 400, last_response.status
|
350
|
+
assert_match(/required parameters integer not exist/i, last_response.body)
|
351
|
+
end
|
352
|
+
|
353
|
+
it 'no required header but not check' do
|
354
|
+
@app = new_rack_app(schema: open_api_3_schema, check_header: false)
|
355
|
+
|
356
|
+
get "/header"
|
357
|
+
|
358
|
+
assert_equal 200, last_response.status
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
485
362
|
private
|
486
363
|
|
487
364
|
def new_rack_app(options = {})
|
@@ -374,23 +374,38 @@ describe Committee::Middleware::RequestValidation do
|
|
374
374
|
end
|
375
375
|
|
376
376
|
it "OpenAPI3 pass through a valid request" do
|
377
|
-
@app = new_rack_app(
|
377
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
378
378
|
get "/characters"
|
379
379
|
assert_equal 200, last_response.status
|
380
380
|
end
|
381
381
|
|
382
382
|
it "OpenAPI3 pass not exist href" do
|
383
|
-
@app = new_rack_app(
|
383
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
384
384
|
get "/unknown"
|
385
385
|
assert_equal 200, last_response.status
|
386
386
|
end
|
387
387
|
|
388
388
|
it "OpenAPI3 pass not exist href in strict mode" do
|
389
|
-
@app = new_rack_app(
|
389
|
+
@app = new_rack_app(schema: open_api_3_schema, strict: true)
|
390
390
|
get "/unknown"
|
391
391
|
assert_equal 404, last_response.status
|
392
392
|
end
|
393
393
|
|
394
|
+
it "not exist path and options" do
|
395
|
+
options = {
|
396
|
+
coerce_form_params: true,
|
397
|
+
coerce_date_times: true,
|
398
|
+
coerce_query_params: true,
|
399
|
+
coerce_path_params: true,
|
400
|
+
coerce_recursive: true
|
401
|
+
}
|
402
|
+
|
403
|
+
@app = new_rack_app({schema: hyper_schema}.merge(options))
|
404
|
+
header "Content-Type", "application/x-www-form-urlencoded"
|
405
|
+
post "/unknown"
|
406
|
+
assert_equal 200, last_response.status
|
407
|
+
end
|
408
|
+
|
394
409
|
private
|
395
410
|
|
396
411
|
def new_rack_app(options = {})
|