committee_firetail 5.0.0
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 +7 -0
- data/bin/committee-stub +23 -0
- data/lib/committee/bin/committee_stub.rb +67 -0
- data/lib/committee/drivers/driver.rb +47 -0
- 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/hyper_schema.rb +12 -0
- data/lib/committee/drivers/open_api_2/driver.rb +252 -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_2.rb +13 -0
- 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/open_api_3.rb +11 -0
- data/lib/committee/drivers/schema.rb +23 -0
- data/lib/committee/drivers.rb +84 -0
- data/lib/committee/errors.rb +36 -0
- data/lib/committee/middleware/base.rb +57 -0
- data/lib/committee/middleware/request_validation.rb +41 -0
- data/lib/committee/middleware/response_validation.rb +58 -0
- data/lib/committee/middleware/stub.rb +75 -0
- data/lib/committee/middleware.rb +11 -0
- data/lib/committee/request_unpacker.rb +91 -0
- data/lib/committee/schema_validator/hyper_schema/parameter_coercer.rb +79 -0
- data/lib/committee/schema_validator/hyper_schema/request_validator.rb +55 -0
- data/lib/committee/schema_validator/hyper_schema/response_generator.rb +102 -0
- data/lib/committee/schema_validator/hyper_schema/response_validator.rb +89 -0
- data/lib/committee/schema_validator/hyper_schema/router.rb +46 -0
- data/lib/committee/schema_validator/hyper_schema/string_params_coercer.rb +105 -0
- data/lib/committee/schema_validator/hyper_schema.rb +119 -0
- data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +139 -0
- data/lib/committee/schema_validator/open_api_3/request_validator.rb +52 -0
- data/lib/committee/schema_validator/open_api_3/response_validator.rb +29 -0
- data/lib/committee/schema_validator/open_api_3/router.rb +45 -0
- data/lib/committee/schema_validator/open_api_3.rb +120 -0
- data/lib/committee/schema_validator/option.rb +60 -0
- data/lib/committee/schema_validator.rb +23 -0
- data/lib/committee/test/methods.rb +84 -0
- data/lib/committee/test/schema_coverage.rb +101 -0
- data/lib/committee/utils.rb +28 -0
- data/lib/committee/validation_error.rb +26 -0
- data/lib/committee/version.rb +5 -0
- data/lib/committee.rb +40 -0
- data/test/bin/committee_stub_test.rb +57 -0
- data/test/bin_test.rb +25 -0
- data/test/committee_test.rb +77 -0
- data/test/drivers/hyper_schema/driver_test.rb +49 -0
- data/test/drivers/hyper_schema/link_test.rb +56 -0
- 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/driver_test.rb +84 -0
- data/test/drivers_test.rb +154 -0
- data/test/middleware/base_test.rb +130 -0
- data/test/middleware/request_validation_open_api_3_test.rb +626 -0
- data/test/middleware/request_validation_test.rb +516 -0
- data/test/middleware/response_validation_open_api_3_test.rb +291 -0
- data/test/middleware/response_validation_test.rb +189 -0
- data/test/middleware/stub_test.rb +145 -0
- data/test/request_unpacker_test.rb +200 -0
- data/test/schema_validator/hyper_schema/parameter_coercer_test.rb +111 -0
- data/test/schema_validator/hyper_schema/request_validator_test.rb +151 -0
- data/test/schema_validator/hyper_schema/response_generator_test.rb +142 -0
- data/test/schema_validator/hyper_schema/response_validator_test.rb +118 -0
- data/test/schema_validator/hyper_schema/router_test.rb +88 -0
- data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +137 -0
- data/test/schema_validator/open_api_3/operation_wrapper_test.rb +218 -0
- data/test/schema_validator/open_api_3/request_validator_test.rb +110 -0
- data/test/schema_validator/open_api_3/response_validator_test.rb +92 -0
- data/test/test/methods_new_version_test.rb +97 -0
- data/test/test/methods_test.rb +363 -0
- data/test/test/schema_coverage_test.rb +216 -0
- data/test/test_helper.rb +120 -0
- data/test/validation_error_test.rb +25 -0
- metadata +328 -0
@@ -0,0 +1,195 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe Committee::Drivers::OpenAPI2::ParameterSchemaBuilder do
|
6
|
+
before do
|
7
|
+
end
|
8
|
+
|
9
|
+
it "reflects a basic type into a schema" do
|
10
|
+
data = {
|
11
|
+
"parameters" => [
|
12
|
+
{
|
13
|
+
"name" => "limit",
|
14
|
+
"type" => "integer",
|
15
|
+
}
|
16
|
+
]
|
17
|
+
}
|
18
|
+
schema, schema_data = call(data)
|
19
|
+
|
20
|
+
assert_nil schema_data
|
21
|
+
assert_equal ["limit"], schema.properties.keys
|
22
|
+
assert_equal [], schema.required
|
23
|
+
assert_equal ["integer"], schema.properties["limit"].type
|
24
|
+
assert_nil schema.properties["limit"].enum
|
25
|
+
assert_nil schema.properties["limit"].format
|
26
|
+
assert_nil schema.properties["limit"].pattern
|
27
|
+
assert_nil schema.properties["limit"].min_length
|
28
|
+
assert_nil schema.properties["limit"].max_length
|
29
|
+
assert_nil schema.properties["limit"].min_items
|
30
|
+
assert_nil schema.properties["limit"].max_items
|
31
|
+
assert_nil schema.properties["limit"].unique_items
|
32
|
+
assert_nil schema.properties["limit"].min
|
33
|
+
assert_nil schema.properties["limit"].min_exclusive
|
34
|
+
assert_nil schema.properties["limit"].max
|
35
|
+
assert_nil schema.properties["limit"].max_exclusive
|
36
|
+
assert_nil schema.properties["limit"].multiple_of
|
37
|
+
end
|
38
|
+
|
39
|
+
it "reflects a required property into a schema" do
|
40
|
+
data = {
|
41
|
+
"parameters" => [
|
42
|
+
{
|
43
|
+
"name" => "limit",
|
44
|
+
"required" => true,
|
45
|
+
}
|
46
|
+
]
|
47
|
+
}
|
48
|
+
schema, schema_data = call(data)
|
49
|
+
|
50
|
+
assert_nil schema_data
|
51
|
+
assert_equal ["limit"], schema.required
|
52
|
+
end
|
53
|
+
|
54
|
+
it "reflects an array with an items schema into a schema" do
|
55
|
+
data = {
|
56
|
+
"parameters" => [
|
57
|
+
{
|
58
|
+
"name" => "tags",
|
59
|
+
"type" => "array",
|
60
|
+
"minItems" => 1,
|
61
|
+
"maxItems" => 10,
|
62
|
+
"uniqueItems" => true,
|
63
|
+
"items" => {
|
64
|
+
"type" => "string"
|
65
|
+
}
|
66
|
+
}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
schema, schema_data = call(data)
|
70
|
+
|
71
|
+
assert_nil schema_data
|
72
|
+
assert_equal ["array"], schema.properties["tags"].type
|
73
|
+
assert_equal 1, schema.properties["tags"].min_items
|
74
|
+
assert_equal 10, schema.properties["tags"].max_items
|
75
|
+
assert_equal true, schema.properties["tags"].unique_items
|
76
|
+
assert_equal({ "type" => "string" }, schema.properties["tags"].items)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "reflects a enum property into a schema" do
|
80
|
+
data = {
|
81
|
+
"parameters" => [
|
82
|
+
{
|
83
|
+
"name" => "type",
|
84
|
+
"type" => "string",
|
85
|
+
"enum" => ["hoge", "fuga"]
|
86
|
+
}
|
87
|
+
]
|
88
|
+
}
|
89
|
+
schema, schema_data = call(data)
|
90
|
+
|
91
|
+
assert_nil schema_data
|
92
|
+
assert_equal ["hoge", "fuga"], schema.properties["type"].enum
|
93
|
+
end
|
94
|
+
|
95
|
+
it "reflects string properties into a schema" do
|
96
|
+
data = {
|
97
|
+
"parameters" => [
|
98
|
+
{
|
99
|
+
"name" => "password",
|
100
|
+
"type" => "string",
|
101
|
+
"format" => "password",
|
102
|
+
"pattern" => "[a-zA-Z0-9]+",
|
103
|
+
"minLength" => 6,
|
104
|
+
"maxLength" => 30
|
105
|
+
}
|
106
|
+
]
|
107
|
+
}
|
108
|
+
schema, schema_data = call(data)
|
109
|
+
|
110
|
+
assert_nil schema_data
|
111
|
+
assert_equal "password", schema.properties["password"].format
|
112
|
+
assert_equal Regexp.new("[a-zA-Z0-9]+"), schema.properties["password"].pattern
|
113
|
+
assert_equal 6, schema.properties["password"].min_length
|
114
|
+
assert_equal 30, schema.properties["password"].max_length
|
115
|
+
end
|
116
|
+
|
117
|
+
it "reflects number properties into a schema" do
|
118
|
+
data = {
|
119
|
+
"parameters" => [
|
120
|
+
{
|
121
|
+
"name" => "limit",
|
122
|
+
"type" => "integer",
|
123
|
+
"minimum" => 20,
|
124
|
+
"exclusiveMinimum" => true,
|
125
|
+
"maximum" => 100,
|
126
|
+
"exclusiveMaximum" => false,
|
127
|
+
"multipleOf" => 10
|
128
|
+
}
|
129
|
+
]
|
130
|
+
}
|
131
|
+
schema, schema_data = call(data)
|
132
|
+
|
133
|
+
assert_nil schema_data
|
134
|
+
assert_equal 20, schema.properties["limit"].min
|
135
|
+
assert_equal true, schema.properties["limit"].min_exclusive
|
136
|
+
assert_equal 100, schema.properties["limit"].max
|
137
|
+
assert_equal false, schema.properties["limit"].max_exclusive
|
138
|
+
assert_equal 10, schema.properties["limit"].multiple_of
|
139
|
+
end
|
140
|
+
|
141
|
+
it "returns schema data for a body parameter" do
|
142
|
+
data = {
|
143
|
+
"parameters" => [
|
144
|
+
{
|
145
|
+
"name" => "payload",
|
146
|
+
"in" => "body",
|
147
|
+
"schema" => {
|
148
|
+
"$ref" => "#/definitions/foo",
|
149
|
+
}
|
150
|
+
}
|
151
|
+
]
|
152
|
+
}
|
153
|
+
schema, schema_data = call(data)
|
154
|
+
|
155
|
+
assert_nil schema
|
156
|
+
assert_equal({ "$ref" => "#/definitions/foo" }, schema_data)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "requires that certain fields are present" do
|
160
|
+
data = {
|
161
|
+
"parameters" => [
|
162
|
+
{
|
163
|
+
}
|
164
|
+
]
|
165
|
+
}
|
166
|
+
e = assert_raises ArgumentError do
|
167
|
+
call(data)
|
168
|
+
end
|
169
|
+
assert_equal "Committee: no name section in link data.", e.message
|
170
|
+
end
|
171
|
+
|
172
|
+
it "requires that body parameters not be mixed with form parameters" do
|
173
|
+
data = {
|
174
|
+
"parameters" => [
|
175
|
+
{
|
176
|
+
"name" => "payload",
|
177
|
+
"in" => "body",
|
178
|
+
},
|
179
|
+
{
|
180
|
+
"name" => "limit",
|
181
|
+
"in" => "form",
|
182
|
+
},
|
183
|
+
]
|
184
|
+
}
|
185
|
+
e = assert_raises ArgumentError do
|
186
|
+
call(data)
|
187
|
+
end
|
188
|
+
assert_equal "Committee: can't mix body parameter with form parameters.",
|
189
|
+
e.message
|
190
|
+
end
|
191
|
+
|
192
|
+
def call(data)
|
193
|
+
Committee::Drivers::OpenAPI2::ParameterSchemaBuilder.new(data).call
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe Committee::Drivers::OpenAPI3::Driver do
|
6
|
+
before do
|
7
|
+
@driver = Committee::Drivers::OpenAPI3::Driver.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "has a name" do
|
11
|
+
assert_equal :open_api_3, @driver.name
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a schema class" do
|
15
|
+
assert_equal Committee::Drivers::OpenAPI3::Schema, @driver.schema_class
|
16
|
+
end
|
17
|
+
|
18
|
+
it "override methods" do
|
19
|
+
parser = OpenAPIParser.parse(open_api_3_data, strict_reference_validation: false)
|
20
|
+
schema = @driver.parse(parser)
|
21
|
+
|
22
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, schema
|
23
|
+
assert_kind_of OpenAPIParser::Schemas::OpenAPI, schema.open_api
|
24
|
+
assert_equal @driver, schema.driver
|
25
|
+
end
|
26
|
+
|
27
|
+
it "defaults to coercing form parameters" do
|
28
|
+
assert_equal true, @driver.default_coerce_form_params
|
29
|
+
end
|
30
|
+
|
31
|
+
it "defaults to path parameters" do
|
32
|
+
assert_equal true, @driver.default_path_params
|
33
|
+
end
|
34
|
+
|
35
|
+
it "defaults to query parameters" do
|
36
|
+
assert_equal true, @driver.default_query_params
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "Schema" do
|
40
|
+
describe "#operation_object" do
|
41
|
+
describe "path template" do
|
42
|
+
it "gets a normal path" do
|
43
|
+
obj = open_api_3_schema.operation_object("/path_template_test/no_template", "get")
|
44
|
+
assert_equal "/path_template_test/no_template", obj.original_path
|
45
|
+
end
|
46
|
+
|
47
|
+
it "gets a template path" do
|
48
|
+
obj = open_api_3_schema.operation_object("/path_template_test/test", "get")
|
49
|
+
assert_equal "/path_template_test/{template_name}", obj.original_path
|
50
|
+
end
|
51
|
+
|
52
|
+
it "gets a nested template path" do
|
53
|
+
obj = open_api_3_schema.operation_object("/path_template_test/abc/nested", "get")
|
54
|
+
assert_equal "/path_template_test/{template_name}/nested", obj.original_path
|
55
|
+
assert_equal({"template_name"=>"abc"}, obj.path_params)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "gets a double nested template path" do
|
59
|
+
obj = open_api_3_schema.operation_object("/path_template_test/test/nested/abc", "get")
|
60
|
+
assert_equal "/path_template_test/{template_name}/nested/{nested_parameter}", obj.original_path
|
61
|
+
assert_equal({"template_name"=>"test", "nested_parameter" => "abc"}, obj.path_params)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "gets a twice nested template path" do
|
65
|
+
obj = open_api_3_schema.operation_object("/path_template_test/test/abc", "get")
|
66
|
+
assert_equal "/path_template_test/{template_name}/{nested_parameter}", obj.original_path
|
67
|
+
assert_equal({"template_name"=>"test", "nested_parameter" => "abc"}, obj.path_params)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "gets a twice nested concrete path" do
|
71
|
+
obj = open_api_3_schema.operation_object("/path_template_test/test/abc/finish", "get")
|
72
|
+
assert_equal "/path_template_test/{template_name}/{nested_parameter}/finish", obj.original_path
|
73
|
+
assert_equal({"template_name"=>"test", "nested_parameter" => "abc"}, obj.path_params)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "gets an ambiguous path" do
|
77
|
+
obj = open_api_3_schema.operation_object("/ambiguous/no_template", "get")
|
78
|
+
assert_equal "/{ambiguous}/no_template", obj.original_path
|
79
|
+
assert_equal({"ambiguous"=>"ambiguous"}, obj.path_params)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe Committee::Drivers do
|
6
|
+
DRIVERS = [
|
7
|
+
:hyper_schema,
|
8
|
+
:open_api_2,
|
9
|
+
:open_api_3,
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
it "gets driver with .driver_from_name" do
|
13
|
+
DRIVERS.each do |name|
|
14
|
+
driver = Committee::Drivers.driver_from_name(name)
|
15
|
+
assert_kind_of Committee::Drivers::Driver, driver
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "raises an ArgumentError for an unknown driver with .driver_from_name" do
|
20
|
+
e = assert_raises(ArgumentError) do
|
21
|
+
Committee::Drivers.driver_from_name(:blueprint)
|
22
|
+
end
|
23
|
+
assert_equal %{Committee: unknown driver "blueprint".}, e.message
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'load_from_file(schema_path)' do
|
27
|
+
it 'loads OpenAPI2' do
|
28
|
+
s = Committee::Drivers.load_from_file(open_api_2_schema_path)
|
29
|
+
assert_kind_of Committee::Drivers::Schema, s
|
30
|
+
assert_kind_of Committee::Drivers::OpenAPI2::Schema, s
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'loads Hyper-Schema' do
|
34
|
+
s = Committee::Drivers.load_from_file(hyper_schema_schema_path)
|
35
|
+
assert_kind_of Committee::Drivers::Schema, s
|
36
|
+
assert_kind_of Committee::Drivers::HyperSchema::Schema, s
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'loads OpenAPI 3' do
|
40
|
+
s = Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: true})
|
41
|
+
assert_kind_of Committee::Drivers::Schema, s
|
42
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, s
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'load OpenAPI 3 (patch version 3.0.1)' do
|
46
|
+
s = Committee::Drivers.load_from_file(open_api_3_0_1_schema_path, parser_options:{strict_reference_validation: true})
|
47
|
+
assert_kind_of Committee::Drivers::Schema, s
|
48
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, s
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'fails to load OpenAPI 3 with invalid reference' do
|
52
|
+
parser_options = { strict_reference_validation: true }
|
53
|
+
assert_raises(OpenAPIParser::MissingReferenceError) do
|
54
|
+
Committee::Drivers.load_from_file(open_api_3_invalid_reference_path, parser_options: parser_options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# This test can be removed when the test above (raising on invalid reference) becomes default behavior?
|
59
|
+
it 'allows loading OpenAPI 3 with invalid reference as existing behavior' do
|
60
|
+
s = Committee::Drivers.load_from_file(open_api_3_invalid_reference_path, parser_options:{strict_reference_validation: false})
|
61
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, s
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'errors on an unsupported file extension' do
|
65
|
+
e = assert_raises(StandardError) do
|
66
|
+
Committee::Drivers.load_from_file('test.xml', parser_options:{strict_reference_validation: true})
|
67
|
+
end
|
68
|
+
assert_equal "Committee only supports the following file extensions: '.json', '.yaml', '.yml'", e.message
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe 'load_from_json(schema_path)' do
|
73
|
+
it 'loads OpenAPI2' do
|
74
|
+
s = Committee::Drivers.load_from_json(open_api_2_schema_path, parser_options:{strict_reference_validation: true})
|
75
|
+
assert_kind_of Committee::Drivers::Schema, s
|
76
|
+
assert_kind_of Committee::Drivers::OpenAPI2::Schema, s
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'loads Hyper-Schema' do
|
80
|
+
s = Committee::Drivers.load_from_json(hyper_schema_schema_path, parser_options:{strict_reference_validation: true})
|
81
|
+
assert_kind_of Committee::Drivers::Schema, s
|
82
|
+
assert_kind_of Committee::Drivers::HyperSchema::Schema, s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'load_from_yaml(schema_path)' do
|
87
|
+
it 'loads OpenAPI3' do
|
88
|
+
s = Committee::Drivers.load_from_yaml(open_api_3_schema_path, parser_options:{strict_reference_validation: true})
|
89
|
+
assert_kind_of Committee::Drivers::Schema, s
|
90
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, s
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'load_from_data(schema_path)' do
|
95
|
+
it 'loads OpenAPI3' do
|
96
|
+
s = Committee::Drivers.load_from_data(open_api_3_data, parser_options:{strict_reference_validation: false})
|
97
|
+
assert_kind_of Committee::Drivers::Schema, s
|
98
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, s
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'loads OpenAPI2' do
|
102
|
+
s = Committee::Drivers.load_from_data(open_api_2_data)
|
103
|
+
assert_kind_of Committee::Drivers::Schema, s
|
104
|
+
assert_kind_of Committee::Drivers::OpenAPI2::Schema, s
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'loads Hyper-Schema' do
|
108
|
+
s = Committee::Drivers.load_from_data(hyper_schema_data)
|
109
|
+
assert_kind_of Committee::Drivers::Schema, s
|
110
|
+
assert_kind_of Committee::Drivers::HyperSchema::Schema, s
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe Committee::Drivers::Driver do
|
116
|
+
DRIVER_METHODS = {
|
117
|
+
default_allow_get_body: [],
|
118
|
+
default_coerce_form_params: [],
|
119
|
+
default_path_params: [],
|
120
|
+
default_query_params: [],
|
121
|
+
name: [],
|
122
|
+
parse: [nil],
|
123
|
+
schema_class: [],
|
124
|
+
}
|
125
|
+
|
126
|
+
it "has a set of abstract methods" do
|
127
|
+
driver = Committee::Drivers::Driver.new
|
128
|
+
DRIVER_METHODS.each do |name, args|
|
129
|
+
e = assert_raises do
|
130
|
+
driver.send(name, *args)
|
131
|
+
end
|
132
|
+
assert_equal "needs implementation", e.message,
|
133
|
+
"Incorrect error message while sending #{name}: #{e.message}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe Committee::Drivers::Schema do
|
139
|
+
SCHEMA_METHODS = {
|
140
|
+
driver: [],
|
141
|
+
build_router: [validator_option: nil, prefix: nil]
|
142
|
+
}
|
143
|
+
|
144
|
+
it "has a set of abstract methods" do
|
145
|
+
schema = Committee::Drivers::Schema.new
|
146
|
+
SCHEMA_METHODS.each do |name, args|
|
147
|
+
e = assert_raises do
|
148
|
+
schema.send(name, *args)
|
149
|
+
end
|
150
|
+
assert_equal "needs implementation", e.message,
|
151
|
+
"Incorrect error message while sending #{name}: #{e.message}"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe Committee::Middleware::Base do
|
6
|
+
include Rack::Test::Methods
|
7
|
+
|
8
|
+
def app
|
9
|
+
@app
|
10
|
+
end
|
11
|
+
|
12
|
+
it "accepts just a schema object" do
|
13
|
+
@app = new_rack_app(
|
14
|
+
schema: hyper_schema
|
15
|
+
)
|
16
|
+
params = {
|
17
|
+
"name" => "cloudnasium"
|
18
|
+
}
|
19
|
+
header "Content-Type", "application/json"
|
20
|
+
post "/apps", JSON.generate(params)
|
21
|
+
assert_equal 200, last_response.status
|
22
|
+
end
|
23
|
+
|
24
|
+
it "accepts just a OpenAPI3 schema object" do
|
25
|
+
@app = new_rack_app(schema: open_api_3_schema)
|
26
|
+
params = {
|
27
|
+
"name" => "cloudnasium"
|
28
|
+
}
|
29
|
+
header "Content-Type", "application/json"
|
30
|
+
post "/apps", JSON.generate(params)
|
31
|
+
assert_equal 200, last_response.status
|
32
|
+
end
|
33
|
+
|
34
|
+
it "doesn't accept a schema string" do
|
35
|
+
@app = new_rack_app(
|
36
|
+
schema: JSON.dump(hyper_schema_data)
|
37
|
+
)
|
38
|
+
params = {
|
39
|
+
"name" => "cloudnasium"
|
40
|
+
}
|
41
|
+
header "Content-Type", "application/json"
|
42
|
+
|
43
|
+
e = assert_raises(ArgumentError) do
|
44
|
+
post "/apps", JSON.generate(params)
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_equal "Committee: schema expected to be an instance " +
|
48
|
+
"of Committee::Drivers::Schema.", e.message
|
49
|
+
end
|
50
|
+
|
51
|
+
it "doesn't accept a schema hash" do
|
52
|
+
@app = new_rack_app(
|
53
|
+
schema: hyper_schema_data
|
54
|
+
)
|
55
|
+
params = {
|
56
|
+
"name" => "cloudnasium"
|
57
|
+
}
|
58
|
+
header "Content-Type", "application/json"
|
59
|
+
|
60
|
+
e = assert_raises(ArgumentError) do
|
61
|
+
post "/apps", JSON.generate(params)
|
62
|
+
end
|
63
|
+
|
64
|
+
assert_equal "Committee: schema expected to be an instance " +
|
65
|
+
"of Committee::Drivers::Schema.", e.message
|
66
|
+
end
|
67
|
+
|
68
|
+
it "doesn't accept a JsonSchema::Schema object" do
|
69
|
+
@app = new_rack_app(
|
70
|
+
schema: JsonSchema.parse!(hyper_schema_data)
|
71
|
+
)
|
72
|
+
params = {
|
73
|
+
"name" => "cloudnasium"
|
74
|
+
}
|
75
|
+
header "Content-Type", "application/json"
|
76
|
+
|
77
|
+
e = assert_raises(ArgumentError) do
|
78
|
+
post "/apps", JSON.generate(params)
|
79
|
+
end
|
80
|
+
|
81
|
+
assert_equal "Committee: schema expected to be an instance " +
|
82
|
+
"of Committee::Drivers::Schema.", e.message
|
83
|
+
end
|
84
|
+
|
85
|
+
it "doesn't accept other schema types" do
|
86
|
+
@app = new_rack_app(
|
87
|
+
schema: 7,
|
88
|
+
)
|
89
|
+
e = assert_raises(ArgumentError) do
|
90
|
+
post "/apps"
|
91
|
+
end
|
92
|
+
assert_equal "Committee: schema expected to be an instance of Committee::Drivers::Schema.", e.message
|
93
|
+
end
|
94
|
+
|
95
|
+
it "errors when no schema is specified" do
|
96
|
+
@app = new_rack_app
|
97
|
+
e = assert_raises(ArgumentError) do
|
98
|
+
post "/apps"
|
99
|
+
end
|
100
|
+
|
101
|
+
assert_equal "Committee: need option `schema` or `schema_path`", e.message
|
102
|
+
end
|
103
|
+
|
104
|
+
describe 'initialize option' do
|
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
|
+
end
|
110
|
+
|
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)
|
113
|
+
assert_kind_of Committee::Drivers::OpenAPI3::Schema, b.instance_variable_get(:@schema)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def new_rack_app(options = {})
|
120
|
+
# TODO: delete when 5.0.0 released because default value changed
|
121
|
+
options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
|
122
|
+
|
123
|
+
Rack::Builder.new {
|
124
|
+
use Committee::Middleware::RequestValidation, options
|
125
|
+
run lambda { |_|
|
126
|
+
[200, {}, []]
|
127
|
+
}
|
128
|
+
}
|
129
|
+
end
|
130
|
+
end
|