committee 3.3.0 → 4.0.0
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.rb +5 -5
- data/test/middleware/request_validation_open_api_3_test.rb +11 -6
- data/test/middleware/request_validation_test.rb +4 -1
- data/test/middleware/response_validation_open_api_3_test.rb +24 -2
- data/test/middleware/response_validation_test.rb +4 -1
- data/test/schema_validator/open_api_3/operation_wrapper_test.rb +3 -6
- data/test/test_helper.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fba0d88ad4356b605437b7bdee80b8af67f4c1604aa01ed67f8e23f03097e93d
|
4
|
+
data.tar.gz: 3a26946ba09a1543a045d2e5755e18da81302964c8b7452e093457745960ad01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 245f5960617c3bba3da10e6c64441493eb4d8d657f3deb98d18e46e3db4564ebeeae63fc372eb6153f4d2e0c00124fee4fcec1b7d8b3b342a712d9da63d28257
|
7
|
+
data.tar.gz: 5bb6f878296cac731f5c081e6fe531305c79599e427dad1d72b128def97627c56e2c62901de3aff8b15e8cfa0e07798c608b23e778aedb485a17c92d7aeb0c73
|
data/lib/committee/drivers.rb
CHANGED
@@ -21,14 +21,14 @@ module Committee
|
|
21
21
|
# @param [String] schema_path
|
22
22
|
# @return [Committee::Driver]
|
23
23
|
def self.load_from_json(schema_path)
|
24
|
-
load_from_data(JSON.parse(File.read(schema_path)))
|
24
|
+
load_from_data(JSON.parse(File.read(schema_path)), schema_path)
|
25
25
|
end
|
26
26
|
|
27
27
|
# load and build drive from YAML file
|
28
28
|
# @param [String] schema_path
|
29
29
|
# @return [Committee::Driver]
|
30
30
|
def self.load_from_yaml(schema_path)
|
31
|
-
load_from_data(YAML.load_file(schema_path))
|
31
|
+
load_from_data(YAML.load_file(schema_path), schema_path)
|
32
32
|
end
|
33
33
|
|
34
34
|
# load and build drive from file
|
@@ -48,10 +48,10 @@ module Committee
|
|
48
48
|
# load and build drive from Hash object
|
49
49
|
# @param [Hash] hash
|
50
50
|
# @return [Committee::Driver]
|
51
|
-
def self.load_from_data(hash)
|
51
|
+
def self.load_from_data(hash, schema_path = nil)
|
52
52
|
if hash['openapi']&.start_with?('3.0.')
|
53
|
-
|
54
|
-
return Committee::Drivers::OpenAPI3::Driver.new.parse(
|
53
|
+
openapi = OpenAPIParser.parse_with_filepath(hash, schema_path)
|
54
|
+
return Committee::Drivers::OpenAPI3::Driver.new.parse(openapi)
|
55
55
|
end
|
56
56
|
|
57
57
|
driver = if hash['swagger'] == '2.0'
|
@@ -249,8 +249,7 @@ describe Committee::Middleware::RequestValidation do
|
|
249
249
|
}
|
250
250
|
post "/characters", JSON.generate(params)
|
251
251
|
assert_equal 400, last_response.status
|
252
|
-
|
253
|
-
assert_match(/expected string, but received #{1.class}:/i, last_response.body)
|
252
|
+
assert_match(/expected string, but received Integer:/i, last_response.body)
|
254
253
|
end
|
255
254
|
|
256
255
|
it "rescues JSON errors" do
|
@@ -279,8 +278,7 @@ describe Committee::Middleware::RequestValidation do
|
|
279
278
|
header "Content-Type", "application/json"
|
280
279
|
post "/v1/characters", JSON.generate(params)
|
281
280
|
assert_equal 400, last_response.status
|
282
|
-
|
283
|
-
assert_match(/expected string, but received #{1.class}: /i, last_response.body)
|
281
|
+
assert_match(/expected string, but received Integer: /i, last_response.body)
|
284
282
|
end
|
285
283
|
|
286
284
|
it "ignores paths outside the prefix" do
|
@@ -415,7 +413,11 @@ describe Committee::Middleware::RequestValidation do
|
|
415
413
|
{ check_header: false, description: 'valid value', value: 1, expected: { status: 200 } },
|
416
414
|
{ check_header: false, description: 'missing value', value: nil, expected: { status: 200 } },
|
417
415
|
{ check_header: false, description: 'invalid value', value: 'x', expected: { status: 200 } },
|
418
|
-
].each do |
|
416
|
+
].each do |h|
|
417
|
+
check_header = h[:check_header]
|
418
|
+
description = h[:description]
|
419
|
+
value = h[:value]
|
420
|
+
expected = h[:expected]
|
419
421
|
describe "when #{check_header}" do
|
420
422
|
%w(get post put patch delete).each do |method|
|
421
423
|
describe method do
|
@@ -441,7 +443,10 @@ describe Committee::Middleware::RequestValidation do
|
|
441
443
|
{ description: 'when not specified, includes everything', accept_request_filter: nil, expected: { status: 400 } },
|
442
444
|
{ description: 'when predicate matches, performs validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/c') }, expected: { status: 400 } },
|
443
445
|
{ description: 'when predicate does not match, skips validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/x') }, expected: { status: 200 } },
|
444
|
-
].each do |
|
446
|
+
].each do |h|
|
447
|
+
description = h[:description]
|
448
|
+
accept_request_filter = h[:accept_request_filter]
|
449
|
+
expected = h[:expected]
|
445
450
|
it description do
|
446
451
|
@app = new_rack_app(prefix: '/v1', schema: open_api_3_schema, accept_request_filter: accept_request_filter)
|
447
452
|
|
@@ -495,7 +495,10 @@ describe Committee::Middleware::RequestValidation do
|
|
495
495
|
{ description: 'when not specified, includes everything', accept_request_filter: nil, expected: { status: 400 } },
|
496
496
|
{ description: 'when predicate matches, performs validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/a') }, expected: { status: 400 } },
|
497
497
|
{ description: 'when predicate does not match, skips validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/x') }, expected: { status: 200 } },
|
498
|
-
].each do |
|
498
|
+
].each do |h|
|
499
|
+
description = h[:description]
|
500
|
+
accept_request_filter = h[:accept_request_filter]
|
501
|
+
expected = h[:expected]
|
499
502
|
it description do
|
500
503
|
@app = new_rack_app(prefix: '/v1', schema: hyper_schema, accept_request_filter: accept_request_filter)
|
501
504
|
|
@@ -99,6 +99,20 @@ describe Committee::Middleware::ResponseValidation do
|
|
99
99
|
assert_match(/valid JSON/i, last_response.body)
|
100
100
|
end
|
101
101
|
|
102
|
+
describe "remote schema $ref" do
|
103
|
+
it "passes through a valid response" do
|
104
|
+
@app = new_response_rack(JSON.generate({ "sample" => "value" }), {}, schema: open_api_3_schema)
|
105
|
+
get "/ref-sample"
|
106
|
+
assert_equal 200, last_response.status
|
107
|
+
end
|
108
|
+
|
109
|
+
it "detects a invalid response" do
|
110
|
+
@app = new_response_rack("{}", {}, schema: open_api_3_schema)
|
111
|
+
get "/ref-sample"
|
112
|
+
assert_equal 500, last_response.status
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
102
116
|
describe 'check header' do
|
103
117
|
[
|
104
118
|
{ check_header: true, description: 'valid value', header: { 'integer' => 1 }, expected: { status: 200 } },
|
@@ -108,7 +122,11 @@ describe Committee::Middleware::ResponseValidation do
|
|
108
122
|
{ check_header: false, description: 'valid value', header: { 'integer' => 1 }, expected: { status: 200 } },
|
109
123
|
{ check_header: false, description: 'missing value', header: { 'integer' => nil }, expected: { status: 200 } },
|
110
124
|
{ check_header: false, description: 'invalid value', header: { 'integer' => 'x' }, expected: { status: 200 } },
|
111
|
-
].each do |
|
125
|
+
].each do |h|
|
126
|
+
check_header = h[:check_header]
|
127
|
+
description = h[:description]
|
128
|
+
header = h[:header]
|
129
|
+
expected = h[:expected]
|
112
130
|
describe "when #{check_header}" do
|
113
131
|
%w(get post put patch delete).each do |method|
|
114
132
|
describe method do
|
@@ -174,7 +192,11 @@ describe Committee::Middleware::ResponseValidation do
|
|
174
192
|
{ description: 'when not specified, includes everything', accept_request_filter: nil, expected: { status: 500 } },
|
175
193
|
{ description: 'when predicate matches, performs validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/c') }, expected: { status: 500 } },
|
176
194
|
{ description: 'when predicate does not match, skips validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/x') }, expected: { status: 200 } },
|
177
|
-
].each do |
|
195
|
+
].each do |h|
|
196
|
+
description = h[:description]
|
197
|
+
accept_request_filter = h[:accept_request_filter]
|
198
|
+
expected = h[:expected]
|
199
|
+
|
178
200
|
it description do
|
179
201
|
@app = new_response_rack('not_json', {}, schema: open_api_3_schema, prefix: '/v1', accept_request_filter: accept_request_filter)
|
180
202
|
|
@@ -167,7 +167,10 @@ describe Committee::Middleware::ResponseValidation do
|
|
167
167
|
{ description: 'when not specified, includes everything', accept_request_filter: nil, expected: { status: 500 } },
|
168
168
|
{ description: 'when predicate matches, performs validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/a') }, expected: { status: 500 } },
|
169
169
|
{ description: 'when predicate does not match, skips validation', accept_request_filter: -> (request) { request.path.start_with?('/v1/x') }, expected: { status: 200 } },
|
170
|
-
].each do |
|
170
|
+
].each do |h|
|
171
|
+
description = h[:description]
|
172
|
+
accept_request_filter = h[:accept_request_filter]
|
173
|
+
expected = h[:expected]
|
171
174
|
it description do
|
172
175
|
@app = new_rack_app('not_json', {}, schema: hyper_schema, prefix: '/v1', accept_request_filter: accept_request_filter)
|
173
176
|
|
@@ -52,8 +52,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
52
52
|
operation_object.validate_request_params({"string" => 1}, HEADER, @validator_option)
|
53
53
|
}
|
54
54
|
|
55
|
-
|
56
|
-
assert_match(/expected string, but received #{1.class}: 1/i, e.message)
|
55
|
+
assert_match(/expected string, but received Integer: 1/i, e.message)
|
57
56
|
end
|
58
57
|
|
59
58
|
it 'support put method' do
|
@@ -64,8 +63,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
64
63
|
operation_object.validate_request_params({"string" => 1}, HEADER, @validator_option)
|
65
64
|
}
|
66
65
|
|
67
|
-
|
68
|
-
assert_match(/expected string, but received #{1.class}: 1/i, e.message)
|
66
|
+
assert_match(/expected string, but received Integer: 1/i, e.message)
|
69
67
|
end
|
70
68
|
|
71
69
|
it 'support patch method' do
|
@@ -121,8 +119,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
|
|
121
119
|
)
|
122
120
|
}
|
123
121
|
|
124
|
-
|
125
|
-
assert_match(/expected string, but received #{1.class}: 1/i, e.message)
|
122
|
+
assert_match(/expected string, but received Integer: 1/i, e.message)
|
126
123
|
end
|
127
124
|
end
|
128
125
|
|
data/test/test_helper.rb
CHANGED
@@ -56,7 +56,7 @@ def open_api_2_schema
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def open_api_3_schema
|
59
|
-
@open_api_3_schema ||= Committee::Drivers.
|
59
|
+
@open_api_3_schema ||= Committee::Drivers.load_from_file(open_api_3_schema_path)
|
60
60
|
end
|
61
61
|
|
62
62
|
# Don't cache this because we'll often manipulate the created hash in tests.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: committee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandur
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-05-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json_schema
|
@@ -52,14 +52,14 @@ dependencies:
|
|
52
52
|
requirements:
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: 0.
|
55
|
+
version: 0.11.1
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0.
|
62
|
+
version: 0.11.1
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
64
|
name: minitest
|
65
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -282,14 +282,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
282
282
|
requirements:
|
283
283
|
- - ">="
|
284
284
|
- !ruby/object:Gem::Version
|
285
|
-
version: 2.
|
285
|
+
version: 2.4.0
|
286
286
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
287
287
|
requirements:
|
288
288
|
- - ">="
|
289
289
|
- !ruby/object:Gem::Version
|
290
290
|
version: '0'
|
291
291
|
requirements: []
|
292
|
-
rubygems_version: 3.
|
292
|
+
rubygems_version: 3.1.2
|
293
293
|
signing_key:
|
294
294
|
specification_version: 4
|
295
295
|
summary: A collection of Rack middleware to support JSON Schema.
|