vcr 1.3.3 → 1.4.0

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.
Files changed (46) hide show
  1. data/.rspec +2 -0
  2. data/CHANGELOG.md +16 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +23 -4
  5. data/Guardfile +6 -0
  6. data/README.md +5 -4
  7. data/Rakefile +1 -3
  8. data/TODO.md +3 -0
  9. data/cucumber.yml +3 -3
  10. data/features/cassettes/no_cassette.feature +67 -0
  11. data/features/configuration/allow_http_connections_when_no_cassette.feature +54 -0
  12. data/features/configuration/ignore_localhost.feature +2 -2
  13. data/features/configuration/stub_with.feature +40 -16
  14. data/features/http_libraries/em_http_request.feature +217 -0
  15. data/features/middleware/faraday.feature +89 -0
  16. data/features/middleware/rack.feature +95 -0
  17. data/features/step_definitions/cli_steps.rb +7 -0
  18. data/lib/vcr.rb +48 -4
  19. data/lib/vcr/config.rb +11 -2
  20. data/lib/vcr/extensions/net_http.rb +4 -0
  21. data/lib/vcr/http_stubbing_adapters/common.rb +35 -4
  22. data/lib/vcr/http_stubbing_adapters/faraday.rb +80 -0
  23. data/lib/vcr/http_stubbing_adapters/typhoeus.rb +1 -1
  24. data/lib/vcr/http_stubbing_adapters/webmock.rb +18 -16
  25. data/lib/vcr/middleware/cassette_arguments.rb +18 -0
  26. data/lib/vcr/middleware/common.rb +22 -0
  27. data/lib/vcr/middleware/faraday.rb +79 -0
  28. data/lib/vcr/middleware/rack.rb +13 -0
  29. data/lib/vcr/request_matcher.rb +16 -1
  30. data/lib/vcr/version.rb +1 -1
  31. data/spec/config_spec.rb +27 -2
  32. data/spec/fixtures/1.9.1/fake_example.com_responses.yml +0 -29
  33. data/spec/fixtures/1.9.1/match_requests_on.yml +2 -2
  34. data/spec/fixtures/not_1.9.1/fake_example.com_responses.yml +0 -29
  35. data/spec/http_stubbing_adapters/faraday_spec.rb +84 -0
  36. data/spec/middleware/cassette_arguments_spec.rb +32 -0
  37. data/spec/middleware/faraday_spec.rb +52 -0
  38. data/spec/middleware/rack_spec.rb +54 -0
  39. data/spec/monkey_patches.rb +1 -0
  40. data/spec/request_matcher_spec.rb +36 -0
  41. data/spec/spec_helper.rb +10 -0
  42. data/spec/support/http_library_adapters.rb +113 -25
  43. data/spec/support/http_stubbing_adapter.rb +55 -16
  44. data/spec/vcr_spec.rb +92 -4
  45. data/vcr.gemspec +1 -0
  46. metadata +72 -34
@@ -1,33 +1,4 @@
1
1
  ---
2
- - !ruby/struct:VCR::HTTPInteraction
3
- :request: !ruby/struct:VCR::Request
4
- :method: :post
5
- :uri: http://example.com:80/
6
- :body:
7
- :headers:
8
- :response: !ruby/struct:VCR::Response
9
- :status: !ruby/struct:VCR::ResponseStatus
10
- :code: 200
11
- :message: OK
12
- :headers:
13
- etag:
14
- - "\"24ec5-1b6-4059a80bfd280\""
15
- last-modified:
16
- - Tue, 15 Nov 2005 13:24:10 GMT
17
- content-type:
18
- - text/html; charset=UTF-8
19
- connection:
20
- - close
21
- server:
22
- - Apache/2.2.3 (CentOS)
23
- date:
24
- - Wed, 31 Mar 2010 02:43:26 GMT
25
- content-length:
26
- - "438"
27
- accept-ranges:
28
- - bytes
29
- :body: example.com post response with id=7
30
- :http_version: "1.1"
31
2
  - !ruby/struct:VCR::HTTPInteraction
32
3
  :request: !ruby/struct:VCR::Request
33
4
  :method: :get
@@ -155,7 +155,7 @@
155
155
  :uri: http://example.com:80/
156
156
  :body:
157
157
  :headers:
158
- :x-http-header1:
158
+ x-http-header1:
159
159
  - val1
160
160
  :response: !ruby/struct:VCR::Response
161
161
  :status: !ruby/struct:VCR::ResponseStatus
@@ -172,7 +172,7 @@
172
172
  :uri: http://example.com:80/
173
173
  :body:
174
174
  :headers:
175
- :x-http-header1:
175
+ x-http-header1:
176
176
  - val2
177
177
  :response: !ruby/struct:VCR::Response
178
178
  :status: !ruby/struct:VCR::ResponseStatus
@@ -1,33 +1,4 @@
1
1
  ---
2
- - !ruby/struct:VCR::HTTPInteraction
3
- request: !ruby/struct:VCR::Request
4
- method: :post
5
- uri: http://example.com:80/
6
- body:
7
- headers:
8
- response: !ruby/struct:VCR::Response
9
- status: !ruby/struct:VCR::ResponseStatus
10
- code: 200
11
- message: OK
12
- headers:
13
- last-modified:
14
- - Tue, 15 Nov 2005 13:24:10 GMT
15
- connection:
16
- - close
17
- etag:
18
- - "\"24ec5-1b6-4059a80bfd280\""
19
- content-type:
20
- - text/html; charset=UTF-8
21
- date:
22
- - Wed, 31 Mar 2010 02:43:26 GMT
23
- server:
24
- - Apache/2.2.3 (CentOS)
25
- content-length:
26
- - "438"
27
- accept-ranges:
28
- - bytes
29
- body: example.com post response with id=7
30
- http_version: "1.1"
31
2
  - !ruby/struct:VCR::HTTPInteraction
32
3
  request: !ruby/struct:VCR::Request
33
4
  method: :get
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe VCR::HttpStubbingAdapters::Faraday do
4
+ without_monkey_patches :all
5
+
6
+ it_behaves_like 'an http stubbing adapter',
7
+ %w[ faraday-typhoeus faraday-net_http faraday-patron ],
8
+ [:method, :uri, :host, :path, :body, :headers],
9
+ :status_message_not_exposed, :does_not_support_rotating_responses
10
+
11
+ it_performs('version checking',
12
+ :valid => %w[ 0.5.3 0.5.10 ],
13
+ :too_low => %w[ 0.5.2 0.4.99 ],
14
+ :too_high => %w[ 0.6.0 1.0.0 ]
15
+ ) do
16
+ disable_warnings
17
+ before(:each) { @orig_version = Faraday::VERSION }
18
+ after(:each) { Faraday::VERSION = @orig_version }
19
+
20
+ # Cannot be regular method def as that raises a "dynamic constant assignment" error
21
+ define_method :stub_version do |version|
22
+ ::Faraday::VERSION = version
23
+ end
24
+ end
25
+
26
+ context 'when some request have been stubbed' do
27
+ subject { described_class }
28
+ let(:request_1) { VCR::Request.new(:get, 'http://foo.com') }
29
+ let(:request_2) { VCR::Request.new(:get, 'http://bazz.com') }
30
+ let(:match_attributes) { [:method, :uri] }
31
+
32
+ def stubbed_response_for(request)
33
+ matcher = VCR::RequestMatcher.new(request, match_attributes)
34
+ subject.stubbed_response_for(matcher)
35
+ end
36
+
37
+ before(:each) do
38
+ subject.stub_requests(
39
+ [
40
+ VCR::HTTPInteraction.new(request_1, :response_1),
41
+ VCR::HTTPInteraction.new(request_1, :response_2),
42
+ ], match_attributes
43
+ )
44
+ end
45
+
46
+ def test_stubbed_responses
47
+ stubbed_response_for(request_1).should == :response_1
48
+ stubbed_response_for(request_1).should == :response_2
49
+ stubbed_response_for(request_1).should == :response_2
50
+ stubbed_response_for(request_1).should == :response_2
51
+ end
52
+
53
+ describe '.stubbed_response_for' do
54
+ it 'returns nil when there is no matching response' do
55
+ stubbed_response_for(request_2).should be_nil
56
+ end
57
+
58
+ it 'dequeues each response and continues to return the last one' do
59
+ test_stubbed_responses
60
+ end
61
+ end
62
+
63
+ describe '.restore_stubs_checkpoints' do
64
+ before(:each) do
65
+ subject.create_stubs_checkpoint(:checkpoint_1)
66
+ end
67
+
68
+ it 'restores the queues to the checkpoint state when a queue has additional responses' do
69
+ subject.stub_requests( [
70
+ VCR::HTTPInteraction.new(request_1, :response_3),
71
+ ], match_attributes)
72
+
73
+ subject.restore_stubs_checkpoint(:checkpoint_1)
74
+ test_stubbed_responses
75
+ end
76
+
77
+ it 'restores the queues to the checkpoint state when a queue has been used' do
78
+ stubbed_response_for(request_1)
79
+ subject.restore_stubs_checkpoint(:checkpoint_1)
80
+ test_stubbed_responses
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe VCR::Middleware::CassetteArguments do
4
+ describe '#name' do
5
+ it 'initially returns nil' do
6
+ subject.name.should be_nil
7
+ end
8
+
9
+ it 'stores the given value, returning it when no arg is given' do
10
+ subject.name :value1
11
+ subject.name.should == :value1
12
+
13
+ subject.name :value2
14
+ subject.name.should == :value2
15
+ end
16
+ end
17
+
18
+ describe '#options' do
19
+ it 'initially returns an empty hash' do
20
+ subject.options.should == {}
21
+ end
22
+
23
+ it 'merges the given hash options, returning them when no arg is given' do
24
+ subject.options :record => :new_episodes
25
+ subject.options.should == { :record => :new_episodes }
26
+
27
+ subject.options :erb => true
28
+ subject.options.should == { :record => :new_episodes, :erb => true }
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe VCR::Middleware::Faraday do
4
+ describe '.new' do
5
+ it 'raises an error if no cassette arguments block is provided' do
6
+ expect {
7
+ described_class.new(lambda { |env| })
8
+ }.to raise_error(ArgumentError)
9
+ end
10
+ end
11
+
12
+ describe '#call' do
13
+ let(:env_hash) { { :url => 'http://localhost:3000/' } }
14
+
15
+ before(:each) do
16
+ VCR::HttpStubbingAdapters::Faraday.ignore_localhost = true
17
+ end
18
+
19
+ it 'uses a cassette when the app is called' do
20
+ VCR.current_cassette.should be_nil
21
+ app = lambda { |env| VCR.current_cassette.should_not be_nil }
22
+ instance = described_class.new(app) { |c| c.name 'cassette_name' }
23
+ instance.call(env_hash)
24
+ VCR.current_cassette.should be_nil
25
+ end
26
+
27
+ it 'sets the cassette name based on the provided block' do
28
+ app = lambda { |env| VCR.current_cassette.name.should == 'rack_cassette' }
29
+ instance = described_class.new(app) { |c| c.name 'rack_cassette' }
30
+ instance.call(env_hash)
31
+ end
32
+
33
+ it 'sets the cassette options based on the provided block' do
34
+ app = lambda { |env| VCR.current_cassette.erb.should == { :foo => :bar } }
35
+ instance = described_class.new(app) do |c|
36
+ c.name 'c'
37
+ c.options :erb => { :foo => :bar }
38
+ end
39
+
40
+ instance.call(env_hash)
41
+ end
42
+
43
+ it 'yields the env to the provided block when the block accepts 2 arguments' do
44
+ instance = described_class.new(lambda { |env| }) do |c, env|
45
+ env.should == env_hash
46
+ c.name 'c'
47
+ end
48
+
49
+ instance.call(env_hash)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe VCR::Middleware::Rack do
4
+ describe '.new' do
5
+ it 'raises an error if no cassette arguments block is provided' do
6
+ expect {
7
+ described_class.new(lambda { |env| })
8
+ }.to raise_error(ArgumentError)
9
+ end
10
+ end
11
+
12
+ describe '#call' do
13
+ let(:env_hash) { { :env => :hash } }
14
+ it 'calls the provided rack app and returns its response' do
15
+ rack_app = mock
16
+ rack_app.should_receive(:call).with(env_hash).and_return(:response)
17
+ instance = described_class.new(rack_app) { |c| c.name 'cassette_name' }
18
+ instance.call(env_hash).should == :response
19
+ end
20
+
21
+ it 'uses a cassette when the rack app is called' do
22
+ VCR.current_cassette.should be_nil
23
+ rack_app = lambda { |env| VCR.current_cassette.should_not be_nil }
24
+ instance = described_class.new(rack_app) { |c| c.name 'cassette_name' }
25
+ instance.call({})
26
+ VCR.current_cassette.should be_nil
27
+ end
28
+
29
+ it 'sets the cassette name based on the provided block' do
30
+ rack_app = lambda { |env| VCR.current_cassette.name.should == 'rack_cassette' }
31
+ instance = described_class.new(rack_app) { |c| c.name 'rack_cassette' }
32
+ instance.call({})
33
+ end
34
+
35
+ it 'sets the cassette options based on the provided block' do
36
+ rack_app = lambda { |env| VCR.current_cassette.erb.should == { :foo => :bar } }
37
+ instance = described_class.new(rack_app) do |c|
38
+ c.name 'c'
39
+ c.options :erb => { :foo => :bar }
40
+ end
41
+
42
+ instance.call({})
43
+ end
44
+
45
+ it 'yields the rack env to the provided block when the block accepts 2 arguments' do
46
+ instance = described_class.new(lambda { |env| }) do |c, env|
47
+ env.should == env_hash
48
+ c.name 'c'
49
+ end
50
+
51
+ instance.call(env_hash)
52
+ end
53
+ end
54
+ end
@@ -95,6 +95,7 @@ if RUBY_INTERPRETER == :mri
95
95
  require 'patron'
96
96
  require 'em-http-request'
97
97
  require 'curb'
98
+ require 'typhoeus'
98
99
  end
99
100
 
100
101
  # The FakeWeb adapter must be required after WebMock's so
@@ -145,6 +145,10 @@ describe VCR::RequestMatcher do
145
145
  return matcher, matcher(attribute)
146
146
  end
147
147
 
148
+ def matcher_with_headers(headers)
149
+ VCR::RequestMatcher.new(VCR::Request.new(:get, 'http://foo.com/', nil, headers), [:method, :uri, :headers])
150
+ end
151
+
148
152
  describe '#hash' do
149
153
  it 'returns the same code for two objects when #match_attributes, #method, #uri, #body and #headers are the same, even when the request object is different' do
150
154
  m1, m2 = matchers_varying_on(:request)
@@ -164,6 +168,38 @@ describe VCR::RequestMatcher do
164
168
  m1.hash.should_not == m2.hash
165
169
  end
166
170
  end
171
+
172
+ context 'for headers' do
173
+ it 'returns the same code for the same headers' do
174
+ m1 = matcher_with_headers('x-http-header' => ['val1'])
175
+ m2 = matcher_with_headers('x-http-header' => ['val1'])
176
+ m1.hash.should == m2.hash
177
+ end
178
+
179
+ it 'returns the same code when the header keys are ordered differently' do
180
+ m1 = matcher_with_headers('x-http-header1' => ['val1'], 'x-http-header2' => ['val2'])
181
+ m2 = matcher_with_headers('x-http-header2' => ['val2'], 'x-http-header1' => ['val1'])
182
+ m1.hash.should == m2.hash
183
+ end
184
+
185
+ it 'returns the same code when the header value arrays are ordered differently' do
186
+ m1 = matcher_with_headers('x-http-header' => ['val1', 'val2'])
187
+ m2 = matcher_with_headers('x-http-header' => ['val2', 'val1'])
188
+ m1.hash.should == m2.hash
189
+ end
190
+
191
+ it 'returns a different code when the header values are different' do
192
+ m1 = matcher_with_headers('x-http-header' => ['val1'])
193
+ m2 = matcher_with_headers('x-http-header' => ['val2'])
194
+ m1.hash.should_not == m2.hash
195
+ end
196
+
197
+ it 'returns a different code when the header keys are different' do
198
+ m1 = matcher_with_headers('x-http-header1' => ['val1'])
199
+ m2 = matcher_with_headers('x-http-header2' => ['val1'])
200
+ m1.hash.should_not == m2.hash
201
+ end
202
+ end
167
203
  end
168
204
 
169
205
  [:eql?, :==].each do |equality_method|
data/spec/spec_helper.rb CHANGED
@@ -24,6 +24,9 @@ RSpec.configure do |config|
24
24
  config.debug = RUBY_INTERPRETER == :mri
25
25
 
26
26
  config.before(:each) do
27
+ VCR.turn_on! unless VCR.turned_on?
28
+ VCR.eject_cassette while VCR.current_cassette
29
+
27
30
  VCR::Config.default_cassette_options = { :record => :new_episodes }
28
31
  VCR::Config.stub_with :fakeweb
29
32
 
@@ -32,6 +35,8 @@ RSpec.configure do |config|
32
35
 
33
36
  FakeWeb.allow_net_connect = true
34
37
  FakeWeb.clean_registry
38
+
39
+ VCR::HttpStubbingAdapters::Faraday.reset!
35
40
  end
36
41
 
37
42
  config.filter_run :focus => true
@@ -40,3 +45,8 @@ RSpec.configure do |config|
40
45
  config.alias_it_should_behave_like_to :it_performs, 'it performs'
41
46
  end
42
47
 
48
+ http_stubbing_dir = File.join(File.dirname(__FILE__), '..', 'lib', 'vcr', 'http_stubbing_adapters')
49
+ Dir[File.join(http_stubbing_dir, '*.rb')].each do |file|
50
+ next if RUBY_INTERPRETER != :mri && file =~ /(typhoeus)/
51
+ require "vcr/http_stubbing_adapters/#{File.basename(file)}"
52
+ end
@@ -112,12 +112,68 @@ HTTP_LIBRARY_ADAPTERS['typhoeus'] = Module.new do
112
112
  end
113
113
  end
114
114
 
115
+ %w[ net_http typhoeus patron ].each do |_faraday_adapter|
116
+ HTTP_LIBRARY_ADAPTERS["faraday-#{_faraday_adapter}"] = Module.new do
117
+ class << self; self; end.class_eval do
118
+ define_method(:http_library_name) do
119
+ "Faraday (#{_faraday_adapter})"
120
+ end
121
+ end
122
+
123
+ define_method(:faraday_adapter) { _faraday_adapter.to_sym }
124
+
125
+ def get_body_string(response)
126
+ response.body
127
+ end
128
+
129
+ def get_header(header_key, response)
130
+ response.headers[header_key]
131
+ end
132
+
133
+ def make_http_request(method, url, body = nil, headers = {})
134
+ url_root, url_rest = split_url(url)
135
+
136
+ faraday_connection(url_root).send(method) do |req|
137
+ req.url url_rest
138
+ headers.each { |k, v| req[k] = v }
139
+ req.body = body if body
140
+ end
141
+ end
142
+
143
+ def split_url(url)
144
+ uri = URI.parse(url)
145
+ url_root = "#{uri.scheme}://#{uri.host}:#{uri.port}"
146
+ rest = url.sub(url_root, '')
147
+
148
+ [url_root, rest]
149
+ end
150
+
151
+ def faraday_connection(url_root)
152
+ Faraday::Connection.new(:url => url_root) do |builder|
153
+ builder.use VCR::Middleware::Faraday do |cassette|
154
+ cassette.name 'faraday_example'
155
+
156
+ if respond_to?(:match_requests_on)
157
+ cassette.options :match_requests_on => match_requests_on
158
+ end
159
+
160
+ if respond_to?(:record_mode)
161
+ cassette.options :record => record_mode
162
+ end
163
+ end
164
+
165
+ builder.adapter faraday_adapter
166
+ end
167
+ end
168
+ end
169
+ end
170
+
115
171
  NET_CONNECT_NOT_ALLOWED_ERROR = /You can use VCR to automatically record this request and replay it later/
116
172
 
117
173
  module HttpLibrarySpecs
118
174
  def test_http_library(library, supported_request_match_attributes, *other)
119
- # curb, patron and em-http-client cannot be installed on jruby
120
- return if %w[curb patron em-http-request].include?(library) && RUBY_INTERPRETER != :mri
175
+ # skip libs that only work on MRI
176
+ return if RUBY_INTERPRETER != :mri && library =~ /(typhoeus|curb|patron|em-http)/
121
177
 
122
178
  unless adapter_module = HTTP_LIBRARY_ADAPTERS[library]
123
179
  raise ArgumentError.new("No http library adapter module could be found for #{library}")
@@ -139,7 +195,9 @@ module HttpLibrarySpecs
139
195
  supported_request_match_attributes = @supported_request_match_attributes
140
196
 
141
197
  describe ":#{attribute}" do
142
- let(:perform_stubbing) { subject.stub_requests(interactions, [attribute]) }
198
+ let(:perform_stubbing) { subject.stub_requests(interactions, match_requests_on) }
199
+ let(:match_requests_on) { [attribute] }
200
+ let(:record_mode) { :none }
143
201
 
144
202
  if supported_request_match_attributes.include?(attribute)
145
203
  before(:each) { perform_stubbing }
@@ -199,7 +257,7 @@ module HttpLibrarySpecs
199
257
  end
200
258
  end
201
259
 
202
- def self.test_real_http_request(http_allowed)
260
+ def self.test_real_http_request(http_allowed, *other)
203
261
  let(:url) { "http://localhost:#{VCR::SinatraApp.port}/foo" }
204
262
 
205
263
  if http_allowed
@@ -208,20 +266,55 @@ module HttpLibrarySpecs
208
266
  get_body_string(make_http_request(:get, url)).should == 'FOO!'
209
267
  end
210
268
 
211
- it 'records new http requests' do
212
- VCR.should_receive(:record_http_interaction) do |interaction|
213
- interaction.request.uri.should == url
214
- interaction.request.method.should == :get
215
- interaction.response.status.code.should == 200
216
- interaction.response.status.message.should == 'OK'
217
- interaction.response.body.should == 'FOO!'
218
- interaction.response.headers['content-type'].should == ["text/html;charset=utf-8"]
269
+ describe 'recording new http requests' do
270
+ let(:recorded_interaction) do
271
+ interaction = nil
272
+ VCR.should_receive(:record_http_interaction) { |i| interaction = i }
273
+ make_http_request(:get, url)
274
+ interaction
219
275
  end
220
276
 
221
- make_http_request(:get, url)
222
- end
277
+ it 'does not record the request if the adapter is disabled' do
278
+ subject.stub(:enabled?).and_return(false)
279
+ VCR.should_not_receive(:record_http_interaction)
280
+ make_http_request(:get, url)
281
+ end
282
+
283
+ it 'records the request uri' do
284
+ recorded_interaction.request.uri.should == url
285
+ end
286
+
287
+ it 'records the request method' do
288
+ recorded_interaction.request.method.should == :get
289
+ end
290
+
291
+ it 'records the request body' do
292
+ recorded_interaction.request.body.should be_nil
293
+ end
294
+
295
+ it 'records the request headers' do
296
+ recorded_interaction.request.headers.should be_nil
297
+ end
298
+
299
+ it 'records the response status code' do
300
+ recorded_interaction.response.status.code.should == 200
301
+ end
302
+
303
+ it 'records the response status message' do
304
+ recorded_interaction.response.status.message.should == 'OK'
305
+ end unless other.include?(:status_message_not_exposed)
306
+
307
+ it 'records the response body' do
308
+ recorded_interaction.response.body.should == 'FOO!'
309
+ end
223
310
 
311
+ it 'records the response headers' do
312
+ recorded_interaction.response.headers['content-type'].should == ["text/html;charset=utf-8"]
313
+ end
314
+ end
224
315
  else
316
+ let(:record_mode) { :none }
317
+
225
318
  it 'does not allow real HTTP requests or record them' do
226
319
  VCR.should_receive(:record_http_interaction).never
227
320
  expect { make_http_request(:get, url) }.to raise_error(NET_CONNECT_NOT_ALLOWED_ERROR)
@@ -246,11 +339,12 @@ module HttpLibrarySpecs
246
339
  subject.http_connections_allowed?.should == http_allowed
247
340
  end
248
341
 
249
- test_real_http_request(http_allowed)
342
+ test_real_http_request(http_allowed, *other)
250
343
 
251
344
  unless http_allowed
252
345
  describe '.ignore_localhost =' do
253
346
  localhost_response = "Localhost response"
347
+ let(:record_mode) { :none }
254
348
 
255
349
  VCR::LOCALHOST_ALIASES.each do |localhost_alias|
256
350
  describe 'when set to true' do
@@ -291,15 +385,9 @@ module HttpLibrarySpecs
291
385
  end
292
386
  end
293
387
 
294
- it 'gets the stubbed responses when multiple post requests are made to http://example.com, and does not record them' do
295
- VCR.should_receive(:record_http_interaction).never
296
- get_body_string(make_http_request(:post, 'http://example.com/', { 'id' => '7' })).should == 'example.com post response with id=7'
297
- get_body_string(make_http_request(:post, 'http://example.com/', { 'id' => '3' })).should == 'example.com post response with id=3'
298
- end
299
-
300
388
  it 'gets the stubbed responses when requests are made to http://example.com/foo, and does not record them' do
301
389
  VCR.should_receive(:record_http_interaction).never
302
- get_body_string(make_http_request(:get, 'http://example.com/foo')).should == 'example.com get response 1 with path=foo'
390
+ get_body_string(make_http_request(:get, 'http://example.com/foo')).should =~ /example\.com get response \d with path=foo/
303
391
  end
304
392
 
305
393
  it 'rotates through multiple responses for the same request' do
@@ -309,16 +397,16 @@ module HttpLibrarySpecs
309
397
  # subsequent requests keep getting the last one
310
398
  get_body_string(make_http_request(:get, 'http://example.com/foo')).should == 'example.com get response 2 with path=foo'
311
399
  get_body_string(make_http_request(:get, 'http://example.com/foo')).should == 'example.com get response 2 with path=foo'
312
- end
400
+ end unless other.include?(:does_not_support_rotating_responses)
313
401
 
314
402
  it "correctly handles stubbing multiple values for the same header" do
315
- get_header('Set-Cookie', make_http_request(:get, 'http://example.com/two_set_cookie_headers')).should =~ ['bar=bazz', 'foo=bar']
403
+ get_header('Set-Cookie', make_http_request(:get, 'http://example.com/two_set_cookie_headers')).should =~ ['bar=bazz', 'foo=bar']
316
404
  end
317
405
 
318
406
  context 'when we restore our previous check point' do
319
407
  before(:each) { subject.restore_stubs_checkpoint(:my_checkpoint) }
320
408
 
321
- test_real_http_request(http_allowed)
409
+ test_real_http_request(http_allowed, *other)
322
410
 
323
411
  if other.include?(:needs_net_http_extension)
324
412
  it 'returns false from #request_stubbed?' do