vcr 3.0.0 → 3.0.1
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.
- checksums.yaml +4 -4
- data/features/configuration/hook_into.feature +1 -1
- data/features/step_definitions/cli_steps.rb +3 -3
- data/features/support/env.rb +3 -1
- data/features/support/http_lib_filters.rb +5 -5
- data/lib/vcr.rb +19 -8
- data/lib/vcr/cassette.rb +5 -0
- data/lib/vcr/cassette/persisters/file_system.rb +2 -3
- data/lib/vcr/errors.rb +65 -16
- data/lib/vcr/library_hooks/fakeweb.rb +1 -1
- data/lib/vcr/linked_cassette.rb +72 -0
- data/lib/vcr/test_frameworks/rspec.rb +6 -1
- data/lib/vcr/version.rb +1 -1
- data/spec/lib/vcr/cassette/persisters/file_system_spec.rb +10 -4
- data/spec/lib/vcr/cassette_spec.rb +1 -1
- data/spec/lib/vcr/errors_spec.rb +22 -6
- data/spec/lib/vcr/library_hooks/fakeweb_spec.rb +1 -1
- data/spec/lib/vcr/library_hooks/typhoeus_spec.rb +1 -1
- data/spec/lib/vcr/test_frameworks/rspec_spec.rb +11 -0
- data/spec/lib/vcr_spec.rb +5 -0
- data/spec/monkey_patches.rb +10 -6
- data/spec/support/vcr_localhost_server.rb +1 -1
- metadata +4 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c6e5ef325a46f12137b6d559a35e1664c684a7f
|
4
|
+
data.tar.gz: c2bcdd8e42555694ec5cf081eccb74bb01ebd89f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 687d5591fedaf5c58051814b07f7b5eb9e2a42d6179ddb946d9124ebbf07d58c2edf4bb90a16b80553e36ab93f91036fb25e51f2324bcb49ec1fd90795e7edba
|
7
|
+
data.tar.gz: 85865a69856a58f4ad35f2fad7d8231071ad2e8c4bfc34b5d308a7bb90fdd31bec403e58a1df8bf7d77076eadec0351aa25593ab7b29aabdbfb602a56b3759df
|
@@ -85,7 +85,7 @@ Feature: hook_into
|
|
85
85
|
| c.hook_into :faraday | faraday (w/ net_http) |
|
86
86
|
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
87
87
|
|
88
|
-
@exclude-jruby @exclude-18
|
88
|
+
@exclude-jruby @exclude-rbx @exclude-18
|
89
89
|
Scenario Outline: Use Typhoeus, Excon and Faraday in combination with FakeWeb or WebMock
|
90
90
|
Given a file named "hook_into_multiple.rb" with:
|
91
91
|
"""ruby
|
@@ -143,7 +143,7 @@ end
|
|
143
143
|
|
144
144
|
Then(/^the file "([^"]*)" should contain YAML like:$/) do |file_name, expected_content|
|
145
145
|
actual_content = in_current_dir { File.read(file_name) }
|
146
|
-
expect(normalize_cassette_hash(YAML.load(actual_content))).to eq(normalize_cassette_hash(YAML.load(expected_content)))
|
146
|
+
expect(normalize_cassette_hash(YAML.load(actual_content))).to eq(normalize_cassette_hash(YAML.load(expected_content.to_s)))
|
147
147
|
end
|
148
148
|
|
149
149
|
Then(/^the file "([^"]*)" should contain JSON like:$/) do |file_name, expected_content|
|
@@ -155,8 +155,8 @@ end
|
|
155
155
|
|
156
156
|
Then(/^the file "([^"]*)" should contain compressed YAML like:$/) do |file_name, expected_content|
|
157
157
|
actual_content = in_current_dir { File.read(file_name) }
|
158
|
-
unzipped_content = Zlib.inflate(actual_content)
|
159
|
-
expect(normalize_cassette_hash(YAML.load(unzipped_content))).to eq(normalize_cassette_hash(YAML.load(expected_content)))
|
158
|
+
unzipped_content = Zlib::Inflate.inflate(actual_content)
|
159
|
+
expect(normalize_cassette_hash(YAML.load(unzipped_content))).to eq(normalize_cassette_hash(YAML.load(expected_content.to_s)))
|
160
160
|
end
|
161
161
|
|
162
162
|
Then(/^the file "([^"]*)" should contain ruby like:$/) do |file_name, expected_content|
|
data/features/support/env.rb
CHANGED
@@ -20,7 +20,7 @@ rubyopt = "-rsupport/cucumber_helpers"
|
|
20
20
|
|
21
21
|
if RUBY_VERSION > '1.9'
|
22
22
|
load_paths.unshift(".")
|
23
|
-
rubyopt = "--disable-gems #{rubyopt}"
|
23
|
+
rubyopt = "--disable-gems #{rubyopt}" unless "rbx" == ruby_engine
|
24
24
|
end
|
25
25
|
|
26
26
|
Before do
|
@@ -35,6 +35,8 @@ end
|
|
35
35
|
Before("~@with-bundler") do
|
36
36
|
set_env("RUBYLIB", load_paths.join(":"))
|
37
37
|
set_env("RUBYOPT", rubyopt)
|
38
|
+
set_env("RBXOPT", "--disable-gems #{ENV["RBXOPT"]}") if "rbx" == ruby_engine
|
39
|
+
set_env("GEM_HOME", nil)
|
38
40
|
end
|
39
41
|
|
40
42
|
Before("@with-bundler") do
|
@@ -11,9 +11,9 @@ elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
|
11
11
|
|
12
12
|
# I'm getting errors in the curb C extension in rbx.
|
13
13
|
|
14
|
-
#
|
14
|
+
# Typhoeus should be buildable on rbx, but the travis build times out,
|
15
15
|
# so we skip them to speed up the build on travis.
|
16
|
-
UNSUPPORTED_HTTP_LIBS = %w[ patron em-http-request curb
|
16
|
+
UNSUPPORTED_HTTP_LIBS = %w[ patron em-http-request curb typhoeus ]
|
17
17
|
elsif RUBY_PLATFORM == 'java'
|
18
18
|
# These gems have C extensions and can't install on JRuby.
|
19
19
|
c_dependent_libs = %w[ typhoeus patron curb em-http-request ]
|
@@ -28,9 +28,9 @@ if defined?(UNSUPPORTED_HTTP_LIBS)
|
|
28
28
|
UNSUPPORTED_HTTP_LIB_REGEX = Regexp.union(*UNSUPPORTED_HTTP_LIBS)
|
29
29
|
|
30
30
|
# Filter out example rows that use libraries that are not supported on the current ruby interpreter
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
Before do |scenario|
|
32
|
+
if scenario.respond_to?(:cell_values) && scenario.cell_values.any? { |v| v =~ UNSUPPORTED_HTTP_LIB_REGEX }
|
33
|
+
scenario.skip_invoke!
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
data/lib/vcr.rb
CHANGED
@@ -4,6 +4,7 @@ require 'vcr/util/variable_args_block_caller'
|
|
4
4
|
require 'vcr/cassette'
|
5
5
|
require 'vcr/cassette/serializers'
|
6
6
|
require 'vcr/cassette/persisters'
|
7
|
+
require 'vcr/linked_cassette'
|
7
8
|
require 'vcr/configuration'
|
8
9
|
require 'vcr/deprecations'
|
9
10
|
require 'vcr/errors'
|
@@ -130,7 +131,7 @@ module VCR
|
|
130
131
|
end
|
131
132
|
|
132
133
|
cassette = Cassette.new(name, options)
|
133
|
-
|
134
|
+
context_cassettes.push(cassette)
|
134
135
|
cassette
|
135
136
|
elsif !ignore_cassettes?
|
136
137
|
message = "VCR is turned off. You must turn it on before you can insert a cassette. " +
|
@@ -155,7 +156,7 @@ module VCR
|
|
155
156
|
cassette.eject(options) if cassette
|
156
157
|
cassette
|
157
158
|
ensure
|
158
|
-
|
159
|
+
context_cassettes.delete(cassette)
|
159
160
|
end
|
160
161
|
|
161
162
|
# Inserts a cassette using the given name and options, runs the given
|
@@ -262,7 +263,7 @@ module VCR
|
|
262
263
|
"You must eject it before you can turn VCR off."
|
263
264
|
end
|
264
265
|
|
265
|
-
set_context_value(:ignore_cassettes, options
|
266
|
+
set_context_value(:ignore_cassettes, options.fetch(:ignore_cassettes, false))
|
266
267
|
invalid_options = options.keys - [:ignore_cassettes]
|
267
268
|
if invalid_options.any?
|
268
269
|
raise ArgumentError.new("You passed some invalid options: #{invalid_options.inspect}")
|
@@ -307,6 +308,14 @@ module VCR
|
|
307
308
|
@request_matchers
|
308
309
|
end
|
309
310
|
|
311
|
+
# @return [Enumerable] list of all cassettes currently being used
|
312
|
+
def cassettes(context = current_context)
|
313
|
+
linked_context = context[:linked_context]
|
314
|
+
linked_cassettes = cassettes(linked_context) if linked_context
|
315
|
+
|
316
|
+
LinkedCassette.list(context[:cassettes], Array(linked_cassettes))
|
317
|
+
end
|
318
|
+
|
310
319
|
# @private
|
311
320
|
def request_ignorer
|
312
321
|
@request_ignorer
|
@@ -376,8 +385,9 @@ private
|
|
376
385
|
def dup_context(context)
|
377
386
|
{
|
378
387
|
:turned_off => context[:turned_off],
|
379
|
-
:ignore_cassettes => context[:ignore_cassettes]
|
380
|
-
:cassettes =>
|
388
|
+
:ignore_cassettes => context[:ignore_cassettes],
|
389
|
+
:cassettes => [],
|
390
|
+
:linked_context => context
|
381
391
|
}
|
382
392
|
end
|
383
393
|
|
@@ -385,7 +395,7 @@ private
|
|
385
395
|
context_value(:ignore_cassettes)
|
386
396
|
end
|
387
397
|
|
388
|
-
def
|
398
|
+
def context_cassettes
|
389
399
|
context_value(:cassettes)
|
390
400
|
end
|
391
401
|
|
@@ -403,8 +413,9 @@ private
|
|
403
413
|
@context = {
|
404
414
|
MainThread => {
|
405
415
|
:turned_off => false,
|
406
|
-
:ignore_cassettes =>
|
407
|
-
:cassettes => []
|
416
|
+
:ignore_cassettes => false,
|
417
|
+
:cassettes => [],
|
418
|
+
:linked_context => nil
|
408
419
|
}
|
409
420
|
}
|
410
421
|
@configuration = Configuration.new
|
data/lib/vcr/cassette.rb
CHANGED
@@ -134,6 +134,11 @@ module VCR
|
|
134
134
|
@originally_recorded_at ||= previously_recorded_interactions.map(&:recorded_at).min
|
135
135
|
end
|
136
136
|
|
137
|
+
# @return [Boolean] false unless wrapped with LinkedCassette
|
138
|
+
def linked?
|
139
|
+
false
|
140
|
+
end
|
141
|
+
|
137
142
|
private
|
138
143
|
|
139
144
|
def assert_valid_options!
|
@@ -23,7 +23,7 @@ module VCR
|
|
23
23
|
def [](file_name)
|
24
24
|
path = absolute_path_to_file(file_name)
|
25
25
|
return nil unless File.exist?(path)
|
26
|
-
File.
|
26
|
+
File.binread(path)
|
27
27
|
end
|
28
28
|
|
29
29
|
# Sets the cassette for the given storage key (file name).
|
@@ -34,7 +34,7 @@ module VCR
|
|
34
34
|
path = absolute_path_to_file(file_name)
|
35
35
|
directory = File.dirname(path)
|
36
36
|
FileUtils.mkdir_p(directory) unless File.exist?(directory)
|
37
|
-
File.
|
37
|
+
File.binwrite(path, content)
|
38
38
|
end
|
39
39
|
|
40
40
|
# @private
|
@@ -44,7 +44,6 @@ module VCR
|
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
47
|
-
|
48
47
|
def absolute_path_for(path)
|
49
48
|
Dir.chdir(path) { Dir.pwd }
|
50
49
|
end
|
data/lib/vcr/errors.rb
CHANGED
@@ -51,6 +51,10 @@ module VCR
|
|
51
51
|
# @see VCR::HTTPInteractionList#assert_no_unused_interactions!
|
52
52
|
class UnusedHTTPInteractionError < Error; end
|
53
53
|
|
54
|
+
# Error raised when you attempt to eject a cassette inserted by another
|
55
|
+
# thread.
|
56
|
+
class EjectLinkedCassetteError < Error; end
|
57
|
+
|
54
58
|
# Error raised when an HTTP request is made that VCR is unable to handle.
|
55
59
|
# @note VCR will raise this to force you to do something about the
|
56
60
|
# HTTP request. The idea is that you want to handle _every_ HTTP
|
@@ -78,11 +82,26 @@ module VCR
|
|
78
82
|
["", "", "=" * 80,
|
79
83
|
"An HTTP request has been made that VCR does not know how to handle:",
|
80
84
|
"#{request_description}\n",
|
81
|
-
|
85
|
+
cassettes_description,
|
82
86
|
formatted_suggestions,
|
83
87
|
"=" * 80, "", ""].join("\n")
|
84
88
|
end
|
85
89
|
|
90
|
+
def current_cassettes
|
91
|
+
@cassettes ||= begin
|
92
|
+
cassettes = VCR.cassettes.to_a.reverse
|
93
|
+
|
94
|
+
begin
|
95
|
+
loop do
|
96
|
+
break unless VCR.eject_cassette
|
97
|
+
end
|
98
|
+
rescue EjectLinkedCassetteError
|
99
|
+
end
|
100
|
+
|
101
|
+
cassettes
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
86
105
|
def request_description
|
87
106
|
lines = []
|
88
107
|
|
@@ -100,19 +119,18 @@ module VCR
|
|
100
119
|
end
|
101
120
|
|
102
121
|
def current_matchers
|
103
|
-
if
|
104
|
-
|
122
|
+
if current_cassettes.size > 0
|
123
|
+
current_cassettes.inject([]) do |memo, cassette|
|
124
|
+
memo | cassette.match_requests_on
|
125
|
+
end
|
105
126
|
else
|
106
127
|
VCR.configuration.default_cassette_options[:match_requests_on]
|
107
128
|
end
|
108
129
|
end
|
109
130
|
|
110
|
-
def
|
111
|
-
if
|
112
|
-
[
|
113
|
-
" - #{cassette.file}",
|
114
|
-
" - :record => #{cassette.record_mode.inspect}",
|
115
|
-
" - :match_requests_on => #{cassette.match_requests_on.inspect}\n",
|
131
|
+
def cassettes_description
|
132
|
+
if current_cassettes.size > 0
|
133
|
+
[cassettes_list << "\n",
|
116
134
|
"Under the current configuration VCR can not find a suitable HTTP interaction",
|
117
135
|
"to replay and is prevented from recording new requests. There are a few ways",
|
118
136
|
"you can deal with this:\n"].join("\n")
|
@@ -122,6 +140,26 @@ module VCR
|
|
122
140
|
end
|
123
141
|
end
|
124
142
|
|
143
|
+
def cassettes_list
|
144
|
+
lines = []
|
145
|
+
|
146
|
+
lines << if current_cassettes.size == 1
|
147
|
+
"VCR is currently using the following cassette:"
|
148
|
+
else
|
149
|
+
"VCR are currently using the following cassettes:"
|
150
|
+
end
|
151
|
+
|
152
|
+
lines = current_cassettes.inject(lines) do |memo, cassette|
|
153
|
+
memo.concat([
|
154
|
+
" - #{cassette.file}",
|
155
|
+
" - :record => #{cassette.record_mode.inspect}",
|
156
|
+
" - :match_requests_on => #{cassette.match_requests_on.inspect}"
|
157
|
+
])
|
158
|
+
end
|
159
|
+
|
160
|
+
lines.join("\n")
|
161
|
+
end
|
162
|
+
|
125
163
|
def formatted_suggestions
|
126
164
|
formatted_points, formatted_foot_notes = [], []
|
127
165
|
|
@@ -221,11 +259,11 @@ module VCR
|
|
221
259
|
end
|
222
260
|
|
223
261
|
def suggestions
|
224
|
-
return no_cassette_suggestions
|
262
|
+
return no_cassette_suggestions if current_cassettes.size == 0
|
225
263
|
|
226
264
|
[:try_debug_logger, :use_new_episodes, :ignore_request].tap do |suggestions|
|
227
265
|
suggestions.push(*record_mode_suggestion)
|
228
|
-
suggestions << :allow_playback_repeats if
|
266
|
+
suggestions << :allow_playback_repeats if has_used_interaction_matching?
|
229
267
|
suggestions.map! { |k| suggestion_for(k) }
|
230
268
|
suggestions.push(*match_requests_on_suggestion)
|
231
269
|
end
|
@@ -238,15 +276,26 @@ module VCR
|
|
238
276
|
end
|
239
277
|
|
240
278
|
def record_mode_suggestion
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
279
|
+
record_modes = current_cassettes.map(&:record_mode)
|
280
|
+
|
281
|
+
if record_modes.all?{|r| r == :none }
|
282
|
+
[:deal_with_none]
|
283
|
+
elsif record_modes.all?{|r| r == :once }
|
284
|
+
[:delete_cassette_for_once]
|
285
|
+
else
|
286
|
+
[]
|
245
287
|
end
|
246
288
|
end
|
247
289
|
|
290
|
+
def has_used_interaction_matching?
|
291
|
+
current_cassettes.any?{|c| c.http_interactions.has_used_interaction_matching?(request) }
|
292
|
+
end
|
293
|
+
|
248
294
|
def match_requests_on_suggestion
|
249
|
-
num_remaining_interactions =
|
295
|
+
num_remaining_interactions = current_cassettes.inject(0) { |sum, c|
|
296
|
+
sum + c.http_interactions.remaining_unused_interaction_count
|
297
|
+
}
|
298
|
+
|
250
299
|
return [] if num_remaining_interactions.zero?
|
251
300
|
|
252
301
|
interaction_description = if num_remaining_interactions == 1
|
@@ -192,6 +192,6 @@ VCR.configuration.after_library_hooks_loaded do
|
|
192
192
|
if defined?(WebMock)
|
193
193
|
raise ArgumentError.new("You have configured VCR to hook into both :fakeweb and :webmock. You cannot use both.")
|
194
194
|
end
|
195
|
-
::Kernel.warn "WARNING: VCR's FakeWeb integration is deprecated and will be removed in VCR
|
195
|
+
::Kernel.warn "WARNING: VCR's FakeWeb integration is deprecated and will be removed in VCR 4.0."
|
196
196
|
end
|
197
197
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'vcr/errors'
|
3
|
+
|
4
|
+
module VCR
|
5
|
+
# A Cassette wrapper for linking cassettes from another thread
|
6
|
+
class LinkedCassette < SimpleDelegator
|
7
|
+
# An enumerable lazily wrapping a list of cassettes that a context is using
|
8
|
+
class CassetteList
|
9
|
+
include Enumerable
|
10
|
+
|
11
|
+
# Creates a new list of context-owned cassettes and linked cassettes
|
12
|
+
# @param [Array] context-owned cassettes
|
13
|
+
# @param [Array] context-unowned (linked) cassettes
|
14
|
+
def initialize(cassettes, linked_cassettes)
|
15
|
+
@cassettes = cassettes
|
16
|
+
@linked_cassettes = linked_cassettes
|
17
|
+
end
|
18
|
+
|
19
|
+
# Yields linked cassettes first, and then context-owned cassettes
|
20
|
+
def each
|
21
|
+
@linked_cassettes.each do |cassette|
|
22
|
+
yield wrap(cassette)
|
23
|
+
end
|
24
|
+
|
25
|
+
@cassettes.each do |cassette|
|
26
|
+
yield cassette
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Provide last implementation, which is not provided by Enumerable
|
31
|
+
def last
|
32
|
+
cassette = @cassettes.last
|
33
|
+
return cassette if cassette
|
34
|
+
|
35
|
+
cassette = @linked_cassettes.last
|
36
|
+
wrap(cassette) if cassette
|
37
|
+
end
|
38
|
+
|
39
|
+
# Provide size implementation, which is not provided by Enumerable
|
40
|
+
def size
|
41
|
+
@cassettes.size + @linked_cassettes.size
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
def wrap(cassette)
|
46
|
+
if cassette.linked?
|
47
|
+
cassette
|
48
|
+
else
|
49
|
+
LinkedCassette.new(cassette)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create a new CassetteList
|
55
|
+
# @param [Array] context-owned cassettes
|
56
|
+
# @param [Array] context-unowned (linked) cassettes
|
57
|
+
def self.list(cassettes, linked_cassettes)
|
58
|
+
CassetteList.new(cassettes, linked_cassettes)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Prevents cassette ejection by raising EjectLinkedCassetteError
|
62
|
+
def eject(*args)
|
63
|
+
raise Errors::EjectLinkedCassetteError,
|
64
|
+
"cannot eject a cassette inserted by a parent thread"
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [Boolean] true
|
68
|
+
def linked?
|
69
|
+
true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -8,7 +8,12 @@ module VCR
|
|
8
8
|
def configure!
|
9
9
|
::RSpec.configure do |config|
|
10
10
|
vcr_cassette_name_for = lambda do |metadata|
|
11
|
-
description = metadata[:description]
|
11
|
+
description = if metadata[:description].empty?
|
12
|
+
# we have an "it { is_expected.to be something }" block
|
13
|
+
metadata[:scoped_id]
|
14
|
+
else
|
15
|
+
metadata[:description]
|
16
|
+
end
|
12
17
|
example_group = if metadata.key?(:example_group)
|
13
18
|
metadata[:example_group]
|
14
19
|
else
|
data/lib/vcr/version.rb
CHANGED
@@ -25,10 +25,16 @@ module VCR
|
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "#[]=" do
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
context 'with a simple file_name and binary content' do
|
29
|
+
let(:file_name) { 'foo.txt' }
|
30
|
+
let(:content) { SecureRandom.random_bytes(20) }
|
31
|
+
let(:location) { FileSystem.storage_location + '/' + file_name }
|
32
|
+
|
33
|
+
it 'writes the given file contents to the given file name' do
|
34
|
+
expect(File.exist?(location)).to be false
|
35
|
+
FileSystem[file_name] = content
|
36
|
+
expect(File.binread(location)).to eq(content)
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
40
|
it 'creates any needed intermediary directories' do
|
@@ -273,7 +273,7 @@ describe VCR::Cassette do
|
|
273
273
|
|
274
274
|
allow(::File).to receive(:exist?).with(file_name).and_return(true)
|
275
275
|
allow(::File).to receive(:size?).with(file_name).and_return(true)
|
276
|
-
allow(::File).to receive(:
|
276
|
+
allow(::File).to receive(:binread).with(file_name).and_return(yaml)
|
277
277
|
end
|
278
278
|
|
279
279
|
context 'and the earliest recorded interaction was recorded less than 7 days ago' do
|
data/spec/lib/vcr/errors_spec.rb
CHANGED
@@ -22,7 +22,7 @@ module VCR
|
|
22
22
|
)
|
23
23
|
end
|
24
24
|
|
25
|
-
context 'when there is no
|
25
|
+
context 'when there is no cassette' do
|
26
26
|
it 'identifies the request by its body when the default_cassette_options include the body in the match_requests_on option' do
|
27
27
|
VCR.configuration.default_cassette_options[:match_requests_on] = [:body]
|
28
28
|
|
@@ -31,7 +31,7 @@ module VCR
|
|
31
31
|
)
|
32
32
|
end
|
33
33
|
|
34
|
-
it 'mentions that there is no
|
34
|
+
it 'mentions that there is no cassette' do
|
35
35
|
expect(message).to include('There is currently no cassette in use.')
|
36
36
|
end
|
37
37
|
|
@@ -56,7 +56,7 @@ module VCR
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context 'when there
|
59
|
+
context 'when there are cassettes' do
|
60
60
|
it 'identifies the request by its body when the match_requests_on option includes the body' do
|
61
61
|
VCR.use_cassette('example', :match_requests_on => [:body]) do
|
62
62
|
expect(message_for(:body => 'param=val1')).to include(
|
@@ -72,12 +72,20 @@ module VCR
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
it 'mentions the details about the
|
75
|
+
it 'mentions the details about the single cassette when there is one cassette' do
|
76
76
|
VCR.use_cassette('example') do
|
77
77
|
expect(message).to match(/VCR is currently using the following cassette:.+example.yml/m)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
+
it 'mentions the details about all cassettes when there are a few cassettes' do
|
82
|
+
VCR.use_cassette('example') do
|
83
|
+
VCR.use_cassette('sample') do
|
84
|
+
expect(message).to match(/VCR are currently using the following cassettes:.+sample.yml.+example.yml/m)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
81
89
|
it 'mentions that :new_episodes can be used to record the request' do
|
82
90
|
VCR.use_cassette('example') do
|
83
91
|
expect(message).to include('use the :new_episodes record mode')
|
@@ -102,7 +110,15 @@ module VCR
|
|
102
110
|
end
|
103
111
|
end
|
104
112
|
|
105
|
-
it '
|
113
|
+
it 'does not mention the :once or :none record modes if using the :new_episodes record mode at least in one cassette' do
|
114
|
+
VCR.use_cassette('example', :record => :new_episodes) do
|
115
|
+
VCR.use_cassette('sample') do
|
116
|
+
expect(message).not_to include('current record mode (:once)', 'current record mode (:none)')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'mentions :allow_playback_repeats if the cassette has a used matching interaction' do
|
106
122
|
VCR.use_cassette('example') do |cassette|
|
107
123
|
expect(cassette.http_interactions).to respond_to(:has_used_interaction_matching?)
|
108
124
|
allow(cassette.http_interactions).to receive(:has_used_interaction_matching?).and_return(true)
|
@@ -110,7 +126,7 @@ module VCR
|
|
110
126
|
end
|
111
127
|
end
|
112
128
|
|
113
|
-
it 'does not mention :allow_playback_repeats if the
|
129
|
+
it 'does not mention :allow_playback_repeats if the cassette does not have a used matching interaction' do
|
114
130
|
VCR.use_cassette('example') do |cassette|
|
115
131
|
expect(cassette.http_interactions).to respond_to(:has_used_interaction_matching?)
|
116
132
|
allow(cassette.http_interactions).to receive(:has_used_interaction_matching?).and_return(false)
|
@@ -129,7 +129,7 @@ describe "FakeWeb hook", :with_monkey_patches => :fakeweb do
|
|
129
129
|
end
|
130
130
|
|
131
131
|
it "warns about FakeWeb deprecation" do
|
132
|
-
expect(::Kernel).to receive(:warn).with("WARNING: VCR's FakeWeb integration is deprecated and will be removed in VCR
|
132
|
+
expect(::Kernel).to receive(:warn).with("WARNING: VCR's FakeWeb integration is deprecated and will be removed in VCR 4.0.")
|
133
133
|
run_hook
|
134
134
|
end
|
135
135
|
end
|
@@ -17,6 +17,17 @@ describe VCR::RSpec::Metadata, :skip_vcr_reset do
|
|
17
17
|
])
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
21
|
+
context 'when the spec has no description' do
|
22
|
+
it do
|
23
|
+
expect(VCR.current_cassette.name.split('/')).to eq([
|
24
|
+
'VCR::RSpec::Metadata',
|
25
|
+
'an example group',
|
26
|
+
'when the spec has no description',
|
27
|
+
'1:1:2:1'
|
28
|
+
])
|
29
|
+
end
|
30
|
+
end
|
20
31
|
end
|
21
32
|
|
22
33
|
context 'with the cassette name overridden at the example group level', :vcr => { :cassette_name => 'foo' } do
|
data/spec/lib/vcr_spec.rb
CHANGED
@@ -291,6 +291,11 @@ describe VCR do
|
|
291
291
|
}.to raise_error(ArgumentError)
|
292
292
|
end
|
293
293
|
|
294
|
+
it 'sets ignore_cassettes to false' do
|
295
|
+
VCR.turn_off!
|
296
|
+
expect(VCR.send(:ignore_cassettes?)).to equal(false)
|
297
|
+
end
|
298
|
+
|
294
299
|
context 'when `:ignore_cassettes => true` is passed' do
|
295
300
|
before(:each) { VCR.turn_off!(:ignore_cassettes => true) }
|
296
301
|
|
data/spec/monkey_patches.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'typhoeus'
|
2
|
-
|
3
1
|
module MonkeyPatches
|
4
2
|
extend self
|
5
3
|
|
@@ -134,10 +132,16 @@ end
|
|
134
132
|
# for WebMock to work with them.
|
135
133
|
require 'httpclient'
|
136
134
|
|
137
|
-
|
138
|
-
require '
|
139
|
-
|
140
|
-
|
135
|
+
if RUBY_INTERPRETER == :mri
|
136
|
+
require 'typhoeus'
|
137
|
+
begin
|
138
|
+
require 'patron'
|
139
|
+
require 'em-http-request'
|
140
|
+
require 'curb'
|
141
|
+
rescue LoadError
|
142
|
+
# these are not always available, depending on the Gemfile used
|
143
|
+
warn $!.message
|
144
|
+
end
|
141
145
|
end
|
142
146
|
|
143
147
|
if defined?(::Typhoeus.before)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Myron Marston
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -276,76 +276,6 @@ dependencies:
|
|
276
276
|
- - ">="
|
277
277
|
- !ruby/object:Gem::Version
|
278
278
|
version: '0'
|
279
|
-
- !ruby/object:Gem::Dependency
|
280
|
-
name: typhoeus
|
281
|
-
requirement: !ruby/object:Gem::Requirement
|
282
|
-
requirements:
|
283
|
-
- - ">="
|
284
|
-
- !ruby/object:Gem::Version
|
285
|
-
version: '0'
|
286
|
-
type: :development
|
287
|
-
prerelease: false
|
288
|
-
version_requirements: !ruby/object:Gem::Requirement
|
289
|
-
requirements:
|
290
|
-
- - ">="
|
291
|
-
- !ruby/object:Gem::Version
|
292
|
-
version: '0'
|
293
|
-
- !ruby/object:Gem::Dependency
|
294
|
-
name: patron
|
295
|
-
requirement: !ruby/object:Gem::Requirement
|
296
|
-
requirements:
|
297
|
-
- - ">="
|
298
|
-
- !ruby/object:Gem::Version
|
299
|
-
version: '0'
|
300
|
-
type: :development
|
301
|
-
prerelease: false
|
302
|
-
version_requirements: !ruby/object:Gem::Requirement
|
303
|
-
requirements:
|
304
|
-
- - ">="
|
305
|
-
- !ruby/object:Gem::Version
|
306
|
-
version: '0'
|
307
|
-
- !ruby/object:Gem::Dependency
|
308
|
-
name: em-http-request
|
309
|
-
requirement: !ruby/object:Gem::Requirement
|
310
|
-
requirements:
|
311
|
-
- - ">="
|
312
|
-
- !ruby/object:Gem::Version
|
313
|
-
version: '0'
|
314
|
-
type: :development
|
315
|
-
prerelease: false
|
316
|
-
version_requirements: !ruby/object:Gem::Requirement
|
317
|
-
requirements:
|
318
|
-
- - ">="
|
319
|
-
- !ruby/object:Gem::Version
|
320
|
-
version: '0'
|
321
|
-
- !ruby/object:Gem::Dependency
|
322
|
-
name: curb
|
323
|
-
requirement: !ruby/object:Gem::Requirement
|
324
|
-
requirements:
|
325
|
-
- - ">="
|
326
|
-
- !ruby/object:Gem::Version
|
327
|
-
version: '0'
|
328
|
-
type: :development
|
329
|
-
prerelease: false
|
330
|
-
version_requirements: !ruby/object:Gem::Requirement
|
331
|
-
requirements:
|
332
|
-
- - ">="
|
333
|
-
- !ruby/object:Gem::Version
|
334
|
-
version: '0'
|
335
|
-
- !ruby/object:Gem::Dependency
|
336
|
-
name: yajl-ruby
|
337
|
-
requirement: !ruby/object:Gem::Requirement
|
338
|
-
requirements:
|
339
|
-
- - ">="
|
340
|
-
- !ruby/object:Gem::Version
|
341
|
-
version: '0'
|
342
|
-
type: :development
|
343
|
-
prerelease: false
|
344
|
-
version_requirements: !ruby/object:Gem::Requirement
|
345
|
-
requirements:
|
346
|
-
- - ">="
|
347
|
-
- !ruby/object:Gem::Version
|
348
|
-
version: '0'
|
349
279
|
- !ruby/object:Gem::Dependency
|
350
280
|
name: relish
|
351
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -475,6 +405,7 @@ files:
|
|
475
405
|
- lib/vcr/library_hooks/typhoeus.rb
|
476
406
|
- lib/vcr/library_hooks/typhoeus_0.4.rb
|
477
407
|
- lib/vcr/library_hooks/webmock.rb
|
408
|
+
- lib/vcr/linked_cassette.rb
|
478
409
|
- lib/vcr/middleware/excon.rb
|
479
410
|
- lib/vcr/middleware/excon/legacy_methods.rb
|
480
411
|
- lib/vcr/middleware/faraday.rb
|
@@ -564,7 +495,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
564
495
|
version: '0'
|
565
496
|
requirements: []
|
566
497
|
rubyforge_project:
|
567
|
-
rubygems_version: 2.4.
|
498
|
+
rubygems_version: 2.4.3
|
568
499
|
signing_key:
|
569
500
|
specification_version: 4
|
570
501
|
summary: Record your test suite's HTTP interactions and replay them during future
|