airborne 0.1.1 → 0.1.2

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: 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