committee_firetail 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/bin/committee-stub +23 -0
  3. data/lib/committee/bin/committee_stub.rb +67 -0
  4. data/lib/committee/drivers/driver.rb +47 -0
  5. data/lib/committee/drivers/hyper_schema/driver.rb +105 -0
  6. data/lib/committee/drivers/hyper_schema/link.rb +68 -0
  7. data/lib/committee/drivers/hyper_schema/schema.rb +22 -0
  8. data/lib/committee/drivers/hyper_schema.rb +12 -0
  9. data/lib/committee/drivers/open_api_2/driver.rb +252 -0
  10. data/lib/committee/drivers/open_api_2/header_schema_builder.rb +33 -0
  11. data/lib/committee/drivers/open_api_2/link.rb +36 -0
  12. data/lib/committee/drivers/open_api_2/parameter_schema_builder.rb +83 -0
  13. data/lib/committee/drivers/open_api_2/schema.rb +26 -0
  14. data/lib/committee/drivers/open_api_2/schema_builder.rb +33 -0
  15. data/lib/committee/drivers/open_api_2.rb +13 -0
  16. data/lib/committee/drivers/open_api_3/driver.rb +51 -0
  17. data/lib/committee/drivers/open_api_3/schema.rb +41 -0
  18. data/lib/committee/drivers/open_api_3.rb +11 -0
  19. data/lib/committee/drivers/schema.rb +23 -0
  20. data/lib/committee/drivers.rb +84 -0
  21. data/lib/committee/errors.rb +36 -0
  22. data/lib/committee/middleware/base.rb +57 -0
  23. data/lib/committee/middleware/request_validation.rb +41 -0
  24. data/lib/committee/middleware/response_validation.rb +58 -0
  25. data/lib/committee/middleware/stub.rb +75 -0
  26. data/lib/committee/middleware.rb +11 -0
  27. data/lib/committee/request_unpacker.rb +91 -0
  28. data/lib/committee/schema_validator/hyper_schema/parameter_coercer.rb +79 -0
  29. data/lib/committee/schema_validator/hyper_schema/request_validator.rb +55 -0
  30. data/lib/committee/schema_validator/hyper_schema/response_generator.rb +102 -0
  31. data/lib/committee/schema_validator/hyper_schema/response_validator.rb +89 -0
  32. data/lib/committee/schema_validator/hyper_schema/router.rb +46 -0
  33. data/lib/committee/schema_validator/hyper_schema/string_params_coercer.rb +105 -0
  34. data/lib/committee/schema_validator/hyper_schema.rb +119 -0
  35. data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +139 -0
  36. data/lib/committee/schema_validator/open_api_3/request_validator.rb +52 -0
  37. data/lib/committee/schema_validator/open_api_3/response_validator.rb +29 -0
  38. data/lib/committee/schema_validator/open_api_3/router.rb +45 -0
  39. data/lib/committee/schema_validator/open_api_3.rb +120 -0
  40. data/lib/committee/schema_validator/option.rb +60 -0
  41. data/lib/committee/schema_validator.rb +23 -0
  42. data/lib/committee/test/methods.rb +84 -0
  43. data/lib/committee/test/schema_coverage.rb +101 -0
  44. data/lib/committee/utils.rb +28 -0
  45. data/lib/committee/validation_error.rb +26 -0
  46. data/lib/committee/version.rb +5 -0
  47. data/lib/committee.rb +40 -0
  48. data/test/bin/committee_stub_test.rb +57 -0
  49. data/test/bin_test.rb +25 -0
  50. data/test/committee_test.rb +77 -0
  51. data/test/drivers/hyper_schema/driver_test.rb +49 -0
  52. data/test/drivers/hyper_schema/link_test.rb +56 -0
  53. data/test/drivers/open_api_2/driver_test.rb +156 -0
  54. data/test/drivers/open_api_2/header_schema_builder_test.rb +26 -0
  55. data/test/drivers/open_api_2/link_test.rb +52 -0
  56. data/test/drivers/open_api_2/parameter_schema_builder_test.rb +195 -0
  57. data/test/drivers/open_api_3/driver_test.rb +84 -0
  58. data/test/drivers_test.rb +154 -0
  59. data/test/middleware/base_test.rb +130 -0
  60. data/test/middleware/request_validation_open_api_3_test.rb +626 -0
  61. data/test/middleware/request_validation_test.rb +516 -0
  62. data/test/middleware/response_validation_open_api_3_test.rb +291 -0
  63. data/test/middleware/response_validation_test.rb +189 -0
  64. data/test/middleware/stub_test.rb +145 -0
  65. data/test/request_unpacker_test.rb +200 -0
  66. data/test/schema_validator/hyper_schema/parameter_coercer_test.rb +111 -0
  67. data/test/schema_validator/hyper_schema/request_validator_test.rb +151 -0
  68. data/test/schema_validator/hyper_schema/response_generator_test.rb +142 -0
  69. data/test/schema_validator/hyper_schema/response_validator_test.rb +118 -0
  70. data/test/schema_validator/hyper_schema/router_test.rb +88 -0
  71. data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +137 -0
  72. data/test/schema_validator/open_api_3/operation_wrapper_test.rb +218 -0
  73. data/test/schema_validator/open_api_3/request_validator_test.rb +110 -0
  74. data/test/schema_validator/open_api_3/response_validator_test.rb +92 -0
  75. data/test/test/methods_new_version_test.rb +97 -0
  76. data/test/test/methods_test.rb +363 -0
  77. data/test/test/schema_coverage_test.rb +216 -0
  78. data/test/test_helper.rb +120 -0
  79. data/test/validation_error_test.rb +25 -0
  80. 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