committee 3.1.0 → 3.1.1
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 +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
|
|