committee 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/committee-stub +1 -0
- data/lib/committee.rb +12 -34
- data/lib/committee/bin/committee_stub.rb +6 -4
- data/lib/committee/drivers.rb +15 -67
- data/lib/committee/drivers/driver.rb +47 -0
- data/lib/committee/drivers/hyper_schema.rb +8 -171
- data/lib/committee/drivers/hyper_schema/driver.rb +105 -0
- data/lib/committee/drivers/hyper_schema/link.rb +68 -0
- data/lib/committee/drivers/hyper_schema/schema.rb +22 -0
- data/lib/committee/drivers/open_api_2.rb +9 -416
- data/lib/committee/drivers/open_api_2/driver.rb +253 -0
- data/lib/committee/drivers/open_api_2/header_schema_builder.rb +33 -0
- data/lib/committee/drivers/open_api_2/link.rb +36 -0
- data/lib/committee/drivers/open_api_2/parameter_schema_builder.rb +83 -0
- data/lib/committee/drivers/open_api_2/schema.rb +26 -0
- data/lib/committee/drivers/open_api_2/schema_builder.rb +33 -0
- data/lib/committee/drivers/open_api_3.rb +7 -75
- data/lib/committee/drivers/open_api_3/driver.rb +51 -0
- data/lib/committee/drivers/open_api_3/schema.rb +41 -0
- data/lib/committee/drivers/schema.rb +23 -0
- data/lib/committee/errors.rb +2 -0
- data/lib/committee/middleware.rb +11 -0
- data/lib/committee/middleware/base.rb +38 -34
- data/lib/committee/middleware/request_validation.rb +51 -30
- data/lib/committee/middleware/response_validation.rb +49 -26
- data/lib/committee/middleware/stub.rb +55 -51
- data/lib/committee/request_unpacker.rb +3 -1
- data/lib/committee/schema_validator.rb +23 -0
- data/lib/committee/schema_validator/hyper_schema.rb +85 -74
- data/lib/committee/schema_validator/hyper_schema/parameter_coercer.rb +60 -54
- data/lib/committee/schema_validator/hyper_schema/request_validator.rb +43 -37
- data/lib/committee/schema_validator/hyper_schema/response_generator.rb +86 -80
- data/lib/committee/schema_validator/hyper_schema/response_validator.rb +65 -59
- data/lib/committee/schema_validator/hyper_schema/router.rb +35 -29
- data/lib/committee/schema_validator/hyper_schema/string_params_coercer.rb +87 -81
- data/lib/committee/schema_validator/open_api_3.rb +71 -61
- data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +121 -115
- data/lib/committee/schema_validator/open_api_3/request_validator.rb +24 -18
- data/lib/committee/schema_validator/open_api_3/response_validator.rb +22 -16
- data/lib/committee/schema_validator/open_api_3/router.rb +30 -24
- data/lib/committee/schema_validator/option.rb +42 -38
- data/lib/committee/test/methods.rb +55 -51
- data/lib/committee/validation_error.rb +2 -0
- data/test/bin/committee_stub_test.rb +3 -1
- data/test/bin_test.rb +3 -1
- data/test/committee_test.rb +3 -1
- data/test/drivers/hyper_schema/driver_test.rb +49 -0
- data/test/drivers/{hyper_schema_test.rb → hyper_schema/link_test.rb} +2 -45
- data/test/drivers/open_api_2/driver_test.rb +156 -0
- data/test/drivers/open_api_2/header_schema_builder_test.rb +26 -0
- data/test/drivers/open_api_2/link_test.rb +52 -0
- data/test/drivers/open_api_2/parameter_schema_builder_test.rb +195 -0
- data/test/drivers/{open_api_3_test.rb → open_api_3/driver_test.rb} +5 -3
- data/test/drivers_test.rb +12 -10
- data/test/middleware/base_test.rb +3 -1
- data/test/middleware/request_validation_open_api_3_test.rb +4 -2
- data/test/middleware/request_validation_test.rb +46 -5
- data/test/middleware/response_validation_open_api_3_test.rb +3 -1
- data/test/middleware/response_validation_test.rb +39 -4
- data/test/middleware/stub_test.rb +3 -1
- data/test/request_unpacker_test.rb +2 -2
- data/test/schema_validator/hyper_schema/parameter_coercer_test.rb +2 -2
- data/test/schema_validator/hyper_schema/request_validator_test.rb +3 -1
- data/test/schema_validator/hyper_schema/response_generator_test.rb +3 -1
- data/test/schema_validator/hyper_schema/response_validator_test.rb +3 -1
- data/test/schema_validator/hyper_schema/router_test.rb +5 -3
- data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +3 -1
- data/test/schema_validator/open_api_3/operation_wrapper_test.rb +3 -1
- data/test/schema_validator/open_api_3/request_validator_test.rb +11 -1
- data/test/schema_validator/open_api_3/response_validator_test.rb +3 -1
- data/test/test/methods_new_version_test.rb +3 -1
- data/test/test/methods_test.rb +4 -2
- data/test/test_helper.rb +16 -16
- data/test/validation_error_test.rb +3 -1
- metadata +52 -6
- data/lib/committee/schema_validator/schema_validator.rb +0 -15
- data/test/drivers/open_api_2_test.rb +0 -416
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe Committee::Drivers::OpenAPI3::Driver do
|
4
6
|
before do
|
5
|
-
@driver = Committee::Drivers::OpenAPI3.new
|
7
|
+
@driver = Committee::Drivers::OpenAPI3::Driver.new
|
6
8
|
end
|
7
9
|
|
8
10
|
it "has a name" do
|
data/test/drivers_test.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::Drivers do
|
4
6
|
DRIVERS = [
|
@@ -99,13 +101,13 @@ end
|
|
99
101
|
|
100
102
|
describe Committee::Drivers::Driver do
|
101
103
|
DRIVER_METHODS = {
|
102
|
-
:
|
103
|
-
:
|
104
|
-
:
|
105
|
-
:
|
106
|
-
:
|
107
|
-
:
|
108
|
-
:
|
104
|
+
default_allow_get_body: [],
|
105
|
+
default_coerce_form_params: [],
|
106
|
+
default_path_params: [],
|
107
|
+
default_query_params: [],
|
108
|
+
name: [],
|
109
|
+
parse: [nil],
|
110
|
+
schema_class: [],
|
109
111
|
}
|
110
112
|
|
111
113
|
it "has a set of abstract methods" do
|
@@ -122,8 +124,8 @@ end
|
|
122
124
|
|
123
125
|
describe Committee::Drivers::Schema do
|
124
126
|
SCHEMA_METHODS = {
|
125
|
-
:
|
126
|
-
:
|
127
|
+
driver: [],
|
128
|
+
build_router: [validator_option: nil, prefix: nil]
|
127
129
|
}
|
128
130
|
|
129
131
|
it "has a set of abstract methods" do
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::Middleware::RequestValidation do
|
4
6
|
include Rack::Test::Methods
|
@@ -254,7 +256,7 @@ describe Committee::Middleware::RequestValidation do
|
|
254
256
|
it "rescues JSON errors" do
|
255
257
|
@app = new_rack_app(schema: open_api_3_schema)
|
256
258
|
header "Content-Type", "application/json"
|
257
|
-
post "/
|
259
|
+
post "/characters", "{x:y}"
|
258
260
|
assert_equal 400, last_response.status
|
259
261
|
assert_match(/valid json/i, last_response.body)
|
260
262
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::Middleware::RequestValidation do
|
4
6
|
include Rack::Test::Methods
|
@@ -61,9 +63,21 @@ describe Committee::Middleware::RequestValidation do
|
|
61
63
|
assert_equal 200, last_response.status
|
62
64
|
end
|
63
65
|
|
64
|
-
it "doesn't call error_handler when request is valid" do
|
66
|
+
it "doesn't call error_handler (has a arg) when request is valid" do
|
65
67
|
called_error = false
|
66
|
-
pr = ->(
|
68
|
+
pr = ->(_e) { called_error = true }
|
69
|
+
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
70
|
+
params = {
|
71
|
+
"name" => "cloudnasium"
|
72
|
+
}
|
73
|
+
header "Content-Type", "application/json"
|
74
|
+
post "/apps", JSON.generate(params)
|
75
|
+
assert !called_error
|
76
|
+
end
|
77
|
+
|
78
|
+
it "doesn't call error_handler (has 2 args) when request is valid" do
|
79
|
+
called_error = false
|
80
|
+
pr = ->(_e, _env) { called_error = true }
|
67
81
|
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
68
82
|
params = {
|
69
83
|
"name" => "cloudnasium"
|
@@ -282,7 +296,7 @@ describe Committee::Middleware::RequestValidation do
|
|
282
296
|
assert_match(/invalid request/i, last_response.body)
|
283
297
|
end
|
284
298
|
|
285
|
-
it "calls error_handler when request is invalid" do
|
299
|
+
it "calls error_handler (has a arg) when request is invalid" do
|
286
300
|
called_err = nil
|
287
301
|
pr = ->(e) { called_err = e }
|
288
302
|
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
@@ -290,6 +304,21 @@ describe Committee::Middleware::RequestValidation do
|
|
290
304
|
params = {
|
291
305
|
"name" => 1
|
292
306
|
}
|
307
|
+
_, err = capture_io do
|
308
|
+
post "/apps", JSON.generate(params)
|
309
|
+
end
|
310
|
+
assert_kind_of Committee::InvalidRequest, called_err
|
311
|
+
assert_match(/\[DEPRECATION\]/i, err)
|
312
|
+
end
|
313
|
+
|
314
|
+
it "calls error_handler (has two args) when request is invalid" do
|
315
|
+
called_err = nil
|
316
|
+
pr = ->(e, _env) { called_err = e }
|
317
|
+
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
318
|
+
header "Content-Type", "application/json"
|
319
|
+
params = {
|
320
|
+
"name" => 1
|
321
|
+
}
|
293
322
|
post "/apps", JSON.generate(params)
|
294
323
|
assert_kind_of Committee::InvalidRequest, called_err
|
295
324
|
end
|
@@ -302,11 +331,23 @@ describe Committee::Middleware::RequestValidation do
|
|
302
331
|
assert_match(/valid json/i, last_response.body)
|
303
332
|
end
|
304
333
|
|
305
|
-
it "calls error_handler when it rescues JSON errors" do
|
334
|
+
it "calls error_handler (has a arg) when it rescues JSON errors" do
|
306
335
|
called_err = nil
|
307
336
|
pr = ->(e) { called_err = e }
|
308
337
|
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
309
338
|
header "Content-Type", "application/json"
|
339
|
+
_, err = capture_io do
|
340
|
+
post "/apps", "{x:y}"
|
341
|
+
end
|
342
|
+
assert_kind_of JSON::ParserError, called_err
|
343
|
+
assert_match(/\[DEPRECATION\]/i, err)
|
344
|
+
end
|
345
|
+
|
346
|
+
it "calls error_handler (has two args) when it rescues JSON errors" do
|
347
|
+
called_err = nil
|
348
|
+
pr = ->(e, _env) { called_err = e }
|
349
|
+
@app = new_rack_app(schema: hyper_schema, error_handler: pr)
|
350
|
+
header "Content-Type", "application/json"
|
310
351
|
post "/apps", "{x:y}"
|
311
352
|
assert_kind_of JSON::ParserError, called_err
|
312
353
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::Middleware::ResponseValidation do
|
4
6
|
include Rack::Test::Methods
|
@@ -13,7 +15,7 @@ describe Committee::Middleware::ResponseValidation do
|
|
13
15
|
assert_equal 200, last_response.status
|
14
16
|
end
|
15
17
|
|
16
|
-
it "doesn't call error_handler when response is valid" do
|
18
|
+
it "doesn't call error_handler (has a arg) when response is valid" do
|
17
19
|
called = false
|
18
20
|
pr = ->(_e) { called = true }
|
19
21
|
@app = new_rack_app(JSON.generate([ValidApp]), {}, schema: hyper_schema, error_handler: pr)
|
@@ -21,6 +23,14 @@ describe Committee::Middleware::ResponseValidation do
|
|
21
23
|
assert !called, "error_handler is called"
|
22
24
|
end
|
23
25
|
|
26
|
+
it "doesn't call error_handler (has two args) when response is valid" do
|
27
|
+
called = false
|
28
|
+
pr = ->(_e, _env) { called = true }
|
29
|
+
@app = new_rack_app(JSON.generate([ValidApp]), {}, schema: hyper_schema, error_handler: pr)
|
30
|
+
get "/apps"
|
31
|
+
assert !called, "error_handler is called"
|
32
|
+
end
|
33
|
+
|
24
34
|
it "detects a response invalid due to schema" do
|
25
35
|
@app = new_rack_app("{}", {}, schema: hyper_schema)
|
26
36
|
get "/apps"
|
@@ -75,10 +85,21 @@ describe Committee::Middleware::ResponseValidation do
|
|
75
85
|
assert_match(/valid json/i, last_response.body)
|
76
86
|
end
|
77
87
|
|
78
|
-
it "calls error_handler when it rescues JSON errors" do
|
88
|
+
it "calls error_handler (has a arg) when it rescues JSON errors" do
|
79
89
|
called_err = nil
|
80
90
|
pr = ->(e) { called_err = e }
|
81
91
|
@app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, error_handler: pr)
|
92
|
+
_, err = capture_io do
|
93
|
+
get "/apps"
|
94
|
+
end
|
95
|
+
assert_kind_of JSON::ParserError, called_err
|
96
|
+
assert_match(/\[DEPRECATION\]/i, err)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "calls error_handler (has two args) when it rescues JSON errors" do
|
100
|
+
called_err = nil
|
101
|
+
pr = ->(e, _env) { called_err = e }
|
102
|
+
@app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, error_handler: pr)
|
82
103
|
get "/apps"
|
83
104
|
assert_kind_of JSON::ParserError, called_err
|
84
105
|
end
|
@@ -97,10 +118,24 @@ describe Committee::Middleware::ResponseValidation do
|
|
97
118
|
end
|
98
119
|
end
|
99
120
|
|
100
|
-
it "calls error_handler when it rescues JSON errors" do
|
121
|
+
it "calls error_handler (has a arg) when it rescues JSON errors" do
|
101
122
|
called_err = nil
|
102
123
|
pr = ->(e) { called_err = e }
|
103
124
|
@app = new_rack_app("[{x:y}]", {}, raise: true, schema: hyper_schema, error_handler: pr)
|
125
|
+
assert_raises(Committee::InvalidResponse) do
|
126
|
+
_, err = capture_io do
|
127
|
+
get "/apps"
|
128
|
+
end
|
129
|
+
|
130
|
+
assert_kind_of JSON::ParserError, called_err
|
131
|
+
assert_match(/\[DEPRECATION\]/i, err)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "calls error_handler (has two args) when it rescues JSON errors" do
|
136
|
+
called_err = nil
|
137
|
+
pr = ->(e, _env) { called_err = e }
|
138
|
+
@app = new_rack_app("[{x:y}]", {}, raise: true, schema: hyper_schema, error_handler: pr)
|
104
139
|
assert_raises(Committee::InvalidResponse) do
|
105
140
|
get "/apps"
|
106
141
|
assert_kind_of JSON::ParserError, called_err
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::SchemaValidator::HyperSchema::Router do
|
4
6
|
it "builds routes without parameters" do
|
@@ -67,14 +69,14 @@ describe Committee::SchemaValidator::HyperSchema::Router do
|
|
67
69
|
end
|
68
70
|
|
69
71
|
def hyper_schema_router(options = {})
|
70
|
-
schema = Committee::Drivers::HyperSchema.new.parse(hyper_schema_data)
|
72
|
+
schema = Committee::Drivers::HyperSchema::Driver.new.parse(hyper_schema_data)
|
71
73
|
validator_option = Committee::SchemaValidator::Option.new(options, schema, :hyper_schema)
|
72
74
|
|
73
75
|
Committee::SchemaValidator::HyperSchema::Router.new(schema, validator_option)
|
74
76
|
end
|
75
77
|
|
76
78
|
def open_api_2_router(options = {})
|
77
|
-
schema = Committee::Drivers::OpenAPI2.new.parse(open_api_2_data)
|
79
|
+
schema = Committee::Drivers::OpenAPI2::Driver.new.parse(open_api_2_data)
|
78
80
|
validator_option = Committee::SchemaValidator::Option.new(options, schema, :hyper_schema)
|
79
81
|
|
80
82
|
Committee::SchemaValidator::HyperSchema::Router.new(schema, validator_option)
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::SchemaValidator::OpenAPI3::RequestValidator do
|
4
6
|
describe 'OpenAPI3' do
|
@@ -8,6 +10,14 @@ describe Committee::SchemaValidator::OpenAPI3::RequestValidator do
|
|
8
10
|
@app
|
9
11
|
end
|
10
12
|
|
13
|
+
it "skip validaiton when link does not exist" do
|
14
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
15
|
+
params = {}
|
16
|
+
header "Content-Type", "application/json"
|
17
|
+
post "/unknown", JSON.generate(params)
|
18
|
+
assert_equal 200, last_response.status
|
19
|
+
end
|
20
|
+
|
11
21
|
it "optionally content_type check" do
|
12
22
|
@app = new_rack_app(check_content_type: true, schema: open_api_3_schema)
|
13
23
|
params = {
|
data/test/test/methods_test.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
describe Committee::Test::Methods do
|
4
6
|
include Committee::Test::Methods
|
@@ -33,7 +35,7 @@ describe Committee::Test::Methods do
|
|
33
35
|
before do
|
34
36
|
sc = JsonSchema.parse!(hyper_schema_data)
|
35
37
|
sc.expand_references!
|
36
|
-
s = Committee::Drivers::HyperSchema.new.parse(sc)
|
38
|
+
s = Committee::Drivers::HyperSchema::Driver.new.parse(sc)
|
37
39
|
@committee_options = {schema: s}
|
38
40
|
end
|
39
41
|
|
data/test/test_helper.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'simplecov'
|
4
|
+
|
5
|
+
SimpleCov.start do
|
6
|
+
# We do our utmost to test our executables by modularizing them into
|
7
|
+
# testable pieces, but testing them to completion is nearly impossible as
|
8
|
+
# far as I can tell, so include them in our tests but don't calculate
|
9
|
+
# coverage.
|
10
|
+
add_filter "/bin/"
|
11
|
+
add_filter "/test/"
|
12
|
+
|
13
|
+
# This library has a pretty modest number of lines, so let's try to stick
|
14
|
+
# to a 100% coverage target for a while and see what happens.
|
15
|
+
minimum_coverage 100
|
17
16
|
end
|
18
17
|
|
19
18
|
require "minitest"
|
@@ -22,6 +21,7 @@ require "minitest/autorun"
|
|
22
21
|
require "rack/test"
|
23
22
|
require "rr"
|
24
23
|
require "pry"
|
24
|
+
require "stringio"
|
25
25
|
|
26
26
|
require_relative "../lib/committee"
|
27
27
|
|