committee 3.1.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/bin/committee-stub +1 -0
  3. data/lib/committee.rb +12 -34
  4. data/lib/committee/bin/committee_stub.rb +6 -4
  5. data/lib/committee/drivers.rb +15 -67
  6. data/lib/committee/drivers/driver.rb +47 -0
  7. data/lib/committee/drivers/hyper_schema.rb +8 -171
  8. data/lib/committee/drivers/hyper_schema/driver.rb +105 -0
  9. data/lib/committee/drivers/hyper_schema/link.rb +68 -0
  10. data/lib/committee/drivers/hyper_schema/schema.rb +22 -0
  11. data/lib/committee/drivers/open_api_2.rb +9 -416
  12. data/lib/committee/drivers/open_api_2/driver.rb +253 -0
  13. data/lib/committee/drivers/open_api_2/header_schema_builder.rb +33 -0
  14. data/lib/committee/drivers/open_api_2/link.rb +36 -0
  15. data/lib/committee/drivers/open_api_2/parameter_schema_builder.rb +83 -0
  16. data/lib/committee/drivers/open_api_2/schema.rb +26 -0
  17. data/lib/committee/drivers/open_api_2/schema_builder.rb +33 -0
  18. data/lib/committee/drivers/open_api_3.rb +7 -75
  19. data/lib/committee/drivers/open_api_3/driver.rb +51 -0
  20. data/lib/committee/drivers/open_api_3/schema.rb +41 -0
  21. data/lib/committee/drivers/schema.rb +23 -0
  22. data/lib/committee/errors.rb +2 -0
  23. data/lib/committee/middleware.rb +11 -0
  24. data/lib/committee/middleware/base.rb +38 -34
  25. data/lib/committee/middleware/request_validation.rb +51 -30
  26. data/lib/committee/middleware/response_validation.rb +49 -26
  27. data/lib/committee/middleware/stub.rb +55 -51
  28. data/lib/committee/request_unpacker.rb +3 -1
  29. data/lib/committee/schema_validator.rb +23 -0
  30. data/lib/committee/schema_validator/hyper_schema.rb +85 -74
  31. data/lib/committee/schema_validator/hyper_schema/parameter_coercer.rb +60 -54
  32. data/lib/committee/schema_validator/hyper_schema/request_validator.rb +43 -37
  33. data/lib/committee/schema_validator/hyper_schema/response_generator.rb +86 -80
  34. data/lib/committee/schema_validator/hyper_schema/response_validator.rb +65 -59
  35. data/lib/committee/schema_validator/hyper_schema/router.rb +35 -29
  36. data/lib/committee/schema_validator/hyper_schema/string_params_coercer.rb +87 -81
  37. data/lib/committee/schema_validator/open_api_3.rb +71 -61
  38. data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +121 -115
  39. data/lib/committee/schema_validator/open_api_3/request_validator.rb +24 -18
  40. data/lib/committee/schema_validator/open_api_3/response_validator.rb +22 -16
  41. data/lib/committee/schema_validator/open_api_3/router.rb +30 -24
  42. data/lib/committee/schema_validator/option.rb +42 -38
  43. data/lib/committee/test/methods.rb +55 -51
  44. data/lib/committee/validation_error.rb +2 -0
  45. data/test/bin/committee_stub_test.rb +3 -1
  46. data/test/bin_test.rb +3 -1
  47. data/test/committee_test.rb +3 -1
  48. data/test/drivers/hyper_schema/driver_test.rb +49 -0
  49. data/test/drivers/{hyper_schema_test.rb → hyper_schema/link_test.rb} +2 -45
  50. data/test/drivers/open_api_2/driver_test.rb +156 -0
  51. data/test/drivers/open_api_2/header_schema_builder_test.rb +26 -0
  52. data/test/drivers/open_api_2/link_test.rb +52 -0
  53. data/test/drivers/open_api_2/parameter_schema_builder_test.rb +195 -0
  54. data/test/drivers/{open_api_3_test.rb → open_api_3/driver_test.rb} +5 -3
  55. data/test/drivers_test.rb +12 -10
  56. data/test/middleware/base_test.rb +3 -1
  57. data/test/middleware/request_validation_open_api_3_test.rb +4 -2
  58. data/test/middleware/request_validation_test.rb +46 -5
  59. data/test/middleware/response_validation_open_api_3_test.rb +3 -1
  60. data/test/middleware/response_validation_test.rb +39 -4
  61. data/test/middleware/stub_test.rb +3 -1
  62. data/test/request_unpacker_test.rb +2 -2
  63. data/test/schema_validator/hyper_schema/parameter_coercer_test.rb +2 -2
  64. data/test/schema_validator/hyper_schema/request_validator_test.rb +3 -1
  65. data/test/schema_validator/hyper_schema/response_generator_test.rb +3 -1
  66. data/test/schema_validator/hyper_schema/response_validator_test.rb +3 -1
  67. data/test/schema_validator/hyper_schema/router_test.rb +5 -3
  68. data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +3 -1
  69. data/test/schema_validator/open_api_3/operation_wrapper_test.rb +3 -1
  70. data/test/schema_validator/open_api_3/request_validator_test.rb +11 -1
  71. data/test/schema_validator/open_api_3/response_validator_test.rb +3 -1
  72. data/test/test/methods_new_version_test.rb +3 -1
  73. data/test/test/methods_test.rb +4 -2
  74. data/test/test_helper.rb +16 -16
  75. data/test/validation_error_test.rb +3 -1
  76. metadata +52 -6
  77. data/lib/committee/schema_validator/schema_validator.rb +0 -15
  78. data/test/drivers/open_api_2_test.rb +0 -416
@@ -1,8 +1,10 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- describe Committee::Drivers::OpenAPI3 do
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
- require_relative "test_helper"
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
- :default_allow_get_body => [],
103
- :default_coerce_form_params => [],
104
- :default_path_params => [],
105
- :default_query_params => [],
106
- :name => [],
107
- :parse => [nil],
108
- :schema_class => [],
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
- :driver => [],
126
- :build_router => [validator_option: nil, prefix: nil]
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
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::Base do
4
6
  include Rack::Test::Methods
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
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 "/apps", "{x:y}"
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
- require_relative "../test_helper"
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 = ->(_) { called_error = true }
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
- require_relative "../test_helper"
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
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
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
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::Stub do
4
6
  include Rack::Test::Methods
@@ -1,6 +1,6 @@
1
- require_relative "test_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- require "stringio"
3
+ require "test_helper"
4
4
 
5
5
  describe Committee::RequestUnpacker do
6
6
  it "unpacks JSON on Content-Type: application/json" do
@@ -1,6 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- require "stringio"
3
+ require "test_helper"
4
4
 
5
5
  describe Committee::SchemaValidator::HyperSchema::ParameterCoercer do
6
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  require "stringio"
4
6
 
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::ResponseGenerator do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::ResponseValidator do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
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
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::StringParamsCoercer do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  require "stringio"
4
6
 
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
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 = {
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::OpenAPI3::ResponseValidator do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
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
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
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
- if RUBY_VERSION >= '2.0.0'
2
- require 'simplecov'
3
-
4
- SimpleCov.start do
5
- # We do our utmost to test our executables by modularizing them into
6
- # testable pieces, but testing them to completion is nearly impossible as
7
- # far as I can tell, so include them in our tests but don't calculate
8
- # coverage.
9
- add_filter "/bin/"
10
-
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
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