vcr 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +0 -3
- data/CHANGELOG.md +32 -3
- data/Gemfile +33 -0
- data/Gemfile.lock +99 -119
- data/README.md +19 -7
- data/Rakefile +5 -9
- data/benchmarks/null_logging.rb +62 -0
- data/features/.nav +0 -1
- data/features/about_these_examples.md +1 -2
- data/features/cassettes/allow_unused_http_interactions.feature +15 -1
- data/features/cassettes/decompress.feature +6 -2
- data/features/cassettes/format.feature +20 -12
- data/features/cassettes/freezing_time.feature +68 -0
- data/features/configuration/cassette_library_dir.feature +5 -0
- data/features/configuration/preserve_exact_body_bytes.feature +5 -0
- data/features/configuration/uri_parser.feature +2 -4
- data/features/http_libraries/net_http.feature +1 -1
- data/features/request_matching/headers.feature +0 -1
- data/features/step_definitions/cli_steps.rb +1 -4
- data/features/test_frameworks/cucumber.feature +59 -0
- data/features/test_frameworks/rspec_metadata.feature +59 -1
- data/gemfiles/typhoeus_old.gemfile +19 -0
- data/gemfiles/typhoeus_old.gemfile.lock +84 -86
- data/lib/vcr.rb +12 -3
- data/lib/vcr/cassette.rb +32 -11
- data/lib/vcr/cassette/http_interaction_list.rb +3 -2
- data/lib/vcr/cassette/migrator.rb +1 -0
- data/lib/vcr/cassette/serializers/json.rb +1 -1
- data/lib/vcr/configuration.rb +17 -9
- data/lib/vcr/library_hooks/typhoeus.rb +3 -2
- data/lib/vcr/library_hooks/webmock.rb +1 -1
- data/lib/vcr/middleware/excon.rb +13 -1
- data/lib/vcr/middleware/faraday.rb +1 -0
- data/lib/vcr/request_handler.rb +1 -1
- data/lib/vcr/structs.rb +19 -4
- data/lib/vcr/test_frameworks/cucumber.rb +2 -2
- data/lib/vcr/test_frameworks/rspec.rb +10 -2
- data/lib/vcr/util/logger.rb +41 -7
- data/lib/vcr/version.rb +1 -1
- data/script/ci.sh +8 -1
- data/spec/acceptance/threading_spec.rb +6 -0
- data/spec/capture_warnings.rb +9 -1
- data/spec/spec_helper.rb +6 -2
- data/spec/support/configuration_stubbing.rb +8 -0
- data/spec/support/http_library_adapters.rb +1 -1
- data/spec/support/limited_uri.rb +1 -0
- data/spec/support/shared_example_groups/excon.rb +23 -1
- data/spec/support/shared_example_groups/hook_into_http_library.rb +12 -12
- data/spec/support/shared_example_groups/request_hooks.rb +1 -1
- data/spec/support/sinatra_app.rb +9 -0
- data/spec/support/vcr_localhost_server.rb +4 -25
- data/spec/support/vcr_stub_helpers.rb +1 -1
- data/spec/vcr/cassette/http_interaction_list_spec.rb +41 -14
- data/spec/vcr/cassette/migrator_spec.rb +1 -1
- data/spec/vcr/cassette/persisters_spec.rb +2 -2
- data/spec/vcr/cassette/serializers_spec.rb +13 -4
- data/spec/vcr/cassette_spec.rb +107 -58
- data/spec/vcr/configuration_spec.rb +23 -23
- data/spec/vcr/deprecations_spec.rb +9 -9
- data/spec/vcr/errors_spec.rb +6 -6
- data/spec/vcr/library_hooks/excon_spec.rb +15 -10
- data/spec/vcr/library_hooks/fakeweb_spec.rb +8 -8
- data/spec/vcr/library_hooks/faraday_spec.rb +1 -1
- data/spec/vcr/library_hooks/typhoeus_0.4_spec.rb +2 -2
- data/spec/vcr/library_hooks/typhoeus_spec.rb +68 -9
- data/spec/vcr/library_hooks/webmock_spec.rb +6 -10
- data/spec/vcr/middleware/faraday_spec.rb +33 -5
- data/spec/vcr/middleware/rack_spec.rb +2 -2
- data/spec/vcr/request_matcher_registry_spec.rb +11 -6
- data/spec/vcr/structs_spec.rb +114 -47
- data/spec/vcr/test_frameworks/cucumber_spec.rb +4 -4
- data/spec/vcr/util/hooks_spec.rb +2 -2
- data/spec/vcr/util/internet_connection_spec.rb +3 -3
- data/spec/vcr/util/version_checker_spec.rb +4 -4
- data/spec/vcr_spec.rb +22 -16
- data/vcr.gemspec +2 -31
- metadata +9 -328
- data/features/test_frameworks/shoulda.feature +0 -64
@@ -40,10 +40,10 @@ describe "WebMock hook", :with_monkey_patches => :webmock do
|
|
40
40
|
|
41
41
|
context "when there'ss a bug and the request does not have the @__typed_vcr_request in the after_request callbacks" do
|
42
42
|
let(:warner) { VCR::LibraryHooks::WebMock }
|
43
|
-
before { warner.
|
43
|
+
before { allow(warner).to receive(:warn) }
|
44
44
|
|
45
45
|
it 'records the HTTP interaction properly' do
|
46
|
-
VCR.
|
46
|
+
expect(VCR).to receive(:record_http_interaction) do |i|
|
47
47
|
expect(i.request.uri).to eq("http://foo.com/")
|
48
48
|
expect(i.response.body).to eq("OK")
|
49
49
|
end
|
@@ -63,7 +63,7 @@ describe "WebMock hook", :with_monkey_patches => :webmock do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'prints a warning' do
|
66
|
-
warner.
|
66
|
+
expect(warner).to receive(:warn).at_least(:once).with(/bug.*after_request/)
|
67
67
|
|
68
68
|
run_after_request_callback
|
69
69
|
end
|
@@ -98,7 +98,7 @@ describe "WebMock hook", :with_monkey_patches => :webmock do
|
|
98
98
|
|
99
99
|
expect {
|
100
100
|
make_http_request(:get, request_url)
|
101
|
-
}.to_not raise_error
|
101
|
+
}.to_not raise_error
|
102
102
|
end
|
103
103
|
|
104
104
|
it 'can allow connections to matching urls' do
|
@@ -107,16 +107,12 @@ describe "WebMock hook", :with_monkey_patches => :webmock do
|
|
107
107
|
|
108
108
|
expect {
|
109
109
|
make_http_request(:get, request_url)
|
110
|
-
}.to_not raise_error
|
110
|
+
}.to_not raise_error
|
111
111
|
end
|
112
112
|
end
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
it_behaves_like "Excon streaming"
|
117
|
-
before(:each) do
|
118
|
-
pending "waiting on bblimke/webmock#246 for a fix"
|
119
|
-
end
|
120
|
-
end
|
116
|
+
it_behaves_like "Excon streaming"
|
121
117
|
end
|
122
118
|
|
@@ -7,8 +7,7 @@ describe VCR::Middleware::Faraday do
|
|
7
7
|
http_libs.each do |lib|
|
8
8
|
it_behaves_like 'a hook into an HTTP library', :faraday, "faraday (w/ #{lib})",
|
9
9
|
:status_message_not_exposed,
|
10
|
-
:does_not_support_rotating_responses
|
11
|
-
:not_disableable
|
10
|
+
:does_not_support_rotating_responses
|
12
11
|
end
|
13
12
|
|
14
13
|
context 'when performing a multipart upload' do
|
@@ -22,7 +21,7 @@ describe VCR::Middleware::Faraday do
|
|
22
21
|
it 'records the request body correctly' do
|
23
22
|
payload = { :file => Faraday::UploadIO.new(__FILE__, 'text/plain') }
|
24
23
|
|
25
|
-
VCR.
|
24
|
+
expect(VCR).to receive(:record_http_interaction) do |i|
|
26
25
|
expect(i.request.headers['Content-Type'].first).to include("multipart")
|
27
26
|
expect(i.request.body).to include(File.read(__FILE__))
|
28
27
|
end
|
@@ -43,6 +42,35 @@ describe VCR::Middleware::Faraday do
|
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
45
|
+
context 'when extending the response body with an extension module' do
|
46
|
+
let(:connection) { ::Faraday.new("http://localhost:#{VCR::SinatraApp.port}/") }
|
47
|
+
|
48
|
+
def process_response(response)
|
49
|
+
response.body.extend Module.new { attr_accessor :_response }
|
50
|
+
response.body._response = response
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'does not record the body extensions to the cassette' do
|
54
|
+
3.times do |i|
|
55
|
+
VCR.use_cassette("hack", :record => :new_episodes) do
|
56
|
+
response = connection.get("/foo")
|
57
|
+
process_response(response)
|
58
|
+
|
59
|
+
# Do something different after the first time to
|
60
|
+
# ensure new interactions are added to an existing
|
61
|
+
# cassette.
|
62
|
+
if i > 1
|
63
|
+
response = connection.get("/")
|
64
|
+
process_response(response)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
contents = VCR::Cassette.new("hack").send(:raw_cassette_bytes)
|
70
|
+
expect(contents).not_to include("ruby/object:Faraday::Response")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
46
74
|
context 'when making parallel requests' do
|
47
75
|
include VCRStubHelpers
|
48
76
|
let(:connection) { ::Faraday.new { |b| b.adapter :typhoeus } }
|
@@ -102,7 +130,7 @@ describe VCR::Middleware::Faraday do
|
|
102
130
|
|
103
131
|
context 'for a recorded request' do
|
104
132
|
let!(:inserted_cassette) { VCR.insert_cassette('new_cassette') }
|
105
|
-
before(:each) { VCR.
|
133
|
+
before(:each) { expect(VCR).to receive(:record_http_interaction) }
|
106
134
|
it_behaves_like "exclusive library hook"
|
107
135
|
end
|
108
136
|
|
@@ -132,7 +160,7 @@ describe VCR::Middleware::Faraday do
|
|
132
160
|
it 'can be used to eject a cassette after the request is recorded' do
|
133
161
|
VCR.configuration.after_http_request { |request| VCR.eject_cassette }
|
134
162
|
|
135
|
-
VCR.
|
163
|
+
expect(VCR).to receive(:record_http_interaction) do |interaction|
|
136
164
|
expect(VCR.current_cassette).to be(inserted_cassette)
|
137
165
|
end
|
138
166
|
|
@@ -45,8 +45,8 @@ module VCR
|
|
45
45
|
describe '#call' do
|
46
46
|
let(:env_hash) { { :env => :hash } }
|
47
47
|
it 'calls the provided rack app and returns its response' do
|
48
|
-
rack_app =
|
49
|
-
rack_app.
|
48
|
+
rack_app = double
|
49
|
+
expect(rack_app).to receive(:call).with(env_hash).and_return(:response)
|
50
50
|
instance = described_class.new(rack_app) { |c| c.name 'cassette_name' }
|
51
51
|
expect(instance.call(env_hash)).to eq(:response)
|
52
52
|
end
|
@@ -2,11 +2,16 @@ require 'vcr/request_matcher_registry'
|
|
2
2
|
require 'vcr/structs'
|
3
3
|
require 'support/limited_uri'
|
4
4
|
require 'cgi'
|
5
|
+
require 'support/configuration_stubbing'
|
5
6
|
|
6
7
|
module VCR
|
7
8
|
describe RequestMatcherRegistry do
|
8
|
-
|
9
|
-
|
9
|
+
include_context "configuration stubbing"
|
10
|
+
|
11
|
+
before do
|
12
|
+
allow(config).to receive(:uri_parser) { LimitedURI }
|
13
|
+
allow(config).to receive(:query_parser) { CGI.method(:parse) }
|
14
|
+
end
|
10
15
|
|
11
16
|
def request_with(values)
|
12
17
|
VCR::Request.new.tap do |request|
|
@@ -20,23 +25,23 @@ module VCR
|
|
20
25
|
it 'registers a request matcher block that can be used later' do
|
21
26
|
matcher_called = false
|
22
27
|
subject.register(:my_matcher) { |*a| matcher_called = true }
|
23
|
-
subject[:my_matcher].matches?(
|
28
|
+
subject[:my_matcher].matches?(double, double)
|
24
29
|
expect(matcher_called).to be_true
|
25
30
|
end
|
26
31
|
|
27
32
|
context 'when there is already a matcher for the given name' do
|
28
33
|
before(:each) do
|
29
34
|
subject.register(:foo) { |*a| false }
|
30
|
-
subject.
|
35
|
+
allow(subject).to receive :warn
|
31
36
|
end
|
32
37
|
|
33
38
|
it 'overrides the existing matcher' do
|
34
39
|
subject.register(:foo) { |*a| true }
|
35
|
-
expect(subject[:foo].matches?(
|
40
|
+
expect(subject[:foo].matches?(double, double)).to be_true
|
36
41
|
end
|
37
42
|
|
38
43
|
it 'warns that there is a name collision' do
|
39
|
-
subject.
|
44
|
+
expect(subject).to receive(:warn).with(
|
40
45
|
/WARNING: There is already a VCR request matcher registered for :foo\. Overriding it/
|
41
46
|
)
|
42
47
|
|
data/spec/vcr/structs_spec.rb
CHANGED
@@ -8,6 +8,7 @@ require 'vcr/errors'
|
|
8
8
|
require 'zlib'
|
9
9
|
require 'stringio'
|
10
10
|
require 'support/limited_uri'
|
11
|
+
require 'support/configuration_stubbing'
|
11
12
|
|
12
13
|
shared_examples_for "a header normalizer" do
|
13
14
|
let(:instance) do
|
@@ -61,7 +62,8 @@ end
|
|
61
62
|
|
62
63
|
module VCR
|
63
64
|
describe HTTPInteraction do
|
64
|
-
|
65
|
+
include_context "configuration stubbing"
|
66
|
+
before { allow(config).to receive(:uri_parser) { LimitedURI } }
|
65
67
|
|
66
68
|
if ''.respond_to?(:encoding)
|
67
69
|
def body_hash(key, value)
|
@@ -77,7 +79,7 @@ module VCR
|
|
77
79
|
let(:now) { Time.now }
|
78
80
|
|
79
81
|
it 'is initialized to the current time' do
|
80
|
-
Time.
|
82
|
+
allow(Time).to receive(:now).and_return(now)
|
81
83
|
expect(VCR::HTTPInteraction.new.recorded_at).to eq(now)
|
82
84
|
end
|
83
85
|
end
|
@@ -118,6 +120,18 @@ module VCR
|
|
118
120
|
expect(HTTPInteraction.from_hash(hash).recorded_at).to eq(recorded_at)
|
119
121
|
end
|
120
122
|
|
123
|
+
it 'initializes the response adapter_metadata from the hash if it is included' do
|
124
|
+
hash['response']['adapter_metadata'] = { 'foo' => 12 }
|
125
|
+
interaction = HTTPInteraction.from_hash(hash)
|
126
|
+
expect(interaction.response.adapter_metadata).to eq("foo" => 12)
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'works when the response adapter_metadata is missing' do
|
130
|
+
expect(hash['response'].keys).not_to include('adapter_metadata')
|
131
|
+
interaction = HTTPInteraction.from_hash(hash)
|
132
|
+
expect(interaction.response.adapter_metadata).to eq({})
|
133
|
+
end
|
134
|
+
|
121
135
|
it 'uses a blank request when the hash lacks one' do
|
122
136
|
hash.delete('request')
|
123
137
|
i = HTTPInteraction.from_hash(hash)
|
@@ -192,7 +206,7 @@ module VCR
|
|
192
206
|
expect(string).to be_valid_encoding
|
193
207
|
hash['request']['body'] = { 'string' => string, 'encoding' => 'ASCII-8BIT' }
|
194
208
|
|
195
|
-
Request.
|
209
|
+
expect(Request).not_to receive(:warn)
|
196
210
|
i = HTTPInteraction.from_hash(hash)
|
197
211
|
expect(i.request.body).to eq(string)
|
198
212
|
expect(i.request.body.bytes.to_a).to eq(string.bytes.to_a)
|
@@ -201,14 +215,12 @@ module VCR
|
|
201
215
|
|
202
216
|
context 'when the string cannot be encoded as the original encoding' do
|
203
217
|
def verify_encoding_error
|
204
|
-
|
205
|
-
expect { "\xFAbc".encode("ISO-8859-1") }.to raise_error(EncodingError)
|
206
|
-
end
|
218
|
+
expect { "\xFAbc".encode("ISO-8859-1") }.to raise_error(EncodingError)
|
207
219
|
end
|
208
220
|
|
209
221
|
before do
|
210
|
-
Request.
|
211
|
-
Response.
|
222
|
+
allow(Request).to receive(:warn)
|
223
|
+
allow(Response).to receive(:warn)
|
212
224
|
|
213
225
|
hash['request']['body'] = { 'string' => "\xFAbc", 'encoding' => 'ISO-8859-1' }
|
214
226
|
hash['response']['body'] = { 'string' => "\xFAbc", 'encoding' => 'ISO-8859-1' }
|
@@ -225,8 +237,8 @@ module VCR
|
|
225
237
|
end
|
226
238
|
|
227
239
|
it 'prints a warning and informs users of the :preserve_exact_body_bytes option' do
|
228
|
-
Request.
|
229
|
-
Response.
|
240
|
+
expect(Request).to receive(:warn).with(/ISO-8859-1.*preserve_exact_body_bytes/)
|
241
|
+
expect(Response).to receive(:warn).with(/ISO-8859-1.*preserve_exact_body_bytes/)
|
230
242
|
|
231
243
|
HTTPInteraction.from_hash(hash)
|
232
244
|
end
|
@@ -235,9 +247,11 @@ module VCR
|
|
235
247
|
end
|
236
248
|
|
237
249
|
describe "#to_hash" do
|
250
|
+
include_context "configuration stubbing"
|
251
|
+
|
238
252
|
before(:each) do
|
239
|
-
|
240
|
-
|
253
|
+
allow(config).to receive(:preserve_exact_body_bytes_for?).and_return(false)
|
254
|
+
allow(config).to receive(:uri_parser).and_return(URI)
|
241
255
|
end
|
242
256
|
|
243
257
|
let(:hash) { interaction.to_hash }
|
@@ -265,8 +279,29 @@ module VCR
|
|
265
279
|
})
|
266
280
|
end
|
267
281
|
|
282
|
+
it 'includes the response adapter metadata when it is not empty' do
|
283
|
+
interaction.response.adapter_metadata['foo'] = 17
|
284
|
+
expect(hash['response']['adapter_metadata']).to eq('foo' => 17)
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'does not include the response adapter metadata when it is empty' do
|
288
|
+
expect(interaction.response.adapter_metadata).to eq({})
|
289
|
+
expect(hash['response'].keys).not_to include('adapter_metadata')
|
290
|
+
end
|
291
|
+
|
292
|
+
context "when the body is extended with a module and some state" do
|
293
|
+
it 'serializes to YAML w/o the extra state' do
|
294
|
+
interaction.request.body.extend Module.new { attr_accessor :foo }
|
295
|
+
interaction.response.body.extend Module.new { attr_accessor :foo }
|
296
|
+
interaction.request.body.foo = 98765
|
297
|
+
interaction.response.body.foo = 98765
|
298
|
+
|
299
|
+
expect(YAML.dump(interaction.to_hash)).not_to include("98765")
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
268
303
|
it 'encodes the body as base64 when the configuration is so set' do
|
269
|
-
|
304
|
+
allow(config).to receive(:preserve_exact_body_bytes_for?).and_return(true)
|
270
305
|
expect(hash['request']['body']).to eq(body_hash('base64_string', Base64.encode64('req body')))
|
271
306
|
expect(hash['response']['body']).to eq(body_hash('base64_string', Base64.encode64('res body')))
|
272
307
|
end
|
@@ -291,19 +326,24 @@ module VCR
|
|
291
326
|
assert_yielded_keys hash['response'], 'status', 'headers', 'body', 'http_version'
|
292
327
|
assert_yielded_keys hash['response']['status'], 'code', 'message'
|
293
328
|
end
|
329
|
+
|
330
|
+
it 'yields `adapter_metadata` if it has any data' do
|
331
|
+
interaction.response.adapter_metadata['foo'] = 17
|
332
|
+
assert_yielded_keys hash['response'], 'status', 'headers', 'body', 'http_version', 'adapter_metadata'
|
333
|
+
end
|
294
334
|
end
|
295
335
|
|
296
336
|
describe "#parsed_uri" do
|
297
337
|
before :each do
|
298
|
-
uri_parser.
|
299
|
-
|
338
|
+
allow(uri_parser).to receive(:parse).and_return(uri)
|
339
|
+
allow(config).to receive(:uri_parser).and_return(uri_parser)
|
300
340
|
end
|
301
341
|
|
302
|
-
let(:uri_parser){
|
303
|
-
let(:uri){
|
342
|
+
let(:uri_parser){ double('parser') }
|
343
|
+
let(:uri){ double('uri').as_null_object }
|
304
344
|
|
305
345
|
it "parses the uri using the current uri_parser" do
|
306
|
-
uri_parser.
|
346
|
+
expect(uri_parser).to receive(:parse).with(request.uri)
|
307
347
|
request.parsed_uri
|
308
348
|
end
|
309
349
|
|
@@ -314,7 +354,11 @@ module VCR
|
|
314
354
|
end
|
315
355
|
|
316
356
|
describe HTTPInteraction::HookAware do
|
317
|
-
|
357
|
+
include_context "configuration stubbing"
|
358
|
+
|
359
|
+
before do
|
360
|
+
allow(config).to receive(:uri_parser) { LimitedURI }
|
361
|
+
end
|
318
362
|
|
319
363
|
let(:response_status) { VCR::ResponseStatus.new(200, "OK foo") }
|
320
364
|
let(:body) { "The body foo this is (foo-Foo)" }
|
@@ -399,14 +443,14 @@ module VCR
|
|
399
443
|
describe Request::Typed do
|
400
444
|
[:uri, :method, :headers, :body].each do |method|
|
401
445
|
it "delegates ##{method} to the request" do
|
402
|
-
request =
|
446
|
+
request = double(method => "delegated value")
|
403
447
|
expect(Request::Typed.new(request, :type).send(method)).to eq("delegated value")
|
404
448
|
end
|
405
449
|
end
|
406
450
|
|
407
451
|
describe "#type" do
|
408
452
|
it 'returns the initialized type' do
|
409
|
-
expect(Request::Typed.new(
|
453
|
+
expect(Request::Typed.new(double, :ignored).type).to be(:ignored)
|
410
454
|
end
|
411
455
|
end
|
412
456
|
|
@@ -414,11 +458,11 @@ module VCR
|
|
414
458
|
valid_types.each do |type|
|
415
459
|
describe "##{type}?" do
|
416
460
|
it "returns true if the type is set to :#{type}" do
|
417
|
-
expect(Request::Typed.new(
|
461
|
+
expect(Request::Typed.new(double, type).send("#{type}?")).to be_true
|
418
462
|
end
|
419
463
|
|
420
464
|
it "returns false if the type is set to :other" do
|
421
|
-
expect(Request::Typed.new(
|
465
|
+
expect(Request::Typed.new(double, :other).send("#{type}?")).to be_false
|
422
466
|
end
|
423
467
|
end
|
424
468
|
end
|
@@ -427,13 +471,13 @@ module VCR
|
|
427
471
|
real_types = [:ignored, :recordable]
|
428
472
|
real_types.each do |type|
|
429
473
|
it "returns true if the type is set to :#{type}" do
|
430
|
-
expect(Request::Typed.new(
|
474
|
+
expect(Request::Typed.new(double, type)).to be_real
|
431
475
|
end
|
432
476
|
end
|
433
477
|
|
434
478
|
(valid_types - real_types).each do |type|
|
435
479
|
it "returns false if the type is set to :#{type}" do
|
436
|
-
expect(Request::Typed.new(
|
480
|
+
expect(Request::Typed.new(double, type)).not_to be_real
|
437
481
|
end
|
438
482
|
end
|
439
483
|
end
|
@@ -442,20 +486,24 @@ module VCR
|
|
442
486
|
stubbed_types = [:externally_stubbed, :stubbed_by_vcr]
|
443
487
|
stubbed_types.each do |type|
|
444
488
|
it "returns true if the type is set to :#{type}" do
|
445
|
-
expect(Request::Typed.new(
|
489
|
+
expect(Request::Typed.new(double, type)).to be_stubbed
|
446
490
|
end
|
447
491
|
end
|
448
492
|
|
449
493
|
(valid_types - stubbed_types).each do |type|
|
450
494
|
it "returns false if the type is set to :#{type}" do
|
451
|
-
expect(Request::Typed.new(
|
495
|
+
expect(Request::Typed.new(double, type)).not_to be_stubbed
|
452
496
|
end
|
453
497
|
end
|
454
498
|
end
|
455
499
|
end
|
456
500
|
|
457
501
|
describe Request do
|
458
|
-
|
502
|
+
include_context "configuration stubbing"
|
503
|
+
|
504
|
+
before do
|
505
|
+
allow(config).to receive(:uri_parser) { LimitedURI }
|
506
|
+
end
|
459
507
|
|
460
508
|
describe '#method' do
|
461
509
|
subject { VCR::Request.new(:get) }
|
@@ -518,7 +566,7 @@ module VCR
|
|
518
566
|
end
|
519
567
|
|
520
568
|
it 'can be cast to a proc' do
|
521
|
-
Fiber.
|
569
|
+
expect(Fiber).to receive(:yield)
|
522
570
|
lambda(&subject).call
|
523
571
|
end
|
524
572
|
end if RUBY_VERSION > '1.9'
|
@@ -549,6 +597,27 @@ module VCR
|
|
549
597
|
end
|
550
598
|
end
|
551
599
|
|
600
|
+
describe "#adapter_metadata" do
|
601
|
+
it 'returns the hash given as the last #initialize argument' do
|
602
|
+
response = Response.new(
|
603
|
+
ResponseStatus.new(200, "OK"),
|
604
|
+
{}, "the body", "1.1",
|
605
|
+
{ "meta" => "value" }
|
606
|
+
)
|
607
|
+
|
608
|
+
expect(response.adapter_metadata).to eq("meta" => "value")
|
609
|
+
end
|
610
|
+
|
611
|
+
it 'returns a blank hash when nil is passed to #initialize' do
|
612
|
+
response = Response.new(
|
613
|
+
ResponseStatus.new(200, "OK"),
|
614
|
+
{}, "the body", "1.1", nil
|
615
|
+
)
|
616
|
+
|
617
|
+
expect(response.adapter_metadata).to eq({})
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
552
621
|
describe '#update_content_length_header' do
|
553
622
|
%w[ content-length Content-Length ].each do |header|
|
554
623
|
context "for the #{header} header" do
|
@@ -625,24 +694,22 @@ module VCR
|
|
625
694
|
end
|
626
695
|
|
627
696
|
it "unzips gzipped response" do
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
expect
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
to([content.bytesize.to_s])
|
645
|
-
end
|
697
|
+
io = StringIO.new
|
698
|
+
|
699
|
+
writer = Zlib::GzipWriter.new(io)
|
700
|
+
writer << content
|
701
|
+
writer.close
|
702
|
+
|
703
|
+
gzipped = io.string
|
704
|
+
resp = instance(gzipped, 'gzip')
|
705
|
+
expect(resp).to be_compressed
|
706
|
+
expect {
|
707
|
+
expect(resp.decompress).to equal(resp)
|
708
|
+
expect(resp).not_to be_compressed
|
709
|
+
expect(resp.body).to eq(content)
|
710
|
+
}.to change { resp.headers['content-length'] }.
|
711
|
+
from([gzipped.bytesize.to_s]).
|
712
|
+
to([content.bytesize.to_s])
|
646
713
|
end
|
647
714
|
|
648
715
|
it "inflates deflated response" do
|