committee 4.4.0 → 5.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/committee/drivers/open_api_2/driver.rb +1 -1
- data/lib/committee/drivers/open_api_2/parameter_schema_builder.rb +1 -1
- data/lib/committee/drivers.rb +21 -9
- data/lib/committee/middleware/base.rb +5 -4
- data/lib/committee/middleware/request_validation.rb +1 -8
- data/lib/committee/middleware/response_validation.rb +13 -14
- data/lib/committee/request_unpacker.rb +1 -1
- data/lib/committee/schema_validator/hyper_schema/response_validator.rb +1 -1
- data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +32 -33
- data/lib/committee/schema_validator/open_api_3/request_validator.rb +2 -2
- data/lib/committee/schema_validator/open_api_3.rb +28 -15
- data/lib/committee/schema_validator/option.rb +5 -13
- data/lib/committee/test/methods.rb +2 -7
- data/lib/committee/version.rb +5 -0
- data/lib/committee.rb +9 -2
- data/test/committee_test.rb +28 -2
- data/test/drivers/open_api_3/driver_test.rb +1 -1
- data/test/drivers_test.rb +20 -7
- data/test/middleware/base_test.rb +6 -13
- data/test/middleware/request_validation_open_api_3_test.rb +117 -41
- data/test/middleware/request_validation_test.rb +1 -28
- data/test/middleware/response_validation_open_api_3_test.rb +46 -3
- data/test/middleware/response_validation_test.rb +6 -25
- data/test/schema_validator/hyper_schema/response_validator_test.rb +10 -0
- data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +1 -1
- data/test/schema_validator/open_api_3/operation_wrapper_test.rb +55 -11
- data/test/schema_validator/open_api_3/request_validator_test.rb +10 -0
- data/test/schema_validator/open_api_3/response_validator_test.rb +14 -0
- data/test/test/methods_new_version_test.rb +1 -1
- data/test/test/methods_test.rb +11 -31
- data/test/test_helper.rb +11 -3
- metadata +14 -19
@@ -102,21 +102,14 @@ describe Committee::Middleware::Base do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
describe 'initialize option' do
|
105
|
-
it "
|
106
|
-
|
107
|
-
|
108
|
-
|
105
|
+
it "accepts OpenAPI3 parser config of strict_reference_validation and raises" do
|
106
|
+
assert_raises(OpenAPIParser::MissingReferenceError) do
|
107
|
+
Committee::Middleware::Base.new(nil, schema_path: open_api_3_invalid_reference_path, strict_reference_validation: true)
|
108
|
+
end
|
109
109
|
end
|
110
110
|
|
111
|
-
it "
|
112
|
-
|
113
|
-
b = Committee::Middleware::Base.new(nil, schema_path: open_api_2_schema_path, parse_response_by_content_type: false)
|
114
|
-
assert_kind_of Committee::Drivers::OpenAPI2::Schema, b.instance_variable_get(:@schema)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "schema_path option with OpenAPI3" do
|
118
|
-
# TODO: delete when 5.0.0 released because default value changed
|
119
|
-
b = Committee::Middleware::Base.new(nil, schema_path: open_api_3_schema_path, parse_response_by_content_type: false)
|
111
|
+
it "does not raise by default even with invalid reference OpenAPI3 specification" do
|
112
|
+
b = Committee::Middleware::Base.new(nil, schema_path: open_api_3_invalid_reference_path, strict_reference_validation: false)
|
120
113
|
assert_kind_of Committee::Drivers::OpenAPI3::Schema, b.instance_variable_get(:@schema)
|
121
114
|
end
|
122
115
|
end
|
@@ -34,12 +34,12 @@ describe Committee::Middleware::RequestValidation do
|
|
34
34
|
params = { "datetime_string" => "2016-04-01T16:00:00.000+09:00" }
|
35
35
|
|
36
36
|
check_parameter = lambda { |env|
|
37
|
-
assert_equal DateTime, env['
|
37
|
+
assert_equal DateTime, env['test.query_hash']["datetime_string"].class
|
38
38
|
assert_equal String, env['rack.request.query_hash']["datetime_string"].class
|
39
39
|
[200, {}, []]
|
40
40
|
}
|
41
41
|
|
42
|
-
@app = new_rack_app_with_lambda(check_parameter, schema: open_api_3_schema, coerce_date_times: true, query_hash_key: "
|
42
|
+
@app = new_rack_app_with_lambda(check_parameter, schema: open_api_3_schema, coerce_date_times: true, query_hash_key: "test.query_hash")
|
43
43
|
|
44
44
|
get "/string_params_coercer", params
|
45
45
|
assert_equal 200, last_response.status
|
@@ -49,7 +49,7 @@ describe Committee::Middleware::RequestValidation do
|
|
49
49
|
params = { "datetime_string" => "2016-04-01T16:00:00.000+09:00" }
|
50
50
|
|
51
51
|
check_parameter = lambda { |env|
|
52
|
-
|
52
|
+
assert_nil env['committee.query_hash']
|
53
53
|
assert_equal DateTime, env['rack.request.query_hash']["datetime_string"].class
|
54
54
|
[200, {}, []]
|
55
55
|
}
|
@@ -65,7 +65,7 @@ describe Committee::Middleware::RequestValidation do
|
|
65
65
|
|
66
66
|
@app = new_rack_app(schema: open_api_3_schema, allow_get_body: true)
|
67
67
|
|
68
|
-
get "/
|
68
|
+
get "/get_endpoint_with_required_parameter", { no_problem: true }, { input: params.to_json }
|
69
69
|
assert_equal 200, last_response.status
|
70
70
|
end
|
71
71
|
|
@@ -74,7 +74,7 @@ describe Committee::Middleware::RequestValidation do
|
|
74
74
|
|
75
75
|
@app = new_rack_app(schema: open_api_3_schema, allow_get_body: false)
|
76
76
|
|
77
|
-
get "/
|
77
|
+
get "/get_endpoint_with_required_parameter", { no_problem: true }, { input: params.to_json }
|
78
78
|
assert_equal 400, last_response.status
|
79
79
|
end
|
80
80
|
|
@@ -170,8 +170,7 @@ describe Committee::Middleware::RequestValidation do
|
|
170
170
|
}
|
171
171
|
|
172
172
|
check_parameter = lambda { |env|
|
173
|
-
|
174
|
-
hash = env["rack.request.query_hash"]
|
173
|
+
hash = env["committee.query_hash"]
|
175
174
|
assert_equal DateTime, hash['nested_array'].first['update_time'].class
|
176
175
|
assert_equal 1, hash['nested_array'].first['per_page']
|
177
176
|
|
@@ -377,8 +376,7 @@ describe Committee::Middleware::RequestValidation do
|
|
377
376
|
|
378
377
|
it "passes through a valid request for OpenAPI3" do
|
379
378
|
check_parameter = lambda { |env|
|
380
|
-
|
381
|
-
assert_equal 3, env['rack.request.query_hash']['limit'] #5.0.x-
|
379
|
+
assert_equal 3, env['committee.query_hash']['limit'] #5.0.x-
|
382
380
|
[200, {}, []]
|
383
381
|
}
|
384
382
|
|
@@ -412,43 +410,121 @@ describe Committee::Middleware::RequestValidation do
|
|
412
410
|
get "/coerce_path_params/1"
|
413
411
|
end
|
414
412
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
413
|
+
describe "overwrite same parameter (old rule)" do
|
414
|
+
# (high priority) path_hash_key -> request_body_hash -> query_param
|
415
|
+
it "set query parameter to committee.params and query hash" do
|
416
|
+
@app = new_rack_app_with_lambda(lambda do |env|
|
417
|
+
assert_equal env['committee.params']['integer'], 42
|
418
|
+
assert_equal env['committee.params'][:integer], 42
|
419
|
+
assert_equal env['committee.query_hash']['integer'], 42
|
420
|
+
#assert_equal env['rack.request.query_hash'][:integer], 42 # this isn't hash indifferent hash because we use rack.request.query_hash
|
421
|
+
[204, {}, []]
|
422
|
+
end, schema: open_api_3_schema, parameter_overwite_by_rails_rule: false)
|
423
|
+
|
424
|
+
header "Content-Type", "application/json"
|
425
|
+
post '/overwrite_same_parameter?integer=42'
|
426
|
+
assert_equal 204, last_response.status
|
427
|
+
end
|
423
428
|
|
424
|
-
|
425
|
-
|
426
|
-
|
429
|
+
it "request body precedence over query parameter" do
|
430
|
+
@app = new_rack_app_with_lambda(lambda do |env|
|
431
|
+
assert_equal env['committee.params']['integer'], 21
|
432
|
+
assert_equal env['committee.params'][:integer], 21
|
433
|
+
assert_equal env['committee.request_body_hash']['integer'], 21
|
434
|
+
assert_equal env['committee.request_body_hash'][:integer], 21
|
435
|
+
assert_equal env['committee.query_hash']['integer'], 42
|
436
|
+
[204, {}, []]
|
437
|
+
end, schema: open_api_3_schema, parameter_overwite_by_rails_rule: false)
|
438
|
+
|
439
|
+
params = {integer: 21}
|
440
|
+
|
441
|
+
header "Content-Type", "application/json"
|
442
|
+
post '/overwrite_same_parameter?integer=42', JSON.generate(params)
|
443
|
+
assert_equal 204, last_response.status
|
444
|
+
end
|
445
|
+
|
446
|
+
it "path parameter precedence over request body" do
|
447
|
+
@app = new_rack_app_with_lambda(lambda do |env|
|
448
|
+
assert_equal env['committee.params']['integer'], 84
|
449
|
+
assert_equal env['committee.params'][:integer], 84
|
450
|
+
assert_equal env['committee.path_hash']['integer'], 84
|
451
|
+
assert_equal env['committee.path_hash'][:integer], 84
|
452
|
+
assert_equal env['committee.request_body_hash']['integer'], 21
|
453
|
+
assert_equal env['committee.request_body_hash'][:integer], 21
|
454
|
+
assert_equal env['committee.query_hash']['integer'], 84 # we can't use query_parameter :(
|
455
|
+
#assert_equal env['rack.request.query_hash'][:integer], 21 # this isn't hash indifferent hash because we use rack.request.query_hash
|
456
|
+
[204, {}, []]
|
457
|
+
end, schema: open_api_3_schema, parameter_overwite_by_rails_rule: false)
|
458
|
+
|
459
|
+
params = {integer: 21}
|
460
|
+
|
461
|
+
header "Content-Type", "application/json"
|
462
|
+
post '/overwrite_same_parameter/84?integer=42', JSON.generate(params)
|
463
|
+
assert_equal 204, last_response.status
|
464
|
+
end
|
427
465
|
end
|
428
466
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
467
|
+
describe "overwrite same parameter (new rule and seme to Rails)" do
|
468
|
+
# (high priority) path_hash_key -> query_param -> request_body_hash
|
469
|
+
it "set request body to committee.params and query hash" do
|
470
|
+
@app = new_rack_app_with_lambda(lambda do |env|
|
471
|
+
assert_equal env['committee.params']['integer'], 21
|
472
|
+
assert_equal env['committee.params'][:integer], 21
|
473
|
+
assert_equal env['committee.request_body_hash']['integer'], 21
|
474
|
+
assert_equal env['committee.request_body_hash'][:integer], 21
|
475
|
+
[204, {}, []]
|
476
|
+
end, schema: open_api_3_schema)
|
437
477
|
|
438
|
-
|
478
|
+
params = {integer: 21}
|
439
479
|
|
440
|
-
|
441
|
-
|
442
|
-
|
480
|
+
header "Content-Type", "application/json"
|
481
|
+
post '/overwrite_same_parameter', JSON.generate(params)
|
482
|
+
assert_equal 204, last_response.status
|
483
|
+
end
|
484
|
+
|
485
|
+
it "query parameter precedence over request body" do
|
486
|
+
@app = new_rack_app_with_lambda(lambda do |env|
|
487
|
+
assert_equal env['committee.params']['integer'], 42
|
488
|
+
assert_equal env['committee.params'][:integer], 42
|
489
|
+
assert_equal env['committee.request_body_hash']['integer'], 21
|
490
|
+
assert_equal env['committee.request_body_hash'][:integer], 21
|
491
|
+
assert_equal env['committee.query_hash']['integer'], 42
|
492
|
+
[204, {}, []]
|
493
|
+
end, schema: open_api_3_schema)
|
494
|
+
|
495
|
+
params = {integer: 21}
|
496
|
+
|
497
|
+
header "Content-Type", "application/json"
|
498
|
+
post '/overwrite_same_parameter?integer=42', JSON.generate(params)
|
499
|
+
assert_equal 204, last_response.status
|
500
|
+
end
|
501
|
+
|
502
|
+
it "path path parameter precedence over query parameter" do
|
503
|
+
@app = new_rack_app_with_lambda(lambda do |env|
|
504
|
+
assert_equal env['committee.params']['integer'], 84
|
505
|
+
assert_equal env['committee.params'][:integer], 84
|
506
|
+
assert_equal env['committee.request_body_hash']['integer'], 21
|
507
|
+
assert_equal env['committee.request_body_hash'][:integer], 21
|
508
|
+
assert_equal env['committee.query_hash']['integer'], 84 # we can't use query_parameter :(
|
509
|
+
assert_equal env['committee.path_hash']['integer'], 84
|
510
|
+
assert_equal env['committee.path_hash'][:integer], 84
|
511
|
+
[204, {}, []]
|
512
|
+
end, schema: open_api_3_schema)
|
513
|
+
|
514
|
+
params = {integer: 21}
|
515
|
+
|
516
|
+
header "Content-Type", "application/json"
|
517
|
+
post '/overwrite_same_parameter/84?integer=42', JSON.generate(params)
|
518
|
+
assert_equal 204, last_response.status
|
519
|
+
end
|
443
520
|
end
|
444
521
|
|
445
522
|
it "unpacker test" do
|
446
523
|
@app = new_rack_app_with_lambda(lambda do |env|
|
447
|
-
assert_equal env['committee.params']['integer']
|
448
|
-
assert_equal env['committee.params'][:integer]
|
449
|
-
|
450
|
-
assert_equal env['
|
451
|
-
# assert_equal env['rack.request.query_hash'][:integer], 42
|
524
|
+
assert_equal '21', env['committee.params']['integer'] # query parameter has precedence
|
525
|
+
assert_equal '21', env['committee.params'][:integer]
|
526
|
+
assert_equal '21', env['rack.request.query_hash']['integer']
|
527
|
+
assert_equal 42, env['committee.request_body_hash']['integer']
|
452
528
|
[204, {}, []]
|
453
529
|
end, schema: open_api_3_schema, raise: true)
|
454
530
|
|
@@ -461,11 +537,11 @@ describe Committee::Middleware::RequestValidation do
|
|
461
537
|
@app = new_rack_app(schema: open_api_3_schema)
|
462
538
|
|
463
539
|
e = assert_raises(RuntimeError) {
|
464
|
-
|
540
|
+
custom_request('TRACE', "/characters")
|
465
541
|
}
|
466
542
|
|
467
|
-
assert_equal 'Committee OpenAPI3 not support
|
468
|
-
end
|
543
|
+
assert_equal 'Committee OpenAPI3 not support trace method', e.message
|
544
|
+
end
|
469
545
|
|
470
546
|
describe 'check header' do
|
471
547
|
[
|
@@ -482,7 +558,7 @@ describe Committee::Middleware::RequestValidation do
|
|
482
558
|
value = h[:value]
|
483
559
|
expected = h[:expected]
|
484
560
|
describe "when #{check_header}" do
|
485
|
-
%w(get post put patch delete).each do |method|
|
561
|
+
%w(get post put patch delete options).each do |method|
|
486
562
|
describe method do
|
487
563
|
describe description do
|
488
564
|
it (expected[:error].nil? ? 'should pass' : 'should fail') do
|
@@ -306,21 +306,6 @@ describe Committee::Middleware::RequestValidation do
|
|
306
306
|
assert_equal 200, last_response.status
|
307
307
|
end
|
308
308
|
|
309
|
-
it "calls error_handler (has a arg) when request is invalid" do
|
310
|
-
called_err = nil
|
311
|
-
pr = ->(e) { called_err = e }
|
312
|
-
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
313
|
-
header "Content-Type", "application/json"
|
314
|
-
params = {
|
315
|
-
"name" => 1
|
316
|
-
}
|
317
|
-
_, err = capture_io do
|
318
|
-
post "/apps", JSON.generate(params)
|
319
|
-
end
|
320
|
-
assert_kind_of Committee::InvalidRequest, called_err
|
321
|
-
assert_match(/\[DEPRECATION\]/i, err)
|
322
|
-
end
|
323
|
-
|
324
309
|
it "calls error_handler (has two args) when request is invalid" do
|
325
310
|
called_err = nil
|
326
311
|
pr = ->(e, _env) { called_err = e }
|
@@ -341,18 +326,6 @@ describe Committee::Middleware::RequestValidation do
|
|
341
326
|
assert_match(/valid json/i, last_response.body)
|
342
327
|
end
|
343
328
|
|
344
|
-
it "calls error_handler (has a arg) when it rescues JSON errors" do
|
345
|
-
called_err = nil
|
346
|
-
pr = ->(e) { called_err = e }
|
347
|
-
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
348
|
-
header "Content-Type", "application/json"
|
349
|
-
_, err = capture_io do
|
350
|
-
post "/apps", "{x:y}"
|
351
|
-
end
|
352
|
-
assert_kind_of JSON::ParserError, called_err
|
353
|
-
assert_match(/\[DEPRECATION\]/i, err)
|
354
|
-
end
|
355
|
-
|
356
329
|
it "calls error_handler (has two args) when it rescues JSON errors" do
|
357
330
|
called_err = nil
|
358
331
|
pr = ->(e, _env) { called_err = e }
|
@@ -435,7 +408,7 @@ describe Committee::Middleware::RequestValidation do
|
|
435
408
|
assert_equal 200, last_response.status
|
436
409
|
end
|
437
410
|
|
438
|
-
it "
|
411
|
+
it "coerce form params" do
|
439
412
|
check_parameter = lambda { |env|
|
440
413
|
assert_equal 3, env['committee.params']['age']
|
441
414
|
assert_equal 3, env['committee.request_body_hash']['age']
|
@@ -64,6 +64,12 @@ describe Committee::Middleware::ResponseValidation do
|
|
64
64
|
assert_equal 204, last_response.status
|
65
65
|
end
|
66
66
|
|
67
|
+
it "passes through a 304 (not modified) response" do
|
68
|
+
@app = new_response_rack("", {}, {schema: open_api_3_schema}, {status: 304})
|
69
|
+
post "/validate"
|
70
|
+
assert_equal 304, last_response.status
|
71
|
+
end
|
72
|
+
|
67
73
|
it "passes through a valid response with prefix" do
|
68
74
|
@app = new_response_rack(JSON.generate(CHARACTERS_RESPONSE), {}, schema: open_api_3_schema, prefix: "/v1")
|
69
75
|
get "/v1/characters"
|
@@ -86,7 +92,7 @@ describe Committee::Middleware::ResponseValidation do
|
|
86
92
|
end
|
87
93
|
end
|
88
94
|
|
89
|
-
it "not parameter
|
95
|
+
it "not parameter request" do
|
90
96
|
@app = new_response_rack({integer: '1'}.to_json, {}, schema: open_api_3_schema, raise: true)
|
91
97
|
|
92
98
|
assert_raises(Committee::InvalidResponse) do
|
@@ -136,7 +142,7 @@ describe Committee::Middleware::ResponseValidation do
|
|
136
142
|
header = h[:header]
|
137
143
|
expected = h[:expected]
|
138
144
|
describe "when #{check_header}" do
|
139
|
-
%w(get post put patch delete).each do |method|
|
145
|
+
%w(get post put patch delete options).each do |method|
|
140
146
|
describe method do
|
141
147
|
describe description do
|
142
148
|
if expected[:error].nil?
|
@@ -228,6 +234,42 @@ describe Committee::Middleware::ResponseValidation do
|
|
228
234
|
end
|
229
235
|
end
|
230
236
|
|
237
|
+
it "strict and invalid status" do
|
238
|
+
@app = new_response_rack(JSON.generate(CHARACTERS_RESPONSE), {}, {schema: open_api_3_schema, strict: true}, {status: 201})
|
239
|
+
get "/characters"
|
240
|
+
assert_equal 500, last_response.status
|
241
|
+
end
|
242
|
+
|
243
|
+
it "strict and invalid status with raise" do
|
244
|
+
@app = new_response_rack(JSON.generate(CHARACTERS_RESPONSE), {}, {schema: open_api_3_schema, strict: true, raise: true}, {status: 201})
|
245
|
+
|
246
|
+
assert_raises(Committee::InvalidResponse) do
|
247
|
+
get "/characters"
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
it "strict and invalid content type" do
|
252
|
+
@app = new_response_rack("abc",
|
253
|
+
{},
|
254
|
+
{schema: open_api_3_schema, strict: true},
|
255
|
+
{content_type: 'application/text'}
|
256
|
+
)
|
257
|
+
get "/characters"
|
258
|
+
assert_equal 500, last_response.status
|
259
|
+
end
|
260
|
+
|
261
|
+
it "strict and invalid content type with raise" do
|
262
|
+
@app = new_response_rack("abc",
|
263
|
+
{},
|
264
|
+
{schema: open_api_3_schema, strict: true, raise: true},
|
265
|
+
{content_type: 'application/text'}
|
266
|
+
)
|
267
|
+
|
268
|
+
assert_raises(Committee::InvalidResponse) do
|
269
|
+
get "/characters"
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
231
273
|
private
|
232
274
|
|
233
275
|
def new_response_rack(response, headers = {}, options = {}, rack_options = {})
|
@@ -235,8 +277,9 @@ describe Committee::Middleware::ResponseValidation do
|
|
235
277
|
options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
|
236
278
|
|
237
279
|
status = rack_options[:status] || 200
|
280
|
+
content_type = rack_options[:content_type] || "application/json"
|
238
281
|
headers = {
|
239
|
-
"Content-Type" =>
|
282
|
+
"Content-Type" => content_type
|
240
283
|
}.merge(headers)
|
241
284
|
Rack::Builder.new {
|
242
285
|
use Committee::Middleware::ResponseValidation, options
|
@@ -85,6 +85,12 @@ describe Committee::Middleware::ResponseValidation do
|
|
85
85
|
assert_equal 204, last_response.status
|
86
86
|
end
|
87
87
|
|
88
|
+
it "passes through a 304 (not modified) response" do
|
89
|
+
@app = new_rack_app("", {}, app_status: 304, schema: hyper_schema)
|
90
|
+
get "/apps"
|
91
|
+
assert_equal 304, last_response.status
|
92
|
+
end
|
93
|
+
|
88
94
|
it "skip validation when 4xx" do
|
89
95
|
@app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, validate_success_only: true, app_status: 400)
|
90
96
|
get "/apps"
|
@@ -99,17 +105,6 @@ describe Committee::Middleware::ResponseValidation do
|
|
99
105
|
assert_match(/valid json/i, last_response.body)
|
100
106
|
end
|
101
107
|
|
102
|
-
it "calls error_handler (has a arg) when it rescues JSON errors" do
|
103
|
-
called_err = nil
|
104
|
-
pr = ->(e) { called_err = e }
|
105
|
-
@app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, error_handler: pr)
|
106
|
-
_, err = capture_io do
|
107
|
-
get "/apps"
|
108
|
-
end
|
109
|
-
assert_kind_of JSON::ParserError, called_err
|
110
|
-
assert_match(/\[DEPRECATION\]/i, err)
|
111
|
-
end
|
112
|
-
|
113
108
|
it "calls error_handler (has two args) when it rescues JSON errors" do
|
114
109
|
called_err = nil
|
115
110
|
pr = ->(e, _env) { called_err = e }
|
@@ -132,20 +127,6 @@ describe Committee::Middleware::ResponseValidation do
|
|
132
127
|
end
|
133
128
|
end
|
134
129
|
|
135
|
-
it "calls error_handler (has a arg) when it rescues JSON errors" do
|
136
|
-
called_err = nil
|
137
|
-
pr = ->(e) { called_err = e }
|
138
|
-
@app = new_rack_app("[{x:y}]", {}, raise: true, schema: hyper_schema, error_handler: pr)
|
139
|
-
assert_raises(Committee::InvalidResponse) do
|
140
|
-
_, err = capture_io do
|
141
|
-
get "/apps"
|
142
|
-
end
|
143
|
-
|
144
|
-
assert_kind_of JSON::ParserError, called_err
|
145
|
-
assert_match(/\[DEPRECATION\]/i, err)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
130
|
it "calls error_handler (has two args) when it rescues JSON errors" do
|
150
131
|
called_err = nil
|
151
132
|
pr = ->(e, _env) { called_err = e }
|
@@ -38,6 +38,11 @@ describe Committee::SchemaValidator::HyperSchema::ResponseValidator do
|
|
38
38
|
call
|
39
39
|
end
|
40
40
|
|
41
|
+
it "passes through a 304 Not Modified response" do
|
42
|
+
@status, @headers, @data = 304, {}, nil
|
43
|
+
call
|
44
|
+
end
|
45
|
+
|
41
46
|
it "passes through a valid list response for for rel instances links" do
|
42
47
|
@link = @list_link
|
43
48
|
|
@@ -91,6 +96,11 @@ describe Committee::SchemaValidator::HyperSchema::ResponseValidator do
|
|
91
96
|
call
|
92
97
|
end
|
93
98
|
|
99
|
+
it "allows no Content-Type for 304 Not Modified" do
|
100
|
+
@status, @headers = 304, {}
|
101
|
+
call
|
102
|
+
end
|
103
|
+
|
94
104
|
it "raises errors generated by json_schema" do
|
95
105
|
@data.merge!("name" => "%@!")
|
96
106
|
e = assert_raises(Committee::InvalidResponse) { call }
|
@@ -11,7 +11,7 @@ describe Committee::SchemaValidator::HyperSchema::StringParamsCoercer do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "doesn't coerce params not in the schema" do
|
14
|
-
check_convert("
|
14
|
+
check_convert("owner", "admin", "admin")
|
15
15
|
end
|
16
16
|
|
17
17
|
it "skips values for string param" do
|
@@ -32,12 +32,15 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
32
32
|
]
|
33
33
|
|
34
34
|
it 'correct data' do
|
35
|
-
operation_object.validate_request_params(SCHEMA_PROPERTIES_PAIR.to_h, HEADER, @validator_option)
|
35
|
+
operation_object.validate_request_params({}, {}, SCHEMA_PROPERTIES_PAIR.to_h, HEADER, @validator_option)
|
36
36
|
assert true
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'correct object data' do
|
40
|
-
operation_object.validate_request_params(
|
40
|
+
operation_object.validate_request_params(
|
41
|
+
{},
|
42
|
+
{},
|
43
|
+
{
|
41
44
|
"object_1" =>
|
42
45
|
{
|
43
46
|
"string_1" => nil,
|
@@ -54,7 +57,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
54
57
|
|
55
58
|
it 'invalid params' do
|
56
59
|
e = assert_raises(Committee::InvalidRequest) {
|
57
|
-
operation_object.validate_request_params({"string" => 1}, HEADER, @validator_option)
|
60
|
+
operation_object.validate_request_params({}, {}, {"string" => 1}, HEADER, @validator_option)
|
58
61
|
}
|
59
62
|
|
60
63
|
assert_match(/expected string, but received Integer: 1/i, e.message)
|
@@ -63,10 +66,10 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
63
66
|
|
64
67
|
it 'support put method' do
|
65
68
|
@method = "put"
|
66
|
-
operation_object.validate_request_params({"string" => "str"}, HEADER, @validator_option)
|
69
|
+
operation_object.validate_request_params({}, {}, {"string" => "str"}, HEADER, @validator_option)
|
67
70
|
|
68
71
|
e = assert_raises(Committee::InvalidRequest) {
|
69
|
-
operation_object.validate_request_params({"string" => 1}, HEADER, @validator_option)
|
72
|
+
operation_object.validate_request_params({}, {}, {"string" => 1}, HEADER, @validator_option)
|
70
73
|
}
|
71
74
|
|
72
75
|
assert_match(/expected string, but received Integer: 1/i, e.message)
|
@@ -75,10 +78,10 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
75
78
|
|
76
79
|
it 'support patch method' do
|
77
80
|
@method = "patch"
|
78
|
-
operation_object.validate_request_params({"integer" => 1}, HEADER, @validator_option)
|
81
|
+
operation_object.validate_request_params({}, {}, {"integer" => 1}, HEADER, @validator_option)
|
79
82
|
|
80
83
|
e = assert_raises(Committee::InvalidRequest) {
|
81
|
-
operation_object.validate_request_params({"integer" => "str"}, HEADER, @validator_option)
|
84
|
+
operation_object.validate_request_params({}, {}, {"integer" => "str"}, HEADER, @validator_option)
|
82
85
|
}
|
83
86
|
|
84
87
|
assert_match(/expected integer, but received String: "str"/i, e.message)
|
@@ -86,7 +89,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
86
89
|
end
|
87
90
|
|
88
91
|
it 'unknown param' do
|
89
|
-
operation_object.validate_request_params({"unknown" => 1}, HEADER, @validator_option)
|
92
|
+
operation_object.validate_request_params({}, {}, {"unknown" => 1}, HEADER, @validator_option)
|
90
93
|
end
|
91
94
|
|
92
95
|
describe 'support get method' do
|
@@ -96,13 +99,17 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
96
99
|
|
97
100
|
it 'correct' do
|
98
101
|
operation_object.validate_request_params(
|
102
|
+
{},
|
99
103
|
{"query_string" => "query", "query_integer_list" => [1, 2]},
|
104
|
+
{},
|
100
105
|
HEADER,
|
101
106
|
@validator_option
|
102
107
|
)
|
103
108
|
|
104
109
|
operation_object.validate_request_params(
|
110
|
+
{},
|
105
111
|
{"query_string" => "query", "query_integer_list" => [1, 2], "optional_integer" => 1},
|
112
|
+
{},
|
106
113
|
HEADER,
|
107
114
|
@validator_option
|
108
115
|
)
|
@@ -112,7 +119,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
112
119
|
|
113
120
|
it 'not exist required' do
|
114
121
|
e = assert_raises(Committee::InvalidRequest) {
|
115
|
-
operation_object.validate_request_params({"query_integer_list" => [1, 2]}, HEADER, @validator_option)
|
122
|
+
operation_object.validate_request_params({}, {"query_integer_list" => [1, 2]}, {}, HEADER, @validator_option)
|
116
123
|
}
|
117
124
|
|
118
125
|
assert_match(/missing required parameters: query_string/i, e.message)
|
@@ -122,7 +129,9 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
122
129
|
it 'invalid type' do
|
123
130
|
e = assert_raises(Committee::InvalidRequest) {
|
124
131
|
operation_object.validate_request_params(
|
132
|
+
{},
|
125
133
|
{"query_string" => 1, "query_integer_list" => [1, 2], "optional_integer" => 1},
|
134
|
+
{},
|
126
135
|
HEADER,
|
127
136
|
@validator_option
|
128
137
|
)
|
@@ -140,14 +149,14 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
140
149
|
end
|
141
150
|
|
142
151
|
it 'correct' do
|
143
|
-
operation_object.validate_request_params({"limit" => "1"}, HEADER, @validator_option)
|
152
|
+
operation_object.validate_request_params({}, {"limit" => "1"}, {}, HEADER, @validator_option)
|
144
153
|
|
145
154
|
assert true
|
146
155
|
end
|
147
156
|
|
148
157
|
it 'invalid type' do
|
149
158
|
e = assert_raises(Committee::InvalidRequest) {
|
150
|
-
operation_object.validate_request_params({"limit" => "a"}, HEADER, @validator_option)
|
159
|
+
operation_object.validate_request_params({}, {"limit" => "a"}, {}, HEADER, @validator_option)
|
151
160
|
}
|
152
161
|
|
153
162
|
assert_match(/expected integer, but received String: "a"/i, e.message)
|
@@ -155,6 +164,41 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
155
164
|
end
|
156
165
|
end
|
157
166
|
|
167
|
+
describe 'support head method' do
|
168
|
+
before do
|
169
|
+
@path = '/characters'
|
170
|
+
@method = 'head'
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'correct' do
|
174
|
+
operation_object.validate_request_params({}, {"limit" => "1"}, {}, HEADER, @validator_option)
|
175
|
+
|
176
|
+
assert true
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'invalid type' do
|
180
|
+
e = assert_raises(Committee::InvalidRequest) {
|
181
|
+
operation_object.validate_request_params({}, {"limit" => "a"}, {}, HEADER, @validator_option)
|
182
|
+
}
|
183
|
+
|
184
|
+
assert_match(/expected integer, but received String: "a"/i, e.message)
|
185
|
+
assert_kind_of(OpenAPIParser::OpenAPIError, e.original_error)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'support options method' do
|
190
|
+
@method = "options"
|
191
|
+
operation_object.validate_request_params({}, {}, {"integer" => 1}, HEADER, @validator_option)
|
192
|
+
|
193
|
+
e = assert_raises(Committee::InvalidRequest) {
|
194
|
+
operation_object.validate_request_params({}, {}, {"integer" => "str"}, HEADER, @validator_option)
|
195
|
+
}
|
196
|
+
|
197
|
+
assert_match(/expected integer, but received String: "str"/i, e.message)
|
198
|
+
assert_kind_of(OpenAPIParser::OpenAPIError, e.original_error)
|
199
|
+
end
|
200
|
+
|
201
|
+
|
158
202
|
describe '#content_types' do
|
159
203
|
it 'returns supported content types' do
|
160
204
|
@path = '/validate_content_types'
|
@@ -71,6 +71,16 @@ describe Committee::SchemaValidator::OpenAPI3::RequestValidator do
|
|
71
71
|
assert_equal 200, last_response.status
|
72
72
|
end
|
73
73
|
|
74
|
+
it "does not mix up parameters and requestBody" do
|
75
|
+
@app = new_rack_app(check_content_type: true, schema: open_api_3_schema)
|
76
|
+
params = {
|
77
|
+
"last_name" => "Skywalker"
|
78
|
+
}
|
79
|
+
header "Content-Type", "application/json"
|
80
|
+
post "/additional_properties?first_name=Luke", JSON.generate(params)
|
81
|
+
assert_equal 200, last_response.status
|
82
|
+
end
|
83
|
+
|
74
84
|
def new_rack_app(options = {})
|
75
85
|
# TODO: delete when 5.0.0 released because default value changed
|
76
86
|
options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
|