vcr 1.4.0 → 1.5.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.
- data/CHANGELOG.md +23 -0
- data/Gemfile +0 -2
- data/Gemfile.lock +15 -14
- data/Guardfile +2 -3
- data/LICENSE +1 -1
- data/README.md +5 -1
- data/features/.nav +28 -0
- data/features/README.md +1 -1
- data/features/cassettes/automatic_re_recording.feature +2 -2
- data/features/cassettes/format.feature +2 -2
- data/features/cassettes/no_cassette.feature +3 -3
- data/features/cassettes/request_matching.feature +8 -8
- data/features/configuration/allow_http_connections_when_no_cassette.feature +1 -1
- data/features/configuration/cassette_library_dir.feature +1 -1
- data/features/configuration/default_cassette_options.feature +2 -2
- data/features/configuration/hooks.feature +276 -0
- data/features/configuration/ignore_localhost.feature +1 -1
- data/features/configuration/stub_with.feature +19 -20
- data/features/middleware/rack.feature +6 -6
- data/features/{cassettes/record_modes → record_modes}/all.feature +2 -2
- data/features/{cassettes/record_modes → record_modes}/new_episodes.feature +3 -3
- data/features/{cassettes/record_modes → record_modes}/none.feature +4 -4
- data/features/support/vcr_cucumber_helpers.rb +1 -1
- data/features/test_frameworks/cucumber.feature +11 -11
- data/features/test_frameworks/rspec.feature +12 -12
- data/features/test_frameworks/shoulda.feature +1 -1
- data/lib/vcr.rb +8 -4
- data/lib/vcr/cassette.rb +28 -39
- data/lib/vcr/cassette/reader.rb +58 -0
- data/lib/vcr/config.rb +45 -40
- data/lib/vcr/deprecations.rb +1 -1
- data/lib/vcr/extensions/net_http.rb +6 -1
- data/lib/vcr/hooks.rb +45 -0
- data/lib/vcr/http_stubbing_adapters/common.rb +16 -13
- data/lib/vcr/http_stubbing_adapters/fakeweb.rb +4 -4
- data/lib/vcr/http_stubbing_adapters/faraday.rb +4 -4
- data/lib/vcr/http_stubbing_adapters/typhoeus.rb +4 -4
- data/lib/vcr/http_stubbing_adapters/webmock.rb +4 -4
- data/lib/vcr/structs.rb +8 -0
- data/lib/vcr/{basic_object.rb → util/basic_object.rb} +0 -0
- data/lib/vcr/{internet_connection.rb → util/internet_connection.rb} +1 -1
- data/lib/vcr/{ping.rb → util/ping.rb} +0 -0
- data/lib/vcr/version.rb +1 -1
- data/script/FullBuildRakeFile +6 -0
- data/script/full_build +1 -1
- data/script/spec +1 -0
- data/spec/fixtures/1.9.1/cassette_spec/empty.yml +0 -0
- data/spec/fixtures/not_1.9.1/cassette_spec/empty.yml +0 -0
- data/spec/spec_helper.rb +7 -4
- data/spec/support/http_library_adapters.rb +8 -0
- data/spec/support/http_stubbing_adapter.rb +2 -2
- data/spec/vcr/cassette/reader_spec.rb +59 -0
- data/spec/{cassette_spec.rb → vcr/cassette_spec.rb} +115 -54
- data/spec/{config_spec.rb → vcr/config_spec.rb} +0 -0
- data/spec/{cucumber_tags_spec.rb → vcr/cucumber_tags_spec.rb} +0 -0
- data/spec/{deprecations_spec.rb → vcr/deprecations_spec.rb} +0 -0
- data/spec/{extensions → vcr/extensions}/net_http_response_spec.rb +0 -0
- data/spec/{extensions → vcr/extensions}/net_http_spec.rb +0 -0
- data/spec/vcr/hooks_spec.rb +95 -0
- data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/fakeweb_spec.rb +0 -0
- data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/faraday_spec.rb +5 -3
- data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/multi_object_proxy_spec.rb +0 -0
- data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/typhoeus_spec.rb +0 -0
- data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/webmock_spec.rb +0 -0
- data/spec/{middleware → vcr/middleware}/cassette_arguments_spec.rb +0 -0
- data/spec/{middleware → vcr/middleware}/faraday_spec.rb +0 -0
- data/spec/{middleware → vcr/middleware}/rack_spec.rb +0 -0
- data/spec/{request_matcher_spec.rb → vcr/request_matcher_spec.rb} +0 -0
- data/spec/{rspec_spec.rb → vcr/rspec_spec.rb} +0 -0
- data/spec/{structs_spec.rb → vcr/structs_spec.rb} +15 -4
- data/spec/{internet_connection_spec.rb → vcr/util/internet_connection_spec.rb} +0 -0
- data/spec/{version_spec.rb → vcr/version_spec.rb} +0 -0
- data/spec/vcr_spec.rb +10 -3
- data/vcr.gemspec +3 -3
- metadata +123 -101
- data/spec/fixtures/1.9.1/cassette_spec/erb_with_no_vars.yml +0 -32
- data/spec/fixtures/1.9.1/cassette_spec/erb_with_vars.yml +0 -32
- data/spec/fixtures/not_1.9.1/cassette_spec/erb_with_no_vars.yml +0 -32
- data/spec/fixtures/not_1.9.1/cassette_spec/erb_with_vars.yml +0 -32
data/lib/vcr/deprecations.rb
CHANGED
@@ -11,7 +11,12 @@ module Net
|
|
11
11
|
vcr_request = VCR::Request.from_net_http_request(self, request)
|
12
12
|
response = request_without_vcr(request, body)
|
13
13
|
|
14
|
-
match_attributes =
|
14
|
+
match_attributes = if cass = VCR.current_cassette
|
15
|
+
cass.match_requests_on
|
16
|
+
else
|
17
|
+
VCR::RequestMatcher::DEFAULT_MATCH_ATTRIBUTES
|
18
|
+
end
|
19
|
+
|
15
20
|
if started? && !VCR.http_stubbing_adapter.request_stubbed?(vcr_request, match_attributes)
|
16
21
|
VCR.record_http_interaction VCR::HTTPInteraction.new(vcr_request, VCR::Response.from_net_http_response(response))
|
17
22
|
response.extend VCR::Net::HTTPResponse # "unwind" the response
|
data/lib/vcr/hooks.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module VCR
|
2
|
+
module Hooks
|
3
|
+
def invoke_hook(hook, tag, *args)
|
4
|
+
hooks_for(hook, tag).each do |callback|
|
5
|
+
callback.call(*args_for_callback(args, callback))
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def clear_hooks
|
10
|
+
hooks.clear
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def hooks
|
16
|
+
@hooks ||= Hash.new do |hook_type_hash, hook_type|
|
17
|
+
hook_type_hash[hook_type] = Hash.new do |tag_hash, tag|
|
18
|
+
tag_hash[tag] = []
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def define_hook(hook)
|
24
|
+
# We must use string eval so that the dynamically
|
25
|
+
# defined method can accept a block.
|
26
|
+
instance_eval <<-RUBY, __FILE__, __LINE__ + 1
|
27
|
+
def #{hook}(tag = nil, &block)
|
28
|
+
hooks[#{hook.inspect}][tag] << block
|
29
|
+
end
|
30
|
+
RUBY
|
31
|
+
end
|
32
|
+
|
33
|
+
def hooks_for(hook, tag)
|
34
|
+
for_hook = hooks[hook]
|
35
|
+
hooks = for_hook[tag] # matching tagged hooks
|
36
|
+
hooks += for_hook[nil] unless tag.nil? # untagged hooks
|
37
|
+
hooks
|
38
|
+
end
|
39
|
+
|
40
|
+
def args_for_callback(args, callback)
|
41
|
+
return args if callback.arity < 0
|
42
|
+
args.first([args.size, callback.arity].min)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -47,12 +47,11 @@ module VCR
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def check_version!
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
warn "You are using #{library_name} #{version}. VCR is known to work with #{library_name} #{version_requirement}. It may not work with this version."
|
50
|
+
case compare_version
|
51
|
+
when :too_low
|
52
|
+
raise "You are using #{library_name} #{version}. VCR requires version #{version_requirement}."
|
53
|
+
when :too_high
|
54
|
+
warn "You are using #{library_name} #{version}. VCR is known to work with #{library_name} #{version_requirement}. It may not work with this version."
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
@@ -64,6 +63,10 @@ module VCR
|
|
64
63
|
self.http_connections_allowed = VCR::Config.allow_http_connections_when_no_cassette?
|
65
64
|
end
|
66
65
|
|
66
|
+
def restore_stubs_checkpoint(cassette)
|
67
|
+
raise ArgumentError.new("No checkpoint for #{cassette.inspect} could be found")
|
68
|
+
end
|
69
|
+
|
67
70
|
private
|
68
71
|
|
69
72
|
def compare_version
|
@@ -71,13 +74,13 @@ module VCR
|
|
71
74
|
min_major, min_minor, min_patch = parse_version(self::MINIMUM_VERSION)
|
72
75
|
max_major, max_minor = parse_version(self::MAXIMUM_VERSION)
|
73
76
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
case
|
78
|
+
when major < min_major; :too_low
|
79
|
+
when major > max_major; :too_high
|
80
|
+
when minor < min_minor; :too_low
|
81
|
+
when minor > max_minor; :too_high
|
82
|
+
when patch < min_patch; :too_low
|
83
|
+
end
|
81
84
|
end
|
82
85
|
|
83
86
|
def version_requirement
|
@@ -43,12 +43,12 @@ module VCR
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
def create_stubs_checkpoint(
|
47
|
-
checkpoints[
|
46
|
+
def create_stubs_checkpoint(cassette)
|
47
|
+
checkpoints[cassette] = ::FakeWeb::Registry.instance.uri_map.dup
|
48
48
|
end
|
49
49
|
|
50
|
-
def restore_stubs_checkpoint(
|
51
|
-
::FakeWeb::Registry.instance.uri_map = checkpoints.delete(
|
50
|
+
def restore_stubs_checkpoint(cassette)
|
51
|
+
::FakeWeb::Registry.instance.uri_map = checkpoints.delete(cassette) || super
|
52
52
|
end
|
53
53
|
|
54
54
|
def request_stubbed?(request, match_attributes)
|
@@ -26,12 +26,12 @@ module VCR
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def create_stubs_checkpoint(
|
30
|
-
checkpoints[
|
29
|
+
def create_stubs_checkpoint(cassette)
|
30
|
+
checkpoints[cassette] = stub_queue_dup
|
31
31
|
end
|
32
32
|
|
33
|
-
def restore_stubs_checkpoint(
|
34
|
-
@stub_queues = checkpoints.delete(
|
33
|
+
def restore_stubs_checkpoint(cassette)
|
34
|
+
@stub_queues = checkpoints.delete(cassette) || super
|
35
35
|
end
|
36
36
|
|
37
37
|
def stubbed_response_for(request_matcher)
|
@@ -43,12 +43,12 @@ module VCR
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
def create_stubs_checkpoint(
|
47
|
-
checkpoints[
|
46
|
+
def create_stubs_checkpoint(cassette)
|
47
|
+
checkpoints[cassette] = ::Typhoeus::Hydra.stubs.dup
|
48
48
|
end
|
49
49
|
|
50
|
-
def restore_stubs_checkpoint(
|
51
|
-
::Typhoeus::Hydra.stubs = checkpoints.delete(
|
50
|
+
def restore_stubs_checkpoint(cassette)
|
51
|
+
::Typhoeus::Hydra.stubs = checkpoints.delete(cassette) || super
|
52
52
|
end
|
53
53
|
|
54
54
|
private
|
@@ -36,12 +36,12 @@ module VCR
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def create_stubs_checkpoint(
|
40
|
-
checkpoints[
|
39
|
+
def create_stubs_checkpoint(cassette)
|
40
|
+
checkpoints[cassette] = ::WebMock::StubRegistry.instance.request_stubs.dup
|
41
41
|
end
|
42
42
|
|
43
|
-
def restore_stubs_checkpoint(
|
44
|
-
::WebMock::StubRegistry.instance.request_stubs = checkpoints.delete(
|
43
|
+
def restore_stubs_checkpoint(cassette)
|
44
|
+
::WebMock::StubRegistry.instance.request_stubs = checkpoints.delete(cassette) || super
|
45
45
|
end
|
46
46
|
|
47
47
|
private
|
data/lib/vcr/structs.rb
CHANGED
@@ -157,5 +157,13 @@ module VCR
|
|
157
157
|
class HTTPInteraction < Struct.new(:request, :response)
|
158
158
|
extend ::Forwardable
|
159
159
|
def_delegators :request, :uri, :method
|
160
|
+
|
161
|
+
def ignore!
|
162
|
+
@ignored = true
|
163
|
+
end
|
164
|
+
|
165
|
+
def ignored?
|
166
|
+
@ignored
|
167
|
+
end
|
160
168
|
end
|
161
169
|
end
|
File without changes
|
File without changes
|
data/lib/vcr/version.rb
CHANGED
data/script/FullBuildRakeFile
CHANGED
@@ -7,6 +7,12 @@ task :build => :ensure_bundler_installed do
|
|
7
7
|
sh "rake"
|
8
8
|
end
|
9
9
|
|
10
|
+
desc "Install necessary gems with bundler, runs specs, run cukes"
|
11
|
+
task :spec => :ensure_bundler_installed do
|
12
|
+
sh "bundle install"
|
13
|
+
sh "rake spec"
|
14
|
+
end
|
15
|
+
|
10
16
|
task :ensure_bundler_installed do
|
11
17
|
installed = begin
|
12
18
|
require 'rubygems'
|
data/script/full_build
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,
|
1
|
+
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,rbx rake -f script/FullBuildRakeFile build && rvm use jruby && bundle install && rake | tee tmp/full_build.out
|
data/script/spec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.8.6,1.8.7,1.9.1,1.9.2,ree,rbx rake -f script/FullBuildRakeFile spec && rvm use jruby && bundle install && rake spec | tee tmp/spec.out
|
File without changes
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -7,13 +7,15 @@ require 'rspec'
|
|
7
7
|
# Ruby 1.9.1 has a different yaml serialization format.
|
8
8
|
YAML_SERIALIZATION_VERSION = RUBY_VERSION == '1.9.1' ? '1.9.1' : 'not_1.9.1'
|
9
9
|
|
10
|
-
|
11
|
-
# in ./support/ and its subdirectories.
|
12
|
-
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require File.join("support", File.basename(f))}
|
10
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
13
11
|
|
14
12
|
require 'vcr'
|
15
13
|
require 'monkey_patches'
|
16
14
|
|
15
|
+
module VCR
|
16
|
+
SPEC_ROOT = File.dirname(__FILE__)
|
17
|
+
end
|
18
|
+
|
17
19
|
RSpec.configure do |config|
|
18
20
|
config.extend TempCassetteLibraryDir
|
19
21
|
config.extend DisableWarnings
|
@@ -21,7 +23,7 @@ RSpec.configure do |config|
|
|
21
23
|
config.extend WebMockMacros
|
22
24
|
|
23
25
|
config.color_enabled = true
|
24
|
-
config.debug = RUBY_INTERPRETER == :mri
|
26
|
+
config.debug = RUBY_INTERPRETER == :mri && RUBY_VERSION != '1.9.2'
|
25
27
|
|
26
28
|
config.before(:each) do
|
27
29
|
VCR.turn_on! unless VCR.turned_on?
|
@@ -29,6 +31,7 @@ RSpec.configure do |config|
|
|
29
31
|
|
30
32
|
VCR::Config.default_cassette_options = { :record => :new_episodes }
|
31
33
|
VCR::Config.stub_with :fakeweb
|
34
|
+
VCR::Config.clear_hooks
|
32
35
|
|
33
36
|
WebMock.allow_net_connect!
|
34
37
|
WebMock.reset!
|
@@ -331,6 +331,14 @@ module HttpLibrarySpecs
|
|
331
331
|
subject.http_connections_allowed?.should == false
|
332
332
|
end
|
333
333
|
|
334
|
+
describe '.restore_stubs_checkpoint' do
|
335
|
+
it 'raises an appropriate error when there is no matching checkpoint' do
|
336
|
+
expect {
|
337
|
+
subject.restore_stubs_checkpoint(:some_crazy_checkpoint_that_doesnt_exist)
|
338
|
+
}.to raise_error(ArgumentError, /no checkpoint .* could be found/i)
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
334
342
|
[true, false].each do |http_allowed|
|
335
343
|
context "when #http_connections_allowed is set to #{http_allowed}" do
|
336
344
|
before(:each) { subject.http_connections_allowed = http_allowed }
|
@@ -52,9 +52,9 @@ shared_examples_for "an http stubbing adapter" do |supported_http_libraries, sup
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 're-enables all adapters afterwards' do
|
55
|
-
VCR::HttpStubbingAdapters::Common.adapters.
|
55
|
+
VCR::HttpStubbingAdapters::Common.adapters.each { |a| a.should be_enabled }
|
56
56
|
subject.exclusively_enabled { }
|
57
|
-
VCR::HttpStubbingAdapters::Common.adapters.
|
57
|
+
VCR::HttpStubbingAdapters::Common.adapters.each { |a| a.should be_enabled }
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe VCR::Cassette::Reader do
|
4
|
+
describe '#read' do
|
5
|
+
def read(*args)
|
6
|
+
described_class.new(*args).read
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:no_vars_content) { '<%= 3 + 4 %>. Some ERB' }
|
10
|
+
let(:vars_content) { '<%= var1 %>. ERB with Vars! <%= var2 %>' }
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
File.stub(:read) do |name|
|
14
|
+
case name
|
15
|
+
when 'no_vars'; no_vars_content
|
16
|
+
when 'vars'; vars_content
|
17
|
+
else raise ArgumentError.new("Unexpected file name: #{name}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when ERB is disabled' do
|
23
|
+
it 'reads the raw file content' do
|
24
|
+
read('no_vars', false).should == no_vars_content
|
25
|
+
read('no_vars', nil).should == no_vars_content
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when ERB is enabled but no variables are passed' do
|
30
|
+
it 'renders the file content as ERB' do
|
31
|
+
read('no_vars', true).should == "7. Some ERB"
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'raises an appropriate error when the ERB template needs variables' do
|
35
|
+
expect {
|
36
|
+
read('vars', true)
|
37
|
+
}.to raise_error(VCR::Cassette::MissingERBVariableError,
|
38
|
+
%{The ERB in the vars cassette file references undefined variable var1. } +
|
39
|
+
%{Pass it to the cassette using :erb => #{ {:var1=>"some value"}.inspect }.}
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when ERB is enabled and variables are passed' do
|
45
|
+
it 'renders the file content as ERB with the passed variables' do
|
46
|
+
read('vars', :var1 => 'foo', :var2 => 'bar').should == 'foo. ERB with Vars! bar'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'raises an appropriate error when one or more of the needed variables are not passed' do
|
50
|
+
expect {
|
51
|
+
read('vars', :var1 => 'foo')
|
52
|
+
}.to raise_error(VCR::Cassette::MissingERBVariableError,
|
53
|
+
%{The ERB in the vars cassette file references undefined variable var2. } +
|
54
|
+
%{Pass it to the cassette using :erb => #{ {:var1 => "foo", :var2 => "some value"}.inspect }.}
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe VCR::Cassette do
|
4
4
|
describe '#file' do
|
5
|
-
temp_dir
|
5
|
+
temp_dir "#{VCR::SPEC_ROOT}/fixtures/file", :assign_to_cassette_library_dir => true
|
6
6
|
|
7
7
|
it 'combines the cassette_library_dir with the cassette name' do
|
8
8
|
cassette = VCR::Cassette.new('the_file')
|
@@ -51,7 +51,7 @@ describe VCR::Cassette do
|
|
51
51
|
|
52
52
|
describe 'on creation' do
|
53
53
|
it 'raises an error with a helpful message when loading an old unsupported cassette' do
|
54
|
-
VCR::Config.cassette_library_dir =
|
54
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}"
|
55
55
|
expect { VCR::Cassette.new('0_3_1_cassette') }.to raise_error(/The VCR cassette 0_3_1_cassette.yml uses an old format that is now deprecated/)
|
56
56
|
end
|
57
57
|
|
@@ -65,63 +65,56 @@ describe VCR::Cassette do
|
|
65
65
|
}.to raise_error(ArgumentError)
|
66
66
|
end
|
67
67
|
|
68
|
-
it '
|
69
|
-
VCR.
|
70
|
-
VCR::Cassette.new('
|
68
|
+
it 'does not raise an error in the case of an empty file' do
|
69
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
70
|
+
VCR::Cassette.new('empty', :record => :none).recorded_interactions.should == []
|
71
71
|
end
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
@orig_default_options = VCR::Config.default_cassette_options
|
76
|
-
end
|
73
|
+
it 'creates a stubs checkpoint on the http_stubbing_adapter' do
|
74
|
+
cassette = nil
|
77
75
|
|
78
|
-
|
79
|
-
|
76
|
+
VCR.http_stubbing_adapter.should_receive(:create_stubs_checkpoint) do |c|
|
77
|
+
cassette = c
|
80
78
|
end
|
81
79
|
|
82
|
-
|
83
|
-
|
84
|
-
VCR::Cassette.new(name, options.merge(:record => :new_episodes)).recorded_interactions.first.response.body
|
85
|
-
end
|
80
|
+
VCR::Cassette.new('example').should equal(cassette)
|
81
|
+
end
|
86
82
|
|
87
|
-
|
88
|
-
|
83
|
+
describe "reading the file from disk" do
|
84
|
+
before(:each) do
|
85
|
+
VCR::Config.cassette_library_dir = "cassette_lib"
|
86
|
+
File.stub(:size? => true)
|
89
87
|
end
|
90
88
|
|
91
|
-
it
|
92
|
-
VCR::
|
93
|
-
|
94
|
-
|
89
|
+
it 'reads the appropriate file from disk using a VCR::Cassette::Reader' do
|
90
|
+
VCR::Cassette::Reader.should_receive(:new).with(
|
91
|
+
'cassette_lib/foo.yml', anything
|
92
|
+
).and_return(mock('reader', :read => [].to_yaml))
|
95
93
|
|
96
|
-
|
97
|
-
VCR::Config.default_cassette_options = { :erb => true }
|
98
|
-
cassette_body('erb_with_no_vars', :erb => false).should == 'sum: <%= 1 + 2 %>'
|
94
|
+
VCR::Cassette.new('foo', :record => :new_episodes)
|
99
95
|
end
|
100
96
|
|
101
|
-
|
102
|
-
|
103
|
-
|
97
|
+
[true, false, nil, { }].each do |erb|
|
98
|
+
it "passes #{erb.inspect} to the VCR::Cassette::Reader when given as the :erb option" do
|
99
|
+
# test that it overrides the default
|
100
|
+
VCR::Config.default_cassette_options = { :erb => true }
|
104
101
|
|
105
|
-
|
106
|
-
|
107
|
-
|
102
|
+
VCR::Cassette::Reader.should_receive(:new).with(
|
103
|
+
anything, erb
|
104
|
+
).and_return(mock('reader', :read => [].to_yaml))
|
108
105
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
}
|
113
|
-
|
114
|
-
%{Pass it to the cassette using :erb => #{ { :var1 => 'a', :var2 => 'b' }.merge(:var3 => 'some value').inspect }.}
|
115
|
-
)
|
116
|
-
end
|
106
|
+
VCR::Cassette.new('foo', :record => :new_episodes, :erb => erb)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "passes #{erb.inspect} to the VCR::Cassette::Reader when it is the default :erb option and none is given" do
|
110
|
+
VCR::Config.default_cassette_options = { :erb => erb }
|
117
111
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
)
|
112
|
+
VCR::Cassette::Reader.should_receive(:new).with(
|
113
|
+
anything, erb
|
114
|
+
).and_return(mock('reader', :read => [].to_yaml))
|
115
|
+
|
116
|
+
VCR::Cassette.new('foo', :record => :new_episodes)
|
117
|
+
end
|
125
118
|
end
|
126
119
|
end
|
127
120
|
|
@@ -194,14 +187,14 @@ describe VCR::Cassette do
|
|
194
187
|
|
195
188
|
it "#{ ignore_localhost ? 'does not load' : 'loads' } localhost interactions from the cassette file when http_stubbing_adapter.ignore_localhost is set to #{ignore_localhost}" do
|
196
189
|
VCR.http_stubbing_adapter.stub!(:ignore_localhost?).and_return(ignore_localhost)
|
197
|
-
VCR::Config.cassette_library_dir =
|
190
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
198
191
|
cassette = VCR::Cassette.new('with_localhost_requests', :record => record_mode)
|
199
192
|
cassette.recorded_interactions.map { |i| URI.parse(i.uri).host }.should =~ expected_uri_hosts
|
200
193
|
end
|
201
194
|
end
|
202
195
|
|
203
196
|
it "loads the recorded interactions from the library yml file" do
|
204
|
-
VCR::Config.cassette_library_dir =
|
197
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
205
198
|
cassette = VCR::Cassette.new('example', :record => record_mode)
|
206
199
|
|
207
200
|
cassette.should have(3).recorded_interactions
|
@@ -222,20 +215,42 @@ describe VCR::Cassette do
|
|
222
215
|
end
|
223
216
|
|
224
217
|
if stub_requests
|
218
|
+
it 'invokes the appropriately tagged before_playback hooks' do
|
219
|
+
VCR::Config.should_receive(:invoke_hook).with(
|
220
|
+
:before_playback,
|
221
|
+
:foo,
|
222
|
+
an_instance_of(VCR::HTTPInteraction),
|
223
|
+
an_instance_of(VCR::Cassette)
|
224
|
+
).exactly(3).times
|
225
|
+
|
226
|
+
cassette = VCR::Cassette.new('example', :record => record_mode, :tag => :foo)
|
227
|
+
cassette.should have(3).recorded_interactions
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'does not playback any interactions that are ignored in a before_playback hook' do
|
231
|
+
VCR.config do |c|
|
232
|
+
c.before_playback { |i| i.ignore! if i.request.uri =~ /foo/ }
|
233
|
+
end
|
234
|
+
|
235
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
236
|
+
cassette = VCR::Cassette.new('example', :record => record_mode)
|
237
|
+
cassette.should have(2).recorded_interactions
|
238
|
+
end
|
239
|
+
|
225
240
|
it "stubs the recorded requests with the http stubbing adapter" do
|
226
|
-
VCR::Config.cassette_library_dir =
|
241
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
227
242
|
VCR.http_stubbing_adapter.should_receive(:stub_requests).with([an_instance_of(VCR::HTTPInteraction)]*3, anything)
|
228
243
|
cassette = VCR::Cassette.new('example', :record => record_mode)
|
229
244
|
end
|
230
245
|
|
231
246
|
it "passes the :match_request_on option to #stub_requests" do
|
232
|
-
VCR::Config.cassette_library_dir =
|
247
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
233
248
|
VCR.http_stubbing_adapter.should_receive(:stub_requests).with(anything, [:body, :headers])
|
234
249
|
cassette = VCR::Cassette.new('example', :record => record_mode, :match_requests_on => [:body, :headers])
|
235
250
|
end
|
236
251
|
else
|
237
252
|
it "does not stub the recorded requests with the http stubbing adapter" do
|
238
|
-
VCR::Config.cassette_library_dir =
|
253
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
239
254
|
VCR.http_stubbing_adapter.should_not_receive(:stub_requests)
|
240
255
|
cassette = VCR::Cassette.new('example', :record => record_mode)
|
241
256
|
end
|
@@ -245,7 +260,7 @@ describe VCR::Cassette do
|
|
245
260
|
end
|
246
261
|
|
247
262
|
describe '#eject' do
|
248
|
-
temp_dir
|
263
|
+
temp_dir "#{VCR::SPEC_ROOT}/fixtures/cassette_spec_eject", :assign_to_cassette_library_dir => true
|
249
264
|
|
250
265
|
[true, false].each do |orig_http_connections_allowed|
|
251
266
|
it "resets #{orig_http_connections_allowed} on the http stubbing adapter if it was originally #{orig_http_connections_allowed}" do
|
@@ -271,6 +286,52 @@ describe VCR::Cassette do
|
|
271
286
|
saved_recorded_interactions.should == recorded_interactions
|
272
287
|
end
|
273
288
|
|
289
|
+
it 'invokes the appropriately tagged before_record hooks' do
|
290
|
+
interactions = [
|
291
|
+
VCR::HTTPInteraction.new(:req_sig_1, :response_1),
|
292
|
+
VCR::HTTPInteraction.new(:req_sig_2, :response_2)
|
293
|
+
]
|
294
|
+
|
295
|
+
cassette = VCR::Cassette.new('example', :tag => :foo)
|
296
|
+
cassette.stub!(:new_recorded_interactions).and_return(interactions)
|
297
|
+
|
298
|
+
interactions.each do |i|
|
299
|
+
VCR::Config.should_receive(:invoke_hook).with(
|
300
|
+
:before_record,
|
301
|
+
:foo,
|
302
|
+
i,
|
303
|
+
cassette
|
304
|
+
).ordered
|
305
|
+
end
|
306
|
+
|
307
|
+
cassette.eject
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'does not record interactions that have been ignored' do
|
311
|
+
interaction_1 = VCR::HTTPInteraction.new(:request_1, :response_1)
|
312
|
+
interaction_2 = VCR::HTTPInteraction.new(:request_2, :response_2)
|
313
|
+
|
314
|
+
interaction_1.ignore!
|
315
|
+
|
316
|
+
cassette = VCR::Cassette.new('test_cassette')
|
317
|
+
cassette.stub!(:new_recorded_interactions).and_return([interaction_1, interaction_2])
|
318
|
+
cassette.eject
|
319
|
+
|
320
|
+
saved_recorded_interactions = YAML.load_file(cassette.file)
|
321
|
+
saved_recorded_interactions.should == [interaction_2]
|
322
|
+
end
|
323
|
+
|
324
|
+
it 'does not write the cassette to disk if all interactions have been ignored' do
|
325
|
+
interaction_1 = VCR::HTTPInteraction.new(:request_1, :response_1)
|
326
|
+
interaction_1.ignore!
|
327
|
+
|
328
|
+
cassette = VCR::Cassette.new('test_cassette')
|
329
|
+
cassette.stub!(:new_recorded_interactions).and_return([interaction_1])
|
330
|
+
cassette.eject
|
331
|
+
|
332
|
+
File.should_not exist(cassette.file)
|
333
|
+
end
|
334
|
+
|
274
335
|
it "writes the recorded interactions to a subdirectory if the cassette name includes a directory" do
|
275
336
|
recorded_interactions = [VCR::HTTPInteraction.new(:the_request, :the_response)]
|
276
337
|
cassette = VCR::Cassette.new('subdirectory/test_cassette')
|
@@ -283,17 +344,17 @@ describe VCR::Cassette do
|
|
283
344
|
|
284
345
|
[:all, :none, :new_episodes].each do |record_mode|
|
285
346
|
context "for a :record => :#{record_mode} cassette with previously recorded interactions" do
|
286
|
-
temp_dir
|
347
|
+
temp_dir "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec/temp", :assign_to_cassette_library_dir => true
|
287
348
|
|
288
349
|
subject { VCR::Cassette.new('example', :record => record_mode, :match_requests_on => [:uri]) }
|
289
350
|
|
290
351
|
before(:each) do
|
291
|
-
base_dir =
|
352
|
+
base_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
292
353
|
FileUtils.cp(base_dir + "/example.yml", base_dir + "/temp/example.yml")
|
293
354
|
end
|
294
355
|
|
295
356
|
it "restore the stubs checkpoint on the http stubbing adapter" do
|
296
|
-
VCR.http_stubbing_adapter.should_receive(:restore_stubs_checkpoint).with(
|
357
|
+
VCR.http_stubbing_adapter.should_receive(:restore_stubs_checkpoint).with(subject)
|
297
358
|
subject.eject
|
298
359
|
end
|
299
360
|
|