vcr 2.5.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +0 -3
  3. data/CHANGELOG.md +32 -3
  4. data/Gemfile +33 -0
  5. data/Gemfile.lock +99 -119
  6. data/README.md +19 -7
  7. data/Rakefile +5 -9
  8. data/benchmarks/null_logging.rb +62 -0
  9. data/features/.nav +0 -1
  10. data/features/about_these_examples.md +1 -2
  11. data/features/cassettes/allow_unused_http_interactions.feature +15 -1
  12. data/features/cassettes/decompress.feature +6 -2
  13. data/features/cassettes/format.feature +20 -12
  14. data/features/cassettes/freezing_time.feature +68 -0
  15. data/features/configuration/cassette_library_dir.feature +5 -0
  16. data/features/configuration/preserve_exact_body_bytes.feature +5 -0
  17. data/features/configuration/uri_parser.feature +2 -4
  18. data/features/http_libraries/net_http.feature +1 -1
  19. data/features/request_matching/headers.feature +0 -1
  20. data/features/step_definitions/cli_steps.rb +1 -4
  21. data/features/test_frameworks/cucumber.feature +59 -0
  22. data/features/test_frameworks/rspec_metadata.feature +59 -1
  23. data/gemfiles/typhoeus_old.gemfile +19 -0
  24. data/gemfiles/typhoeus_old.gemfile.lock +84 -86
  25. data/lib/vcr.rb +12 -3
  26. data/lib/vcr/cassette.rb +32 -11
  27. data/lib/vcr/cassette/http_interaction_list.rb +3 -2
  28. data/lib/vcr/cassette/migrator.rb +1 -0
  29. data/lib/vcr/cassette/serializers/json.rb +1 -1
  30. data/lib/vcr/configuration.rb +17 -9
  31. data/lib/vcr/library_hooks/typhoeus.rb +3 -2
  32. data/lib/vcr/library_hooks/webmock.rb +1 -1
  33. data/lib/vcr/middleware/excon.rb +13 -1
  34. data/lib/vcr/middleware/faraday.rb +1 -0
  35. data/lib/vcr/request_handler.rb +1 -1
  36. data/lib/vcr/structs.rb +19 -4
  37. data/lib/vcr/test_frameworks/cucumber.rb +2 -2
  38. data/lib/vcr/test_frameworks/rspec.rb +10 -2
  39. data/lib/vcr/util/logger.rb +41 -7
  40. data/lib/vcr/version.rb +1 -1
  41. data/script/ci.sh +8 -1
  42. data/spec/acceptance/threading_spec.rb +6 -0
  43. data/spec/capture_warnings.rb +9 -1
  44. data/spec/spec_helper.rb +6 -2
  45. data/spec/support/configuration_stubbing.rb +8 -0
  46. data/spec/support/http_library_adapters.rb +1 -1
  47. data/spec/support/limited_uri.rb +1 -0
  48. data/spec/support/shared_example_groups/excon.rb +23 -1
  49. data/spec/support/shared_example_groups/hook_into_http_library.rb +12 -12
  50. data/spec/support/shared_example_groups/request_hooks.rb +1 -1
  51. data/spec/support/sinatra_app.rb +9 -0
  52. data/spec/support/vcr_localhost_server.rb +4 -25
  53. data/spec/support/vcr_stub_helpers.rb +1 -1
  54. data/spec/vcr/cassette/http_interaction_list_spec.rb +41 -14
  55. data/spec/vcr/cassette/migrator_spec.rb +1 -1
  56. data/spec/vcr/cassette/persisters_spec.rb +2 -2
  57. data/spec/vcr/cassette/serializers_spec.rb +13 -4
  58. data/spec/vcr/cassette_spec.rb +107 -58
  59. data/spec/vcr/configuration_spec.rb +23 -23
  60. data/spec/vcr/deprecations_spec.rb +9 -9
  61. data/spec/vcr/errors_spec.rb +6 -6
  62. data/spec/vcr/library_hooks/excon_spec.rb +15 -10
  63. data/spec/vcr/library_hooks/fakeweb_spec.rb +8 -8
  64. data/spec/vcr/library_hooks/faraday_spec.rb +1 -1
  65. data/spec/vcr/library_hooks/typhoeus_0.4_spec.rb +2 -2
  66. data/spec/vcr/library_hooks/typhoeus_spec.rb +68 -9
  67. data/spec/vcr/library_hooks/webmock_spec.rb +6 -10
  68. data/spec/vcr/middleware/faraday_spec.rb +33 -5
  69. data/spec/vcr/middleware/rack_spec.rb +2 -2
  70. data/spec/vcr/request_matcher_registry_spec.rb +11 -6
  71. data/spec/vcr/structs_spec.rb +114 -47
  72. data/spec/vcr/test_frameworks/cucumber_spec.rb +4 -4
  73. data/spec/vcr/util/hooks_spec.rb +2 -2
  74. data/spec/vcr/util/internet_connection_spec.rb +3 -3
  75. data/spec/vcr/util/version_checker_spec.rb +4 -4
  76. data/spec/vcr_spec.rb +22 -16
  77. data/vcr.gemspec +2 -31
  78. metadata +9 -328
  79. data/features/test_frameworks/shoulda.feature +0 -64
@@ -68,8 +68,8 @@ describe VCR::Configuration do
68
68
 
69
69
  describe '#hook_into' do
70
70
  it 'requires the named library hook' do
71
- subject.should_receive(:require).with("vcr/library_hooks/fakeweb")
72
- subject.should_receive(:require).with("vcr/library_hooks/excon")
71
+ expect(subject).to receive(:require).with("vcr/library_hooks/fakeweb")
72
+ expect(subject).to receive(:require).with("vcr/library_hooks/excon")
73
73
  subject.hook_into :fakeweb, :excon
74
74
  end
75
75
 
@@ -89,14 +89,14 @@ describe VCR::Configuration do
89
89
 
90
90
  describe '#ignore_hosts' do
91
91
  it 'delegates to the current request_ignorer instance' do
92
- VCR.request_ignorer.should_receive(:ignore_hosts).with('example.com', 'example.net')
92
+ expect(VCR.request_ignorer).to receive(:ignore_hosts).with('example.com', 'example.net')
93
93
  subject.ignore_hosts 'example.com', 'example.net'
94
94
  end
95
95
  end
96
96
 
97
97
  describe '#ignore_localhost=' do
98
98
  it 'delegates to the current request_ignorer instance' do
99
- VCR.request_ignorer.should_receive(:ignore_localhost=).with(true)
99
+ expect(VCR.request_ignorer).to receive(:ignore_localhost=).with(true)
100
100
  subject.ignore_localhost = true
101
101
  end
102
102
  end
@@ -107,7 +107,7 @@ describe VCR::Configuration do
107
107
  it 'registers the given block with the request ignorer' do
108
108
  block_called = false
109
109
  subject.ignore_request { |r| block_called = true }
110
- VCR.request_ignorer.ignore?(stub(:parsed_uri => uri))
110
+ VCR.request_ignorer.ignore?(double(:parsed_uri => uri))
111
111
  expect(block_called).to be_true
112
112
  end
113
113
  end
@@ -155,9 +155,9 @@ describe VCR::Configuration do
155
155
  it 'sets up a tag filter' do
156
156
  called = false
157
157
  VCR.configuration.send(hook_type, :my_tag) { called = true }
158
- VCR.configuration.invoke_hook(hook_type, stub, stub(:tags => []))
158
+ VCR.configuration.invoke_hook(hook_type, double, double(:tags => []))
159
159
  expect(called).to be_false
160
- VCR.configuration.invoke_hook(hook_type, stub, stub(:tags => [:my_tag]))
160
+ VCR.configuration.invoke_hook(hook_type, double, double(:tags => [:my_tag]))
161
161
  expect(called).to be_true
162
162
  end
163
163
  end
@@ -165,42 +165,42 @@ describe VCR::Configuration do
165
165
 
166
166
  %w[ filter_sensitive_data define_cassette_placeholder ].each do |method|
167
167
  describe "##{method}" do
168
- let(:interaction) { mock('interaction').as_null_object }
169
- before(:each) { interaction.stub(:filter!) }
168
+ let(:interaction) { double('interaction').as_null_object }
169
+ before(:each) { allow(interaction).to receive(:filter!) }
170
170
 
171
171
  it 'adds a before_record hook that replaces the string returned by the block with the given string' do
172
172
  subject.send(method, 'foo', &lambda { 'bar' })
173
- interaction.should_receive(:filter!).with('bar', 'foo')
174
- subject.invoke_hook(:before_record, interaction, stub.as_null_object)
173
+ expect(interaction).to receive(:filter!).with('bar', 'foo')
174
+ subject.invoke_hook(:before_record, interaction, double.as_null_object)
175
175
  end
176
176
 
177
177
  it 'adds a before_playback hook that replaces the given string with the string returned by the block' do
178
178
  subject.send(method, 'foo', &lambda { 'bar' })
179
- interaction.should_receive(:filter!).with('foo', 'bar')
180
- subject.invoke_hook(:before_playback, interaction, stub.as_null_object)
179
+ expect(interaction).to receive(:filter!).with('foo', 'bar')
180
+ subject.invoke_hook(:before_playback, interaction, double.as_null_object)
181
181
  end
182
182
 
183
183
  it 'tags the before_record hook when given a tag' do
184
- subject.should_receive(:before_record).with(:my_tag)
184
+ expect(subject).to receive(:before_record).with(:my_tag)
185
185
  subject.send(method, 'foo', :my_tag) { 'bar' }
186
186
  end
187
187
 
188
188
  it 'tags the before_playback hook when given a tag' do
189
- subject.should_receive(:before_playback).with(:my_tag)
189
+ expect(subject).to receive(:before_playback).with(:my_tag)
190
190
  subject.send(method, 'foo', :my_tag) { 'bar' }
191
191
  end
192
192
 
193
193
  it 'yields the interaction to the block for the before_record hook' do
194
194
  yielded_interaction = nil
195
195
  subject.send(method, 'foo', &lambda { |i| yielded_interaction = i; 'bar' })
196
- subject.invoke_hook(:before_record, interaction, stub.as_null_object)
196
+ subject.invoke_hook(:before_record, interaction, double.as_null_object)
197
197
  expect(yielded_interaction).to equal(interaction)
198
198
  end
199
199
 
200
200
  it 'yields the interaction to the block for the before_playback hook' do
201
201
  yielded_interaction = nil
202
202
  subject.send(method, 'foo', &lambda { |i| yielded_interaction = i; 'bar' })
203
- subject.invoke_hook(:before_playback, interaction, stub.as_null_object)
203
+ subject.invoke_hook(:before_playback, interaction, double.as_null_object)
204
204
  expect(yielded_interaction).to equal(interaction)
205
205
  end
206
206
  end
@@ -235,7 +235,7 @@ describe VCR::Configuration do
235
235
  end if RUBY_VERSION < '1.9'
236
236
 
237
237
  describe "#cassette_serializers" do
238
- let(:custom_serializer) { stub }
238
+ let(:custom_serializer) { double }
239
239
  it 'allows a custom serializer to be registered' do
240
240
  expect { subject.cassette_serializers[:custom] }.to raise_error(ArgumentError)
241
241
  subject.cassette_serializers[:custom] = custom_serializer
@@ -244,7 +244,7 @@ describe VCR::Configuration do
244
244
  end
245
245
 
246
246
  describe "#cassette_persisters" do
247
- let(:custom_persister) { stub }
247
+ let(:custom_persister) { double }
248
248
  it 'allows a custom persister to be registered' do
249
249
  expect { subject.cassette_persisters[:custom] }.to raise_error(ArgumentError)
250
250
  subject.cassette_persisters[:custom] = custom_persister
@@ -253,7 +253,7 @@ describe VCR::Configuration do
253
253
  end
254
254
 
255
255
  describe "#uri_parser=" do
256
- let(:custom_parser) { stub }
256
+ let(:custom_parser) { double }
257
257
  it 'allows a custom uri parser to be set' do
258
258
  subject.uri_parser = custom_parser
259
259
  expect(subject.uri_parser).to eq(custom_parser)
@@ -266,7 +266,7 @@ describe VCR::Configuration do
266
266
 
267
267
  describe "#preserve_exact_body_bytes_for?" do
268
268
  def message_for(body)
269
- stub(:body => body)
269
+ double(:body => body)
270
270
  end
271
271
 
272
272
  context "default hook" do
@@ -302,7 +302,7 @@ describe VCR::Configuration do
302
302
  it "invokes the configured hook with the http message and the current cassette" do
303
303
  VCR.use_cassette('example') do |cassette|
304
304
  expect(cassette).to be_a(VCR::Cassette)
305
- message = stub(:message)
305
+ message = double(:message)
306
306
 
307
307
  yielded_objects = nil
308
308
  subject.preserve_exact_body_bytes { |a, b| yielded_objects = [a, b] }
@@ -314,7 +314,7 @@ describe VCR::Configuration do
314
314
 
315
315
  describe "#configure_rspec_metadata!" do
316
316
  it "only configures the underlying metadata once, no matter how many times it is called" do
317
- VCR::RSpec::Metadata.should_receive(:configure!).once
317
+ expect(VCR::RSpec::Metadata).to receive(:configure!).once
318
318
  VCR.configure do |c|
319
319
  c.configure_rspec_metadata!
320
320
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe VCR, 'deprecations', :disable_warnings do
4
4
  describe ".config" do
5
5
  it 'delegates to VCR.configure' do
6
- VCR.should_receive(:configure)
6
+ expect(VCR).to receive(:configure)
7
7
  VCR.config { }
8
8
  end
9
9
 
@@ -14,7 +14,7 @@ describe VCR, 'deprecations', :disable_warnings do
14
14
  end
15
15
 
16
16
  it 'prints a deprecation warning' do
17
- VCR.should_receive(:warn).with(/VCR.config.*deprecated/i)
17
+ expect(VCR).to receive(:warn).with(/VCR.config.*deprecated/i)
18
18
 
19
19
  VCR.config { }
20
20
  end
@@ -26,7 +26,7 @@ describe VCR, 'deprecations', :disable_warnings do
26
26
  end
27
27
 
28
28
  it 'prints a deprecation warning' do
29
- VCR.should_receive(:warn).with(/VCR::Config.*deprecated/i)
29
+ expect(VCR).to receive(:warn).with(/VCR::Config.*deprecated/i)
30
30
 
31
31
  VCR::Config
32
32
  end
@@ -44,7 +44,7 @@ describe VCR, 'deprecations', :disable_warnings do
44
44
  end
45
45
 
46
46
  it 'prints a deprecation warning' do
47
- VCR::Cassette.should_receive(:warn).with(/VCR::Cassette::MissingERBVariableError.*deprecated/i)
47
+ expect(VCR::Cassette).to receive(:warn).with(/VCR::Cassette::MissingERBVariableError.*deprecated/i)
48
48
 
49
49
  VCR::Cassette::MissingERBVariableError
50
50
  end
@@ -58,26 +58,26 @@ describe VCR, 'deprecations', :disable_warnings do
58
58
 
59
59
  describe "VCR.configure { |c| c.stub_with ... }" do
60
60
  it 'delegates to #hook_into' do
61
- VCR.configuration.should_receive(:hook_into).with(:fakeweb, :excon)
61
+ expect(VCR.configuration).to receive(:hook_into).with(:fakeweb, :excon)
62
62
  VCR.configure { |c| c.stub_with :fakeweb, :excon }
63
63
  end
64
64
 
65
65
  it 'prints a deprecation warning' do
66
- VCR.configuration.should_receive(:warn).with(/stub_with.*deprecated/i)
66
+ expect(VCR.configuration).to receive(:warn).with(/stub_with.*deprecated/i)
67
67
  VCR.configure { |c| c.stub_with :fakeweb, :excon }
68
68
  end
69
69
  end
70
70
 
71
71
  describe "VCR::Middleware::Faraday" do
72
72
  it 'prints a deprecation warning when passed a block' do
73
- Kernel.should_receive(:warn).with(/Passing a block .* is deprecated/)
74
- VCR::Middleware::Faraday.new(stub) { }
73
+ expect(Kernel).to receive(:warn).with(/Passing a block .* is deprecated/)
74
+ VCR::Middleware::Faraday.new(double) { }
75
75
  end
76
76
  end
77
77
 
78
78
  describe "VCR::RSpec::Macros" do
79
79
  it 'prints a deprecation warning' do
80
- Kernel.should_receive(:warn).with(/VCR::RSpec::Macros is deprecated/)
80
+ expect(Kernel).to receive(:warn).with(/VCR::RSpec::Macros is deprecated/)
81
81
  Class.new.extend(VCR::RSpec::Macros)
82
82
  end
83
83
  end
@@ -82,7 +82,7 @@ module VCR
82
82
  it 'mentions :allow_playback_repeats if the current cassette has a used matching interaction' do
83
83
  VCR.use_cassette('example') do |cassette|
84
84
  expect(cassette.http_interactions).to respond_to(:has_used_interaction_matching?)
85
- cassette.http_interactions.stub(:has_used_interaction_matching? => true)
85
+ allow(cassette.http_interactions).to receive(:has_used_interaction_matching?).and_return(true)
86
86
  expect(message).to include('allow_playback_repeats')
87
87
  end
88
88
  end
@@ -90,7 +90,7 @@ module VCR
90
90
  it 'does not mention :allow_playback_repeats if the current cassette does not have a used matching interaction' do
91
91
  VCR.use_cassette('example') do |cassette|
92
92
  expect(cassette.http_interactions).to respond_to(:has_used_interaction_matching?)
93
- cassette.http_interactions.stub(:has_used_interaction_matching? => false)
93
+ allow(cassette.http_interactions).to receive(:has_used_interaction_matching?).and_return(false)
94
94
  expect(message).not_to include('allow_playback_repeats')
95
95
  end
96
96
  end
@@ -98,7 +98,7 @@ module VCR
98
98
  it 'does not mention using a different :match_requests_on option when there are no remaining unused interactions' do
99
99
  VCR.use_cassette('example') do |cassette|
100
100
  expect(cassette.http_interactions).to respond_to(:remaining_unused_interaction_count)
101
- cassette.http_interactions.stub(:remaining_unused_interaction_count => 0)
101
+ allow(cassette.http_interactions).to receive(:remaining_unused_interaction_count).and_return(0)
102
102
  expect(message).not_to include('match_requests_on cassette option')
103
103
  end
104
104
  end
@@ -106,7 +106,7 @@ module VCR
106
106
  it 'mentions using a different :match_requests_on option when there are some remaining unused interactions' do
107
107
  VCR.use_cassette('example') do |cassette|
108
108
  expect(cassette.http_interactions).to respond_to(:remaining_unused_interaction_count)
109
- cassette.http_interactions.stub(:remaining_unused_interaction_count => 1)
109
+ allow(cassette.http_interactions).to receive(:remaining_unused_interaction_count).and_return(1)
110
110
  expect(message).to include('match_requests_on cassette option')
111
111
  end
112
112
  end
@@ -114,7 +114,7 @@ module VCR
114
114
  it 'uses the singular (HTTP interaction) when there is only 1 left' do
115
115
  VCR.use_cassette('example') do |cassette|
116
116
  expect(cassette.http_interactions).to respond_to(:remaining_unused_interaction_count)
117
- cassette.http_interactions.stub(:remaining_unused_interaction_count => 1)
117
+ allow(cassette.http_interactions).to receive(:remaining_unused_interaction_count).and_return(1)
118
118
  expect(message).to include('1 HTTP interaction ')
119
119
  end
120
120
  end
@@ -122,7 +122,7 @@ module VCR
122
122
  it 'uses the plural (HTTP interactions) when there is more than 1 left' do
123
123
  VCR.use_cassette('example') do |cassette|
124
124
  expect(cassette.http_interactions).to respond_to(:remaining_unused_interaction_count)
125
- cassette.http_interactions.stub(:remaining_unused_interaction_count => 2)
125
+ allow(cassette.http_interactions).to receive(:remaining_unused_interaction_count).and_return(2)
126
126
  expect(message).to include('2 HTTP interactions ')
127
127
  end
128
128
  end
@@ -2,11 +2,15 @@ require 'spec_helper'
2
2
  require 'support/shared_example_groups/excon'
3
3
 
4
4
  describe "Excon hook", :with_monkey_patches => :excon do
5
- # TODO: figure out a way to get disabling VCR to work with Excon
6
- # and allow dirct excon stubs to work.
7
- # def directly_stub_request(method, url, response_body)
8
- # ::Excon.stub({ :method => method, :url => url }, { :body => response_body })
9
- # end
5
+ after(:each) do
6
+ ::Excon.stubs.clear
7
+ ::Excon.defaults[:mock] = false
8
+ end
9
+
10
+ def directly_stub_request(method, url, response_body)
11
+ ::Excon.defaults[:mock] = true
12
+ ::Excon.stub({ :method => method, :url => url }, { :body => response_body })
13
+ end
10
14
 
11
15
  it_behaves_like 'a hook into an HTTP library', :excon, 'excon', :status_message_not_exposed
12
16
 
@@ -14,7 +18,7 @@ describe "Excon hook", :with_monkey_patches => :excon do
14
18
  let(:excon) { ::Excon.new("http://localhost:#{VCR::SinatraApp.port}/search") }
15
19
 
16
20
  it 'properly records and plays back the response' do
17
- VCR.stub(:real_http_connections_allowed? => true)
21
+ allow(VCR).to receive(:real_http_connections_allowed?).and_return(true)
18
22
  recorded, played_back = [1, 2].map do
19
23
  VCR.use_cassette('excon_query', :record => :once) do
20
24
  excon.request(:method => :get, :query => { :q => 'Tolkien' }).body
@@ -30,16 +34,17 @@ describe "Excon hook", :with_monkey_patches => :excon do
30
34
 
31
35
  context 'when Excon raises an error due to an unexpected response status' do
32
36
  before(:each) do
33
- VCR.stub(:real_http_connections_allowed? => true)
37
+ allow(VCR).to receive(:real_http_connections_allowed?).and_return(true)
34
38
  end
35
39
 
36
40
  it 'still records properly' do
37
- VCR.should_receive(:record_http_interaction) do |interaction|
41
+ expect(VCR).to receive(:record_http_interaction) do |interaction|
38
42
  expect(interaction.response.status.code).to eq(404)
43
+ expect(interaction.response.body).to eq('404 not 200')
39
44
  end
40
45
 
41
46
  expect {
42
- Excon.get("http://localhost:#{VCR::SinatraApp.port}/not_found", :expects => 200)
47
+ Excon.get("http://localhost:#{VCR::SinatraApp.port}/404_not_200", :expects => 200)
43
48
  }.to raise_error(Excon::Errors::Error)
44
49
  end
45
50
 
@@ -76,7 +81,7 @@ describe "Excon hook", :with_monkey_patches => :excon do
76
81
  describe "VCR.configuration.after_library_hooks_loaded hook" do
77
82
  it 'disables the webmock excon adapter so it does not conflict with our typhoeus hook' do
78
83
  expect(::WebMock::HttpLibAdapters::ExconAdapter).to respond_to(:disable!)
79
- ::WebMock::HttpLibAdapters::ExconAdapter.should_receive(:disable!)
84
+ expect(::WebMock::HttpLibAdapters::ExconAdapter).to receive(:disable!)
80
85
  $excon_after_loaded_hook.conditionally_invoke
81
86
  end
82
87
  end
@@ -22,11 +22,11 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
22
22
 
23
23
  describe "some specific Net::HTTP edge cases" do
24
24
  before(:each) do
25
- VCR.stub(:real_http_connections_allowed? => true)
25
+ allow(VCR).to receive(:real_http_connections_allowed?).and_return(true)
26
26
  end
27
27
 
28
28
  it 'records the request body when using #post_form' do
29
- VCR.should_receive(:record_http_interaction) do |interaction|
29
+ expect(VCR).to receive(:record_http_interaction) do |interaction|
30
30
  expect(interaction.request.body).to eq("q=ruby")
31
31
  end
32
32
 
@@ -35,7 +35,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
35
35
  end
36
36
 
37
37
  it "does not record headers for which Net::HTTP sets defaults near the end of the real request" do
38
- VCR.should_receive(:record_http_interaction) do |interaction|
38
+ expect(VCR).to receive(:record_http_interaction) do |interaction|
39
39
  expect(interaction.request.headers).not_to have_key('content-type')
40
40
  expect(interaction.request.headers).not_to have_key('host')
41
41
  end
@@ -43,7 +43,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
43
43
  end
44
44
 
45
45
  it "records headers for which Net::HTTP usually sets defaults when the user manually sets their values" do
46
- VCR.should_receive(:record_http_interaction) do |interaction|
46
+ expect(VCR).to receive(:record_http_interaction) do |interaction|
47
47
  expect(interaction.request.headers['content-type']).to eq(['foo/bar'])
48
48
  expect(interaction.request.headers['host']).to eq(['my-example.com'])
49
49
  end
@@ -57,7 +57,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
57
57
  end
58
58
 
59
59
  it 'records the interaction when Net::HTTP#request is called with a block with a return statement' do
60
- VCR.should_receive(:record_http_interaction).once
60
+ expect(VCR).to receive(:record_http_interaction).once
61
61
  expect(perform_get_with_returning_block.body).to eq("GET to root")
62
62
  end
63
63
 
@@ -66,7 +66,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
66
66
  end
67
67
 
68
68
  it 'records the interaction only once, even when Net::HTTP internally recursively calls #request' do
69
- VCR.should_receive(:record_http_interaction).once
69
+ expect(VCR).to receive(:record_http_interaction).once
70
70
  make_post_request
71
71
  end
72
72
 
@@ -129,7 +129,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
129
129
  end
130
130
 
131
131
  it "warns about FakeWeb deprecation" do
132
- ::Kernel.should_receive(:warn).with("WARNING: VCR's FakeWeb integration is deprecated and will be removed in VCR 3.0.")
132
+ expect(::Kernel).to receive(:warn).with("WARNING: VCR's FakeWeb integration is deprecated and will be removed in VCR 3.0.")
133
133
  run_hook
134
134
  end
135
135
  end
@@ -148,7 +148,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
148
148
 
149
149
  undef make_request
150
150
  def make_request(disabled = false)
151
- ::Net::HTTP.any_instance.stub(:request_without_vcr).and_raise(SocketError)
151
+ allow_any_instance_of(::Net::HTTP).to receive(:request_without_vcr).and_raise(SocketError)
152
152
  expect {
153
153
  ::Net::HTTP.get_response(URI(request_url))
154
154
  }.to raise_error(SocketError)
@@ -47,7 +47,7 @@ describe "Faraday hook" do
47
47
  builder.use Faraday::Response::Logger
48
48
  end
49
49
 
50
- conn.builder.should_receive(:warn).with(/Faraday::Response::Logger/)
50
+ expect(conn.builder).to receive(:warn).with(/Faraday::Response::Logger/)
51
51
  conn.builder.lock!
52
52
  end
53
53
 
@@ -23,12 +23,12 @@ describe "Typhoeus 0.4 hook", :with_monkey_patches => :typhoeus_0_4 do
23
23
 
24
24
  describe "VCR.configuration.after_library_hooks_loaded hook" do
25
25
  it 'disables the webmock typhoeus adapter so it does not conflict with our typhoeus hook' do
26
- ::WebMock::HttpLibAdapters::TyphoeusAdapter.should_receive(:disable!)
26
+ expect(::WebMock::HttpLibAdapters::TyphoeusAdapter).to receive(:disable!)
27
27
  $typhoeus_after_loaded_hook.conditionally_invoke
28
28
  end
29
29
 
30
30
  it "warns about Typhoeus 0.4 deprecation" do
31
- ::Kernel.should_receive(:warn).with("WARNING: VCR's Typhoeus 0.4 integration is deprecated and will be removed in VCR 3.0.")
31
+ expect(::Kernel).to receive(:warn).with("WARNING: VCR's Typhoeus 0.4 integration is deprecated and will be removed in VCR 3.0.")
32
32
  $typhoeus_0_4_after_loaded_hook.conditionally_invoke
33
33
  end
34
34
  end
@@ -23,7 +23,7 @@ describe "Typhoeus hook", :with_monkey_patches => :typhoeus do
23
23
 
24
24
  describe "VCR.configuration.after_library_hooks_loaded hook" do
25
25
  it 'disables the webmock typhoeus adapter so it does not conflict with our typhoeus hook' do
26
- ::WebMock::HttpLibAdapters::TyphoeusAdapter.should_receive(:disable!)
26
+ expect(::WebMock::HttpLibAdapters::TyphoeusAdapter).to receive(:disable!)
27
27
  $typhoeus_after_loaded_hook.conditionally_invoke
28
28
  end
29
29
  end
@@ -65,22 +65,81 @@ describe "Typhoeus hook", :with_monkey_patches => :typhoeus do
65
65
  end
66
66
  end
67
67
 
68
+ context "when used with a typhoeus-based faraday connection" do
69
+ let(:base_url) { "http://localhost:#{VCR::SinatraApp.port}" }
70
+
71
+ let(:conn) do
72
+ Faraday.new(:url => base_url) do |faraday|
73
+ faraday.adapter :typhoeus
74
+ end
75
+ end
76
+
77
+ def get_response
78
+ # Ensure faraday hook doesn't handle the request.
79
+ VCR.library_hooks.exclusively_enabled(:typhoeus) do
80
+ VCR.use_cassette("faraday") do
81
+ conn.get("/")
82
+ end
83
+ end
84
+ end
85
+
86
+ it 'records and replays headers correctly' do
87
+ pending "waiting on typhoeus/typhoeus#324" do
88
+ recorded = get_response
89
+ played_back = get_response
90
+
91
+ expect(played_back.headers).to eq(recorded.headers)
92
+ end
93
+ end
94
+ end
95
+
68
96
  context '#effective_url' do
69
- def make_single_request
70
- VCR.use_cassette('single') do
71
- response = Typhoeus::Request.new("http://localhost:#{VCR::SinatraApp.port}/").run
97
+ ResponseValues = Struct.new(:status, :body, :effective_url)
72
98
 
73
- response.effective_url
99
+ def url_for(path)
100
+ "http://localhost:#{VCR::SinatraApp.port}#{path}"
101
+ end
102
+
103
+ def make_single_request(path, options = {})
104
+ VCR.use_cassette('single') do |cassette|
105
+ response = Typhoeus::Request.new(url_for(path), options).run
106
+
107
+ yield cassette if block_given?
108
+
109
+ ResponseValues.new(
110
+ response.code,
111
+ response.body,
112
+ response.effective_url
113
+ )
74
114
  end
75
115
  end
76
116
 
77
- it 'recorded and played back properly' do
78
- recorded = make_single_request
79
- played_back = make_single_request
80
- expect(recorded).not_to be_nil
117
+ it 'records and plays back properly' do
118
+ recorded = make_single_request('/')
119
+ played_back = make_single_request('/')
81
120
 
121
+ expect(recorded.effective_url).to eq(url_for('/'))
82
122
  expect(played_back).to eq(recorded)
83
123
  end
124
+
125
+ it 'falls back to the request url when it was not recorded (e.g. on VCR <= 2.5.0)' do
126
+ make_single_request('/') do |cassette|
127
+ cassette.new_recorded_interactions.each { |i| i.response.adapter_metadata.clear }
128
+ end
129
+
130
+ played_back = make_single_request('/')
131
+ expect(played_back.effective_url).to eq(url_for('/'))
132
+ end
133
+
134
+ context "when following redirects" do
135
+ it 'records and plays back properly' do
136
+ recorded = make_single_request('/redirect-to-root', :followlocation => true)
137
+ played_back = make_single_request('/redirect-to-root', :followlocation => true)
138
+
139
+ expect(recorded.effective_url).to eq(url_for('/'))
140
+ expect(played_back).to eq(recorded)
141
+ end
142
+ end
84
143
  end
85
144
  end
86
145