airborne 0.0.18 → 0.0.19

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c02499ba105b2a0cf64b2b3f66b3cb0603cdecff
4
- data.tar.gz: 80406ace55d569bbabfd7a103f0135e4a37357b5
3
+ metadata.gz: 2333bbac632fbb30333040aa0aa6bab7dc691118
4
+ data.tar.gz: 4bf80a6bc014b5d8fb7a41943ad53299670a111b
5
5
  SHA512:
6
- metadata.gz: 2a1e7465a8e9b57cd98b8ac94c93f6cf0c890cf660905da806c3a768ef36a0f897a143c35afa52a704b6a2ed9bf8b0e4b3a87825e7c47e4b134ae74baf8caadd
7
- data.tar.gz: 4bbccbf924040c02119972fab3582cab6b71119d8696e0a385f8840389f3023b8ceb23af6d91606d34a50fa98416a081b015b9901573fe04c665d2a257e49993
6
+ metadata.gz: 014872f890830f5941401069bb62d17a1fb3006d3bb92125be375c2f32f114fc801f0edd26a3c9bee8e0fe16e7c997aeb6d509508c9c68fb27fc89a691fca826
7
+ data.tar.gz: 02d23b76acb06cb0032ec63847bfaa9d06d1edb473e84d32d3e97fdf1307e197158f3e495ec2ede44df5ae01c5fc5ac9561719feca6a7a66d6ed491a0719c762
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/Gemfile CHANGED
@@ -2,7 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rspec'
4
4
  gem 'rest-client'
5
+ gem 'rack-test'
6
+ gem 'activesupport'
7
+ gem 'coveralls', require: false
5
8
 
6
9
  group :test do
7
10
  gem 'webmock'
8
- end
11
+ gem 'sinatra'
12
+ end
data/Gemfile.lock CHANGED
@@ -1,12 +1,34 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
+ activesupport (4.1.6)
5
+ i18n (~> 0.6, >= 0.6.9)
6
+ json (~> 1.7, >= 1.7.7)
7
+ minitest (~> 5.1)
8
+ thread_safe (~> 0.1)
9
+ tzinfo (~> 1.1)
4
10
  addressable (2.3.6)
11
+ coveralls (0.7.1)
12
+ multi_json (~> 1.3)
13
+ rest-client
14
+ simplecov (>= 0.7)
15
+ term-ansicolor
16
+ thor
5
17
  crack (0.4.2)
6
18
  safe_yaml (~> 1.0.0)
7
19
  diff-lcs (1.2.5)
20
+ docile (1.1.5)
21
+ i18n (0.6.11)
22
+ json (1.8.1)
8
23
  mime-types (2.3)
24
+ minitest (5.4.1)
25
+ multi_json (1.10.1)
9
26
  netrc (0.7.7)
27
+ rack (1.5.2)
28
+ rack-protection (1.5.3)
29
+ rack
30
+ rack-test (0.6.2)
31
+ rack (>= 1.0)
10
32
  rest-client (1.7.2)
11
33
  mime-types (>= 1.16, < 3.0)
12
34
  netrc (~> 0.7)
@@ -23,6 +45,23 @@ GEM
23
45
  rspec-support (~> 3.1.0)
24
46
  rspec-support (3.1.0)
25
47
  safe_yaml (1.0.3)
48
+ simplecov (0.9.0)
49
+ docile (~> 1.1.0)
50
+ multi_json
51
+ simplecov-html (~> 0.8.0)
52
+ simplecov-html (0.8.0)
53
+ sinatra (1.4.5)
54
+ rack (~> 1.4)
55
+ rack-protection (~> 1.4)
56
+ tilt (~> 1.3, >= 1.3.4)
57
+ term-ansicolor (1.3.0)
58
+ tins (~> 1.0)
59
+ thor (0.19.1)
60
+ thread_safe (0.3.4)
61
+ tilt (1.4.1)
62
+ tins (1.3.3)
63
+ tzinfo (1.2.2)
64
+ thread_safe (~> 0.1)
26
65
  webmock (1.18.0)
27
66
  addressable (>= 2.3.6)
28
67
  crack (>= 0.3.2)
@@ -31,6 +70,10 @@ PLATFORMS
31
70
  ruby
32
71
 
33
72
  DEPENDENCIES
73
+ activesupport
74
+ coveralls
75
+ rack-test
34
76
  rest-client
35
77
  rspec
78
+ sinatra
36
79
  webmock
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
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
+ [![airborne coveralls](http://img.shields.io/coveralls/brooklynDev/airborne/master.svg?style=flat-square)](https://coveralls.io/r/brooklynDev/airborne?branch=master)
4
5
  [![airborne gem version](http://img.shields.io/gem/v/airborne.svg?style=flat-square)](http://rubygems.org/gems/airborne)
5
6
  [![airbore gem downloads](http://img.shields.io/gem/dt/airborne.svg?style=flat-square)](http://rubygems.org/gems/airborne)
6
7
  [![airborne gem stable downloads](http://img.shields.io/gem/dv/airborne/stable.svg?style=flat-square)](http://rubygems.org/gems/airborne)
@@ -66,7 +67,7 @@ Additionally, if an entire object could be null, but you'd still want to test th
66
67
  ```ruby
67
68
  it 'should allow optional nested hash' do
68
69
  get '/simple_path_get' #may or may not return coordinates
69
- expect_json_types("address.coordinates", optional({lattitude: :float, longitutde: :float}))
70
+ expect_json_types("address.coordinates", optional({latitude: :float, longitude: :float}))
70
71
  end
71
72
  ```
72
73
 
@@ -90,7 +91,7 @@ Airborne uses `rest_client` to make the HTTP request, and supports all HTTP verb
90
91
  * `body` - The raw HTTP body returned from the request
91
92
  * `json_body` - A symbolized hash representation of the JSON returned by the request
92
93
 
93
- Fo example:
94
+ For example:
94
95
 
95
96
  ```ruby
96
97
  it 'should validate types' do
@@ -111,6 +112,18 @@ For requests that require a body (`post`, `put`, `patch`) you can pass the body
111
112
  ```ruby
112
113
  post 'http://example.com/api/v1/my_api', {:name => 'John Doe'}, {'x-auth-token' => 'my_token'}
113
114
  ```
115
+
116
+ ##Testing Rack Applications
117
+
118
+ 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:
119
+
120
+ ```ruby
121
+ Airborne.configure do |config|
122
+ config.rack_app = MySinatraApp
123
+ end
124
+ ```
125
+
126
+ Under the covers, Airborne uses [rack-test](https://github.com/brynary/rack-test) to make the requests. (Rails applications are still not working correctly, support for Rails will come soon!)
114
127
 
115
128
  ##API
116
129
 
@@ -123,7 +136,7 @@ post 'http://example.com/api/v1/my_api', {:name => 'John Doe'}, {'x-auth-token'
123
136
 
124
137
  ##Path Matching
125
138
 
126
- When calling `expect_json_types`, `expect_json` or `expect_json_keys` you can optionaly specify a path as a first parameter.
139
+ When calling `expect_json_types`, `expect_json` or `expect_json_keys` you can optionally specify a path as a first parameter.
127
140
 
128
141
  For example, if our API returns the following JSON:
129
142
 
@@ -135,7 +148,7 @@ For example, if our API returns the following JSON:
135
148
  "city": "Roswell",
136
149
  "state": "NM",
137
150
  "coordinates": {
138
- "lattitude": 33.3872,
151
+ "latitude": 33.3872,
139
152
  "longitude": 104.5281
140
153
  }
141
154
  }
@@ -150,17 +163,25 @@ describe 'path spec' do
150
163
  get 'http://example.com/api/v1/simple_path_get'
151
164
  expect_json_types('address', {street: :string, city: :string, state: :string, coordinates: :object })
152
165
  #or this
153
- expect_json_types('address', {street: :string, city: :string, state: :string, coordinates: { lattitude: :float, longitude: :float } })
166
+ expect_json_types('address', {street: :string, city: :string, state: :string, coordinates: { latitude: :float, longitude: :float } })
154
167
  end
155
168
  end
156
169
  ```
170
+ Or, to test the existence of specific keys:
171
+
172
+ ```ruby
173
+ it 'should allow nested paths' do
174
+ get 'http://example.com/api/v1/simple_path_get'
175
+ expect_json_keys('address', [:street, :city, :state, :coordinates])
176
+ end
177
+ ```
157
178
 
158
179
  Alternativley, if we only want to test `coordinates` we can dot into just the `coordinates`:
159
180
 
160
181
  ```ruby
161
182
  it 'should allow nested paths' do
162
183
  get 'http://example.com/api/v1/simple_path_get'
163
- expect_json('address.coordinates', {lattitude: 33.3872, longitutde: 104.5281} )
184
+ expect_json('address.coordinates', {latitude: 33.3872, longitude: 104.5281} )
164
185
  end
165
186
  ```
166
187
 
@@ -249,7 +270,7 @@ Airborne.configure.do |config|
249
270
  end
250
271
  ```
251
272
 
252
- Additionally, you can specify a `base_url` and default `headers` to be used on every request (unless overriden in the actual request):
273
+ Additionally, you can specify a `base_url` and default `headers` to be used on every request (unless overridden in the actual request):
253
274
 
254
275
  ```ruby
255
276
  Airborne.configure.do |config|
@@ -265,6 +286,11 @@ describe 'spec' do
265
286
  end
266
287
  ```
267
288
 
289
+ ### Run it from the CLI
290
+
291
+ $ cd your/project
292
+ $ rspec spec
293
+
268
294
  ## License
269
295
 
270
296
  The MIT License
data/airborne.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'airborne'
3
- s.version = '0.0.18'
3
+ s.version = '0.0.19'
4
4
  s.date = '2014-09-12'
5
5
  s.summary = "RSpec driven API testing framework"
6
6
  s.authors = ["Alex Friedman", "Seth Pollack"]
@@ -10,5 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.license = 'MIT'
11
11
  s.add_runtime_dependency 'rspec', '~> 3.1', '>= 3.1.0'
12
12
  s.add_runtime_dependency 'rest-client', '~> 1.7', '>= 1.7.2'
13
+ s.add_runtime_dependency 'rack-test', '~> 0.6', '>= 0.6.2'
14
+ s.add_runtime_dependency 'activesupport', '~> 4.1.6', '>= 4.1.6'
13
15
  s.add_development_dependency 'webmock', '~> 0'
14
16
  end
data/lib/airborne.rb CHANGED
@@ -1,10 +1,16 @@
1
1
  require 'airborne/optional_hash_type_expectations'
2
2
  require 'airborne/path_matcher'
3
3
  require 'airborne/request_expectations'
4
+ require 'airborne/rest_client_requester'
5
+ require 'airborne/rack_test_requester'
4
6
  require 'airborne/base'
5
7
 
8
+
6
9
  RSpec.configure do |config|
7
10
  config.include Airborne
8
11
  config.add_setting :base_url
9
12
  config.add_setting :headers
13
+ config.add_setting :rack_app
14
+ config.add_setting :requester_type
15
+ config.add_setting :requester_module
10
16
  end
data/lib/airborne/base.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'rest_client'
2
1
  require 'json'
2
+ require 'active_support/core_ext'
3
3
 
4
4
  module Airborne
5
5
  include RequestExpectations
@@ -10,28 +10,38 @@ module Airborne
10
10
  end
11
11
  end
12
12
 
13
+ def self.included(base)
14
+ if(!Airborne.configuration.requester_module.nil?)
15
+ base.send(:include, Airborne.configuration.requester_module)
16
+ elsif(!Airborne.configuration.rack_app.nil?)
17
+ base.send(:include, RackTestRequester)
18
+ else
19
+ base.send(:include, RestClientRequester)
20
+ end
21
+ end
22
+
13
23
  def self.configuration
14
24
  RSpec.configuration
15
25
  end
16
26
 
17
27
  def get(url, headers = nil)
18
- make_request(:get, url, {headers: headers})
28
+ set_response(make_request(:get, url, {headers: headers}))
19
29
  end
20
30
 
21
31
  def post(url, post_body = nil, headers = nil)
22
- make_request(:post, url, {body: post_body, headers: headers})
32
+ set_response(make_request(:post, url, {body: post_body, headers: headers}))
23
33
  end
24
34
 
25
35
  def patch(url, patch_body = nil, headers = nil )
26
- make_request(:patch, url, {body: patch_body, headers: headers})
36
+ set_response(make_request(:patch, url, {body: patch_body, headers: headers}))
27
37
  end
28
38
 
29
39
  def put(url, put_body = nil, headers = nil )
30
- make_request(:put, url, {body: put_body, headers: headers})
40
+ set_response(make_request(:put, url, {body: put_body, headers: headers}))
31
41
  end
32
42
 
33
43
  def delete(url, headers = nil)
34
- make_request(:delete, url, {headers: headers})
44
+ set_response(make_request(:delete, url, {headers: headers}))
35
45
  end
36
46
 
37
47
  def response
@@ -52,27 +62,6 @@ module Airborne
52
62
 
53
63
  private
54
64
 
55
- def make_request(method, url, options = {})
56
- headers = (options[:headers] || {}).merge({content_type: :json})
57
- base_headers = Airborne.configuration.headers || {}
58
- headers = base_headers.merge(headers)
59
- res = if method == :post || method == :patch || method == :put
60
- begin
61
- RestClient.send(method, get_url(url), options[:body].nil? ? "" : options[:body].to_json, headers)
62
- rescue RestClient::Exception => e
63
- e.response
64
- end
65
- else
66
- begin
67
- RestClient.send(method, get_url(url), headers)
68
- rescue RestClient::Exception => e
69
- e.response
70
- end
71
-
72
- end
73
- set_response(res)
74
- end
75
-
76
65
  def get_url(url)
77
66
  base = Airborne.configuration.base_url || ""
78
67
  base + url
@@ -81,7 +70,7 @@ module Airborne
81
70
  def set_response(res)
82
71
  @response = res
83
72
  @body = res.body
84
- @headers = res.headers
73
+ @headers = HashWithIndifferentAccess.new(res.headers.deep_symbolize_keys) unless res.headers.nil?
85
74
  begin
86
75
  @json_body = JSON.parse(res.body, symbolize_names: true) unless res.body.empty?
87
76
  rescue
@@ -0,0 +1,11 @@
1
+ require 'rack/test'
2
+
3
+ module Airborne
4
+ module RackTestRequester
5
+ def make_request(method, url, options = {})
6
+ browser = Rack::Test::Session.new(Rack::MockSession.new(Airborne.configuration.rack_app))
7
+ browser.send(method, url, options[:body] || {}, options[:headers] || {})
8
+ browser.last_response
9
+ end
10
+ end
11
+ end
@@ -29,7 +29,6 @@ module Airborne
29
29
 
30
30
  def expect_header(key, content)
31
31
  header = headers[key]
32
- expect(header).to_not be_nil
33
32
  if header
34
33
  expect(header.downcase).to eq(content.downcase)
35
34
  else
@@ -39,7 +38,6 @@ module Airborne
39
38
 
40
39
  def expect_header_contains(key, content)
41
40
  header = headers[key]
42
- expect(header).to_not be_nil
43
41
  if header
44
42
  expect(header.downcase).to include(content.downcase)
45
43
  else
@@ -0,0 +1,26 @@
1
+ require 'rest_client'
2
+
3
+ module Airborne
4
+ module RestClientRequester
5
+ def make_request(method, url, options = {})
6
+ headers = (options[:headers] || {}).merge({content_type: :json})
7
+ base_headers = Airborne.configuration.headers || {}
8
+ headers = base_headers.merge(headers)
9
+ res = if method == :post || method == :patch || method == :put
10
+ begin
11
+ RestClient.send(method, get_url(url), options[:body].nil? ? "" : options[:body].to_json, headers)
12
+ rescue RestClient::Exception => e
13
+ e.response
14
+ end
15
+ else
16
+ begin
17
+ RestClient.send(method, get_url(url), headers)
18
+ rescue RestClient::Exception => e
19
+ e.response
20
+ end
21
+
22
+ end
23
+ res
24
+ end
25
+ end
26
+ end
@@ -13,11 +13,12 @@ describe 'base spec' do
13
13
  expect(headers).to_not be(nil)
14
14
  end
15
15
 
16
- it 'when request is made headers should be symbolized hash' do
16
+ it 'when request is made headers should be hash with indifferent access' do
17
17
  mock_get('simple_get', {'Content-Type' => 'application/json'})
18
18
  get '/simple_get'
19
19
  expect(headers).to be_kind_of(Hash)
20
- expect(headers.first[0]).to be_kind_of(Symbol)
20
+ expect(headers[:content_type]).to eq('application/json')
21
+ expect(headers['content_type']).to eq('application/json')
21
22
  end
22
23
 
23
24
  it 'when request is made body should be set' do
@@ -32,4 +33,22 @@ describe 'base spec' do
32
33
  expect(json_body).to be_kind_of(Hash)
33
34
  expect(json_body.first[0]).to be_kind_of(Symbol)
34
35
  end
36
+
37
+ it 'should not error on invalid JSON' do
38
+ mock_get('invalid_get')
39
+ get '/invalid_get'
40
+ expect(json_body).to be(nil)
41
+ end
42
+
43
+ it 'should handle a 500 error on get' do
44
+ mock_get('simple_get', {}, [500, "Internal Server Error"])
45
+ get '/simple_get'
46
+ expect(json_body).to_not be(nil)
47
+ end
48
+
49
+ it 'should handle a 500 error on post' do
50
+ mock_post('simple_post', {}, [500, "Internal Server Error"])
51
+ post '/simple_post', {}
52
+ expect(json_body).to_not be(nil)
53
+ end
35
54
  end
@@ -18,6 +18,12 @@ describe 'expect_json' do
18
18
  get '/simple_path_get'
19
19
  expect_json('address', {street: "Area 51", city: "Roswell", state: "NM"})
20
20
  end
21
+
22
+ it 'should allow full object graph' do
23
+ mock_get('simple_path_get')
24
+ get '/simple_path_get'
25
+ expect_json({name: "Alex", address: {street: "Area 51", city: "Roswell", state: "NM"}})
26
+ end
21
27
 
22
28
  it 'should allow nested paths' do
23
29
  mock_get('simple_nested_path')
@@ -25,6 +25,12 @@ describe 'expect_json_types' do
25
25
  expect_json_types('address', {street: :string, city: :string, state: :string})
26
26
  end
27
27
 
28
+ it 'should allow full object graph' do
29
+ mock_get('simple_path_get')
30
+ get '/simple_path_get'
31
+ expect_json_types({name: :string, address: {street: :string, city: :string, state: :string}})
32
+ end
33
+
28
34
  it 'should allow nested paths' do
29
35
  mock_get('simple_nested_path')
30
36
  get '/simple_nested_path'
@@ -20,4 +20,16 @@ describe 'expect header contains' do
20
20
  get '/simple_get'
21
21
  expect_header_contains(:content_type, 'json')
22
22
  end
23
+
24
+ it 'should ensure header is present' do
25
+ mock_get('simple_get', {'Content-Type' => 'application/json'})
26
+ get '/simple_get'
27
+ expect{expect_header_contains(:foo, 'bar')}.to raise_error
28
+ end
29
+
30
+ it 'should ensure partial header is present' do
31
+ mock_get('simple_get', {'Content-Type' => 'application/json'})
32
+ get '/simple_get'
33
+ expect{expect_header_contains(:content_type, 'bar')}.to raise_error
34
+ end
23
35
  end
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+ require 'sinatra'
3
+
4
+ class SampleApp < Sinatra::Application
5
+ before do
6
+ content_type 'application/json'
7
+ end
8
+ get '/' do
9
+ {foo: "bar"}.to_json
10
+ end
11
+ end
12
+
13
+ Airborne.configure do |config|
14
+ config.rack_app = SampleApp
15
+ end
16
+
17
+ describe 'rack app' do
18
+ it 'should allow requests against a sinatra app' do
19
+ get '/'
20
+ expect_json_types({foo: :string})
21
+ end
22
+
23
+ it 'should ensure correct values from sinatra app' do
24
+ get '/'
25
+ expect{expect_json_types({foo: :int})}.to raise_error
26
+ end
27
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
1
3
  require 'airborne'
2
4
  require 'stub_helper'
3
5
 
data/spec/stub_helper.rb CHANGED
@@ -6,23 +6,23 @@ module StubHelper
6
6
  @base_url = 'http://www.example.com/'
7
7
  end
8
8
 
9
- def mock_get(url, response_headers = {})
10
- stub_request(:get, @base_url + url).to_return(headers: response_headers, body: get_json_response_file(url))
9
+ def mock_get(url, response_headers = {}, status = 200)
10
+ stub_request(:get, @base_url + url).to_return(headers: response_headers, body: get_json_response_file(url), status: status)
11
11
  end
12
12
 
13
- def mock_post(url, options = {})
13
+ def mock_post(url, options = {}, status = 200)
14
14
  stub_request(:post, @base_url + url).with(body: options[:request_body] || {})
15
- .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url))
15
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
16
16
  end
17
17
 
18
- def mock_put(url, options = {})
18
+ def mock_put(url, options = {}, status = 200)
19
19
  stub_request(:put, @base_url + url).with(body: options[:request_body] || {})
20
- .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url))
20
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
21
21
  end
22
22
 
23
- def mock_patch(url, options = {})
23
+ def mock_patch(url, options = {}, status = 200)
24
24
  stub_request(:patch, @base_url + url).with(body: options[:request_body] || {})
25
- .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url))
25
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
26
26
  end
27
27
 
28
28
  def mock_delete(url)
@@ -0,0 +1 @@
1
+ THIS IS INTENTIONALLY NOT JSON
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.0.18
4
+ version: 0.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Friedman
@@ -51,6 +51,46 @@ dependencies:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: 1.7.2
54
+ - !ruby/object:Gem::Dependency
55
+ name: rack-test
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.6'
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.6.2
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.6'
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.6.2
74
+ - !ruby/object:Gem::Dependency
75
+ name: activesupport
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 4.1.6
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 4.1.6
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 4.1.6
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 4.1.6
54
94
  - !ruby/object:Gem::Dependency
55
95
  name: webmock
56
96
  requirement: !ruby/object:Gem::Requirement
@@ -73,6 +113,7 @@ executables: []
73
113
  extensions: []
74
114
  extra_rdoc_files: []
75
115
  files:
116
+ - ".coveralls.yml"
76
117
  - ".gitignore"
77
118
  - ".travis.yml"
78
119
  - Gemfile
@@ -84,7 +125,9 @@ files:
84
125
  - lib/airborne/base.rb
85
126
  - lib/airborne/optional_hash_type_expectations.rb
86
127
  - lib/airborne/path_matcher.rb
128
+ - lib/airborne/rack_test_requester.rb
87
129
  - lib/airborne/request_expectations.rb
130
+ - lib/airborne/rest_client_requester.rb
88
131
  - spec/airborne/base_spec.rb
89
132
  - spec/airborne/delete_spec.rb
90
133
  - spec/airborne/expect_json_keys_spec.rb
@@ -95,6 +138,7 @@ files:
95
138
  - spec/airborne/patch_spec.rb
96
139
  - spec/airborne/post_spec.rb
97
140
  - spec/airborne/put_spec.rb
141
+ - spec/airborne/rack_sinatra_spec.rb
98
142
  - spec/spec_helper.rb
99
143
  - spec/stub_helper.rb
100
144
  - spec/test_responses/array_of_values.json
@@ -102,6 +146,7 @@ files:
102
146
  - spec/test_responses/array_with_index.json
103
147
  - spec/test_responses/array_with_nested.json
104
148
  - spec/test_responses/array_with_nested_bad_data.json
149
+ - spec/test_responses/invalid_get.json
105
150
  - spec/test_responses/simple_get.json
106
151
  - spec/test_responses/simple_json.json
107
152
  - spec/test_responses/simple_nested_path.json
@@ -129,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
174
  version: '0'
130
175
  requirements: []
131
176
  rubyforge_project:
132
- rubygems_version: 2.2.0
177
+ rubygems_version: 2.1.5
133
178
  signing_key:
134
179
  specification_version: 4
135
180
  summary: RSpec driven API testing framework