committee 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,9 +10,10 @@ module Committee::Middleware
10
10
 
11
11
  def call(env)
12
12
  request = Rack::Request.new(env)
13
- env[@params_key] = Committee::RequestUnpacker.new(request).call
14
13
  if link = @router.routes_request?(request, prefix: @prefix)
15
- Committee::RequestValidator.new.call(link, env[@params_key])
14
+ validator = Committee::RequestValidator.new(link)
15
+ validator.call(request)
16
+ env[@params_key] = validator.data
16
17
  end
17
18
  @app.call(env)
18
19
  rescue Committee::BadRequest, Committee::InvalidRequest
@@ -1,16 +1,30 @@
1
1
  module Committee
2
2
  class RequestValidator
3
- def initialize(options = {})
3
+ attr_accessor :data
4
+
5
+ def initialize(link, options = {})
6
+ @link = link
4
7
  end
5
8
 
6
- def call(link, params)
7
- if link.schema
8
- valid, errors = link.schema.validate(params)
9
+ def call(request)
10
+ check_content_type!(request)
11
+ @data = Committee::RequestUnpacker.new(request).call
12
+ if @link.schema
13
+ valid, errors = @link.schema.validate(@data)
9
14
  if !valid
10
15
  errors = JsonSchema::SchemaError.aggregate(errors).join("\n")
11
16
  raise InvalidRequest, "Invalid request.\n\n#{errors}"
12
17
  end
13
18
  end
14
19
  end
20
+
21
+ private
22
+
23
+ def check_content_type!(request)
24
+ unless Rack::Mime.match?(@link.enc_type, request.content_type)
25
+ raise Committee::InvalidRequest,
26
+ %{"Content-Type" request header must be set to "#{@link.enc_type}".}
27
+ end
28
+ end
15
29
  end
16
30
  end
@@ -25,7 +25,7 @@ module Committee::Test
25
25
  end
26
26
 
27
27
  def assert_schema_content_type
28
- Committee.warn_deprecated("Use of #assert_schema_content_type is deprecated; use #assert_schema_conform instead.")
28
+ Committee.warn_deprecated("Committee: use of #assert_schema_content_type is deprecated; use #assert_schema_conform instead.")
29
29
  end
30
30
 
31
31
  # can be overridden alternatively to #schema_path in case the schema is
@@ -28,17 +28,6 @@ describe Committee::Middleware::RequestValidation do
28
28
  assert_match /invalid request/i, last_response.body
29
29
  end
30
30
 
31
- it "detects an invalid Content-Type" do
32
- @app = new_rack_app
33
- header "Content-Type", "application/whats-this"
34
- params = {
35
- "name" => "cloudnasium"
36
- }
37
- post "/apps", MultiJson.encode(params)
38
- assert_equal 400, last_response.status
39
- assert_match /unsupported content-type/i, last_response.body
40
- end
41
-
42
31
  it "rescues JSON errors" do
43
32
  @app = new_rack_app
44
33
  header "Content-Type", "application/json"
@@ -1,5 +1,7 @@
1
1
  require_relative "test_helper"
2
2
 
3
+ require "stringio"
4
+
3
5
  describe Committee::RequestValidator do
4
6
  before do
5
7
  @schema =
@@ -13,7 +15,16 @@ describe Committee::RequestValidator do
13
15
  params = {
14
16
  "name" => "heroku-api",
15
17
  }
16
- call(params)
18
+ call(request(params))
19
+ end
20
+
21
+ it "detects an invalid request Content-Type" do
22
+ e = assert_raises(Committee::InvalidRequest) {
23
+ call(Rack::Request.new("CONTENT_TYPE" => "application/x-www-form-urlencoded"))
24
+ }
25
+ message =
26
+ %{"Content-Type" request header must be set to "application/json".}
27
+ assert_equal message, e.message
17
28
  end
18
29
 
19
30
  it "detects a parameter of the wrong pattern" do
@@ -21,7 +32,7 @@ describe Committee::RequestValidator do
21
32
  "name" => "%@!"
22
33
  }
23
34
  e = assert_raises(Committee::InvalidRequest) do
24
- call(params)
35
+ call(request(params))
25
36
  end
26
37
  message = %{Invalid request.\n\n#/name: failed schema #/definitions/app/links/0/schema/properties/name: Expected string to match pattern "/^[a-z][a-z0-9-]{3,30}$/", value was: %@!.}
27
38
  assert_equal message, e.message
@@ -29,7 +40,15 @@ describe Committee::RequestValidator do
29
40
 
30
41
  private
31
42
 
32
- def call(params)
33
- Committee::RequestValidator.new.call(@link, params)
43
+ def call(request)
44
+ Committee::RequestValidator.new(@link).call(request)
45
+ end
46
+
47
+ def request(params)
48
+ env = {
49
+ "CONTENT_TYPE" => "application/json",
50
+ "rack.input" => StringIO.new(MultiJson.encode(params))
51
+ }
52
+ Rack::Request.new(env)
34
53
  end
35
54
  end
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: 1.0.3
4
+ version: 1.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: