vcr 2.0.0.beta2 → 2.0.0.rc1
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.
- data/.gitignore +1 -0
- data/.travis.yml +0 -2
- data/CHANGELOG.md +22 -1
- data/CONTRIBUTING.md +46 -0
- data/Gemfile +1 -9
- data/README.md +8 -2
- data/Rakefile +12 -1
- data/cucumber.yml +8 -9
- data/features/.nav +10 -4
- data/features/cassettes/format.feature +1 -1
- data/features/cassettes/no_cassette.feature +8 -11
- data/features/configuration/allow_http_connections_when_no_cassette.feature +4 -4
- data/features/configuration/filter_sensitive_data.feature +3 -0
- data/features/configuration/hook_into.feature +4 -8
- data/features/configuration/ignore_request.feature +191 -0
- data/features/getting_started.md +38 -21
- data/features/hooks/after_http_request.feature +44 -0
- data/features/hooks/around_http_request.feature +56 -0
- data/features/hooks/before_http_request.feature +44 -0
- data/features/hooks/before_playback.feature +181 -0
- data/features/hooks/before_record.feature +172 -0
- data/features/middleware/faraday.feature +7 -3
- data/features/record_modes/none.feature +2 -1
- data/features/record_modes/once.feature +2 -1
- data/features/request_matching/body.feature +2 -2
- data/features/request_matching/custom_matcher.feature +2 -2
- data/features/request_matching/headers.feature +2 -2
- data/features/request_matching/host.feature +2 -2
- data/features/request_matching/identical_request_sequence.feature +2 -2
- data/features/request_matching/method.feature +2 -2
- data/features/request_matching/path.feature +2 -2
- data/features/request_matching/playback_repeats.feature +2 -1
- data/features/request_matching/uri.feature +2 -2
- data/features/support/env.rb +21 -12
- data/features/test_frameworks/cucumber.feature +9 -4
- data/features/test_frameworks/{rspec.feature → rspec_macro.feature} +7 -7
- data/features/test_frameworks/rspec_metadata.feature +90 -0
- data/lib/vcr.rb +1 -1
- data/lib/vcr/cassette.rb +3 -3
- data/lib/vcr/cassette/http_interaction_list.rb +13 -9
- data/lib/vcr/cassette/migrator.rb +1 -1
- data/lib/vcr/configuration.rb +37 -0
- data/lib/vcr/errors.rb +172 -6
- data/lib/vcr/library_hooks.rb +4 -6
- data/lib/vcr/library_hooks/excon.rb +23 -11
- data/lib/vcr/library_hooks/fakeweb.rb +85 -24
- data/lib/vcr/library_hooks/faraday.rb +30 -2
- data/lib/vcr/library_hooks/typhoeus.rb +25 -3
- data/lib/vcr/library_hooks/webmock.rb +25 -36
- data/lib/vcr/middleware/faraday.rb +23 -5
- data/lib/vcr/request_handler.rb +12 -1
- data/lib/vcr/request_ignorer.rb +12 -1
- data/lib/vcr/request_matcher_registry.rb +1 -9
- data/lib/vcr/structs.rb +32 -2
- data/lib/vcr/test_frameworks/rspec.rb +28 -0
- data/lib/vcr/util/hooks.rb +12 -4
- data/lib/vcr/util/version_checker.rb +2 -0
- data/lib/vcr/version.rb +1 -1
- data/spec/fixtures/cassette_spec/example.yml +1 -1
- data/spec/fixtures/{fake_example.com_responses.yml → fake_example_responses.yml} +0 -0
- data/spec/monkey_patches.rb +1 -1
- data/spec/spec_helper.rb +3 -1
- data/spec/support/http_library_adapters.rb +4 -3
- data/spec/support/shared_example_groups/hook_into_http_library.rb +194 -12
- data/spec/support/shared_example_groups/request_hooks.rb +58 -0
- data/spec/support/shared_example_groups/version_checking.rb +5 -0
- data/spec/support/sinatra_app.rb +17 -9
- data/spec/support/vcr_stub_helpers.rb +17 -0
- data/spec/vcr/cassette/http_interaction_list_spec.rb +28 -29
- data/spec/vcr/cassette/migrator_spec.rb +6 -7
- data/spec/vcr/cassette_spec.rb +5 -5
- data/spec/vcr/configuration_spec.rb +51 -32
- data/spec/vcr/deprecations_spec.rb +0 -8
- data/spec/vcr/errors_spec.rb +129 -0
- data/spec/vcr/library_hooks/excon_spec.rb +21 -4
- data/spec/vcr/library_hooks/fakeweb_spec.rb +71 -3
- data/spec/vcr/library_hooks/faraday_spec.rb +45 -0
- data/spec/vcr/library_hooks/typhoeus_spec.rb +31 -1
- data/spec/vcr/library_hooks/webmock_spec.rb +26 -3
- data/spec/vcr/middleware/faraday_spec.rb +84 -1
- data/spec/vcr/request_ignorer_spec.rb +16 -0
- data/spec/vcr/request_matcher_registry_spec.rb +0 -26
- data/spec/vcr/structs_spec.rb +61 -1
- data/spec/vcr/test_frameworks/rspec_spec.rb +32 -0
- data/spec/vcr/util/hooks_spec.rb +73 -63
- data/spec/vcr_spec.rb +2 -2
- data/vcr.gemspec +5 -5
- metadata +51 -31
- data/features/configuration/hooks.feature +0 -270
- data/features/configuration/ignore_hosts.feature +0 -61
- data/features/configuration/ignore_localhost.feature +0 -97
@@ -3,9 +3,13 @@ Feature: Faraday middleware
|
|
3
3
|
VCR provides middleware that can be used with Faraday. You can use this as
|
4
4
|
an alternative to Faraday's built-in test adapter.
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
VCR will automatically insert this middleware in the Faraday stack
|
7
|
+
when you configure `hook_into :faraday`. However, if you want to control
|
8
|
+
where the middleware goes in the faraday stack, you can use it yourself.
|
9
|
+
The middleware should come before the Faraday HTTP adapter.
|
10
|
+
|
11
|
+
Note that when you use the middleware directly, you don't need to configure
|
12
|
+
`hook_into :faraday`.
|
9
13
|
|
10
14
|
Scenario Outline: Use Faraday middleware
|
11
15
|
Given a file named "faraday_example.rb" with:
|
@@ -54,6 +54,7 @@ Feature: :none
|
|
54
54
|
When I run `ruby replay_recorded_response.rb`
|
55
55
|
Then it should pass with "Response: Hello"
|
56
56
|
|
57
|
+
@exclude-jruby
|
57
58
|
Scenario: New requests are prevented
|
58
59
|
Given a file named "prevent_new_request.rb" with:
|
59
60
|
"""ruby
|
@@ -64,4 +65,4 @@ Feature: :none
|
|
64
65
|
end
|
65
66
|
"""
|
66
67
|
When I run `ruby prevent_new_request.rb`
|
67
|
-
Then it should fail with "
|
68
|
+
Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
|
@@ -61,6 +61,7 @@ Feature: :once
|
|
61
61
|
When I run `ruby replay_recorded_response.rb`
|
62
62
|
Then it should pass with "Response: example.com response"
|
63
63
|
|
64
|
+
@exclude-jruby
|
64
65
|
Scenario: New requests result in an error when the cassette file exists
|
65
66
|
Given a file named "error_for_new_requests_when_cassette_exists.rb" with:
|
66
67
|
"""ruby
|
@@ -72,7 +73,7 @@ Feature: :once
|
|
72
73
|
end
|
73
74
|
"""
|
74
75
|
When I run `ruby error_for_new_requests_when_cassette_exists.rb`
|
75
|
-
Then it should fail with "
|
76
|
+
Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
|
76
77
|
|
77
78
|
Scenario: New requests get recorded when there is no cassette file
|
78
79
|
Given a file named "record_new_requests.rb" with:
|
@@ -78,6 +78,6 @@ Feature: Matching on Body
|
|
78
78
|
| c.hook_into :webmock | typhoeus |
|
79
79
|
| c.hook_into :typhoeus | typhoeus |
|
80
80
|
| c.hook_into :excon | excon |
|
81
|
-
|
|
82
|
-
|
|
81
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
82
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
83
83
|
|
@@ -92,8 +92,8 @@ Feature: Register and use a custom matcher
|
|
92
92
|
| c.hook_into :webmock | typhoeus |
|
93
93
|
| c.hook_into :typhoeus | typhoeus |
|
94
94
|
| c.hook_into :excon | excon |
|
95
|
-
|
|
96
|
-
|
|
95
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
96
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
97
97
|
|
98
98
|
Scenario: Register a named custom matcher
|
99
99
|
And a file named "register_custom_matcher.rb" with:
|
@@ -76,6 +76,6 @@ Feature: Matching on Headers
|
|
76
76
|
| c.hook_into :webmock | patron |
|
77
77
|
| c.hook_into :webmock | em-http-request |
|
78
78
|
| c.hook_into :excon | excon |
|
79
|
-
|
|
80
|
-
|
|
79
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
80
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
81
81
|
|
@@ -82,6 +82,6 @@ Feature: Matching on Host
|
|
82
82
|
| c.hook_into :webmock | typhoeus |
|
83
83
|
| c.hook_into :typhoeus | typhoeus |
|
84
84
|
| c.hook_into :excon | excon |
|
85
|
-
|
|
86
|
-
|
|
85
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
86
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
87
87
|
|
@@ -76,6 +76,6 @@ Feature: Identical requests are replayed in sequence
|
|
76
76
|
| c.hook_into :webmock | typhoeus |
|
77
77
|
| c.hook_into :typhoeus | typhoeus |
|
78
78
|
| c.hook_into :excon | excon |
|
79
|
-
|
|
80
|
-
|
|
79
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
80
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
81
81
|
|
@@ -83,6 +83,6 @@ Feature: Matching on Method
|
|
83
83
|
| c.hook_into :webmock | typhoeus |
|
84
84
|
| c.hook_into :typhoeus | typhoeus |
|
85
85
|
| c.hook_into :excon | excon |
|
86
|
-
|
|
87
|
-
|
|
86
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
87
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
88
88
|
|
@@ -83,6 +83,6 @@ Feature: Matching on Path
|
|
83
83
|
| c.hook_into :webmock | typhoeus |
|
84
84
|
| c.hook_into :typhoeus | typhoeus |
|
85
85
|
| c.hook_into :excon | excon |
|
86
|
-
|
|
87
|
-
|
|
86
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
87
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
88
88
|
|
@@ -12,6 +12,7 @@ Feature: Playback repeats
|
|
12
12
|
|
13
13
|
:allow_playback_repeats => true
|
14
14
|
|
15
|
+
@exclude-jruby
|
15
16
|
Scenario: Responses do not repeat by default
|
16
17
|
Given a previously recorded cassette file "cassettes/example.yml" with:
|
17
18
|
"""
|
@@ -75,7 +76,7 @@ Feature: Playback repeats
|
|
75
76
|
end
|
76
77
|
"""
|
77
78
|
When I run `ruby playback_repeats.rb`
|
78
|
-
Then it should fail with "
|
79
|
+
Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
|
79
80
|
And the output should contain:
|
80
81
|
"""
|
81
82
|
== With :allow_playback_repeats ==
|
@@ -81,6 +81,6 @@ Feature: Matching on URI
|
|
81
81
|
| c.hook_into :webmock | typhoeus |
|
82
82
|
| c.hook_into :typhoeus | typhoeus |
|
83
83
|
| c.hook_into :excon | excon |
|
84
|
-
|
|
85
|
-
|
|
84
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
85
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
86
86
|
|
data/features/support/env.rb
CHANGED
@@ -6,26 +6,35 @@ require 'ruby-debug' if !defined?(RUBY_ENGINE) && RUBY_VERSION != '1.9.3' && !EN
|
|
6
6
|
|
7
7
|
require 'aruba/cucumber'
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
additional_paths = []
|
10
|
+
Before('@rspec-1') do
|
11
|
+
additional_paths << File.join(%w[ .. .. vendor rspec-1 bin ])
|
12
|
+
end
|
13
|
+
|
14
|
+
Before do
|
15
|
+
load_paths, requires = ['../../lib'], []
|
16
|
+
|
17
|
+
if RUBY_VERSION < '1.9'
|
18
|
+
requires << "rubygems"
|
19
|
+
else
|
20
|
+
load_paths << '.'
|
13
21
|
end
|
14
|
-
elsif RUBY_PLATFORM == 'java'
|
15
|
-
Before do
|
16
|
-
set_env('RUBYOPT', "-I../../lib -rubygems -r#{cucumer_helpers_file}")
|
17
22
|
|
23
|
+
requires << '../../features/support/vcr_cucumber_helpers'
|
24
|
+
requires.map! { |r| "-r#{r}" }
|
25
|
+
set_env('RUBYOPT', "-I#{load_paths.join(':')} #{requires.join(' ')}")
|
26
|
+
|
27
|
+
if RUBY_PLATFORM == 'java'
|
18
28
|
# ideas taken from: http://blog.headius.com/2010/03/jruby-startup-time-tips.html
|
19
29
|
set_env('JRUBY_OPTS', '-X-C') # disable JIT since these processes are so short lived
|
20
30
|
set_env('JAVA_OPTS', '-d32') # force jRuby to use client JVM for faster startup times
|
21
31
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
|
33
|
+
if additional_paths.any?
|
34
|
+
existing_paths = ENV['PATH'].split(':')
|
35
|
+
set_env('PATH', (additional_paths + existing_paths).join(':'))
|
25
36
|
end
|
26
|
-
end
|
27
37
|
|
28
|
-
Before do
|
29
38
|
@aruba_timeout_seconds = RUBY_PLATFORM == 'java' ? 60 : 20
|
30
39
|
end
|
31
40
|
|
@@ -23,6 +23,7 @@ Feature: Usage with Cucumber
|
|
23
23
|
be used, or you can override specific options by passing a hash as the
|
24
24
|
last argument to `#tag` or `#tags`.
|
25
25
|
|
26
|
+
@exclude-jruby
|
26
27
|
Scenario: Record HTTP interactions in a scenario by tagging it
|
27
28
|
Given a file named "lib/server.rb" with:
|
28
29
|
"""ruby
|
@@ -91,8 +92,10 @@ Feature: Usage with Cucumber
|
|
91
92
|
When I run `cucumber WITH_SERVER=true features/vcr_example.feature`
|
92
93
|
Then it should fail with "3 scenarios (2 failed, 1 passed)"
|
93
94
|
And the output should contain each of the following:
|
94
|
-
|
|
95
|
-
|
|
95
|
+
| An HTTP request has been made that VCR does not know how to handle: |
|
96
|
+
| GET http://localhost:7777/disallowed_1 |
|
97
|
+
| An HTTP request has been made that VCR does not know how to handle: |
|
98
|
+
| GET http://localhost:7777/disallowed_2 |
|
96
99
|
And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "body: Hello localhost_request_1"
|
97
100
|
And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "body: Hello localhost_request_2"
|
98
101
|
And the file "features/cassettes/nested_cassette.yml" should contain "body: Hello nested_cassette"
|
@@ -103,8 +106,10 @@ Feature: Usage with Cucumber
|
|
103
106
|
When I run `cucumber features/vcr_example.feature`
|
104
107
|
Then it should fail with "3 scenarios (2 failed, 1 passed)"
|
105
108
|
And the output should contain each of the following:
|
106
|
-
|
|
107
|
-
|
|
109
|
+
| An HTTP request has been made that VCR does not know how to handle: |
|
110
|
+
| GET http://localhost:7777/disallowed_1 |
|
111
|
+
| An HTTP request has been made that VCR does not know how to handle: |
|
112
|
+
| GET http://localhost:7777/disallowed_2 |
|
108
113
|
And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "body: Hello localhost_request_1"
|
109
114
|
And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "body: Hello localhost_request_2"
|
110
115
|
And the file "features/cassettes/nested_cassette.yml" should contain "body: Hello nested_cassette"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
Feature: Usage with RSpec
|
1
|
+
Feature: Usage with RSpec macro
|
2
2
|
|
3
3
|
VCR provides a macro that makes it easy to use a VCR cassette for an RSpec
|
4
4
|
example group. To use it, simply add `config.extend VCR::RSpec::Macros`
|
@@ -66,8 +66,8 @@ Feature: Usage with RSpec
|
|
66
66
|
require 'vcr'
|
67
67
|
|
68
68
|
VCR.configure do |c|
|
69
|
-
c.cassette_library_dir
|
70
|
-
c.hook_into
|
69
|
+
c.cassette_library_dir = 'spec/cassettes'
|
70
|
+
c.hook_into :fakeweb
|
71
71
|
end
|
72
72
|
|
73
73
|
RSpec.configure do |c|
|
@@ -79,11 +79,11 @@ Feature: Usage with RSpec
|
|
79
79
|
And the file "spec/cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml" should contain "body: Hello"
|
80
80
|
And the file "spec/cassettes/net_http_example.yml" should contain "body: Hello"
|
81
81
|
|
82
|
+
@rspec-1 @exclude-jruby
|
82
83
|
Scenario: Use `use_vcr_cassette` macro with RSpec 1
|
83
84
|
Given a file named "spec/spec_helper.rb" with:
|
84
85
|
"""ruby
|
85
86
|
require 'sinatra_app'
|
86
|
-
$LOAD_PATH.unshift(File.join(%w[ .. .. vendor rspec-1 lib ]))
|
87
87
|
|
88
88
|
require 'spec'
|
89
89
|
require 'spec/autorun'
|
@@ -91,15 +91,15 @@ Feature: Usage with RSpec
|
|
91
91
|
require 'vcr'
|
92
92
|
|
93
93
|
VCR.configure do |c|
|
94
|
-
c.cassette_library_dir
|
95
|
-
c.hook_into
|
94
|
+
c.cassette_library_dir = 'spec/cassettes'
|
95
|
+
c.hook_into :fakeweb
|
96
96
|
end
|
97
97
|
|
98
98
|
Spec::Runner.configure do |c|
|
99
99
|
c.extend VCR::RSpec::Macros
|
100
100
|
end
|
101
101
|
"""
|
102
|
-
When I run `
|
102
|
+
When I run `spec spec/vcr_example_spec.rb`
|
103
103
|
Then the output should contain "2 examples, 0 failures"
|
104
104
|
And the file "spec/cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml" should contain "body: Hello"
|
105
105
|
And the file "spec/cassettes/net_http_example.yml" should contain "body: Hello"
|
@@ -0,0 +1,90 @@
|
|
1
|
+
Feature: Usage with RSpec metadata
|
2
|
+
|
3
|
+
VCR provides easy integration with RSpec using metadata. To set this
|
4
|
+
up, call `configure_rspec_metadata!` in your `VCR.configure` block.
|
5
|
+
|
6
|
+
Once you've done that, you can have an example group or example use
|
7
|
+
VCR by passing `:vcr` as an additional argument after the description
|
8
|
+
string. It will use set the cassette name based on the example's
|
9
|
+
full description.
|
10
|
+
|
11
|
+
If you need to override the cassette name or options, you can pass a
|
12
|
+
hash (`:vcr => { ... }`).
|
13
|
+
|
14
|
+
Background:
|
15
|
+
Given a file named "spec/spec_helper.rb" with:
|
16
|
+
"""ruby
|
17
|
+
require 'vcr'
|
18
|
+
|
19
|
+
VCR.configure do |c|
|
20
|
+
c.cassette_library_dir = 'spec/cassettes'
|
21
|
+
c.hook_into :fakeweb
|
22
|
+
c.configure_rspec_metadata!
|
23
|
+
end
|
24
|
+
|
25
|
+
RSpec.configure do |c|
|
26
|
+
# so we can use `:vcr` rather than `:vcr => true`;
|
27
|
+
# in RSpec 3 this will no longer be necessary.
|
28
|
+
c.treat_symbols_as_metadata_keys_with_true_values = true
|
29
|
+
end
|
30
|
+
"""
|
31
|
+
|
32
|
+
Scenario: Use `:vcr` metadata
|
33
|
+
Given a file named "spec/vcr_example_spec.rb" with:
|
34
|
+
"""
|
35
|
+
start_sinatra_app(:port => 7777) do
|
36
|
+
get('/') { "Hello" }
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_http_request
|
40
|
+
Net::HTTP.get_response('localhost', '/', 7777).body
|
41
|
+
end
|
42
|
+
|
43
|
+
require 'spec_helper'
|
44
|
+
|
45
|
+
describe "VCR example group metadata", :vcr do
|
46
|
+
it 'records an http request' do
|
47
|
+
make_http_request.should == 'Hello'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'records another http request' do
|
51
|
+
make_http_request.should == 'Hello'
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'in a nested example group' do
|
55
|
+
it 'records another one' do
|
56
|
+
make_http_request.should == 'Hello'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "VCR example metadata" do
|
62
|
+
it 'records an http request', :vcr do
|
63
|
+
make_http_request.should == 'Hello'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
"""
|
67
|
+
When I run `rspec spec/vcr_example_spec.rb`
|
68
|
+
Then it should pass with "4 examples, 0 failures"
|
69
|
+
And the file "spec/cassettes/VCR_example_group_metadata/records_an_http_request.yml" should contain "body: Hello"
|
70
|
+
And the file "spec/cassettes/VCR_example_group_metadata/records_another_http_request.yml" should contain "body: Hello"
|
71
|
+
And the file "spec/cassettes/VCR_example_group_metadata/in_a_nested_example_group/records_another_one.yml" should contain "body: Hello"
|
72
|
+
And the file "spec/cassettes/VCR_example_metadata/records_an_http_request.yml" should contain "body: Hello"
|
73
|
+
|
74
|
+
Scenario: Pass a hash to set the cassette options
|
75
|
+
Given a file named "spec/vcr_example_spec.rb" with:
|
76
|
+
"""
|
77
|
+
require 'spec_helper'
|
78
|
+
|
79
|
+
describe "Using an options hash", :vcr => { :cassette_name => "example", :record => :new_episodes } do
|
80
|
+
it 'uses the provided cassette name' do
|
81
|
+
VCR.current_cassette.name.should == "example"
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'sets the given options' do
|
85
|
+
VCR.current_cassette.record_mode.should == :new_episodes
|
86
|
+
end
|
87
|
+
end
|
88
|
+
"""
|
89
|
+
When I run `rspec spec/vcr_example_spec.rb`
|
90
|
+
Then it should pass with "2 examples, 0 failures"
|
data/lib/vcr.rb
CHANGED
data/lib/vcr/cassette.rb
CHANGED
@@ -34,7 +34,7 @@ module VCR
|
|
34
34
|
@exclusive = options[:exclusive]
|
35
35
|
@serializer = VCR.cassette_serializers[options[:serialize_with]]
|
36
36
|
@record_mode = :all if should_re_record?
|
37
|
-
@parent_list = @exclusive ? HTTPInteractionList::NullList
|
37
|
+
@parent_list = @exclusive ? HTTPInteractionList::NullList : VCR.http_interactions
|
38
38
|
|
39
39
|
raise_error_unless_valid_record_mode
|
40
40
|
end
|
@@ -144,7 +144,7 @@ module VCR
|
|
144
144
|
if should_remove_matching_existing_interactions?
|
145
145
|
new_interaction_list = HTTPInteractionList.new(new_recorded_interactions, match_requests_on)
|
146
146
|
old_interactions = old_interactions.reject do |i|
|
147
|
-
new_interaction_list.
|
147
|
+
new_interaction_list.response_for(i.request)
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
@@ -170,7 +170,7 @@ module VCR
|
|
170
170
|
|
171
171
|
def invoke_hook(type, interactions)
|
172
172
|
interactions.delete_if do |i|
|
173
|
-
VCR.configuration.
|
173
|
+
VCR.configuration.invoke_tagged_hook(type, tag, i, self)
|
174
174
|
i.ignored?
|
175
175
|
end
|
176
176
|
end
|
@@ -1,16 +1,18 @@
|
|
1
1
|
module VCR
|
2
2
|
class Cassette
|
3
3
|
class HTTPInteractionList
|
4
|
-
|
4
|
+
module NullList
|
5
|
+
extend self
|
5
6
|
def response_for(*a); nil; end
|
6
|
-
def
|
7
|
+
def has_used_interaction_matching?(*a); false; end
|
8
|
+
def remaining_unused_interaction_count(*a); 0; end
|
7
9
|
end
|
8
10
|
|
9
11
|
attr_reader :interactions, :request_matchers, :allow_playback_repeats, :parent_list
|
10
12
|
|
11
|
-
def initialize(interactions, request_matchers, allow_playback_repeats = false, parent_list = NullList
|
13
|
+
def initialize(interactions, request_matchers, allow_playback_repeats = false, parent_list = NullList)
|
12
14
|
@interactions = interactions.dup
|
13
|
-
@request_matchers = request_matchers
|
15
|
+
@request_matchers = request_matchers.map { |m| VCR.request_matchers[m] }
|
14
16
|
@allow_playback_repeats = allow_playback_repeats
|
15
17
|
@parent_list = parent_list
|
16
18
|
@used_interactions = []
|
@@ -28,10 +30,12 @@ module VCR
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
def has_used_interaction_matching?(request)
|
34
|
+
@used_interactions.any? { |i| interaction_matches_request?(request, i) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def remaining_unused_interaction_count
|
38
|
+
@interactions.size
|
35
39
|
end
|
36
40
|
|
37
41
|
private
|
@@ -47,7 +51,7 @@ module VCR
|
|
47
51
|
|
48
52
|
def interaction_matches_request?(request, interaction)
|
49
53
|
@request_matchers.all? do |matcher|
|
50
|
-
|
54
|
+
matcher.matches?(request, interaction.request)
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|