airborne 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +53 -2
- data/airborne.gemspec +2 -2
- data/lib/airborne.rb +3 -0
- data/lib/airborne/base.rb +14 -10
- data/lib/airborne/rest_client_requester.rb +14 -2
- data/spec/airborne/client_requester_spec.rb +143 -15
- metadata +18 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4d361645e26853ce3f56827cc2bd1dbf0742f58d
|
4
|
+
data.tar.gz: ce83f9aa0ab23bcda5917e179e1c0b8525f805fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41aaab8803c8750dd2cc8d16043cc76d15b75d0cd3bd6df791f05703d42c8816a0d7fcc525bf699ec03e013ef6f17d5ae3dd9a87eedf0f59103da53f916e82a1
|
7
|
+
data.tar.gz: b99f18a689e857aa156de77471e7908b1859ac5e3afa83735c0154b17ffa416ad7c64642dc07204b7ba116f2c54070dfd444f091ff3ef915af1cc6fa4c47bce8
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Airborne
|
1
|
+
# Airborne
|
2
2
|
|
3
3
|
[![airborne travis](http://img.shields.io/travis/brooklynDev/airborne.svg?branch=master&style=flat-square)](https://travis-ci.org/brooklynDev/airborne)
|
4
4
|
[![airborne coveralls](http://img.shields.io/coveralls/brooklynDev/airborne/master.svg?style=flat-square)](https://coveralls.io/r/brooklynDev/airborne?branch=master)
|
@@ -156,6 +156,57 @@ For requests that require Query params you can pass a params hash into headers.
|
|
156
156
|
post 'http://example.com/api/v1/my_api', { }, { 'params' => {'param_key' => 'param_value' } }
|
157
157
|
```
|
158
158
|
|
159
|
+
### (Not) Verifying SSL Certificates
|
160
|
+
|
161
|
+
SSL certificate verification is enabled by default (specifically, `OpenSSL::SSL::VERIFY_PEER`).
|
162
|
+
|
163
|
+
Carefully consider how you use this. It's not a solution for getting around a failed SSL cert verification; rather, it's intended for testing systems that don't have a legitimate SSL cert, such as a development or test environment.
|
164
|
+
|
165
|
+
You can override this behavior per request:
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
verify_ssl = false
|
169
|
+
post 'http://example.com/api/v1/my_api', "Hello there!", { content_type: 'text/plain' }, verify_ssl
|
170
|
+
```
|
171
|
+
|
172
|
+
or with a global Airborne configuration:
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
Airborne.configure do |config|
|
176
|
+
config.verify_ssl = false # equivalent to OpenSSL::SSL::VERIFY_NONE
|
177
|
+
end
|
178
|
+
```
|
179
|
+
|
180
|
+
Note the per-request option always overrides the Airborne configuration:
|
181
|
+
|
182
|
+
```ruby
|
183
|
+
before do
|
184
|
+
Airborne.configuration.verify_ssl = false
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'will still verify the SSL certificate' do
|
188
|
+
verify_ssl = true
|
189
|
+
post 'http://example.com/api/v1/my_api', "Hello there!", { content_type: 'text/plain' }, verify_ssl
|
190
|
+
end
|
191
|
+
```
|
192
|
+
|
193
|
+
You can use the `verify_ssl` setting to override your global defaults in test blocks like this:
|
194
|
+
|
195
|
+
```ruby
|
196
|
+
describe 'test something', verify_ssl: false do
|
197
|
+
end
|
198
|
+
```
|
199
|
+
|
200
|
+
OR
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
describe 'test something' do
|
204
|
+
Airborne.configuration.verify_ssl = false
|
205
|
+
end
|
206
|
+
```
|
207
|
+
|
208
|
+
This feature currently isn't supported when testing loaded Rack applications (see "Testing Rack Applications" below). If you need to set `verify_ssl: false`, then we recommend starting your Rack app server and sending the `airborne` HTTP requests as you would when testing any other service.
|
209
|
+
|
159
210
|
## Testing Rack Applications
|
160
211
|
|
161
212
|
If you have an existing Rack application like `sinatra` or `grape` you can run Airborne against your application and test without actually having a server running. To do that, just specify your rack application in your Airborne configuration:
|
@@ -238,7 +289,7 @@ it 'should allow nested paths' do
|
|
238
289
|
end
|
239
290
|
```
|
240
291
|
|
241
|
-
|
292
|
+
Alternatively, if we only want to test `coordinates` we can dot into just the `coordinates`:
|
242
293
|
|
243
294
|
```ruby
|
244
295
|
it 'should allow nested paths' do
|
data/airborne.gemspec
CHANGED
@@ -2,7 +2,7 @@ require 'date'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'airborne'
|
5
|
-
s.version = '0.3.
|
5
|
+
s.version = '0.3.3'
|
6
6
|
s.date = Date.today.to_s
|
7
7
|
s.summary = 'RSpec driven API testing framework'
|
8
8
|
s.authors = ['Alex Friedman', 'Seth Pollack']
|
@@ -15,5 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_runtime_dependency 'rack-test', '< 2.0', '>= 1.1.0'
|
16
16
|
s.add_runtime_dependency 'rack'
|
17
17
|
s.add_runtime_dependency 'activesupport'
|
18
|
-
s.add_development_dependency 'webmock', '~>
|
18
|
+
s.add_development_dependency 'webmock', '~> 3'
|
19
19
|
end
|
data/lib/airborne.rb
CHANGED
@@ -15,11 +15,14 @@ RSpec.configure do |config|
|
|
15
15
|
config.add_setting :rack_app
|
16
16
|
config.add_setting :requester_type
|
17
17
|
config.add_setting :requester_module
|
18
|
+
config.add_setting :verify_ssl, default: true
|
18
19
|
config.before do |example|
|
19
20
|
config.match_expected = example.metadata[:match_expected].nil? ?
|
20
21
|
Airborne.configuration.match_expected_default? : example.metadata[:match_expected]
|
21
22
|
config.match_actual = example.metadata[:match_actual].nil? ?
|
22
23
|
Airborne.configuration.match_actual_default? : example.metadata[:match_actual]
|
24
|
+
config.verify_ssl = example.metadata[:verify_ssl].nil? ?
|
25
|
+
Airborne.configuration.verify_ssl? : example.metadata[:verify_ssl]
|
23
26
|
end
|
24
27
|
|
25
28
|
# Include last since it depends on the configuration already being added
|
data/lib/airborne/base.rb
CHANGED
@@ -29,24 +29,24 @@ module Airborne
|
|
29
29
|
RSpec.configuration
|
30
30
|
end
|
31
31
|
|
32
|
-
def get(url, headers = nil)
|
33
|
-
@response = make_request(:get, url, headers: headers)
|
32
|
+
def get(url, headers = nil, verify_ssl = base_verify_ssl)
|
33
|
+
@response = make_request(:get, url, headers: headers, verify_ssl: verify_ssl)
|
34
34
|
end
|
35
35
|
|
36
|
-
def post(url, post_body = nil, headers = nil)
|
37
|
-
@response = make_request(:post, url, body: post_body, headers: headers)
|
36
|
+
def post(url, post_body = nil, headers = nil, verify_ssl = base_verify_ssl)
|
37
|
+
@response = make_request(:post, url, body: post_body, headers: headers, verify_ssl: verify_ssl)
|
38
38
|
end
|
39
39
|
|
40
|
-
def patch(url, patch_body = nil, headers = nil)
|
41
|
-
@response = make_request(:patch, url, body: patch_body, headers: headers)
|
40
|
+
def patch(url, patch_body = nil, headers = nil, verify_ssl = base_verify_ssl)
|
41
|
+
@response = make_request(:patch, url, body: patch_body, headers: headers, verify_ssl: verify_ssl)
|
42
42
|
end
|
43
43
|
|
44
|
-
def put(url, put_body = nil, headers = nil)
|
45
|
-
@response = make_request(:put, url, body: put_body, headers: headers)
|
44
|
+
def put(url, put_body = nil, headers = nil, verify_ssl = base_verify_ssl)
|
45
|
+
@response = make_request(:put, url, body: put_body, headers: headers, verify_ssl: verify_ssl)
|
46
46
|
end
|
47
47
|
|
48
|
-
def delete(url, delete_body = nil, headers = nil)
|
49
|
-
@response = make_request(:delete, url, body: delete_body, headers: headers)
|
48
|
+
def delete(url, delete_body = nil, headers = nil, verify_ssl = base_verify_ssl)
|
49
|
+
@response = make_request(:delete, url, body: delete_body, headers: headers, verify_ssl: verify_ssl)
|
50
50
|
end
|
51
51
|
|
52
52
|
def head(url, headers = nil)
|
@@ -79,4 +79,8 @@ module Airborne
|
|
79
79
|
base = Airborne.configuration.base_url || ''
|
80
80
|
base + url
|
81
81
|
end
|
82
|
+
|
83
|
+
def base_verify_ssl
|
84
|
+
Airborne.configuration.verify_ssl || false
|
85
|
+
end
|
82
86
|
end
|
@@ -4,17 +4,29 @@ module Airborne
|
|
4
4
|
module RestClientRequester
|
5
5
|
def make_request(method, url, options = {})
|
6
6
|
headers = base_headers.merge(options[:headers] || {})
|
7
|
+
verify_ssl = options.fetch(:verify_ssl, true)
|
7
8
|
res = if method == :post || method == :patch || method == :put
|
8
9
|
begin
|
9
10
|
request_body = options[:body].nil? ? '' : options[:body]
|
10
11
|
request_body = request_body.to_json if is_json_request(headers)
|
11
|
-
RestClient.
|
12
|
+
RestClient::Request.execute(
|
13
|
+
method: method,
|
14
|
+
url: get_url(url),
|
15
|
+
payload: request_body,
|
16
|
+
headers: headers,
|
17
|
+
verify_ssl: verify_ssl
|
18
|
+
) { |response, request, result| response }
|
12
19
|
rescue RestClient::Exception => e
|
13
20
|
e.response
|
14
21
|
end
|
15
22
|
else
|
16
23
|
begin
|
17
|
-
RestClient.
|
24
|
+
RestClient::Request.execute(
|
25
|
+
method: method,
|
26
|
+
url: get_url(url),
|
27
|
+
headers: headers,
|
28
|
+
verify_ssl: verify_ssl
|
29
|
+
) { |response, request, result| response }
|
18
30
|
rescue RestClient::Exception => e
|
19
31
|
e.response
|
20
32
|
end
|
@@ -2,27 +2,36 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'client requester' do
|
4
4
|
before do
|
5
|
-
allow(RestClient).to receive(:
|
5
|
+
allow(RestClient::Request).to receive(:execute)
|
6
6
|
RSpec::Mocks.space.proxy_for(self).remove_stub_if_present(:get)
|
7
7
|
end
|
8
8
|
|
9
9
|
after do
|
10
|
-
allow(RestClient).to receive(:
|
11
|
-
Airborne.configure { |config| config.headers =
|
10
|
+
allow(RestClient::Request).to receive(:execute).and_call_original
|
11
|
+
Airborne.configure { |config| config.headers = {} }
|
12
|
+
Airborne.configure { |config| config.verify_ssl = true }
|
12
13
|
end
|
13
14
|
|
14
15
|
it 'should set :content_type to :json by default' do
|
15
16
|
get '/foo'
|
16
17
|
|
17
|
-
expect(RestClient).to have_received(:
|
18
|
-
|
18
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
19
|
+
method: :get,
|
20
|
+
url: 'http://www.example.com/foo',
|
21
|
+
headers: { content_type: :json },
|
22
|
+
verify_ssl: true
|
23
|
+
)
|
19
24
|
end
|
20
25
|
|
21
26
|
it 'should override headers with option[:headers]' do
|
22
27
|
get '/foo', { content_type: 'application/x-www-form-urlencoded' }
|
23
28
|
|
24
|
-
expect(RestClient).to have_received(:
|
25
|
-
|
29
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
30
|
+
method: :get,
|
31
|
+
url: 'http://www.example.com/foo',
|
32
|
+
headers: { content_type: 'application/x-www-form-urlencoded' },
|
33
|
+
verify_ssl: true
|
34
|
+
)
|
26
35
|
end
|
27
36
|
|
28
37
|
it 'should override headers with airborne config headers' do
|
@@ -30,28 +39,147 @@ describe 'client requester' do
|
|
30
39
|
|
31
40
|
get '/foo'
|
32
41
|
|
33
|
-
expect(RestClient).to have_received(:
|
34
|
-
|
42
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
43
|
+
method: :get,
|
44
|
+
url: 'http://www.example.com/foo',
|
45
|
+
headers: { content_type: 'text/plain' },
|
46
|
+
verify_ssl: true
|
47
|
+
)
|
35
48
|
end
|
36
49
|
|
37
50
|
it 'should serialize body to json when :content_type is (default) :json' do
|
38
51
|
post '/foo', { test: 'serialized' }
|
39
52
|
|
40
|
-
expect(RestClient).to have_received(:
|
41
|
-
|
53
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
54
|
+
method: :post,
|
55
|
+
url: 'http://www.example.com/foo',
|
56
|
+
payload: { test: 'serialized' }.to_json,
|
57
|
+
headers: { content_type: :json },
|
58
|
+
verify_ssl: true
|
59
|
+
)
|
42
60
|
end
|
43
61
|
|
44
62
|
it 'should serialize body to json when :content_type is any enhanced JSON content type' do
|
45
63
|
post '/foo', { test: 'serialized' }, { content_type: 'application/vnd.airborne.2+json' }
|
46
64
|
|
47
|
-
expect(RestClient).to have_received(:
|
48
|
-
|
65
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
66
|
+
method: :post,
|
67
|
+
url: 'http://www.example.com/foo',
|
68
|
+
payload: { test: 'serialized' }.to_json,
|
69
|
+
headers: { content_type: 'application/vnd.airborne.2+json' },
|
70
|
+
verify_ssl: true
|
71
|
+
)
|
49
72
|
end
|
50
73
|
|
51
74
|
it 'should not serialize body to json when :content_type does not match JSON' do
|
52
75
|
post '/foo', { test: 'not serialized' }, { content_type: 'text/plain' }
|
53
76
|
|
54
|
-
expect(RestClient).to have_received(:
|
55
|
-
|
77
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
78
|
+
method: :post,
|
79
|
+
url: 'http://www.example.com/foo',
|
80
|
+
payload: { test: 'not serialized' },
|
81
|
+
headers: { content_type: 'text/plain' },
|
82
|
+
verify_ssl: true
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'verify_ssl' do
|
87
|
+
it 'should be true by default' do
|
88
|
+
get '/foo'
|
89
|
+
|
90
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
91
|
+
method: :get,
|
92
|
+
url: 'http://www.example.com/foo',
|
93
|
+
headers: { content_type: :json },
|
94
|
+
verify_ssl: true
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should be set by airborne config' do
|
99
|
+
Airborne.configure { |config| config.verify_ssl = false }
|
100
|
+
|
101
|
+
get '/foo'
|
102
|
+
|
103
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
104
|
+
method: :get,
|
105
|
+
url: 'http://www.example.com/foo',
|
106
|
+
headers: { content_type: :json },
|
107
|
+
verify_ssl: false
|
108
|
+
)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should be overriden with options[:verify_ssl]' do
|
112
|
+
get '/foo', nil, false
|
113
|
+
|
114
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
115
|
+
method: :get,
|
116
|
+
url: 'http://www.example.com/foo',
|
117
|
+
headers: { content_type: :json },
|
118
|
+
verify_ssl: false
|
119
|
+
)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should override airborne config with options[:verify_ssl]' do
|
123
|
+
Airborne.configure { |config| config.verify_ssl = false }
|
124
|
+
|
125
|
+
get '/foo', nil, true
|
126
|
+
|
127
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
128
|
+
method: :get,
|
129
|
+
url: 'http://www.example.com/foo',
|
130
|
+
headers: { content_type: :json },
|
131
|
+
verify_ssl: true
|
132
|
+
)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should interpret airborne "config.verify_ssl = nil" as false' do
|
136
|
+
Airborne.configure { |config| config.verify_ssl = nil }
|
137
|
+
|
138
|
+
get '/foo'
|
139
|
+
|
140
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
141
|
+
method: :get,
|
142
|
+
url: 'http://www.example.com/foo',
|
143
|
+
headers: { content_type: :json },
|
144
|
+
verify_ssl: false
|
145
|
+
)
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'rspec metadata', verify_ssl: false do
|
149
|
+
it 'should override the base airborne config with the rspec metadata' do
|
150
|
+
get '/foo'
|
151
|
+
|
152
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
153
|
+
method: :get,
|
154
|
+
url: 'http://www.example.com/foo',
|
155
|
+
headers: { content_type: :json },
|
156
|
+
verify_ssl: false
|
157
|
+
)
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'should be overriden with options[:verify_ssl]' do
|
161
|
+
get '/foo', nil, true
|
162
|
+
|
163
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
164
|
+
method: :get,
|
165
|
+
url: 'http://www.example.com/foo',
|
166
|
+
headers: { content_type: :json },
|
167
|
+
verify_ssl: true
|
168
|
+
)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should be overriden by supplied airborne config' do
|
172
|
+
Airborne.configure { |config| config.verify_ssl = true }
|
173
|
+
|
174
|
+
get '/foo'
|
175
|
+
|
176
|
+
expect(RestClient::Request).to have_received(:execute).with(
|
177
|
+
method: :get,
|
178
|
+
url: 'http://www.example.com/foo',
|
179
|
+
headers: { content_type: :json },
|
180
|
+
verify_ssl: true
|
181
|
+
)
|
182
|
+
end
|
183
|
+
end
|
56
184
|
end
|
57
185
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airborne
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Friedman
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-03
|
12
|
+
date: 2019-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -29,42 +29,42 @@ dependencies:
|
|
29
29
|
name: rest-client
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: 2.0.2
|
35
32
|
- - "<"
|
36
33
|
- !ruby/object:Gem::Version
|
37
34
|
version: '3.0'
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.0.2
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
|
-
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version: 2.0.2
|
45
42
|
- - "<"
|
46
43
|
- !ruby/object:Gem::Version
|
47
44
|
version: '3.0'
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.0.2
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rack-test
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.1.0
|
55
52
|
- - "<"
|
56
53
|
- !ruby/object:Gem::Version
|
57
54
|
version: '2.0'
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 1.1.0
|
58
58
|
type: :runtime
|
59
59
|
prerelease: false
|
60
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
-
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 1.1.0
|
65
62
|
- - "<"
|
66
63
|
- !ruby/object:Gem::Version
|
67
64
|
version: '2.0'
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 1.1.0
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
name: rack
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,14 +99,14 @@ dependencies:
|
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
102
|
+
version: '3'
|
103
103
|
type: :development
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
109
|
+
version: '3'
|
110
110
|
description:
|
111
111
|
email:
|
112
112
|
- a.friedman07@gmail.com
|
@@ -200,7 +200,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
200
|
- !ruby/object:Gem::Version
|
201
201
|
version: '0'
|
202
202
|
requirements: []
|
203
|
-
|
203
|
+
rubyforge_project:
|
204
|
+
rubygems_version: 2.6.11
|
204
205
|
signing_key:
|
205
206
|
specification_version: 4
|
206
207
|
summary: RSpec driven API testing framework
|