vcr 1.6.0 → 1.7.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/.gemtest +0 -0
- data/.gitignore +5 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +29 -2
- data/Gemfile +3 -3
- data/README.md +55 -11
- data/Rakefile +45 -4
- data/features/.nav +6 -0
- data/features/{README.md → about_the_cucumber_features.md} +1 -1
- data/features/cassettes/update_content_length_header.feature +106 -0
- data/features/configuration/default_cassette_options.feature +20 -2
- data/features/configuration/filter_sensitive_data.feature +154 -0
- data/features/getting_started.md +67 -0
- data/features/record_modes/all.feature +4 -2
- data/features/record_modes/new_episodes.feature +8 -2
- data/features/record_modes/none.feature +4 -2
- data/features/record_modes/once.feature +92 -0
- data/features/step_definitions/cli_steps.rb +18 -0
- data/lib/vcr.rb +13 -6
- data/lib/vcr/cassette.rb +36 -15
- data/lib/vcr/config.rb +14 -2
- data/lib/vcr/deprecations/cassette.rb +29 -0
- data/lib/vcr/deprecations/config.rb +18 -0
- data/lib/vcr/deprecations/http_stubbing_adapters/common.rb +9 -0
- data/lib/vcr/deprecations/http_stubbing_adapters/fakeweb.rb +11 -0
- data/lib/vcr/http_stubbing_adapters/common.rb +1 -1
- data/lib/vcr/http_stubbing_adapters/fakeweb.rb +2 -7
- data/lib/vcr/http_stubbing_adapters/multi_object_proxy.rb +1 -1
- data/lib/vcr/middleware/common.rb +3 -5
- data/lib/vcr/rspec.rb +1 -38
- data/lib/vcr/structs/http_interaction.rb +29 -0
- data/lib/vcr/structs/request.rb +6 -0
- data/lib/vcr/structs/response.rb +4 -0
- data/lib/vcr/{cucumber_tags.rb → test_frameworks/cucumber.rb} +10 -2
- data/lib/vcr/test_frameworks/rspec.rb +37 -0
- data/lib/vcr/util/basic_object.rb +32 -28
- data/lib/vcr/{hooks.rb → util/hooks.rb} +3 -6
- data/lib/vcr/util/internet_connection.rb +1 -1
- data/lib/vcr/util/ping.rb +21 -17
- data/lib/vcr/util/variable_args_block_caller.rb +12 -0
- data/lib/vcr/util/yaml.rb +11 -0
- data/lib/vcr/version.rb +1 -1
- data/script/FullBuildRakeFile +7 -0
- data/spec/monkey_patches.rb +0 -7
- data/spec/spec_helper.rb +40 -8
- data/spec/support/http_library_adapters.rb +0 -262
- data/spec/support/shared_example_groups/http_library.rb +256 -0
- data/spec/support/{http_stubbing_adapter.rb → shared_example_groups/http_stubbing_adapter.rb} +15 -3
- data/spec/support/shared_example_groups/ignore_localhost_deprecation.rb +28 -0
- data/spec/support/{normalizers.rb → shared_example_groups/normalizers.rb} +3 -3
- data/spec/support/{version_checker.rb → shared_example_groups/version_checking.rb} +1 -1
- data/spec/vcr/cassette_spec.rb +80 -28
- data/spec/vcr/config_spec.rb +55 -8
- data/spec/vcr/deprecations/cassette_spec.rb +57 -0
- data/spec/vcr/deprecations/config_spec.rb +30 -0
- data/spec/vcr/deprecations/http_stubbing_adapters/common_spec.rb +7 -0
- data/spec/vcr/deprecations/http_stubbing_adapters/fakeweb_spec.rb +16 -0
- data/spec/vcr/extensions/net_http_response_spec.rb +1 -3
- data/spec/vcr/extensions/net_http_spec.rb +1 -3
- data/spec/vcr/http_stubbing_adapters/fakeweb_spec.rb +1 -4
- data/spec/vcr/http_stubbing_adapters/faraday_spec.rb +1 -4
- data/spec/vcr/http_stubbing_adapters/typhoeus_spec.rb +1 -4
- data/spec/vcr/http_stubbing_adapters/webmock_spec.rb +1 -3
- data/spec/vcr/middleware/faraday_spec.rb +4 -4
- data/spec/vcr/middleware/rack_spec.rb +4 -4
- data/spec/vcr/structs/http_interaction_spec.rb +61 -0
- data/spec/vcr/structs/request_spec.rb +20 -2
- data/spec/vcr/structs/response_spec.rb +23 -1
- data/spec/vcr/structs/response_status_spec.rb +1 -1
- data/spec/vcr/{cucumber_tags_spec.rb → test_frameworks/cucumber_spec.rb} +12 -8
- data/spec/vcr/{rspec_spec.rb → test_frameworks/rspec_spec.rb} +0 -0
- data/spec/vcr/{hooks_spec.rb → util/hooks_spec.rb} +3 -3
- data/spec/vcr/util/internet_connection_spec.rb +3 -3
- data/spec/vcr_spec.rb +3 -3
- data/vcr.gemspec +5 -5
- metadata +149 -131
- data/Gemfile.lock +0 -155
- data/lib/vcr/deprecations.rb +0 -54
- data/spec/support/disable_warnings.rb +0 -12
- data/spec/support/temp_cassette_library_dir.rb +0 -16
- data/spec/support/webmock_macros.rb +0 -14
- data/spec/vcr/deprecations_spec.rb +0 -139
data/spec/support/{http_stubbing_adapter.rb → shared_example_groups/http_stubbing_adapter.rb}
RENAMED
@@ -1,5 +1,4 @@
|
|
1
1
|
shared_examples_for "an http stubbing adapter" do |supported_http_libraries, supported_request_match_attributes, *other|
|
2
|
-
extend HttpLibrarySpecs
|
3
2
|
before(:each) { VCR.stub!(:http_stubbing_adapter).and_return(subject) }
|
4
3
|
subject { described_class }
|
5
4
|
|
@@ -44,6 +43,19 @@ shared_examples_for "an http stubbing adapter" do |supported_http_libraries, sup
|
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
46
|
+
describe '.stub_requests' do
|
47
|
+
let(:request) { VCR::Request.new(:get, 'http://example.com/') }
|
48
|
+
let(:status) { VCR::ResponseStatus.new(200, 'OK') }
|
49
|
+
let(:response) { VCR::Response.new(status) }
|
50
|
+
let(:interaction) { VCR::HTTPInteraction.new(request, response) }
|
51
|
+
|
52
|
+
it 'works when the request and response has no headers' do
|
53
|
+
expect {
|
54
|
+
subject.stub_requests([interaction], [:method, :uri])
|
55
|
+
}.not_to raise_error
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
47
59
|
if other.include?(:needs_net_http_extension)
|
48
60
|
describe '.request_uri' do
|
49
61
|
it 'returns the uri for the given http request' do
|
@@ -61,7 +73,7 @@ shared_examples_for "an http stubbing adapter" do |supported_http_libraries, sup
|
|
61
73
|
end
|
62
74
|
|
63
75
|
describe '.request_stubbed? using specific match_attributes' do
|
64
|
-
let(:interactions) { YAML.
|
76
|
+
let(:interactions) { VCR::YAML.load_file(File.join(VCR::SPEC_ROOT, 'fixtures', YAML_SERIALIZATION_VERSION, 'match_requests_on.yml')) }
|
65
77
|
|
66
78
|
@supported_request_match_attributes = supported_request_match_attributes
|
67
79
|
def self.matching_on(attribute, valid1, valid2, invalid, &block)
|
@@ -128,7 +140,7 @@ shared_examples_for "an http stubbing adapter" do |supported_http_libraries, sup
|
|
128
140
|
end
|
129
141
|
|
130
142
|
supported_http_libraries.each do |library|
|
131
|
-
|
143
|
+
it_behaves_like 'an http library', library, supported_request_match_attributes, *other
|
132
144
|
end
|
133
145
|
end
|
134
146
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
shared_examples_for '.ignore_localhost? deprecation' do
|
2
|
+
it 'returns false when no hosts are ignored' do
|
3
|
+
VCR::Config.ignored_hosts.should be_empty
|
4
|
+
described_class.ignore_localhost?.should be_false
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'returns false when only non-local hosts are ignored' do
|
8
|
+
VCR::Config.ignore_hosts 'example.com'
|
9
|
+
described_class.ignore_localhost?.should be_false
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns false when only some localhost aliases are ignored' do
|
13
|
+
aliases = VCR::LOCALHOST_ALIASES.dup
|
14
|
+
aliases.pop
|
15
|
+
VCR::Config.ignore_hosts *aliases
|
16
|
+
described_class.ignore_localhost?.should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'returns true when all localhost aliases are ignored, even if some other hosts are ignored, too' do
|
20
|
+
VCR::Config.ignore_hosts 'example.com', *VCR::LOCALHOST_ALIASES
|
21
|
+
described_class.ignore_localhost?.should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'prints a warning: WARNING: `VCR::Config.ignore_localhost?` is deprecated. Check the list of ignored hosts using `VCR::Config.ignored_hosts` instead.' do
|
25
|
+
VCR::Config.should_receive(:warn).with(/Check the list of ignored hosts using `VCR::Config.ignored_hosts` instead/)
|
26
|
+
described_class.ignore_localhost?
|
27
|
+
end
|
28
|
+
end
|
@@ -28,14 +28,14 @@ shared_examples_for "header normalization" do
|
|
28
28
|
key = 'my-key'
|
29
29
|
key.instance_variable_set(:@foo, 7)
|
30
30
|
instance = with_headers(key => ['value1'])
|
31
|
-
instance.headers.
|
31
|
+
VCR::YAML.dump(instance.headers).should == VCR::YAML.dump('my-key' => ['value1'])
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'ensures header values are serialized to yaml as raw strings' do
|
35
35
|
value = 'my-value'
|
36
36
|
value.instance_variable_set(:@foo, 7)
|
37
37
|
instance = with_headers('my-key' => [value])
|
38
|
-
instance.headers.
|
38
|
+
VCR::YAML.dump(instance.headers).should == VCR::YAML.dump('my-key' => ['my-value'])
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -47,7 +47,7 @@ shared_examples_for "body normalization" do
|
|
47
47
|
it "ensures the body is serialized to yaml as a raw string" do
|
48
48
|
body = "My String"
|
49
49
|
body.instance_variable_set(:@foo, 7)
|
50
|
-
instance(body).body.
|
50
|
+
VCR::YAML.dump(instance(body).body).should == VCR::YAML.dump("My String")
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
shared_examples_for "version checking" do |options|
|
2
2
|
library = described_class.library_name
|
3
3
|
|
4
|
-
describe '.check_version!' do
|
4
|
+
describe '.check_version!', :disable_warnings => true do
|
5
5
|
options[:valid].each do |version|
|
6
6
|
it "does nothing when #{library}'s version is #{version}" do
|
7
7
|
stub_version(version)
|
data/spec/vcr/cassette_spec.rb
CHANGED
@@ -2,8 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe VCR::Cassette do
|
4
4
|
describe '#file' do
|
5
|
-
temp_dir "#{VCR::SPEC_ROOT}/fixtures/file", :assign_to_cassette_library_dir => true
|
6
|
-
|
7
5
|
it 'combines the cassette_library_dir with the cassette name' do
|
8
6
|
cassette = VCR::Cassette.new('the_file')
|
9
7
|
cassette.file.should == File.join(VCR::Config.cassette_library_dir, 'the_file.yml')
|
@@ -89,7 +87,7 @@ describe VCR::Cassette do
|
|
89
87
|
it 'reads the appropriate file from disk using a VCR::Cassette::Reader' do
|
90
88
|
VCR::Cassette::Reader.should_receive(:new).with(
|
91
89
|
'cassette_lib/foo.yml', anything
|
92
|
-
).and_return(mock('reader', :read => []
|
90
|
+
).and_return(mock('reader', :read => VCR::YAML.dump([])))
|
93
91
|
|
94
92
|
VCR::Cassette.new('foo', :record => :new_episodes)
|
95
93
|
end
|
@@ -101,7 +99,7 @@ describe VCR::Cassette do
|
|
101
99
|
|
102
100
|
VCR::Cassette::Reader.should_receive(:new).with(
|
103
101
|
anything, erb
|
104
|
-
).and_return(mock('reader', :read => []
|
102
|
+
).and_return(mock('reader', :read => VCR::YAML.dump([])))
|
105
103
|
|
106
104
|
VCR::Cassette.new('foo', :record => :new_episodes, :erb => erb)
|
107
105
|
end
|
@@ -111,7 +109,7 @@ describe VCR::Cassette do
|
|
111
109
|
|
112
110
|
VCR::Cassette::Reader.should_receive(:new).with(
|
113
111
|
anything, erb
|
114
|
-
).and_return(mock('reader', :read => []
|
112
|
+
).and_return(mock('reader', :read => VCR::YAML.dump([])))
|
115
113
|
|
116
114
|
VCR::Cassette.new('foo', :record => :new_episodes)
|
117
115
|
end
|
@@ -132,7 +130,55 @@ describe VCR::Cassette do
|
|
132
130
|
end
|
133
131
|
|
134
132
|
context "when :#{record_mode} is passed as the record option" do
|
133
|
+
if record_mode == :none
|
134
|
+
it 'does not allow http connections when there is an existing cassette file with recorded interactions' do
|
135
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
136
|
+
VCR.http_stubbing_adapter.should_receive(:http_connections_allowed=).with(false)
|
137
|
+
c = VCR::Cassette.new('example', :record => :once)
|
138
|
+
File.should exist(c.file)
|
139
|
+
File.size?(c.file).should be_true
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'allows http connections when there is an empty existing cassette file' do
|
143
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
144
|
+
VCR.http_stubbing_adapter.should_receive(:http_connections_allowed=).with(true)
|
145
|
+
c = VCR::Cassette.new('empty', :record => :once)
|
146
|
+
File.should exist(c.file)
|
147
|
+
File.size?(c.file).should be_false
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'allows http connections when there is not an existing cassette file' do
|
151
|
+
VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
152
|
+
VCR.http_stubbing_adapter.should_receive(:http_connections_allowed=).with(true)
|
153
|
+
c = VCR::Cassette.new('non_existant_file', :record => :once)
|
154
|
+
File.should_not exist(c.file)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
135
158
|
unless record_mode == :all
|
159
|
+
let(:interaction_1) { VCR::HTTPInteraction.new(VCR::Request.new(:get, 'http://example.com/'), VCR::Response.new(VCR::ResponseStatus.new)) }
|
160
|
+
let(:interaction_2) { VCR::HTTPInteraction.new(VCR::Request.new(:get, 'http://example.com/'), VCR::Response.new(VCR::ResponseStatus.new)) }
|
161
|
+
let(:interactions) { [interaction_1, interaction_2] }
|
162
|
+
before(:each) { VCR::Config.cassette_library_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec" }
|
163
|
+
|
164
|
+
it 'updates the content_length headers when given :update_content_length_header => true' do
|
165
|
+
VCR::YAML.stub(:load => interactions)
|
166
|
+
interaction_1.response.should_receive(:update_content_length_header)
|
167
|
+
interaction_2.response.should_receive(:update_content_length_header)
|
168
|
+
|
169
|
+
VCR::Cassette.new('example', :record => record_mode, :update_content_length_header => true)
|
170
|
+
end
|
171
|
+
|
172
|
+
[nil, false].each do |val|
|
173
|
+
it "does not update the content_lenth headers when given :update_content_length_header => #{val.inspect}" do
|
174
|
+
VCR::YAML.stub(:load => interactions)
|
175
|
+
interaction_1.response.should_not_receive(:update_content_length_header)
|
176
|
+
interaction_2.response.should_not_receive(:update_content_length_header)
|
177
|
+
|
178
|
+
VCR::Cassette.new('example', :record => record_mode, :update_content_length_header => val)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
136
182
|
context "and re_record_interval is 7.days" do
|
137
183
|
let(:file_name) { File.join(VCR::Config.cassette_library_dir, "cassette_name.yml") }
|
138
184
|
subject { VCR::Cassette.new(File.basename(file_name).gsub('.yml', ''), :record => record_mode, :re_record_interval => 7.days) }
|
@@ -148,7 +194,7 @@ describe VCR::Cassette do
|
|
148
194
|
context 'when the cassette file does exist' do
|
149
195
|
before(:each) do
|
150
196
|
File.stub(:exist?).with(file_name).and_return(true)
|
151
|
-
File.stub(:read).with(file_name).and_return([]
|
197
|
+
File.stub(:read).with(file_name).and_return(VCR::YAML.dump([]))
|
152
198
|
end
|
153
199
|
|
154
200
|
context 'and the file was last modified less than 7 days ago' do
|
@@ -258,8 +304,6 @@ describe VCR::Cassette do
|
|
258
304
|
end
|
259
305
|
|
260
306
|
describe '#eject' do
|
261
|
-
temp_dir "#{VCR::SPEC_ROOT}/fixtures/cassette_spec_eject", :assign_to_cassette_library_dir => true
|
262
|
-
|
263
307
|
[true, false].each do |orig_http_connections_allowed|
|
264
308
|
it "resets #{orig_http_connections_allowed} on the http stubbing adapter if it was originally #{orig_http_connections_allowed}" do
|
265
309
|
VCR.http_stubbing_adapter.should_receive(:http_connections_allowed?).and_return(orig_http_connections_allowed)
|
@@ -280,7 +324,7 @@ describe VCR::Cassette do
|
|
280
324
|
cassette.stub!(:new_recorded_interactions).and_return(recorded_interactions)
|
281
325
|
|
282
326
|
expect { cassette.eject }.to change { File.exist?(cassette.file) }.from(false).to(true)
|
283
|
-
saved_recorded_interactions =
|
327
|
+
saved_recorded_interactions = VCR::YAML.load_file(cassette.file)
|
284
328
|
saved_recorded_interactions.should == recorded_interactions
|
285
329
|
end
|
286
330
|
|
@@ -315,7 +359,7 @@ describe VCR::Cassette do
|
|
315
359
|
cassette.stub!(:new_recorded_interactions).and_return([interaction_1, interaction_2])
|
316
360
|
cassette.eject
|
317
361
|
|
318
|
-
saved_recorded_interactions = YAML.load_file(cassette.file)
|
362
|
+
saved_recorded_interactions = VCR::YAML.load_file(cassette.file)
|
319
363
|
saved_recorded_interactions.should == [interaction_2]
|
320
364
|
end
|
321
365
|
|
@@ -336,19 +380,17 @@ describe VCR::Cassette do
|
|
336
380
|
cassette.stub!(:new_recorded_interactions).and_return(recorded_interactions)
|
337
381
|
|
338
382
|
expect { cassette.eject }.to change { File.exist?(cassette.file) }.from(false).to(true)
|
339
|
-
saved_recorded_interactions =
|
383
|
+
saved_recorded_interactions = VCR::YAML.load_file(cassette.file)
|
340
384
|
saved_recorded_interactions.should == recorded_interactions
|
341
385
|
end
|
342
386
|
|
343
387
|
[:all, :none, :new_episodes].each do |record_mode|
|
344
388
|
context "for a :record => :#{record_mode} cassette with previously recorded interactions" do
|
345
|
-
temp_dir "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec/temp", :assign_to_cassette_library_dir => true
|
346
|
-
|
347
389
|
subject { VCR::Cassette.new('example', :record => record_mode, :match_requests_on => [:uri]) }
|
348
390
|
|
349
391
|
before(:each) do
|
350
392
|
base_dir = "#{VCR::SPEC_ROOT}/fixtures/#{YAML_SERIALIZATION_VERSION}/cassette_spec"
|
351
|
-
FileUtils.cp(base_dir + "/example.yml",
|
393
|
+
FileUtils.cp(base_dir + "/example.yml", VCR::Config.cassette_library_dir + "/example.yml")
|
352
394
|
end
|
353
395
|
|
354
396
|
it "restore the stubs checkpoint on the http stubbing adapter" do
|
@@ -371,16 +413,24 @@ describe VCR::Cassette do
|
|
371
413
|
let(:old_interaction_2) { subject.recorded_interactions[1] }
|
372
414
|
let(:old_interaction_3) { subject.recorded_interactions[2] }
|
373
415
|
|
374
|
-
let(:saved_recorded_interactions) { YAML.
|
416
|
+
let(:saved_recorded_interactions) { VCR::YAML.load_file(subject.file) }
|
417
|
+
|
418
|
+
def stub_matcher_for(interaction, matcher)
|
419
|
+
# There are issues with serializing an object stubbed w/ rspec-mocks using Psych.
|
420
|
+
# So we manually define the method here.
|
421
|
+
class << interaction.request; self; end.class_eval do
|
422
|
+
define_method(:matcher) { |*a| matcher }
|
423
|
+
end
|
424
|
+
end
|
375
425
|
|
376
426
|
before(:each) do
|
377
|
-
old_interaction_1
|
378
|
-
old_interaction_2
|
379
|
-
old_interaction_3
|
427
|
+
stub_matcher_for(old_interaction_1, :matcher_c)
|
428
|
+
stub_matcher_for(old_interaction_2, :matcher_d)
|
429
|
+
stub_matcher_for(old_interaction_3, :matcher_c)
|
380
430
|
|
381
|
-
new_interaction_1
|
382
|
-
new_interaction_2
|
383
|
-
new_interaction_3
|
431
|
+
stub_matcher_for(new_interaction_1, :matcher_a)
|
432
|
+
stub_matcher_for(new_interaction_2, :matcher_b)
|
433
|
+
stub_matcher_for(new_interaction_3, :matcher_c)
|
384
434
|
|
385
435
|
[new_interaction_1, new_interaction_2, new_interaction_3].each do |i|
|
386
436
|
subject.record_http_interaction(i)
|
@@ -400,14 +450,16 @@ describe VCR::Cassette do
|
|
400
450
|
end
|
401
451
|
|
402
452
|
it "matches old requests to new ones using the cassette's match attributes" do
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
i
|
408
|
-
|
453
|
+
pending("Need to fix this to work with Psych", :if => defined?(::Psych)) do
|
454
|
+
[
|
455
|
+
old_interaction_1, old_interaction_2, old_interaction_3,
|
456
|
+
new_interaction_1, new_interaction_2, new_interaction_3
|
457
|
+
].each do |i|
|
458
|
+
i.request.should_receive(:matcher).with(subject.match_requests_on).and_return(:the_matcher)
|
459
|
+
end
|
409
460
|
|
410
|
-
|
461
|
+
subject.eject
|
462
|
+
end
|
411
463
|
end
|
412
464
|
else
|
413
465
|
it 'saves the old interactions followed by the new ones to disk' do
|
data/spec/vcr/config_spec.rb
CHANGED
@@ -7,10 +7,11 @@ describe VCR::Config do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe '.cassette_library_dir=' do
|
10
|
-
temp_dir(File.expand_path(File.dirname(__FILE__) + '/fixtures/config_spec'))
|
11
|
-
|
12
10
|
it 'creates the directory if it does not exist' do
|
13
|
-
|
11
|
+
Dir.mktmpdir do |dir|
|
12
|
+
dir += '/cassettes'
|
13
|
+
expect { VCR::Config.cassette_library_dir = dir }.to change { File.exist?(dir) }.from(false).to(true)
|
14
|
+
end
|
14
15
|
end
|
15
16
|
|
16
17
|
it 'does not raise an error if given nil' do
|
@@ -21,15 +22,20 @@ describe VCR::Config do
|
|
21
22
|
describe '.default_cassette_options' do
|
22
23
|
it 'has a hash with some defaults even if it is set to nil' do
|
23
24
|
VCR::Config.default_cassette_options = nil
|
24
|
-
VCR::Config.default_cassette_options.should == {
|
25
|
+
VCR::Config.default_cassette_options.should == {
|
26
|
+
:match_requests_on => VCR::RequestMatcher::DEFAULT_MATCH_ATTRIBUTES,
|
27
|
+
:record => :once
|
28
|
+
}
|
25
29
|
end
|
26
30
|
|
27
31
|
it "returns #{VCR::RequestMatcher::DEFAULT_MATCH_ATTRIBUTES.inspect} for :match_requests_on when other defaults have been set" do
|
28
32
|
VCR::Config.default_cassette_options = { :record => :none }
|
29
|
-
VCR::Config.default_cassette_options.should
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
VCR::Config.default_cassette_options.should include(:match_requests_on => VCR::RequestMatcher::DEFAULT_MATCH_ATTRIBUTES)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns :once for :record when other defaults have been set" do
|
37
|
+
VCR::Config.default_cassette_options = { :erb => :true }
|
38
|
+
VCR::Config.default_cassette_options.should include(:record => :once)
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
@@ -131,4 +137,45 @@ describe VCR::Config do
|
|
131
137
|
described_class.uri_should_be_ignored?(URI("http://example.net/")).should be_false
|
132
138
|
end
|
133
139
|
end
|
140
|
+
|
141
|
+
describe '.filter_sensitive_data' do
|
142
|
+
let(:interaction) { mock('interaction') }
|
143
|
+
before(:each) { interaction.stub(:filter!) }
|
144
|
+
|
145
|
+
it 'adds a before_record hook that replaces the string returned by the block with the given string' do
|
146
|
+
described_class.filter_sensitive_data('foo', &lambda { 'bar' })
|
147
|
+
interaction.should_receive(:filter!).with('bar', 'foo')
|
148
|
+
described_class.invoke_hook(:before_record, nil, interaction)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'adds a before_playback hook that replaces the given string with the string returned by the block' do
|
152
|
+
described_class.filter_sensitive_data('foo', &lambda { 'bar' })
|
153
|
+
interaction.should_receive(:filter!).with('foo', 'bar')
|
154
|
+
described_class.invoke_hook(:before_playback, nil, interaction)
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'tags the before_record hook when given a tag' do
|
158
|
+
described_class.should_receive(:before_record).with(:my_tag)
|
159
|
+
described_class.filter_sensitive_data('foo', :my_tag) { 'bar' }
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'tags the before_playback hook when given a tag' do
|
163
|
+
described_class.should_receive(:before_playback).with(:my_tag)
|
164
|
+
described_class.filter_sensitive_data('foo', :my_tag) { 'bar' }
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'yields the interaction to the block for the before_record hook' do
|
168
|
+
yielded_interaction = nil
|
169
|
+
described_class.filter_sensitive_data('foo', &lambda { |i| yielded_interaction = i; 'bar' })
|
170
|
+
described_class.invoke_hook(:before_record, nil, interaction)
|
171
|
+
yielded_interaction.should equal(interaction)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'yields the interaction to the block for the before_playback hook' do
|
175
|
+
yielded_interaction = nil
|
176
|
+
described_class.filter_sensitive_data('foo', &lambda { |i| yielded_interaction = i; 'bar' })
|
177
|
+
described_class.invoke_hook(:before_playback, nil, interaction)
|
178
|
+
yielded_interaction.should equal(interaction)
|
179
|
+
end
|
180
|
+
end
|
134
181
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe VCR::Cassette, 'deprecations', :disable_warnings => true do
|
4
|
+
|
5
|
+
subject { VCR::Cassette.new('cassette name') }
|
6
|
+
|
7
|
+
it 'raises an error when an :allow_real_http lambda is given' do
|
8
|
+
expect { VCR::Cassette.new('cassette name', :allow_real_http => lambda {}) }.to raise_error(ArgumentError)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "prints a warning: WARNING: VCR::Cassette#allow_real_http_requests_to? is deprecated and should no longer be used" do
|
12
|
+
subject.should_receive(:warn).with("WARNING: VCR::Cassette#allow_real_http_requests_to? is deprecated and should no longer be used.")
|
13
|
+
subject.allow_real_http_requests_to?(URI.parse('http://example.org'))
|
14
|
+
end
|
15
|
+
|
16
|
+
[true, false].each do |orig_ignore_localhost|
|
17
|
+
orig_ignored_hosts = if orig_ignore_localhost
|
18
|
+
VCR::LOCALHOST_ALIASES
|
19
|
+
else
|
20
|
+
[]
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when the ignored_hosts list is set to #{orig_ignored_hosts.inspect} and the :allow_real_http option is set to :localhost" do
|
24
|
+
before(:each) do
|
25
|
+
VCR::Config.ignored_hosts.clear
|
26
|
+
VCR::Config.ignore_hosts *orig_ignored_hosts
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { VCR::Cassette.new('cassette name', :allow_real_http => :localhost) }
|
30
|
+
|
31
|
+
it "sets the ignored_hosts list to the list of localhost aliases" do
|
32
|
+
subject
|
33
|
+
VCR::Config.ignored_hosts.should == VCR::LOCALHOST_ALIASES
|
34
|
+
end
|
35
|
+
|
36
|
+
it "prints a warning: VCR's :allow_real_http cassette option is deprecated. Instead, use the ignore_localhost configuration option." do
|
37
|
+
Kernel.should_receive(:warn).with("WARNING: VCR's :allow_real_http cassette option is deprecated. Instead, use the ignore_localhost configuration option.")
|
38
|
+
subject
|
39
|
+
end
|
40
|
+
|
41
|
+
it "reverts ignore_hosts when the cassette is ejected" do
|
42
|
+
subject.eject
|
43
|
+
VCR::Config.ignored_hosts.should == orig_ignored_hosts
|
44
|
+
end
|
45
|
+
|
46
|
+
{
|
47
|
+
'http://localhost' => true,
|
48
|
+
'http://127.0.0.1' => true,
|
49
|
+
'http://example.com' => false
|
50
|
+
}.each do |url, expected_value|
|
51
|
+
it "returns #{expected_value} for #allow_real_http_requests_to? when it is given #{url}" do
|
52
|
+
subject.allow_real_http_requests_to?(URI.parse(url)).should == expected_value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|