hops-airborne 0.2.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +38 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +12 -0
  6. data/Gemfile +10 -0
  7. data/LICENSE +9 -0
  8. data/README.md +429 -0
  9. data/airborne.gemspec +19 -0
  10. data/lib/airborne/base.rb +82 -0
  11. data/lib/airborne/optional_hash_type_expectations.rb +23 -0
  12. data/lib/airborne/path_matcher.rb +101 -0
  13. data/lib/airborne/rack_test_requester.rb +18 -0
  14. data/lib/airborne/request_expectations.rb +285 -0
  15. data/lib/airborne/rest_client_requester.rb +33 -0
  16. data/lib/airborne.rb +29 -0
  17. data/spec/airborne/base_spec.rb +55 -0
  18. data/spec/airborne/client_requester_spec.rb +42 -0
  19. data/spec/airborne/delete_spec.rb +9 -0
  20. data/spec/airborne/expectations/expect_header_contains_spec.rb +21 -0
  21. data/spec/airborne/expectations/expect_header_spec.rb +21 -0
  22. data/spec/airborne/expectations/expect_json_keys_path_spec.rb +15 -0
  23. data/spec/airborne/expectations/expect_json_keys_spec.rb +21 -0
  24. data/spec/airborne/expectations/expect_json_lambda_spec.rb +9 -0
  25. data/spec/airborne/expectations/expect_json_options_spec.rb +65 -0
  26. data/spec/airborne/expectations/expect_json_path_spec.rb +108 -0
  27. data/spec/airborne/expectations/expect_json_regex_spec.rb +33 -0
  28. data/spec/airborne/expectations/expect_json_sizes_spec.rb +33 -0
  29. data/spec/airborne/expectations/expect_json_spec.rb +27 -0
  30. data/spec/airborne/expectations/expect_json_types_date_spec.rb +52 -0
  31. data/spec/airborne/expectations/expect_json_types_lambda_spec.rb +9 -0
  32. data/spec/airborne/expectations/expect_json_types_optional_spec.rb +15 -0
  33. data/spec/airborne/expectations/expect_json_types_options_spec.rb +59 -0
  34. data/spec/airborne/expectations/expect_json_types_path_spec.rb +65 -0
  35. data/spec/airborne/expectations/expect_json_types_spec.rb +85 -0
  36. data/spec/airborne/expectations/expect_status_spec.rb +23 -0
  37. data/spec/airborne/head_spec.rb +10 -0
  38. data/spec/airborne/options_spec.rb +10 -0
  39. data/spec/airborne/patch_spec.rb +9 -0
  40. data/spec/airborne/path_spec.rb +34 -0
  41. data/spec/airborne/post_spec.rb +17 -0
  42. data/spec/airborne/put_spec.rb +9 -0
  43. data/spec/airborne/rack/rack_sinatra_spec.rb +43 -0
  44. data/spec/spec_helper.rb +14 -0
  45. data/spec/stub_helper.rb +45 -0
  46. data/spec/test_responses/array_of_types.json +9 -0
  47. data/spec/test_responses/array_of_values.json +5 -0
  48. data/spec/test_responses/array_response.json +5 -0
  49. data/spec/test_responses/array_with_index.json +6 -0
  50. data/spec/test_responses/array_with_nested.json +16 -0
  51. data/spec/test_responses/array_with_nested_bad_data.json +15 -0
  52. data/spec/test_responses/array_with_partial_nested.json +12 -0
  53. data/spec/test_responses/date_is_null_response.json +3 -0
  54. data/spec/test_responses/date_response.json +3 -0
  55. data/spec/test_responses/hash_property.json +3 -0
  56. data/spec/test_responses/invalid_get.json +1 -0
  57. data/spec/test_responses/invalid_json.json +1 -0
  58. data/spec/test_responses/numeric_property.json +6 -0
  59. data/spec/test_responses/simple_delete.json +4 -0
  60. data/spec/test_responses/simple_get.json +5 -0
  61. data/spec/test_responses/simple_json.json +5 -0
  62. data/spec/test_responses/simple_nested_path.json +12 -0
  63. data/spec/test_responses/simple_patch.json +4 -0
  64. data/spec/test_responses/simple_path_get.json +8 -0
  65. data/spec/test_responses/simple_post.json +4 -0
  66. data/spec/test_responses/simple_put.json +4 -0
  67. metadata +206 -0
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'put' do
4
+ it 'should allow testing on put requests' do
5
+ mock_put('simple_put')
6
+ put '/simple_put', {}
7
+ expect_json_types(status: :string, someNumber: :int)
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ require 'json'
2
+ require 'sinatra'
3
+
4
+ class SampleApp < Sinatra::Application
5
+ before do
6
+ content_type 'application/json'
7
+ end
8
+
9
+ get '/' do
10
+ { foo: 'bar' }.to_json
11
+ end
12
+ end
13
+
14
+ Airborne.configure do |config|
15
+ config.rack_app = SampleApp
16
+ end
17
+
18
+ describe 'rack app' do
19
+ it 'should allow requests against a sinatra app' do
20
+ get '/'
21
+ expect_json_types(foo: :string)
22
+ end
23
+
24
+ it 'should ensure correct values from sinatra app' do
25
+ get '/'
26
+ expect { expect_json_types(foo: :int) }.to raise_error(ExpectationNotMetError)
27
+ end
28
+
29
+ it 'Should set json_body even when not using the airborne http requests' do
30
+ Response = Struct.new(:body, :headers)
31
+ @response = Response.new({ foo: 'bar' }.to_json)
32
+ expect(json_body).to eq(foo: 'bar')
33
+ end
34
+
35
+ it 'Should work with consecutive requests' do
36
+ Response = Struct.new(:body, :headers)
37
+ @response = Response.new({ foo: 'bar' }.to_json)
38
+ expect(json_body).to eq(foo: 'bar')
39
+
40
+ @response = Response.new({ foo: 'boo' }.to_json)
41
+ expect(json_body).to eq(foo: 'boo')
42
+ end
43
+ end
@@ -0,0 +1,14 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+ require 'airborne'
4
+ require 'stub_helper'
5
+
6
+ Airborne.configure do |config|
7
+ config.base_url = 'http://www.example.com'
8
+ config.include StubHelper
9
+ end
10
+
11
+ ExpectationNotMetError = RSpec::Expectations::ExpectationNotMetError
12
+ ExpectationError = Airborne::ExpectationError
13
+ InvalidJsonError = Airborne::InvalidJsonError
14
+ PathError = Airborne::PathError
@@ -0,0 +1,45 @@
1
+ require 'webmock/rspec'
2
+
3
+ module StubHelper
4
+ def initialize(*args)
5
+ @base_url = 'http://www.example.com/'
6
+ end
7
+
8
+ def mock_get(url, response_headers = {}, status = 200)
9
+ stub_request(:get, @base_url + url).to_return(headers: response_headers, body: get_json_response_file(url), status: status)
10
+ end
11
+
12
+ def mock_post(url, options = {}, status = 200)
13
+ stub_request(:post, @base_url + url).with(body: options[:request_body] || {})
14
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
15
+ end
16
+
17
+ def mock_put(url, options = {}, status = 200)
18
+ stub_request(:put, @base_url + url).with(body: options[:request_body] || {})
19
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
20
+ end
21
+
22
+ def mock_patch(url, options = {}, status = 200)
23
+ stub_request(:patch, @base_url + url).with(body: options[:request_body] || {})
24
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
25
+ end
26
+
27
+ def mock_delete(url, options = {}, status = 200)
28
+ stub_request(:delete, @base_url + url).with(body: options[:request_body] || {})
29
+ .to_return(headers: options[:response_headers] || {}, body: get_json_response_file(url), status: status)
30
+ end
31
+
32
+ def mock_head(url, response_headers = {}, status = 200)
33
+ stub_request(:head, @base_url + url).to_return(headers: response_headers, body: nil, status: status)
34
+ end
35
+
36
+ def mock_options(url, response_headers = {}, status = 200)
37
+ stub_request(:options, @base_url + url).to_return(headers: response_headers, body: nil, status: status)
38
+ end
39
+
40
+ private
41
+
42
+ def get_json_response_file(name)
43
+ IO.read("spec/test_responses/#{name}.json")
44
+ end
45
+ end
@@ -0,0 +1,9 @@
1
+ {
2
+ "array_of_ints": [1,2,3],
3
+ "array_of_floats": [1.2, 2.2, 3.3],
4
+ "array_of_strings": ["one", "two", "three"],
5
+ "array_of_bools": [true, false, true],
6
+ "array_of_objects": [{}, {}, {}],
7
+ "array_of_arrays": [[], [], []],
8
+ "nil_array": null
9
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "grades":[89,65,100,92],
3
+ "bad": [89,67,"foo"],
4
+ "emptyArray": []
5
+ }
@@ -0,0 +1,5 @@
1
+ [
2
+ {
3
+ "name":"Seth"
4
+ }
5
+ ]
@@ -0,0 +1,6 @@
1
+ {
2
+ "cars":[
3
+ {"make": "Tesla", "model": "Model S"},
4
+ {"make": "Lamborghini", "model": "Aventador"}
5
+ ]
6
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "cars": [{
3
+ "make": "Tesla",
4
+ "model": "Model S",
5
+ "owners": [
6
+ {"name": "Bart Simpson"}
7
+ ]
8
+ }, {
9
+ "make": "Lamborghini",
10
+ "model": "Aventador",
11
+ "owners": [
12
+ {"name": "Peter Griffin"}
13
+
14
+ ]
15
+ }]
16
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "cars": [{
3
+ "make": "Tesla",
4
+ "model": "Model S",
5
+ "owners": [{
6
+ "name": "Bart Simpson"
7
+ }]
8
+ }, {
9
+ "make": "Lamborghini",
10
+ "model": "Aventador",
11
+ "owners": [{
12
+ "name": 123
13
+ }]
14
+ }]
15
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "cars": [{
3
+ "make": "Tesla",
4
+ "model": "Model S",
5
+ "owners": [
6
+ {"name": "Bart Simpson"}
7
+ ]
8
+ }, {
9
+ "make": "Lamborghini",
10
+ "model": "Aventador"
11
+ }]
12
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "dateDeleted": null
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "createdAt": "Mon Oct 20 2014 16:10:42 GMT-0400 (EDT)"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "person": { "name": "Alex" }
3
+ }
@@ -0,0 +1 @@
1
+ THIS IS INTENTIONALLY NOT JSON
@@ -0,0 +1 @@
1
+ invalid1234
@@ -0,0 +1,6 @@
1
+ {
2
+ "cars": {
3
+ "0": {"make": "Tesla", "model": "Model S"},
4
+ "1": {"make": "Lamborghini", "model": "Aventador"}
5
+ }
6
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "status": "ok",
3
+ "someNumber": 100
4
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Alex",
3
+ "age": 32,
4
+ "address": null
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "foo": "foo",
3
+ "bar": "bar",
4
+ "baz": "baz"
5
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "Alex",
3
+ "address": {
4
+ "street": "Area 51",
5
+ "city": "Roswell",
6
+ "state": "NM",
7
+ "coordinates":{
8
+ "lattitude": 33.3872,
9
+ "longitutde": 104.5281
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "status": "ok",
3
+ "someNumber": 100
4
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "Alex",
3
+ "address": {
4
+ "street": "Area 51",
5
+ "city": "Roswell",
6
+ "state": "NM"
7
+ }
8
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "status": "ok",
3
+ "someNumber": 100
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "status": "ok",
3
+ "someNumber": 100
4
+ }
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hops-airborne
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.15
5
+ platform: ruby
6
+ authors:
7
+ - Alex Friedman
8
+ - Seth Pollack
9
+ - Fabio Buso
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2019-02-18 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '3.1'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rest-client
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 1.7.3
36
+ - - "<"
37
+ - !ruby/object:Gem::Version
38
+ version: '3.0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 1.7.3
46
+ - - "<"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: rack-test
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.6'
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: 0.6.2
59
+ type: :runtime
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "~>"
64
+ - !ruby/object:Gem::Version
65
+ version: '0.6'
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
112
+ email:
113
+ - fabio@logicalclocks.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".coveralls.yml"
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENSE
124
+ - README.md
125
+ - airborne.gemspec
126
+ - lib/airborne.rb
127
+ - lib/airborne/base.rb
128
+ - lib/airborne/optional_hash_type_expectations.rb
129
+ - lib/airborne/path_matcher.rb
130
+ - lib/airborne/rack_test_requester.rb
131
+ - lib/airborne/request_expectations.rb
132
+ - lib/airborne/rest_client_requester.rb
133
+ - spec/airborne/base_spec.rb
134
+ - spec/airborne/client_requester_spec.rb
135
+ - spec/airborne/delete_spec.rb
136
+ - spec/airborne/expectations/expect_header_contains_spec.rb
137
+ - spec/airborne/expectations/expect_header_spec.rb
138
+ - spec/airborne/expectations/expect_json_keys_path_spec.rb
139
+ - spec/airborne/expectations/expect_json_keys_spec.rb
140
+ - spec/airborne/expectations/expect_json_lambda_spec.rb
141
+ - spec/airborne/expectations/expect_json_options_spec.rb
142
+ - spec/airborne/expectations/expect_json_path_spec.rb
143
+ - spec/airborne/expectations/expect_json_regex_spec.rb
144
+ - spec/airborne/expectations/expect_json_sizes_spec.rb
145
+ - spec/airborne/expectations/expect_json_spec.rb
146
+ - spec/airborne/expectations/expect_json_types_date_spec.rb
147
+ - spec/airborne/expectations/expect_json_types_lambda_spec.rb
148
+ - spec/airborne/expectations/expect_json_types_optional_spec.rb
149
+ - spec/airborne/expectations/expect_json_types_options_spec.rb
150
+ - spec/airborne/expectations/expect_json_types_path_spec.rb
151
+ - spec/airborne/expectations/expect_json_types_spec.rb
152
+ - spec/airborne/expectations/expect_status_spec.rb
153
+ - spec/airborne/head_spec.rb
154
+ - spec/airborne/options_spec.rb
155
+ - spec/airborne/patch_spec.rb
156
+ - spec/airborne/path_spec.rb
157
+ - spec/airborne/post_spec.rb
158
+ - spec/airborne/put_spec.rb
159
+ - spec/airborne/rack/rack_sinatra_spec.rb
160
+ - spec/spec_helper.rb
161
+ - spec/stub_helper.rb
162
+ - spec/test_responses/array_of_types.json
163
+ - spec/test_responses/array_of_values.json
164
+ - spec/test_responses/array_response.json
165
+ - spec/test_responses/array_with_index.json
166
+ - spec/test_responses/array_with_nested.json
167
+ - spec/test_responses/array_with_nested_bad_data.json
168
+ - spec/test_responses/array_with_partial_nested.json
169
+ - spec/test_responses/date_is_null_response.json
170
+ - spec/test_responses/date_response.json
171
+ - spec/test_responses/hash_property.json
172
+ - spec/test_responses/invalid_get.json
173
+ - spec/test_responses/invalid_json.json
174
+ - spec/test_responses/numeric_property.json
175
+ - spec/test_responses/simple_delete.json
176
+ - spec/test_responses/simple_get.json
177
+ - spec/test_responses/simple_json.json
178
+ - spec/test_responses/simple_nested_path.json
179
+ - spec/test_responses/simple_patch.json
180
+ - spec/test_responses/simple_path_get.json
181
+ - spec/test_responses/simple_post.json
182
+ - spec/test_responses/simple_put.json
183
+ homepage:
184
+ licenses:
185
+ - MIT
186
+ metadata: {}
187
+ post_install_message:
188
+ rdoc_options: []
189
+ require_paths:
190
+ - lib
191
+ required_ruby_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ required_rubygems_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ requirements: []
202
+ rubygems_version: 3.0.2
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: RSpec driven API testing framework - LogicalClocks maintained fork
206
+ test_files: []