hyperspec 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - jruby-18mode # JRuby in 1.8 mode
7
+ - jruby-19mode # JRuby in 1.9 mode
8
+ - rbx-18mode
9
+ - rbx-19mode
10
+ script: ruby -rubygems -w spec/hyperspec_spec.rb
data/README.md CHANGED
@@ -10,6 +10,8 @@ A full stack testing framework for HTTP APIs.
10
10
  By extending `minitest/spec` HyperSpec provides a Ruby DSL for testing
11
11
  HTTP APIs from the outside.
12
12
 
13
+ [![Build Status](https://secure.travis-ci.org/hannestyden/hyperspec.png)](http://travis-ci.org/hannestyden/hyperspec)
14
+
13
15
  ## Example
14
16
 
15
17
  ```ruby
data/hyperspec.gemspec CHANGED
@@ -3,22 +3,27 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
  require "hyperspec/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "hyperspec"
7
- s.version = HyperSpec::VERSION
8
- s.authors = [ "Hannes Tydén" ]
9
- s.email = [ "hannes@soundcloud.com" ]
10
- s.homepage = "http://github.com/hannestyden/hyperspec"
11
- s.summary = "Full stack HTTP API testing DSL."
6
+ s.name = "hyperspec"
7
+ s.version = HyperSpec::VERSION
8
+ s.authors = [ "Hannes Tydén" ]
9
+ s.email = [ "hannes@soundcloud.com" ]
10
+ s.homepage = "http://github.com/hannestyden/hyperspec"
11
+ s.summary = "Full stack HTTP API testing DSL."
12
+
12
13
  s.description = <<-DESCRIPTION
13
- By extending minitest/spec HyperSpec provides a Ruby DSL for testing HTTP APIs from the "outside".
14
+ By extending minitest/spec HyperSpec provides a Ruby DSL for testing
15
+ HTTP APIs from the "outside".
14
16
  DESCRIPTION
15
17
 
16
18
  # Required for validation.
17
19
  s.rubyforge_project = "hyperspec"
18
20
 
19
- s.files = `git ls-files`.split("\n")
20
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.files = `git ls-files`.split("\n")
22
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
+
24
+ s.executables = `git ls-files -- bin/*`.
25
+ split("\n").map { |f| File.basename(f) }
26
+
22
27
  s.require_paths = [ "lib" ]
23
28
 
24
29
  dependencies =
@@ -28,17 +33,17 @@ Gem::Specification.new do |s|
28
33
 
29
34
  developement_dependencies =
30
35
  [
31
- [ "vcr", "~> 1.6" ],
32
- [ "webmock" ],
36
+ [ "vcr", "~> 1.6" ],
37
+ [ "fakeweb" ],
33
38
  ]
34
39
 
35
- runtime_dependencies = []
40
+ runtime_dependencies = []
36
41
 
37
42
  (dependencies + developement_dependencies).each do |dependency|
38
- s.add_development_dependency *dependency
43
+ s.add_development_dependency(*dependency)
39
44
  end
40
45
 
41
46
  (dependencies + runtime_dependencies).each do |dependency|
42
- s.add_runtime_dependency *dependency
47
+ s.add_runtime_dependency(*dependency)
43
48
  end
44
49
  end
data/lib/hyperspec.rb CHANGED
@@ -61,18 +61,32 @@ module HyperSpec
61
61
 
62
62
  # HTTP method selection
63
63
  #
64
- {
65
- 'get' => Net::HTTP::Get,
66
- 'head' => Net::HTTP::Head,
67
- 'post' => Net::HTTP::Post,
68
- 'put' => Net::HTTP::Put,
69
- 'delete' => Net::HTTP::Delete,
70
- }.each do |http_method, request_class|
71
- define_method(http_method) do |additional_desc = nil, &block|
72
- describe(http_method.upcase, additional_desc, &block).tap do |cls|
73
- cls.class_eval do
74
- define_method(:request_class) { request_class }
75
- end
64
+ # Hard coded method definitions is required for 1.8.7 compatibility.
65
+ def get(additional_desc = nil, &block)
66
+ _request('get', Net::HTTP::Get, additional_desc, &block)
67
+ end
68
+
69
+ def head(additional_desc = nil, &block)
70
+ _request('head', Net::HTTP::Head, additional_desc, &block)
71
+ end
72
+
73
+ def post(additional_desc = nil, &block)
74
+ _request('post', Net::HTTP::Post, additional_desc, &block)
75
+ end
76
+
77
+ def put(additional_desc = nil, &block)
78
+ _request('put', Net::HTTP::Put, additional_desc, &block)
79
+ end
80
+
81
+ def delete(additional_desc = nil, &block)
82
+ _request('delete', Net::HTTP::Delete, additional_desc, &block)
83
+ end
84
+
85
+ private
86
+ def _request(http_method, request_class, additional_desc, &block)
87
+ describe(http_method.upcase, additional_desc, &block).tap do |cls|
88
+ cls.class_eval do
89
+ define_method(:request_class) { request_class }
76
90
  end
77
91
  end
78
92
  end
@@ -85,7 +99,7 @@ module HyperSpec
85
99
  end
86
100
 
87
101
  def responds_with
88
- Have.new(response)
102
+ RespondsWith.new(response)
89
103
  end
90
104
 
91
105
  private
@@ -120,18 +134,77 @@ module HyperSpec
120
134
  end
121
135
  end
122
136
 
137
+ class UnkownStatusCodeError < StandardError; end
138
+
123
139
  Response = Struct.new(:status_code, :headers, :body) do
124
140
  STATI = {
125
- # 2xx
141
+ # RFC 2616 - HTTP 1.1
142
+ ## Informational
143
+ 100 => :continue,
144
+ 101 => :switching_protocols,
145
+
146
+ ## Successful 2xx
126
147
  200 => :ok,
127
148
  201 => :created,
149
+ 202 => :accepted,
150
+ 203 => :non_authoritative_information,
151
+ 204 => :no_content,
152
+ 205 => :reset_content,
153
+ 206 => :partial_content,
128
154
 
129
- # 4xx
155
+ ## Redirection 3xx
156
+ 300 => :multiple_choices,
157
+ 301 => :moved_permanently,
158
+ 302 => :found,
159
+ 303 => :see_other,
160
+ 304 => :not_modified,
161
+ 305 => :use_proxy,
162
+ # 306 => :(Unused),
163
+ 307 => :temporary_redirect,
164
+
165
+ ## Client Error 4xx,
166
+ 400 => :bad_request,
130
167
  401 => :unauthorized,
168
+ 402 => :payment_required,
169
+ 403 => :forbidden,
170
+ 404 => :not_found,
171
+ 405 => :method_not_allowed,
172
+ 406 => :not_acceptable,
173
+ 407 => :proxy_authentication_required,
174
+ 408 => :request_timeout,
175
+ 409 => :conflict,
176
+ 410 => :gone,
131
177
  411 => :length_required,
178
+ 412 => :precondition_failed,
179
+ 413 => :request_entity_too_large,
180
+ 414 => :request_uri_too_long,
181
+ 415 => :unsupported_media_type,
182
+ 416 => :requested_range_not_satisfiable,
183
+ 417 => :expectation_failed,
184
+
185
+ ## Server Error 5xx
186
+ 500 => :internal_server_error,
187
+ 501 => :not_implemented,
188
+ 502 => :bad_gateway,
189
+ 503 => :service_unavailable,
190
+ 504 => :gateway_timeout,
191
+ 505 => :http_version_not_supported,
192
+
193
+ # RFC 2324
194
+ 418 => :im_a_teapot,
132
195
 
133
- # WebDav extensions
196
+ # RFC 4918 - WebDav
197
+ 207 => :multi_status,
134
198
  422 => :unprocessable_entity,
199
+ 423 => :locked,
200
+ 424 => :failed_dependency,
201
+ 507 => :insufficient_storage,
202
+
203
+ # RFC 6585 - Additional HTTP Status Codes
204
+ 428 => :precondition_required,
205
+ 429 => :too_many_requests,
206
+ 431 => :request_header_fields_too_large,
207
+ 511 => :network_authentication_required,
135
208
  }
136
209
 
137
210
  def self.from_net_http_response(http)
@@ -179,6 +252,17 @@ module HyperSpec
179
252
  proxy.send(method_name).must_equal(*arguments)
180
253
  end
181
254
  end
255
+
256
+ class RespondsWith < Have
257
+ def status(status_code_symbol)
258
+ if STATI.has_value?(status_code_symbol)
259
+ proxy.status.must_equal(status_code_symbol)
260
+ else
261
+ raise UnkownStatusCodeError,
262
+ "Status code #{status_code_symbol.inspect} is unkown."
263
+ end
264
+ end
265
+ end
182
266
  end
183
267
 
184
268
  ::Object.send(:include, HyperSpec::ObjectExtensions)
@@ -1,6 +1,6 @@
1
1
  module HyperSpec
2
2
  MAJOR = 0
3
3
  MINOR = 0
4
- PATCH = 2
4
+ PATCH = 3
5
5
  VERSION = [ MAJOR, MINOR, PATCH ].join(".")
6
6
  end
@@ -1,6 +1,8 @@
1
1
  require 'uri'
2
2
 
3
- gem 'minitest' # Ensure gem is used over built in.
3
+ # Ensure gem is used over 1.9.x built in.
4
+ gem 'minitest' if RUBY_VERSION =~ /1.9.\d/
5
+
4
6
  require 'minitest/spec'
5
7
  require 'minitest/autorun'
6
8
 
@@ -21,8 +23,8 @@ describe HyperSpec do
21
23
 
22
24
  use_vcr_cassette('localhost')
23
25
 
24
- it "should be of version 0.0.1" do
25
- HyperSpec::VERSION.must_equal "0.0.1"
26
+ it "should be of version 0.0.2" do
27
+ HyperSpec::VERSION.must_equal "0.0.2"
26
28
  end
27
29
 
28
30
  describe "MiniTest::Spec extensions" do
@@ -161,11 +163,73 @@ describe HyperSpec do
161
163
 
162
164
  describe "status" do
163
165
  {
166
+ # RFC 2616 - HTTP 1.1
167
+ ## Informational
168
+ 100 => :continue,
169
+ 101 => :switching_protocols,
170
+
171
+ ## Successful 2xx
164
172
  200 => :ok,
165
173
  201 => :created,
174
+ 202 => :accepted,
175
+ 203 => :non_authoritative_information,
176
+ 204 => :no_content,
177
+ 205 => :reset_content,
178
+ 206 => :partial_content,
179
+
180
+ ## Redirection 3xx
181
+ 300 => :multiple_choices,
182
+ 301 => :moved_permanently,
183
+ 302 => :found,
184
+ 303 => :see_other,
185
+ 304 => :not_modified,
186
+ 305 => :use_proxy,
187
+ # 306 => :(Unused),
188
+ 307 => :temporary_redirect,
189
+
190
+ ## Client Error 4xx,
191
+ 400 => :bad_request,
166
192
  401 => :unauthorized,
193
+ 402 => :payment_required,
194
+ 403 => :forbidden,
195
+ 404 => :not_found,
196
+ 405 => :method_not_allowed,
197
+ 406 => :not_acceptable,
198
+ 407 => :proxy_authentication_required,
199
+ 408 => :request_timeout,
200
+ 409 => :conflict,
201
+ 410 => :gone,
167
202
  411 => :length_required,
203
+ 412 => :precondition_failed,
204
+ 413 => :request_entity_too_large,
205
+ 414 => :request_uri_too_long,
206
+ 415 => :unsupported_media_type,
207
+ 416 => :requested_range_not_satisfiable,
208
+ 417 => :expectation_failed,
209
+
210
+ ## Server Error 5xx
211
+ 500 => :internal_server_error,
212
+ 501 => :not_implemented,
213
+ 502 => :bad_gateway,
214
+ 503 => :service_unavailable,
215
+ 504 => :gateway_timeout,
216
+ 505 => :http_version_not_supported,
217
+
218
+ # RFC 2324
219
+ 418 => :im_a_teapot,
220
+
221
+ # RFC 4918 - WebDav
222
+ 207 => :multi_status,
168
223
  422 => :unprocessable_entity,
224
+ 423 => :locked,
225
+ 424 => :failed_dependency,
226
+ 507 => :insufficient_storage,
227
+
228
+ # RFC 6585 - Additional HTTP Status Codes
229
+ 428 => :precondition_required,
230
+ 429 => :too_many_requests,
231
+ 431 => :request_header_fields_too_large,
232
+ 511 => :network_authentication_required,
169
233
  }.each do |code, status|
170
234
  it do
171
235
  subject.status_code = code
@@ -203,6 +267,12 @@ describe HyperSpec do
203
267
 
204
268
  it { subject.status_code 200 }
205
269
  it { subject.status :ok }
270
+
271
+ it do
272
+ lambda do
273
+ subject.status :this_is_not_known
274
+ end.must_raise HyperSpec::UnkownStatusCodeError
275
+ end
206
276
  end
207
277
 
208
278
  describe "basic auth" do
metadata CHANGED
@@ -1,72 +1,90 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hyperspec
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
4
5
  prerelease:
5
- version: 0.0.2
6
6
  platform: ruby
7
- authors:
8
- - "Hannes Tyd\xC3\xA9n"
7
+ authors:
8
+ - Hannes Tydén
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-03-30 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-08-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: minitest
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
23
- version: "2.11"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.11'
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: vcr
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
30
25
  none: false
31
- requirements:
26
+ requirements:
32
27
  - - ~>
33
- - !ruby/object:Gem::Version
34
- version: "1.6"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.11'
30
+ - !ruby/object:Gem::Dependency
31
+ name: vcr
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.6'
35
38
  type: :development
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: webmock
39
39
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.6'
46
+ - !ruby/object:Gem::Dependency
47
+ name: fakeweb
48
+ requirement: !ruby/object:Gem::Requirement
41
49
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
46
54
  type: :development
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: minitest
50
55
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: minitest
64
+ requirement: !ruby/object:Gem::Requirement
52
65
  none: false
53
- requirements:
66
+ requirements:
54
67
  - - ~>
55
- - !ruby/object:Gem::Version
56
- version: "2.11"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.11'
57
70
  type: :runtime
58
- version_requirements: *id004
59
- description: " By extending minitest/spec HyperSpec provides a Ruby DSL for testing HTTP APIs from the \"outside\".\n"
60
- email:
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.11'
78
+ description: ! " By extending minitest/spec HyperSpec provides a Ruby DSL for testing\n
79
+ \ HTTP APIs from the \"outside\".\n"
80
+ email:
61
81
  - hannes@soundcloud.com
62
82
  executables: []
63
-
64
83
  extensions: []
65
-
66
84
  extra_rdoc_files: []
67
-
68
- files:
85
+ files:
69
86
  - .gitignore
87
+ - .travis.yml
70
88
  - Gemfile
71
89
  - README.md
72
90
  - Rakefile
@@ -82,32 +100,29 @@ files:
82
100
  - spec/support/vcr.rb
83
101
  homepage: http://github.com/hannestyden/hyperspec
84
102
  licenses: []
85
-
86
103
  post_install_message:
87
104
  rdoc_options: []
88
-
89
- require_paths:
105
+ require_paths:
90
106
  - lib
91
- required_ruby_version: !ruby/object:Gem::Requirement
107
+ required_ruby_version: !ruby/object:Gem::Requirement
92
108
  none: false
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: "0"
97
- required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
114
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: "0"
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
103
119
  requirements: []
104
-
105
120
  rubyforge_project: hyperspec
106
- rubygems_version: 1.8.15
121
+ rubygems_version: 1.8.24
107
122
  signing_key:
108
123
  specification_version: 3
109
124
  summary: Full stack HTTP API testing DSL.
110
- test_files:
125
+ test_files:
111
126
  - spec/fixtures/vcr_cassettes/localhost.yml
112
127
  - spec/hyperspec_spec.rb
113
128
  - spec/support/meta_spec.rb