airborne 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
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