airborne 0.1.1 → 0.1.2

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: e39fcf812c0db731f927d6d8d3958af460d32d45
4
- data.tar.gz: 0d57d02c7d3ab02be5043c454b6a77cffc44a234
3
+ metadata.gz: 3e351c7ecb46e7a53eb2f615feefe937d25378f7
4
+ data.tar.gz: 64dbeff0d1bf50ae25d1827bfacf07e25431db98
5
5
  SHA512:
6
- metadata.gz: 413820ceb078ed9d209c7fe1cd746222bae68b18453102194a75be1929cba97a01868eaf3d699d7b8491841947cd01e7e330d2a9c4321352a790422e9e0fa540
7
- data.tar.gz: ac22937b6c71ab214c89fa778d7c255433cc08c96c1d401d84b2b859142e86ce835086046473f3f7678c3b122a5ad67bf4178832514506b147b08378fc1f2d2b
6
+ metadata.gz: b26d99981f1864fd92be88b377fc442321f5f7aa258fc440d5440814570a592cdc792fe3d1d2d7c8e3a7add80efa593f5c55049efebfacec397fe54c6eeb7dcf
7
+ data.tar.gz: fcfbff4c0167958d07d757557c64eade67bbfda6f183eee3238aded65f4618c253059e8f05af24fe11aab32d4723a859f63b1e85f99a0a4f778aa155b1ab3ea0
@@ -0,0 +1,8 @@
1
+
2
+ ## Unreleased
3
+
4
+ ### enhancements
5
+
6
+ - Add new API `expect_json_sizes` for testing sizes of JSON values
7
+
8
+ ### bug fixes
data/README.md CHANGED
@@ -95,6 +95,17 @@ describe 'sample spec' do
95
95
  end
96
96
  ```
97
97
 
98
+ Calling `expect_json_sizes` actually make use of the above feature and call `expect_json` under the hood:
99
+
100
+ ```ruby
101
+ describe 'sample spec' do
102
+ it 'should validate types' do
103
+ get 'http://example.com/api/v1/simple_get_collection' #json api that returns { "ids" : [1, 2, 3, 4] }
104
+ expect_json_sizes({ids: 4})
105
+ end
106
+ end
107
+ ```
108
+
98
109
  ##Making requests
99
110
 
100
111
  Airborne uses `rest_client` to make the HTTP request, and supports all HTTP verbs. When creating a test, you can call any of the following methods: `get`, `post`, `put`, `patch`, `delete`. This will then give you access the following properties:
@@ -161,13 +172,14 @@ end
161
172
  * `expect_json_types` - Tests the types of the JSON property values returned
162
173
  * `expect_json` - Tests the values of the JSON property values returned
163
174
  * `expect_json_keys` - Tests the existence of the specified keys in the JSON object
175
+ * `expect_json_sizes` - Tests the sizes of the JSON property values returned, also test if the values are arrays
164
176
  * `expect_status` - Tests the HTTP status code returned
165
177
  * `expect_header` - Tests for a specified header in the response
166
178
  * `expect_header_contains` - Partial match test on a specified header
167
179
 
168
180
  ##Path Matching
169
181
 
170
- When calling `expect_json_types`, `expect_json` or `expect_json_keys` you can optionally specify a path as a first parameter.
182
+ When calling `expect_json_types`, `expect_json`, `expect_json_keys` or `expect_json_sizes` you can optionally specify a path as a first parameter.
171
183
 
172
184
  For example, if our API returns the following JSON:
173
185
 
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'airborne'
3
- s.version = '0.1.1'
4
- s.date = '2014-10-20'
3
+ s.version = '0.1.2'
4
+ s.date = '2014-11-15'
5
5
  s.summary = "RSpec driven API testing framework"
6
6
  s.authors = ["Alex Friedman", "Seth Pollack"]
7
7
  s.email = ['a.friedman07@gmail.com', 'teampollack@gmail.com']
@@ -5,7 +5,10 @@ module Airborne
5
5
  def make_request(method, url, options = {})
6
6
  browser = Rack::Test::Session.new(Rack::MockSession.new(Airborne.configuration.rack_app))
7
7
  browser.send(method, url, options[:body] || {}, options[:headers] || {})
8
+ Rack::MockResponse.class_eval do
9
+ alias_method :code, :status
10
+ end
8
11
  browser.last_response
9
12
  end
10
13
  end
11
- end
14
+ end
@@ -24,6 +24,12 @@ module Airborne
24
24
  end
25
25
  end
26
26
 
27
+ def expect_json_sizes(*args)
28
+ args.push(convert_expectations_for_json_sizes(args.pop))
29
+
30
+ expect_json_types(*args)
31
+ end
32
+
27
33
  def expect_status(code)
28
34
  expect(response.code).to eq(code)
29
35
  end
@@ -113,17 +119,24 @@ module Airborne
113
119
  mapper
114
120
  end
115
121
 
116
- def expect_json_types_impl(expectations, hash)
117
- return if is_nil_optional_hash?(expectations, hash)
122
+ def expect_json_types_impl(expectations, hash_or_value)
123
+ return if is_nil_optional_hash?(expectations, hash_or_value)
124
+
118
125
  @mapper ||= get_mapper
119
- hash = convert_to_date(hash) if expectations == :date
120
- return expect_type(expectations, hash.class) if expectations.class == Symbol
126
+
127
+ hash_or_value = convert_to_date(hash_or_value) if expectations == :date
128
+
129
+ return expect_type(expectations, hash_or_value.class) if expectations.class == Symbol
130
+ return expectations.call(hash_or_value) if expectations.class == Proc
131
+
121
132
  expectations.each do |prop_name, expected_type|
122
- value = expected_type == :date ? convert_to_date(hash[prop_name]) : hash[prop_name]
133
+ value = expected_type == :date ? convert_to_date(hash_or_value[prop_name]) : hash_or_value[prop_name]
123
134
  expected_class = expected_type.class
124
135
  value_class = value.class
136
+
125
137
  next expect_json_types_impl(expected_type, value) if is_hash?(expected_class)
126
138
  next expected_type.call(value) if expected_class == Proc
139
+
127
140
  if expected_type.to_s.include?("array_of")
128
141
  check_array_types(value, value_class, prop_name, expected_type)
129
142
  else
@@ -177,6 +190,30 @@ module Airborne
177
190
  end
178
191
  end
179
192
 
193
+ # Convert integers in `old_expectations` to proc
194
+ #
195
+ # @param old_expectations [Hash]
196
+ def convert_expectations_for_json_sizes(old_expectations)
197
+ unless old_expectations.is_a?(Hash)
198
+ return convert_expectation_for_json_sizes(old_expectations)
199
+ end
200
+
201
+ old_expectations.each_with_object({}) do |(prop_name, expected_size), memo|
202
+ new_value = if expected_size.is_a?(Hash)
203
+ convert_expectations_for_json_sizes(expected_size)
204
+ else
205
+ convert_expectation_for_json_sizes(expected_size)
206
+ end
207
+ memo[prop_name] = new_value
208
+ end
209
+ end
210
+
211
+ # @param expected_size [Integer]
212
+ # @return [Proc]
213
+ def convert_expectation_for_json_sizes(expected_size)
214
+ -> (data) { expect(data.size).to eq(expected_size) }
215
+ end
216
+
180
217
  def is_property?(expectations)
181
218
  [String, Regexp, Float, Fixnum, Bignum, TrueClass, FalseClass, NilClass].include?(expectations.class)
182
219
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'expect_json_sizes' do
4
+
5
+ it 'should detect sizes' do
6
+ mock_get('array_of_values')
7
+ get '/array_of_values'
8
+ expect_json_sizes({grades: 4, bad: 3, emptyArray: 0})
9
+ end
10
+
11
+ it 'should allow full object graph' do
12
+ mock_get('array_with_nested')
13
+ get '/array_with_nested'
14
+ expect_json_sizes({cars: {0 => {owners: 1}, 1 => {owners: 1}}})
15
+ end
16
+
17
+ it 'should allow properties to be tested against a path' do
18
+ mock_get('array_with_nested')
19
+ get '/array_with_nested'
20
+ expect_json_sizes('cars.0.owners', 1)
21
+ end
22
+
23
+ it 'should test against all elements in the array when path contains * AND expectation is an Integer' do
24
+ mock_get('array_with_nested')
25
+ get '/array_with_nested'
26
+ expect_json_sizes('cars.*.owners', 1)
27
+ end
28
+
29
+ it 'should test against all elements in the array when path contains * AND expectation is a Hash' do
30
+ mock_get('array_with_nested')
31
+ get '/array_with_nested'
32
+ expect_json_sizes('cars.*', {owners: 1})
33
+ end
34
+
35
+ 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.1
4
+ version: 0.1.2
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: 2014-10-20 00:00:00.000000000 Z
12
+ date: 2014-11-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -110,6 +110,7 @@ files:
110
110
  - ".coveralls.yml"
111
111
  - ".gitignore"
112
112
  - ".travis.yml"
113
+ - CHANGELOG.md
113
114
  - Gemfile
114
115
  - Gemfile.lock
115
116
  - LICENSE
@@ -131,8 +132,9 @@ files:
131
132
  - spec/airborne/expectations/expect_json_lambda_spec.rb
132
133
  - spec/airborne/expectations/expect_json_path_spec.rb
133
134
  - spec/airborne/expectations/expect_json_regex_spec.rb
135
+ - spec/airborne/expectations/expect_json_sizes_spec.rb
134
136
  - spec/airborne/expectations/expect_json_spec.rb
135
- - spec/airborne/expectations/expect_json_types_date.rb
137
+ - spec/airborne/expectations/expect_json_types_date_spec.rb
136
138
  - spec/airborne/expectations/expect_json_types_lambda_spec.rb
137
139
  - spec/airborne/expectations/expect_json_types_optional_spec.rb
138
140
  - spec/airborne/expectations/expect_json_types_path_spec.rb
@@ -178,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
180
  version: '0'
179
181
  requirements: []
180
182
  rubyforge_project:
181
- rubygems_version: 2.2.0
183
+ rubygems_version: 2.1.5
182
184
  signing_key:
183
185
  specification_version: 4
184
186
  summary: RSpec driven API testing framework