committee 1.0.6 → 1.0.7

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.
@@ -3,6 +3,7 @@ module Committee::Middleware
3
3
  def initialize(app, options={})
4
4
  super
5
5
  @prefix = options[:prefix]
6
+ @strict = options[:strict]
6
7
 
7
8
  # deprecated
8
9
  @allow_extra = options[:allow_extra]
@@ -10,12 +11,19 @@ module Committee::Middleware
10
11
 
11
12
  def call(env)
12
13
  request = Rack::Request.new(env)
14
+ env[@params_key] = Committee::RequestUnpacker.new(request).call
13
15
  if link = @router.routes_request?(request, prefix: @prefix)
14
16
  validator = Committee::RequestValidator.new(link)
15
- validator.call(request)
16
- env[@params_key] = validator.data
17
+ validator.call(request, env[@params_key])
18
+ @app.call(env)
19
+ else
20
+ if @strict
21
+ render_error(404, :not_found,
22
+ "That request method and path combination isn't defined.")
23
+ else
24
+ @app.call(env)
25
+ end
17
26
  end
18
- @app.call(env)
19
27
  rescue Committee::BadRequest, Committee::InvalidRequest
20
28
  render_error(400, :bad_request, $!.message)
21
29
  rescue MultiJson::LoadError
@@ -1,16 +1,13 @@
1
1
  module Committee
2
2
  class RequestValidator
3
- attr_accessor :data
4
-
5
3
  def initialize(link, options = {})
6
4
  @link = link
7
5
  end
8
6
 
9
- def call(request)
7
+ def call(request, data)
10
8
  check_content_type!(request)
11
- @data = Committee::RequestUnpacker.new(request).call
12
9
  if @link.schema
13
- valid, errors = @link.schema.validate(@data)
10
+ valid, errors = @link.schema.validate(data)
14
11
  if !valid
15
12
  errors = JsonSchema::SchemaError.aggregate(errors).join("\n")
16
13
  raise InvalidRequest, "Invalid request.\n\n#{errors}"
@@ -21,9 +18,11 @@ module Committee
21
18
  private
22
19
 
23
20
  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}".}
21
+ if request.content_type
22
+ unless Rack::Mime.match?(@link.enc_type, request.content_type)
23
+ raise Committee::InvalidRequest,
24
+ %{"Content-Type" request header must be set to "#{@link.enc_type}".}
25
+ end
27
26
  end
28
27
  end
29
28
  end
@@ -57,6 +57,18 @@ describe Committee::Middleware::RequestValidation do
57
57
  assert_equal 200, last_response.status
58
58
  end
59
59
 
60
+ it "routes to paths not in schema" do
61
+ @app = new_rack_app
62
+ get "/not-a-resource"
63
+ assert_equal 200, last_response.status
64
+ end
65
+
66
+ it "doesn't route to paths not in schema when in strict mode" do
67
+ @app = new_rack_app(strict: true)
68
+ get "/not-a-resource"
69
+ assert_equal 404, last_response.status
70
+ end
71
+
60
72
  private
61
73
 
62
74
  def new_rack_app(options = {})
@@ -9,18 +9,23 @@ describe Committee::RequestValidator do
9
9
  @schema.expand_references!
10
10
  # POST /apps/:id
11
11
  @link = @link = @schema.properties["app"].links[0]
12
+ @request = Rack::Request.new({
13
+ "CONTENT_TYPE" => "application/json",
14
+ })
12
15
  end
13
16
 
14
17
  it "passes through a valid request" do
15
- params = {
18
+ data = {
16
19
  "name" => "heroku-api",
17
20
  }
18
- call(request(params))
21
+ call(data)
19
22
  end
20
23
 
21
24
  it "detects an invalid request Content-Type" do
22
25
  e = assert_raises(Committee::InvalidRequest) {
23
- call(Rack::Request.new("CONTENT_TYPE" => "application/x-www-form-urlencoded"))
26
+ @request =
27
+ Rack::Request.new("CONTENT_TYPE" => "application/x-www-form-urlencoded")
28
+ call({})
24
29
  }
25
30
  message =
26
31
  %{"Content-Type" request header must be set to "application/json".}
@@ -28,11 +33,11 @@ describe Committee::RequestValidator do
28
33
  end
29
34
 
30
35
  it "detects a parameter of the wrong pattern" do
31
- params = {
36
+ data = {
32
37
  "name" => "%@!"
33
38
  }
34
39
  e = assert_raises(Committee::InvalidRequest) do
35
- call(request(params))
40
+ call(data)
36
41
  end
37
42
  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: %@!.}
38
43
  assert_equal message, e.message
@@ -40,15 +45,7 @@ describe Committee::RequestValidator do
40
45
 
41
46
  private
42
47
 
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)
48
+ def call(data)
49
+ Committee::RequestValidator.new(@link).call(@request, data)
53
50
  end
54
51
  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.6
4
+ version: 1.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-05-24 00:00:00.000000000 Z
13
+ date: 2014-05-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json_schema