endorser 1.3.0
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Rakefile +5 -0
- data/endorser.gemspec +28 -0
- data/lib/endorser/client.rb +153 -0
- data/lib/endorser/errors/request_error.rb +8 -0
- data/lib/endorser/response.rb +55 -0
- data/lib/endorser/version.rb +5 -0
- data/lib/endorser.rb +15 -0
- data/spec/endorser/client_spec.rb +200 -0
- data/spec/endorser/response_spec.rb +172 -0
- data/spec/spec_helper.rb +12 -0
- metadata +149 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 08157f50cd6166fdac4c1963553e3194946a3322
|
4
|
+
data.tar.gz: fab80bd309b27b9bf427a76969eec0127a8bcca3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cd1c3a31b36d39294410df7e9b7255c42a08c8a20dce31681c8157a2958250e2d7e12311e1c1e5ce7214065942e440b815904dd9aaca10eb263241aab6941137
|
7
|
+
data.tar.gz: 5887df3d9f83139e26a0f0fb48e8c8200a1b669f82ea454276951b912db8aa652fb25fd444abbe42179d3d3a166c57f4d9136e6bd9dd58cd314120708e1e9521
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
endorse
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/endorser.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'endorser/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "endorser"
|
8
|
+
spec.version = Endorser::VERSION
|
9
|
+
spec.authors = ["Matthew Johnston", "Graham Christensen"]
|
10
|
+
spec.email = ["matt@zippykid.com", "graham@zippykid.com"]
|
11
|
+
spec.description = %q{A small rest client library that signs the requests}
|
12
|
+
spec.summary = %q{A small rest client library that signs the requests}
|
13
|
+
spec.homepage = "https://github.com/zippykid/endorser"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency("rest-client", "~> 1.6")
|
22
|
+
spec.add_dependency("endorser-receipt", "~> 1.0.0")
|
23
|
+
|
24
|
+
spec.add_development_dependency("bundler", "~> 1.3")
|
25
|
+
spec.add_development_dependency("rake")
|
26
|
+
spec.add_development_dependency("rspec", "~> 2.14.0")
|
27
|
+
spec.add_development_dependency("simplecov")
|
28
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module Endorser
|
2
|
+
|
3
|
+
class Client
|
4
|
+
attr_reader :key, :secret, :realm
|
5
|
+
|
6
|
+
def initialize(key, secret, realm)
|
7
|
+
@key = key
|
8
|
+
@secret = secret
|
9
|
+
@realm = realm
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [String] url
|
13
|
+
# @param [Hash] headers
|
14
|
+
# @raise [Sacred::Errors::Error] if an error is encountered with sacred
|
15
|
+
# @return [Hash]
|
16
|
+
def get(url, headers={})
|
17
|
+
execute({
|
18
|
+
method: :get,
|
19
|
+
url: url,
|
20
|
+
headers: headers
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [String] url
|
25
|
+
# @param [Hash] payload
|
26
|
+
# @param [Hash] headers
|
27
|
+
# @raise [Sacred::Errors::Error] if an error is encountered with sacred
|
28
|
+
# @return [Hash]
|
29
|
+
def post(url, payload={}, headers={})
|
30
|
+
execute({
|
31
|
+
method: :post,
|
32
|
+
url: url,
|
33
|
+
payload: payload,
|
34
|
+
headers: headers
|
35
|
+
})
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param [String] url
|
39
|
+
# @param [Hash] payload
|
40
|
+
# @param [Hash] headers
|
41
|
+
# @raise [Sacred::Errors::Error] if an error is encountered with sacred
|
42
|
+
# @return [Hash]
|
43
|
+
def put(url, payload={}, headers={})
|
44
|
+
execute({
|
45
|
+
method: :put,
|
46
|
+
url: url,
|
47
|
+
payload: payload,
|
48
|
+
headers: headers
|
49
|
+
})
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param [String] url
|
53
|
+
# @param [Hash] headers
|
54
|
+
# @raise [Sacred::Errors::Error] if an error is encountered with sacred
|
55
|
+
# @return [Hash]
|
56
|
+
def delete(url, headers={})
|
57
|
+
execute({
|
58
|
+
method: :delete,
|
59
|
+
url: url,
|
60
|
+
headers: headers
|
61
|
+
})
|
62
|
+
end
|
63
|
+
|
64
|
+
# Wrapper around RestClient::Request.execute method
|
65
|
+
#
|
66
|
+
# @param [Hash] args
|
67
|
+
# @raise [Sacred::Errors::Error] when the request fails
|
68
|
+
# @return [Hash]
|
69
|
+
def execute(args={})
|
70
|
+
RestClient::Request.execute(signed_request(args)) do |response, request, result, &block|
|
71
|
+
Endorser::Response.new(response, request)
|
72
|
+
end
|
73
|
+
rescue RestClient::Exception => error
|
74
|
+
raise Endorser::RequestError.new(error)
|
75
|
+
end
|
76
|
+
|
77
|
+
def signed_request(args={})
|
78
|
+
if args[:headers].nil?
|
79
|
+
args[:headers] = Hash.new
|
80
|
+
end
|
81
|
+
|
82
|
+
headers = args[:headers]
|
83
|
+
headers[:raw_response] = true
|
84
|
+
headers[:content_type] = "application/json;q=0.1;version=1, */*;q=0.0;version=1"
|
85
|
+
|
86
|
+
headers['ZK-Date'] = Time.now.httpdate
|
87
|
+
headers['ZK-Nonce'] = SecureRandom.uuid
|
88
|
+
|
89
|
+
receipt = build_receipt(args)
|
90
|
+
|
91
|
+
signable_headers(headers).each do |k,v|
|
92
|
+
receipt.headers[k] = v
|
93
|
+
end
|
94
|
+
|
95
|
+
digest = OpenSSL::Digest::Digest.new('sha1')
|
96
|
+
validation = OpenSSL::HMAC.hexdigest(digest, secret, receipt.to_s)
|
97
|
+
|
98
|
+
headers["Authorization"] = "#{realm} #{key}:#{validation}"
|
99
|
+
|
100
|
+
args
|
101
|
+
end
|
102
|
+
|
103
|
+
def build_receipt(args={})
|
104
|
+
headers = args[:headers]
|
105
|
+
method = args[:method].to_s
|
106
|
+
url = args[:url]
|
107
|
+
|
108
|
+
receipt = Endorser::Receipt.new
|
109
|
+
receipt.host = host(url)
|
110
|
+
receipt.uri = uri_path_and_query(url)
|
111
|
+
receipt.request_method = method
|
112
|
+
receipt.api_key = key
|
113
|
+
receipt.api_secret = secret
|
114
|
+
receipt.content_type = headers['Content-Type']
|
115
|
+
receipt.body = RestClient::Payload.generate(args[:payload]).to_s
|
116
|
+
receipt
|
117
|
+
end
|
118
|
+
|
119
|
+
def uri_path_and_query(url)
|
120
|
+
uri = URI(url)
|
121
|
+
if uri.query.nil?
|
122
|
+
uri.path
|
123
|
+
else
|
124
|
+
[uri.path, '?', uri.query].join
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def host(url)
|
129
|
+
uri = URI(url)
|
130
|
+
value = [uri.scheme, '://', uri.host]
|
131
|
+
|
132
|
+
if include_port?(uri)
|
133
|
+
value += [':', uri.port.to_s]
|
134
|
+
end
|
135
|
+
|
136
|
+
value.join
|
137
|
+
end
|
138
|
+
|
139
|
+
def include_port?(uri)
|
140
|
+
(uri.scheme != 'http' || uri.port != 80) && (uri.scheme != 'https' || uri.port != 443)
|
141
|
+
end
|
142
|
+
|
143
|
+
def signable_headers(headers)
|
144
|
+
headers.select { |k,v|
|
145
|
+
k.downcase =~ /^zk-/
|
146
|
+
}.sort_by { |k,v|
|
147
|
+
k.to_s.downcase
|
148
|
+
}
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Endorser
|
2
|
+
class Response
|
3
|
+
attr_reader :request, :raw
|
4
|
+
|
5
|
+
def initialize(raw, request)
|
6
|
+
@raw = raw
|
7
|
+
@request = request
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Hash]
|
11
|
+
def headers
|
12
|
+
raw.raw_headers
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Hash]
|
16
|
+
def cookies
|
17
|
+
raw.cookies
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [String]
|
21
|
+
def body
|
22
|
+
raw.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Integer]
|
26
|
+
def code
|
27
|
+
raw.code
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Boolean]
|
31
|
+
def informational?
|
32
|
+
code.between?(100, 199)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Boolean]
|
36
|
+
def success?
|
37
|
+
code.between?(200, 299)
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Boolean]
|
41
|
+
def redirection?
|
42
|
+
code.between?(300, 399)
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Boolean]
|
46
|
+
def client_error?
|
47
|
+
code.between?(400, 499)
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [Boolean]
|
51
|
+
def server_error?
|
52
|
+
code.between?(500, 599)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/endorser.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'time'
|
3
|
+
require 'securerandom'
|
4
|
+
require 'rest_client'
|
5
|
+
|
6
|
+
require 'endorser/version'
|
7
|
+
|
8
|
+
module Endorser
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'endorser/errors/request_error'
|
13
|
+
require 'endorser/response'
|
14
|
+
require 'endorser/receipt'
|
15
|
+
require 'endorser/client'
|
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Endorser::Client do
|
4
|
+
let(:client) { Endorser::Client.new('abc', '123', 'My Realm') }
|
5
|
+
|
6
|
+
describe '#initialize' do
|
7
|
+
subject { client }
|
8
|
+
its(:key) { should eq('abc') }
|
9
|
+
its(:secret) { should eq('123') }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#get' do
|
13
|
+
it 'should execute a GET request' do
|
14
|
+
url = 'http://localhost:3000/'
|
15
|
+
headers = { data: 'headers' }
|
16
|
+
client.stub(execute: true)
|
17
|
+
|
18
|
+
client.get(url, headers)
|
19
|
+
|
20
|
+
expect(client).to have_received(:execute).with({
|
21
|
+
method: :get,
|
22
|
+
url: url,
|
23
|
+
headers: headers
|
24
|
+
})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#put' do
|
29
|
+
it 'should execute a PUT request' do
|
30
|
+
url = 'http://localhost:3000/'
|
31
|
+
payload = { data: 'payload'}
|
32
|
+
headers = { data: 'headers' }
|
33
|
+
client.stub(execute: true)
|
34
|
+
|
35
|
+
client.put(url, payload, headers)
|
36
|
+
|
37
|
+
expect(client).to have_received(:execute).with({
|
38
|
+
method: :put,
|
39
|
+
url: url,
|
40
|
+
headers: headers,
|
41
|
+
payload: payload
|
42
|
+
})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#post' do
|
47
|
+
it 'should execute a POST request' do
|
48
|
+
url = 'http://localhost:3000/'
|
49
|
+
payload = { data: 'payload'}
|
50
|
+
headers = { data: 'headers' }
|
51
|
+
client.stub(execute: true)
|
52
|
+
|
53
|
+
client.post(url, payload, headers)
|
54
|
+
|
55
|
+
expect(client).to have_received(:execute).with({
|
56
|
+
method: :post,
|
57
|
+
url: url,
|
58
|
+
headers: headers,
|
59
|
+
payload: payload
|
60
|
+
})
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#delete' do
|
65
|
+
it 'should execute a DELETE request' do
|
66
|
+
url = 'http://localhost:3000/'
|
67
|
+
headers = { data: 'headers' }
|
68
|
+
client.stub(execute: true)
|
69
|
+
|
70
|
+
client.delete(url, headers)
|
71
|
+
|
72
|
+
expect(client).to have_received(:execute).with({
|
73
|
+
method: :delete,
|
74
|
+
url: url,
|
75
|
+
headers: headers
|
76
|
+
})
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#signed_request' do
|
81
|
+
context 'when it is a GET request' do
|
82
|
+
it 'should sign the request' do
|
83
|
+
args = {
|
84
|
+
method: :get,
|
85
|
+
url: 'http://localhost:3000'
|
86
|
+
}
|
87
|
+
response = client.signed_request(args)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe '#uri_path_and_query' do
|
93
|
+
context 'when the url is "http://example.com:3000/"' do
|
94
|
+
let(:url) { "http://localhost:3000/" }
|
95
|
+
subject { client.uri_path_and_query(url) }
|
96
|
+
it { should eq("/")}
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when the url is "http://example.com/something/different"' do
|
100
|
+
let(:url) { "http://example.com/something/different" }
|
101
|
+
subject { client.uri_path_and_query(url) }
|
102
|
+
it { should eq("/something/different")}
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'when the url is "http://example.com:3000/?q=abc"' do
|
106
|
+
let(:url) { "http://localhost:3000/?q=abc" }
|
107
|
+
subject { client.uri_path_and_query(url) }
|
108
|
+
it { should eq("/?q=abc")}
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'when the url is "http://example.com/something/different?q=abc"' do
|
112
|
+
let(:url) { "http://example.com/something/different?q=abc" }
|
113
|
+
subject { client.uri_path_and_query(url) }
|
114
|
+
it { should eq("/something/different?q=abc")}
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#host' do
|
119
|
+
context 'when the url is "http://example.com:3000/"' do
|
120
|
+
let(:url) { "http://localhost:3000/" }
|
121
|
+
subject { client.host(url) }
|
122
|
+
it { should eq("http://localhost:3000")}
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'when the url is "https://example.com/"' do
|
126
|
+
let(:url) { "https://example.com/" }
|
127
|
+
subject { client.host(url) }
|
128
|
+
it { should eq("https://example.com")}
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'when the url is "http://example.com/something/different"' do
|
132
|
+
let(:url) { "http://example.com/something/different" }
|
133
|
+
subject { client.host(url) }
|
134
|
+
it { should eq("http://example.com")}
|
135
|
+
end
|
136
|
+
|
137
|
+
context 'when the url is "http://example.com:3000/something/different"' do
|
138
|
+
let(:url) { "http://example.com:3000/something/different" }
|
139
|
+
subject { client.host(url) }
|
140
|
+
it { should eq("http://example.com:3000")}
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe '#include_port?' do
|
145
|
+
context 'when the scheme is http' do
|
146
|
+
context 'and when the port is 80' do
|
147
|
+
let(:uri) { double('URI', scheme: 'http', port: 80)}
|
148
|
+
subject { client.include_port?(uri) }
|
149
|
+
it { should be_false }
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'and when the port is 443' do
|
153
|
+
let(:uri) { double('URI', scheme: 'http', port: 443)}
|
154
|
+
subject { client.include_port?(uri) }
|
155
|
+
it { should be_true }
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
context 'when the scheme is https' do
|
160
|
+
context 'and when the port is 80' do
|
161
|
+
let(:uri) { double('URI', scheme: 'https', port: 80)}
|
162
|
+
subject { client.include_port?(uri) }
|
163
|
+
it { should be_true }
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'and when the port is 443' do
|
167
|
+
let(:uri) { double('URI', scheme: 'https', port: 443)}
|
168
|
+
subject { client.include_port?(uri) }
|
169
|
+
it { should be_false }
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context 'when the scheme is something' do
|
174
|
+
context 'and when the port is 80' do
|
175
|
+
let(:uri) { double('URI', scheme: 'something', port: 80)}
|
176
|
+
subject { client.include_port?(uri) }
|
177
|
+
it { should be_true }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe '#build_receipt' do
|
183
|
+
def args
|
184
|
+
{
|
185
|
+
method: :post,
|
186
|
+
headers: {},
|
187
|
+
url: 'http://example.com',
|
188
|
+
payload: { data: 'here', another: 'set' }
|
189
|
+
}
|
190
|
+
end
|
191
|
+
subject { client.build_receipt(args) }
|
192
|
+
|
193
|
+
it { should be_a(Endorser::Receipt) }
|
194
|
+
its(:host) { should eq("http://example.com") }
|
195
|
+
its(:request_method) { should eq('POST') }
|
196
|
+
its(:body) { should eq('data=here&another=set') }
|
197
|
+
its(:body_md5) { should eq('f4a4a0348d64714e94a3360af1dc614c') }
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Endorser::Response do
|
4
|
+
|
5
|
+
describe '#initialize' do
|
6
|
+
let(:raw) { double('RestClient::RawResponse') }
|
7
|
+
let(:request) { double('RestClient::Request') }
|
8
|
+
|
9
|
+
subject { Endorser::Response.new(raw, request) }
|
10
|
+
|
11
|
+
its(:raw) { should eq(raw) }
|
12
|
+
its(:request) { should eq(request) }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#headers' do
|
16
|
+
let(:raw_headers) { double('Hash') }
|
17
|
+
let(:raw) { double('RestClient::RawResponse', raw_headers: raw_headers) }
|
18
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
19
|
+
|
20
|
+
subject { response.headers }
|
21
|
+
it { should eq(raw_headers) }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#cookies' do
|
25
|
+
let(:cookies) { double('Hash') }
|
26
|
+
let(:raw) { double('RestClient::RawResponse', cookies: cookies) }
|
27
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
28
|
+
|
29
|
+
subject { response.cookies }
|
30
|
+
it { should eq(cookies) }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#code' do
|
34
|
+
let(:raw) { double('RestClient::RawResponse', code: 200) }
|
35
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
36
|
+
|
37
|
+
subject { response.code }
|
38
|
+
it { should eq(200) }
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
describe '#informational?' do
|
43
|
+
let(:raw) { double('RestClient::RawResponse') }
|
44
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
45
|
+
|
46
|
+
context 'when the response code is 100' do
|
47
|
+
before { response.stub(code: 100) }
|
48
|
+
subject { response.informational? }
|
49
|
+
it { should be_true }
|
50
|
+
end
|
51
|
+
context 'when the response code is 199' do
|
52
|
+
before { response.stub(code: 199) }
|
53
|
+
subject { response.informational? }
|
54
|
+
it { should be_true }
|
55
|
+
end
|
56
|
+
context 'when the response code is 99' do
|
57
|
+
before { response.stub(code: 99) }
|
58
|
+
subject { response.informational? }
|
59
|
+
it { should be_false }
|
60
|
+
end
|
61
|
+
context 'when the response code is 200' do
|
62
|
+
before { response.stub(code: 200) }
|
63
|
+
subject { response.informational? }
|
64
|
+
it { should be_false }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#success?' do
|
69
|
+
let(:raw) { double('RestClient::RawResponse') }
|
70
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
71
|
+
|
72
|
+
context 'when the response code is 200' do
|
73
|
+
before { response.stub(code: 200) }
|
74
|
+
subject { response.success? }
|
75
|
+
it { should be_true }
|
76
|
+
end
|
77
|
+
context 'when the response code is 299' do
|
78
|
+
before { response.stub(code: 299) }
|
79
|
+
subject { response.success? }
|
80
|
+
it { should be_true }
|
81
|
+
end
|
82
|
+
context 'when the response code is 199' do
|
83
|
+
before { response.stub(code: 199) }
|
84
|
+
subject { response.success? }
|
85
|
+
it { should be_false }
|
86
|
+
end
|
87
|
+
context 'when the response code is 300' do
|
88
|
+
before { response.stub(code: 300) }
|
89
|
+
subject { response.success? }
|
90
|
+
it { should be_false }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '#redirection?' do
|
95
|
+
let(:raw) { double('RestClient::RawResponse') }
|
96
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
97
|
+
|
98
|
+
context 'when the response code is 300' do
|
99
|
+
before { response.stub(code: 300) }
|
100
|
+
subject { response.redirection? }
|
101
|
+
it { should be_true }
|
102
|
+
end
|
103
|
+
context 'when the response code is 399' do
|
104
|
+
before { response.stub(code: 399) }
|
105
|
+
subject { response.redirection? }
|
106
|
+
it { should be_true }
|
107
|
+
end
|
108
|
+
context 'when the response code is 299' do
|
109
|
+
before { response.stub(code: 299) }
|
110
|
+
subject { response.redirection? }
|
111
|
+
it { should be_false }
|
112
|
+
end
|
113
|
+
context 'when the response code is 400' do
|
114
|
+
before { response.stub(code: 400) }
|
115
|
+
subject { response.redirection? }
|
116
|
+
it { should be_false }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe '#client_error?' do
|
121
|
+
let(:raw) { double('RestClient::RawResponse') }
|
122
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
123
|
+
|
124
|
+
context 'when the response code is 400' do
|
125
|
+
before { response.stub(code: 400) }
|
126
|
+
subject { response.client_error? }
|
127
|
+
it { should be_true }
|
128
|
+
end
|
129
|
+
context 'when the response code is 499' do
|
130
|
+
before { response.stub(code: 499) }
|
131
|
+
subject { response.client_error? }
|
132
|
+
it { should be_true }
|
133
|
+
end
|
134
|
+
context 'when the response code is 399' do
|
135
|
+
before { response.stub(code: 399) }
|
136
|
+
subject { response.client_error? }
|
137
|
+
it { should be_false }
|
138
|
+
end
|
139
|
+
context 'when the response code is 500' do
|
140
|
+
before { response.stub(code: 500) }
|
141
|
+
subject { response.client_error? }
|
142
|
+
it { should be_false }
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#server_error?' do
|
147
|
+
let(:raw) { double('RestClient::RawResponse') }
|
148
|
+
let(:response) { Endorser::Response.new(raw, nil) }
|
149
|
+
|
150
|
+
context 'when the response code is 500' do
|
151
|
+
before { response.stub(code: 500) }
|
152
|
+
subject { response.server_error? }
|
153
|
+
it { should be_true }
|
154
|
+
end
|
155
|
+
context 'when the response code is 599' do
|
156
|
+
before { response.stub(code: 599) }
|
157
|
+
subject { response.server_error? }
|
158
|
+
it { should be_true }
|
159
|
+
end
|
160
|
+
context 'when the response code is 499' do
|
161
|
+
before { response.stub(code: 499) }
|
162
|
+
subject { response.server_error? }
|
163
|
+
it { should be_false }
|
164
|
+
end
|
165
|
+
context 'when the response code is 600' do
|
166
|
+
before { response.stub(code: 600) }
|
167
|
+
subject { response.server_error? }
|
168
|
+
it { should be_false }
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: endorser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Johnston
|
8
|
+
- Graham Christensen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-31 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rest-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.6'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.6'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: endorser-receipt
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.0.0
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.3'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.3'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 2.14.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ~>
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 2.14.0
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: simplecov
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
description: A small rest client library that signs the requests
|
99
|
+
email:
|
100
|
+
- matt@zippykid.com
|
101
|
+
- graham@zippykid.com
|
102
|
+
executables: []
|
103
|
+
extensions: []
|
104
|
+
extra_rdoc_files: []
|
105
|
+
files:
|
106
|
+
- .gitignore
|
107
|
+
- .rspec
|
108
|
+
- .ruby-gemset
|
109
|
+
- .ruby-version
|
110
|
+
- .travis.yml
|
111
|
+
- Gemfile
|
112
|
+
- Rakefile
|
113
|
+
- endorser.gemspec
|
114
|
+
- lib/endorser.rb
|
115
|
+
- lib/endorser/client.rb
|
116
|
+
- lib/endorser/errors/request_error.rb
|
117
|
+
- lib/endorser/response.rb
|
118
|
+
- lib/endorser/version.rb
|
119
|
+
- spec/endorser/client_spec.rb
|
120
|
+
- spec/endorser/response_spec.rb
|
121
|
+
- spec/spec_helper.rb
|
122
|
+
homepage: https://github.com/zippykid/endorser
|
123
|
+
licenses:
|
124
|
+
- MIT
|
125
|
+
metadata: {}
|
126
|
+
post_install_message:
|
127
|
+
rdoc_options: []
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirements: []
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 2.0.6
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: A small rest client library that signs the requests
|
146
|
+
test_files:
|
147
|
+
- spec/endorser/client_spec.rb
|
148
|
+
- spec/endorser/response_spec.rb
|
149
|
+
- spec/spec_helper.rb
|