airborne 0.1.8 → 0.1.9

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: f321e27151ecffef06e9faa916d6f4fdae6819be
4
- data.tar.gz: 9e082aa7e51fcc2bfefd85e7eea05f7e9c8c9b1b
3
+ metadata.gz: 9029133bcf1f37e86472d7066159149ccf633423
4
+ data.tar.gz: 3490ccda6ffafc06a41173f5ba7767c249e589c3
5
5
  SHA512:
6
- metadata.gz: c51351a2c990fe2d5afb9ea7b5b199e5a08bda503d4c8af82c529348a7ef74d9360ade5ad0e2da1d892ecaea5bb8c4b7d48f5627399f9d5d02066228242306db
7
- data.tar.gz: 4cbb58e4c071e2054b005b67afac6757fe81d7c26092a771d73040bcf63b084632b3fadc92e834aa533bf6cd22459f1a85919d74ff1123d0ee5b8f6d0a6f5f02
6
+ metadata.gz: efad782993756790afe2fb8cc09503f891f9e4ade418ff70ede1d1811c0d6d4815d64485a13289e7bb55dd51827081376e8c6a5fad90bcd6681bb9c2ddb2808f
7
+ data.tar.gz: 4f0b6884c93854ea614bc58680c5185a06d7295083ab6d1f61e570284e799ac44b0cd06cbc8c731f4fb959ef0bd746f6b4cb9e446259e32d05033d57e891e685
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![airbore gem downloads](http://img.shields.io/gem/dt/airborne.svg?style=flat-square)](http://rubygems.org/gems/airborne)
8
8
  [![airborne gem stable downloads](http://img.shields.io/gem/dv/airborne/stable.svg?style=flat-square)](http://rubygems.org/gems/airborne)
9
9
 
10
- RSpec driven API testing framework inspired by [frisby.js](https://github.com/vlucas/frisby)
10
+ RSpec driven API testing framework
11
11
 
12
12
  ## Installation
13
13
 
@@ -360,6 +360,9 @@ end
360
360
 
361
361
  ## Contributors
362
362
  https://github.com/brooklynDev/airborne/graphs/contributors
363
+
364
+ Inspired by [frisby.js](https://github.com/vlucas/frisby)
365
+
363
366
  ## License
364
367
 
365
368
  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.1.8'
3
+ s.version = '0.1.9'
4
4
  s.date = '2014-12-10'
5
5
  s.summary = "RSpec driven API testing framework"
6
6
  s.authors = ["Alex Friedman", "Seth Pollack"]
@@ -1,7 +1,9 @@
1
1
  module Airborne
2
+ class PathError < StandardError; end
2
3
  module PathMatcher
3
4
 
4
5
  def get_by_path(path, json, &block)
6
+ raise PathError, "Ivalid Path, contains '..'" if /\.\./ =~ path
5
7
  type = false
6
8
  parts = path.split('.')
7
9
  parts.each_with_index do |part, index|
@@ -14,7 +16,11 @@ module Airborne
14
16
  end
15
17
  next
16
18
  end
17
- json = process_json(part, json)
19
+ begin
20
+ json = process_json(part, json)
21
+ rescue
22
+ raise PathError, "Expected #{json.class}\nto to be an object with property #{part}"
23
+ end
18
24
  end
19
25
  if type == '*'
20
26
  expect_all(json, &block)
@@ -64,7 +70,7 @@ module Airborne
64
70
  json.each do |part|
65
71
  begin
66
72
  yield part
67
- rescue Exception => e
73
+ rescue Exception
68
74
  error_count += 1
69
75
  ensure_match_one(path, item_count, error_count)
70
76
  end
@@ -2,6 +2,7 @@ require 'rspec'
2
2
  require 'date'
3
3
 
4
4
  module Airborne
5
+ class ExpectationError < StandardError; end
5
6
  module RequestExpectations
6
7
  include RSpec
7
8
  include PathMatcher
@@ -130,7 +131,9 @@ module Airborne
130
131
  return expectations.call(hash_or_value) if expectations.class == Proc
131
132
 
132
133
  expectations.each do |prop_name, expected_type|
133
- value = expected_type == :date ? convert_to_date(hash_or_value[prop_name]) : hash_or_value[prop_name]
134
+ value = ensure_hash_contains_prop(prop_name, hash_or_value) do
135
+ expected_type == :date ? convert_to_date(hash_or_value[prop_name]) : hash_or_value[prop_name]
136
+ end
134
137
  expected_class = expected_type.class
135
138
  value_class = value.class
136
139
 
@@ -165,7 +168,7 @@ module Airborne
165
168
 
166
169
  def expect_type(expected_type, value_class, prop_name = nil)
167
170
  insert = prop_name.nil? ? "" : "#{prop_name} to be of type"
168
- msg = "Expected #{insert} #{expected_type}\n, got #{value_class} instead"
171
+ msg = "Expected #{insert} #{expected_type}\n got #{value_class} instead"
169
172
  expect(@mapper[expected_type].include?(value_class)).to eq(true), msg
170
173
  end
171
174
 
@@ -174,14 +177,14 @@ module Airborne
174
177
  end
175
178
 
176
179
  def expect_array(value_class, prop_name, expected_type)
177
- expect(value_class).to eq(Array), "Expected #{prop_name}\n to be of type #{expected_type}\n, got #{value_class} instead"
180
+ expect(value_class).to eq(Array), "Expected #{prop_name}\n to be of type #{expected_type}\n got #{value_class} instead"
178
181
  end
179
182
 
180
183
  def expect_json_impl(expectations, hash)
181
184
  hash = hash.to_s if expectations.class == Regexp
182
185
  return expect(hash).to match(expectations) if is_property?(expectations)
183
186
  expectations.each do |prop_name, expected_value|
184
- actual_value = hash[prop_name]
187
+ actual_value = ensure_hash_contains_prop(prop_name, hash) {hash[prop_name]}
185
188
  expected_class = expected_value.class
186
189
  next expect_json_impl(expected_value, actual_value) if expected_class == Hash
187
190
  next expected_value.call(actual_value) if expected_class == Proc
@@ -190,6 +193,14 @@ module Airborne
190
193
  end
191
194
  end
192
195
 
196
+ def ensure_hash_contains_prop(prop_name, hash)
197
+ begin
198
+ yield
199
+ rescue
200
+ raise ExpectationError, "Expected #{hash.class} #{hash}\nto be an object with property #{prop_name}"
201
+ end
202
+ end
203
+
193
204
  # Convert integers in `old_expectations` to proc
194
205
  #
195
206
  # @param old_expectations [Hash]
@@ -99,4 +99,11 @@ describe 'expect_json with path' do
99
99
  expect_json('age', 32 )
100
100
  end
101
101
 
102
+ it "should raise ExpectationError when expectation expects an object instead of value" do
103
+ mock_get('array_with_index')
104
+ get '/array_with_index'
105
+ expect do
106
+ expect_json('cars.0.make', {make: "Tesla"})
107
+ end.to raise_error(Airborne::ExpectationError, "Expected String Tesla\nto be an object with property make")
108
+ end
102
109
  end
@@ -56,4 +56,12 @@ describe 'expect_json_types wih path' do
56
56
  expect{expect_json_types('cars.*.owners.*', {name: :string})}.to raise_error
57
57
  end
58
58
 
59
+ it "should raise ExpectationError when expectation expects an object instead of type" do
60
+ mock_get('array_with_index')
61
+ get '/array_with_index'
62
+ expect do
63
+ expect_json_types('cars.0.make', {make: :string})
64
+ end.to raise_error(Airborne::ExpectationError, "Expected String Tesla\nto be an object with property make")
65
+ end
66
+
59
67
  end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'expect path' do
4
+
5
+ before :each do
6
+ mock_get('array_with_index')
7
+ get '/array_with_index'
8
+ end
9
+
10
+ it "should raise PathError when incorrect path containing .. is used" do
11
+ expect do
12
+ expect_json('cars..make', "Tesla")
13
+ end.to raise_error(Airborne::PathError, "Ivalid Path, contains '..'")
14
+ end
15
+
16
+ it "should raise PathError when trying to call property on an array" do
17
+ expect do
18
+ expect_json('cars.make', "Tesla")
19
+ end.to raise_error(Airborne::PathError, "Expected Array\nto to be an object with property make")
20
+ end
21
+ end
@@ -9,9 +9,9 @@ describe 'post' do
9
9
  end
10
10
 
11
11
  it 'should allow testing on post requests' do
12
- url = 'http://www.example.com/simple_post'
12
+ url = 'http://www.example.com/simple_post'
13
13
  stub_request(:post, url)
14
14
  post '/simple_post', 'hello', {content_type: "text/plain"}
15
15
  expect(WebMock).to have_requested(:post, url).with(:body => "hello", :headers => {'Content-Type' => 'text/plain'})
16
16
  end
17
- end
17
+ 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.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Friedman
@@ -142,6 +142,7 @@ files:
142
142
  - spec/airborne/head_spec.rb
143
143
  - spec/airborne/options_spec.rb
144
144
  - spec/airborne/patch_spec.rb
145
+ - spec/airborne/path_spec.rb
145
146
  - spec/airborne/post_spec.rb
146
147
  - spec/airborne/put_spec.rb
147
148
  - spec/airborne/rack/rack_sinatra_spec.rb
@@ -181,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
182
  version: '0'
182
183
  requirements: []
183
184
  rubyforge_project:
184
- rubygems_version: 2.2.0
185
+ rubygems_version: 2.2.2
185
186
  signing_key:
186
187
  specification_version: 4
187
188
  summary: RSpec driven API testing framework