committee 0.4.10 → 0.4.11
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.
|
@@ -2,6 +2,7 @@ module Committee::Middleware
|
|
|
2
2
|
class RequestValidation < Base
|
|
3
3
|
def initialize(app, options={})
|
|
4
4
|
super
|
|
5
|
+
@allow_extra = options[:allow_extra]
|
|
5
6
|
@prefix = options[:prefix]
|
|
6
7
|
end
|
|
7
8
|
|
|
@@ -10,7 +11,12 @@ module Committee::Middleware
|
|
|
10
11
|
env[@params_key] = Committee::RequestUnpacker.new(request).call
|
|
11
12
|
link, _ = @router.routes_request?(request, prefix: @prefix)
|
|
12
13
|
if link
|
|
13
|
-
Committee::ParamValidator.new(
|
|
14
|
+
Committee::ParamValidator.new(
|
|
15
|
+
env[@params_key],
|
|
16
|
+
@schema,
|
|
17
|
+
link,
|
|
18
|
+
allow_extra: @allow_extra
|
|
19
|
+
).call
|
|
14
20
|
end
|
|
15
21
|
@app.call(env)
|
|
16
22
|
rescue Committee::BadRequest
|
|
@@ -2,15 +2,16 @@ module Committee
|
|
|
2
2
|
class ParamValidator
|
|
3
3
|
include Validation
|
|
4
4
|
|
|
5
|
-
def initialize(params, schema, link_schema)
|
|
5
|
+
def initialize(params, schema, link_schema, options = {})
|
|
6
6
|
@params = params
|
|
7
7
|
@schema = schema
|
|
8
8
|
@link_schema = link_schema
|
|
9
|
+
@allow_extra = options[:allow_extra]
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def call
|
|
12
13
|
detect_missing!
|
|
13
|
-
detect_extra!
|
|
14
|
+
detect_extra! if !@allow_extra
|
|
14
15
|
check_data!
|
|
15
16
|
end
|
|
16
17
|
|
|
@@ -46,6 +46,18 @@ describe Committee::Middleware::RequestValidation do
|
|
|
46
46
|
assert_match /unknown params/i, last_response.body
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
+
it "doesn't error on an extra parameter with allow_extra" do
|
|
50
|
+
@app = new_rack_app(allow_extra: true)
|
|
51
|
+
params = {
|
|
52
|
+
"app" => "heroku-api",
|
|
53
|
+
"cloud" => "production",
|
|
54
|
+
"recipient" => "owner@heroku.com",
|
|
55
|
+
}
|
|
56
|
+
header "Content-Type", "application/json"
|
|
57
|
+
post "/account/app-transfers", MultiJson.encode(params)
|
|
58
|
+
assert_equal 200, last_response.status
|
|
59
|
+
end
|
|
60
|
+
|
|
49
61
|
it "rescues JSON errors" do
|
|
50
62
|
@app = new_rack_app
|
|
51
63
|
header "Content-Type", "application/json"
|
|
@@ -12,28 +12,24 @@ describe Committee::ParamValidator do
|
|
|
12
12
|
"app" => "heroku-api",
|
|
13
13
|
"recipient" => "owner@heroku.com",
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
validate(params, @schema, @link_schema)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
it "detects a missing parameter" do
|
|
19
19
|
e = assert_raises(Committee::InvalidParams) do
|
|
20
|
-
|
|
20
|
+
validate({}, @schema, @link_schema)
|
|
21
21
|
end
|
|
22
22
|
message = "Require params: app, recipient."
|
|
23
23
|
assert_equal message, e.message
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
it "
|
|
26
|
+
it "doesn't error on an extraneous parameter with allow_extra" do
|
|
27
27
|
params = {
|
|
28
28
|
"app" => "heroku-api",
|
|
29
29
|
"cloud" => "production",
|
|
30
30
|
"recipient" => "owner@heroku.com",
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
Committee::ParamValidator.new(params, @schema, @link_schema).call
|
|
34
|
-
end
|
|
35
|
-
message = "Unknown params: cloud."
|
|
36
|
-
assert_equal message, e.message
|
|
32
|
+
validate(params, @schema, @link_schema, allow_extra: true)
|
|
37
33
|
end
|
|
38
34
|
|
|
39
35
|
it "detects a parameter of the wrong type" do
|
|
@@ -42,7 +38,7 @@ describe Committee::ParamValidator do
|
|
|
42
38
|
"recipient" => 123,
|
|
43
39
|
}
|
|
44
40
|
e = assert_raises(Committee::InvalidType) do
|
|
45
|
-
|
|
41
|
+
validate(params, @schema, @link_schema)
|
|
46
42
|
end
|
|
47
43
|
message = %{Invalid type for key "recipient": expected 123 to be ["string"].}
|
|
48
44
|
assert_equal message, e.message
|
|
@@ -54,7 +50,7 @@ describe Committee::ParamValidator do
|
|
|
54
50
|
"recipient" => "not-email",
|
|
55
51
|
}
|
|
56
52
|
e = assert_raises(Committee::InvalidFormat) do
|
|
57
|
-
|
|
53
|
+
validate(params, @schema, @link_schema)
|
|
58
54
|
end
|
|
59
55
|
message = %{Invalid format for key "recipient": expected "not-email" to be "email".}
|
|
60
56
|
assert_equal message, e.message
|
|
@@ -66,7 +62,7 @@ describe Committee::ParamValidator do
|
|
|
66
62
|
}
|
|
67
63
|
link_schema = @schema["app"]["links"][0]
|
|
68
64
|
e = assert_raises(Committee::InvalidPattern) do
|
|
69
|
-
|
|
65
|
+
validate(params, @schema, link_schema)
|
|
70
66
|
end
|
|
71
67
|
message = %{Invalid pattern for key "name": expected %@! to match "(?-mix:^[a-z][a-z0-9-]{3,30}$)".}
|
|
72
68
|
assert_equal message, e.message
|
|
@@ -81,7 +77,7 @@ describe Committee::ParamValidator do
|
|
|
81
77
|
]
|
|
82
78
|
}
|
|
83
79
|
link_schema = @schema["stack"]["links"][2]
|
|
84
|
-
|
|
80
|
+
validate(params, @schema, link_schema)
|
|
85
81
|
end
|
|
86
82
|
|
|
87
83
|
it "detects an array item with a parameter of the wrong type" do
|
|
@@ -92,7 +88,7 @@ describe Committee::ParamValidator do
|
|
|
92
88
|
}
|
|
93
89
|
link_schema = @schema["stack"]["links"][2]
|
|
94
90
|
e = assert_raises(Committee::InvalidType) do
|
|
95
|
-
|
|
91
|
+
validate(params, @schema, link_schema)
|
|
96
92
|
end
|
|
97
93
|
message = %{Invalid type for key "state": expected 123 to be ["string"].}
|
|
98
94
|
assert_equal message, e.message
|
|
@@ -106,7 +102,7 @@ describe Committee::ParamValidator do
|
|
|
106
102
|
"flags" => [ "vip", "customer" ]
|
|
107
103
|
}
|
|
108
104
|
link_schema = @schema["account"]["links"][1]
|
|
109
|
-
|
|
105
|
+
validate(params, @schema, link_schema)
|
|
110
106
|
end
|
|
111
107
|
|
|
112
108
|
it "detects an array item with a parameter of the wrong type" do
|
|
@@ -116,10 +112,16 @@ describe Committee::ParamValidator do
|
|
|
116
112
|
}
|
|
117
113
|
link_schema = @schema["account"]["links"][1]
|
|
118
114
|
e = assert_raises(Committee::InvalidType) do
|
|
119
|
-
|
|
115
|
+
validate(params, @schema, link_schema)
|
|
120
116
|
end
|
|
121
117
|
message = %{Invalid type for key "flags": expected 999 to be ["string"].}
|
|
122
118
|
assert_equal message, e.message
|
|
123
119
|
end
|
|
124
120
|
end
|
|
121
|
+
|
|
122
|
+
private
|
|
123
|
+
|
|
124
|
+
def validate(params, schema, link_schema, options = {})
|
|
125
|
+
Committee::ParamValidator.new(params, schema, link_schema, options).call
|
|
126
|
+
end
|
|
125
127
|
end
|
data/test/router_test.rb
CHANGED
|
@@ -8,15 +8,19 @@ describe Committee::Router do
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
it "builds routes without parameters" do
|
|
11
|
-
|
|
11
|
+
refute_nil @router.routes?("GET", "/apps")[0]
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "builds routes with parameters" do
|
|
15
|
-
|
|
15
|
+
refute_nil @router.routes?("GET", "/apps/123")[0]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "doesn't match anything on a /" do
|
|
19
|
+
assert_nil @router.routes?("GET", "/")[0]
|
|
16
20
|
end
|
|
17
21
|
|
|
18
22
|
it "takes a prefix" do
|
|
19
23
|
# this is a sociopathic example
|
|
20
|
-
|
|
24
|
+
refute_nil @router.routes?("GET", "/kpi/apps/123", prefix: "/kpi")[0]
|
|
21
25
|
end
|
|
22
26
|
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: 0.4.
|
|
4
|
+
version: 0.4.11
|
|
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-04-
|
|
13
|
+
date: 2014-04-29 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: multi_json
|
|
@@ -44,22 +44,6 @@ dependencies:
|
|
|
44
44
|
- - ! '>'
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
46
|
version: '0.0'
|
|
47
|
-
- !ruby/object:Gem::Dependency
|
|
48
|
-
name: minitest
|
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
|
50
|
-
none: false
|
|
51
|
-
requirements:
|
|
52
|
-
- - ! '>='
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0'
|
|
55
|
-
type: :development
|
|
56
|
-
prerelease: false
|
|
57
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
58
|
-
none: false
|
|
59
|
-
requirements:
|
|
60
|
-
- - ! '>='
|
|
61
|
-
- !ruby/object:Gem::Version
|
|
62
|
-
version: '0'
|
|
63
47
|
- !ruby/object:Gem::Dependency
|
|
64
48
|
name: rack-test
|
|
65
49
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -76,22 +60,6 @@ dependencies:
|
|
|
76
60
|
- - ! '>='
|
|
77
61
|
- !ruby/object:Gem::Version
|
|
78
62
|
version: '0'
|
|
79
|
-
- !ruby/object:Gem::Dependency
|
|
80
|
-
name: rake
|
|
81
|
-
requirement: !ruby/object:Gem::Requirement
|
|
82
|
-
none: false
|
|
83
|
-
requirements:
|
|
84
|
-
- - ! '>='
|
|
85
|
-
- !ruby/object:Gem::Version
|
|
86
|
-
version: '0'
|
|
87
|
-
type: :development
|
|
88
|
-
prerelease: false
|
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
-
none: false
|
|
91
|
-
requirements:
|
|
92
|
-
- - ! '>='
|
|
93
|
-
- !ruby/object:Gem::Version
|
|
94
|
-
version: '0'
|
|
95
63
|
description:
|
|
96
64
|
email:
|
|
97
65
|
- brandur@mutelight.org
|