vcr 2.4.0 → 2.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.
- checksums.yaml +15 -0
- data/.gitignore +3 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +31 -0
- data/Gemfile +1 -2
- data/Gemfile.lock +63 -46
- data/README.md +5 -2
- data/features/cassettes/allow_unused_http_interactions.feature +1 -1
- data/features/cassettes/automatic_re_recording.feature +1 -1
- data/features/cassettes/decompress.feature +3 -3
- data/features/cassettes/dynamic_erb.feature +2 -2
- data/features/cassettes/exclusive.feature +1 -1
- data/features/cassettes/naming.feature +1 -1
- data/features/cassettes/no_cassette.feature +6 -3
- data/features/cassettes/persistence.feature +1 -1
- data/features/cassettes/update_content_length_header.feature +1 -1
- data/features/configuration/allow_http_connections_when_no_cassette.feature +1 -1
- data/features/configuration/cassette_library_dir.feature +1 -1
- data/features/configuration/debug_logging.feature +5 -5
- data/features/configuration/filter_sensitive_data.feature +2 -2
- data/features/configuration/hook_into.feature +4 -7
- data/features/getting_started.md +2 -2
- data/features/hooks/before_playback.feature +5 -5
- data/features/hooks/before_record.feature +5 -5
- data/features/middleware/rack.feature +2 -2
- data/features/record_modes/all.feature +1 -1
- data/features/record_modes/new_episodes.feature +1 -1
- data/features/record_modes/none.feature +1 -1
- data/features/record_modes/once.feature +1 -1
- data/features/request_matching/custom_matcher.feature +1 -1
- data/features/request_matching/headers.feature +0 -2
- data/features/request_matching/playback_repeats.feature +1 -1
- data/features/request_matching/uri_without_param.feature +1 -1
- data/features/support/env.rb +1 -0
- data/features/test_frameworks/cucumber.feature +8 -8
- data/features/test_frameworks/rspec_macro.feature +2 -2
- data/features/test_frameworks/rspec_metadata.feature +1 -1
- data/gemfiles/typhoeus_old.gemfile +1 -1
- data/gemfiles/typhoeus_old.gemfile.lock +31 -57
- data/lib/vcr/cassette/migrator.rb +8 -1
- data/lib/vcr/configuration.rb +9 -2
- data/lib/vcr/library_hooks/excon.rb +2 -184
- data/lib/vcr/library_hooks/typhoeus.rb +1 -1
- data/lib/vcr/library_hooks/typhoeus_0.4.rb +4 -0
- data/lib/vcr/library_hooks/webmock.rb +1 -1
- data/lib/vcr/middleware/excon.rb +226 -0
- data/lib/vcr/version.rb +1 -1
- data/spec/acceptance/threading_spec.rb +28 -0
- data/spec/monkey_patches.rb +3 -7
- data/spec/quality_spec.rb +1 -1
- data/spec/spec_helper.rb +7 -4
- data/spec/support/http_library_adapters.rb +4 -3
- data/spec/support/shared_example_groups/excon.rb +22 -0
- data/spec/support/shared_example_groups/hook_into_http_library.rb +46 -46
- data/spec/support/shared_example_groups/request_hooks.rb +8 -8
- data/spec/vcr/cassette/erb_renderer_spec.rb +5 -5
- data/spec/vcr/cassette/http_interaction_list_spec.rb +52 -40
- data/spec/vcr/cassette/migrator_spec.rb +11 -11
- data/spec/vcr/cassette/persisters/file_system_spec.rb +11 -11
- data/spec/vcr/cassette/persisters_spec.rb +2 -2
- data/spec/vcr/cassette/serializers_spec.rb +13 -12
- data/spec/vcr/cassette_spec.rb +58 -58
- data/spec/vcr/configuration_spec.rb +43 -31
- data/spec/vcr/deprecations_spec.rb +3 -3
- data/spec/vcr/errors_spec.rb +25 -25
- data/spec/vcr/extensions/net_http_response_spec.rb +7 -7
- data/spec/vcr/library_hooks/excon_spec.rb +7 -85
- data/spec/vcr/library_hooks/fakeweb_spec.rb +15 -13
- data/spec/vcr/library_hooks/faraday_spec.rb +4 -4
- data/spec/vcr/library_hooks/typhoeus_0.4_spec.rb +5 -0
- data/spec/vcr/library_hooks/typhoeus_spec.rb +3 -3
- data/spec/vcr/library_hooks/webmock_spec.rb +13 -5
- data/spec/vcr/library_hooks_spec.rb +9 -9
- data/spec/vcr/middleware/faraday_spec.rb +10 -10
- data/spec/vcr/middleware/rack_spec.rb +20 -15
- data/spec/vcr/request_ignorer_spec.rb +3 -3
- data/spec/vcr/request_matcher_registry_spec.rb +88 -61
- data/spec/vcr/structs_spec.rb +85 -85
- data/spec/vcr/test_frameworks/cucumber_spec.rb +7 -7
- data/spec/vcr/test_frameworks/rspec_spec.rb +10 -10
- data/spec/vcr/util/hooks_spec.rb +20 -20
- data/spec/vcr/util/internet_connection_spec.rb +2 -2
- data/spec/vcr_spec.rb +50 -48
- data/vcr.gemspec +4 -4
- metadata +308 -372
@@ -6,8 +6,8 @@ shared_examples_for "request hooks" do |library_hook_name, request_type|
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def assert_expected_response(response)
|
9
|
-
response.status.code.
|
10
|
-
response.body.
|
9
|
+
expect(response.status.code).to eq(200)
|
10
|
+
expect(response.body).to eq('FOO!')
|
11
11
|
end
|
12
12
|
|
13
13
|
[:before_http_request, :after_http_request].each do |hook|
|
@@ -16,7 +16,7 @@ shared_examples_for "request hooks" do |library_hook_name, request_type|
|
|
16
16
|
VCR.configuration.send(hook) { |r| call_count += 1 }
|
17
17
|
|
18
18
|
make_request
|
19
|
-
call_count.
|
19
|
+
expect(call_count).to eq(1)
|
20
20
|
end
|
21
21
|
|
22
22
|
specify "the #{hook} hook yields the request" do
|
@@ -24,19 +24,19 @@ shared_examples_for "request hooks" do |library_hook_name, request_type|
|
|
24
24
|
VCR.configuration.send(hook) { |r| request = r }
|
25
25
|
|
26
26
|
make_request
|
27
|
-
request.method.
|
28
|
-
request.uri.
|
27
|
+
expect(request.method).to be(:get)
|
28
|
+
expect(request.uri).to eq(request_url)
|
29
29
|
end
|
30
30
|
|
31
31
|
specify "the #{hook} hook is not called if the library hook is disabled" do
|
32
|
-
VCR.library_hooks.
|
32
|
+
expect(VCR.library_hooks).to respond_to(:disabled?)
|
33
33
|
VCR.library_hooks.stub(:disabled? => true)
|
34
34
|
|
35
35
|
hook_called = false
|
36
36
|
VCR.configuration.send(hook) { |r| hook_called = true }
|
37
37
|
|
38
38
|
make_request(:disabled)
|
39
|
-
hook_called.
|
39
|
+
expect(hook_called).to be_false
|
40
40
|
end
|
41
41
|
|
42
42
|
specify "the #type of the yielded request given to the #{hook} hook is #{request_type}" do
|
@@ -44,7 +44,7 @@ shared_examples_for "request hooks" do |library_hook_name, request_type|
|
|
44
44
|
VCR.configuration.send(hook) { |r| request = r }
|
45
45
|
|
46
46
|
make_request
|
47
|
-
request.type.
|
47
|
+
expect(request.type).to be(request_type)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -11,14 +11,14 @@ describe VCR::Cassette::ERBRenderer do
|
|
11
11
|
|
12
12
|
context 'when ERB is disabled' do
|
13
13
|
it 'returns the given template' do
|
14
|
-
render(no_vars_content, false).
|
15
|
-
render(no_vars_content, nil).
|
14
|
+
expect(render(no_vars_content, false)).to eq(no_vars_content)
|
15
|
+
expect(render(no_vars_content, nil)).to eq(no_vars_content)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
context 'when ERB is enabled but no variables are passed' do
|
20
20
|
it 'renders the file content as ERB' do
|
21
|
-
render(no_vars_content, true).
|
21
|
+
expect(render(no_vars_content, true)).to eq("7. Some ERB")
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'raises an appropriate error when the ERB template needs variables' do
|
@@ -31,13 +31,13 @@ describe VCR::Cassette::ERBRenderer do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'gracefully handles the template being nil' do
|
34
|
-
render(nil, true).
|
34
|
+
expect(render(nil, true)).to be_nil
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
context 'when ERB is enabled and variables are passed' do
|
39
39
|
it 'renders the file content as ERB with the passed variables' do
|
40
|
-
render(vars_content, :var1 => 'foo', :var2 => 'bar').
|
40
|
+
expect(render(vars_content, :var1 => 'foo', :var2 => 'bar')).to eq('foo. ERB with Vars! bar')
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'raises an appropriate error when one or more of the needed variables are not passed' do
|
@@ -47,41 +47,41 @@ module VCR
|
|
47
47
|
|
48
48
|
describe "#has_used_interaction_matching?" do
|
49
49
|
it 'returns false when no interactions have been used' do
|
50
|
-
list.
|
50
|
+
expect(list).not_to have_used_interaction_matching(request_with(:method => :put))
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'returns true when there is a matching used interaction (even if there is also an unused one that matches)' do
|
54
54
|
list.response_for(request_with(:method => :post))
|
55
|
-
list.
|
55
|
+
expect(list).to have_used_interaction_matching(request_with(:method => :post))
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'returns false when none of the used interactions match' do
|
59
59
|
list.response_for(request_with(:method => :put))
|
60
|
-
list.
|
60
|
+
expect(list).not_to have_used_interaction_matching(request_with(:method => :post))
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
64
|
describe "#remaining_unused_interaction_count" do
|
65
65
|
it 'returns the number of unused interactions' do
|
66
|
-
list.remaining_unused_interaction_count.
|
66
|
+
expect(list.remaining_unused_interaction_count).to eq(3)
|
67
67
|
|
68
68
|
list.response_for(request_with(:method => :get))
|
69
|
-
list.remaining_unused_interaction_count.
|
69
|
+
expect(list.remaining_unused_interaction_count).to eq(3)
|
70
70
|
|
71
71
|
list.response_for(request_with(:method => :put))
|
72
|
-
list.remaining_unused_interaction_count.
|
72
|
+
expect(list.remaining_unused_interaction_count).to eq(2)
|
73
73
|
|
74
74
|
list.response_for(request_with(:method => :put))
|
75
|
-
list.remaining_unused_interaction_count.
|
75
|
+
expect(list.remaining_unused_interaction_count).to eq(2)
|
76
76
|
|
77
77
|
list.response_for(request_with(:method => :post))
|
78
|
-
list.remaining_unused_interaction_count.
|
78
|
+
expect(list.remaining_unused_interaction_count).to eq(1)
|
79
79
|
|
80
80
|
list.response_for(request_with(:method => :post))
|
81
|
-
list.remaining_unused_interaction_count.
|
81
|
+
expect(list.remaining_unused_interaction_count).to eq(0)
|
82
82
|
|
83
83
|
list.response_for(request_with(:method => :post))
|
84
|
-
list.remaining_unused_interaction_count.
|
84
|
+
expect(list.remaining_unused_interaction_count).to eq(0)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -102,22 +102,22 @@ module VCR
|
|
102
102
|
|
103
103
|
describe "has_interaction_matching?" do
|
104
104
|
it 'returns false when the list is empty' do
|
105
|
-
HTTPInteractionList.new([], [:method]).
|
105
|
+
expect(HTTPInteractionList.new([], [:method])).not_to have_interaction_matching(stub)
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'returns false when there is no matching interaction' do
|
109
|
-
list.
|
109
|
+
expect(list).not_to have_interaction_matching(request_with(:method => :get))
|
110
110
|
end
|
111
111
|
|
112
112
|
it 'returns true when there is a matching interaction' do
|
113
|
-
list.
|
113
|
+
expect(list).to have_interaction_matching(request_with(:method => :post))
|
114
114
|
end
|
115
115
|
|
116
116
|
it 'does not consume the interactions when they match' do
|
117
|
-
list.
|
118
|
-
list.remaining_unused_interaction_count.
|
119
|
-
list.
|
120
|
-
list.remaining_unused_interaction_count.
|
117
|
+
expect(list).to have_interaction_matching(request_with(:method => :post))
|
118
|
+
expect(list.remaining_unused_interaction_count).to eq(3)
|
119
|
+
expect(list).to have_interaction_matching(request_with(:method => :post))
|
120
|
+
expect(list.remaining_unused_interaction_count).to eq(3)
|
121
121
|
end
|
122
122
|
|
123
123
|
it 'invokes each matcher block to find the matching interaction' do
|
@@ -131,15 +131,15 @@ module VCR
|
|
131
131
|
interaction('response', :method => :put)
|
132
132
|
], [:foo, :bar, :baz])
|
133
133
|
|
134
|
-
list.
|
135
|
-
list.
|
134
|
+
expect(list).not_to have_interaction_matching(request_with(:method => :post))
|
135
|
+
expect(list).to have_interaction_matching(request_with(:method => :post))
|
136
136
|
end
|
137
137
|
|
138
138
|
it "delegates to the parent list when it can't find a matching interaction" do
|
139
139
|
parent_list = mock(:has_interaction_matching? => true)
|
140
|
-
HTTPInteractionList.new( [], [:method], false, parent_list).
|
140
|
+
expect(HTTPInteractionList.new( [], [:method], false, parent_list)).to have_interaction_matching(stub)
|
141
141
|
parent_list = mock(:has_interaction_matching? => false)
|
142
|
-
HTTPInteractionList.new( [], [:method], false, parent_list).
|
142
|
+
expect(HTTPInteractionList.new( [], [:method], false, parent_list)).not_to have_interaction_matching(stub)
|
143
143
|
end
|
144
144
|
|
145
145
|
context 'when allow_playback_repeats is set to true' do
|
@@ -148,9 +148,11 @@ module VCR
|
|
148
148
|
it 'considers used interactions' do
|
149
149
|
list.response_for(request_with(:method => :put))
|
150
150
|
|
151
|
-
10.times.map
|
151
|
+
results = 10.times.map do
|
152
152
|
list.has_interaction_matching?(request_with(:method => :put))
|
153
|
-
|
153
|
+
end
|
154
|
+
|
155
|
+
expect(results).to eq([true] * 10)
|
154
156
|
end
|
155
157
|
end
|
156
158
|
|
@@ -160,25 +162,29 @@ module VCR
|
|
160
162
|
it 'does not consider used interactions' do
|
161
163
|
list.response_for(request_with(:method => :put))
|
162
164
|
|
163
|
-
10.times.map
|
165
|
+
result = 10.times.map do
|
164
166
|
list.has_interaction_matching?(request_with(:method => :put))
|
165
|
-
|
167
|
+
end
|
168
|
+
|
169
|
+
expect(result).to eq([false] * 10)
|
166
170
|
end
|
167
171
|
end
|
168
172
|
end
|
169
173
|
|
170
174
|
describe "#response_for" do
|
171
175
|
it 'returns nil when the list is empty' do
|
172
|
-
HTTPInteractionList.new([], [:method]).response_for(stub).
|
176
|
+
expect(HTTPInteractionList.new([], [:method]).response_for(stub)).to respond_with(nil)
|
173
177
|
end
|
174
178
|
|
175
179
|
it 'returns nil when there is no matching interaction' do
|
176
|
-
HTTPInteractionList.new([
|
180
|
+
response = HTTPInteractionList.new([
|
177
181
|
interaction('foo', :method => :post),
|
178
182
|
interaction('foo', :method => :put)
|
179
183
|
], [:method]).response_for(
|
180
184
|
request_with(:method => :get)
|
181
|
-
)
|
185
|
+
)
|
186
|
+
|
187
|
+
expect(response).to respond_with(nil)
|
182
188
|
end
|
183
189
|
|
184
190
|
it 'returns the first matching interaction' do
|
@@ -188,7 +194,7 @@ module VCR
|
|
188
194
|
interaction('post response 2', :method => :post)
|
189
195
|
], [:method])
|
190
196
|
|
191
|
-
list.response_for(request_with(:method => :post)).
|
197
|
+
expect(list.response_for(request_with(:method => :post))).to respond_with("post response 1")
|
192
198
|
end
|
193
199
|
|
194
200
|
it 'invokes each matcher block to find the matching interaction' do
|
@@ -202,20 +208,22 @@ module VCR
|
|
202
208
|
interaction('response', :method => :put)
|
203
209
|
], [:foo, :bar, :baz])
|
204
210
|
|
205
|
-
list.response_for(request_with(:method => :post)).
|
206
|
-
list.response_for(request_with(:method => :post)).
|
211
|
+
expect(list.response_for(request_with(:method => :post))).to respond_with(nil)
|
212
|
+
expect(list.response_for(request_with(:method => :post))).to respond_with('response')
|
207
213
|
end
|
208
214
|
|
209
215
|
it "delegates to the parent list when it can't find a matching interaction" do
|
210
216
|
parent_list = mock(:response_for => response('parent'))
|
211
|
-
HTTPInteractionList.new(
|
217
|
+
result = HTTPInteractionList.new(
|
212
218
|
[], [:method], false, parent_list
|
213
|
-
).response_for(stub)
|
219
|
+
).response_for(stub)
|
220
|
+
|
221
|
+
expect(result).to respond_with('parent')
|
214
222
|
end
|
215
223
|
|
216
224
|
it 'consumes the first matching interaction so that it will not be used again' do
|
217
|
-
list.response_for(request_with(:method => :post)).body.
|
218
|
-
list.response_for(request_with(:method => :post)).body.
|
225
|
+
expect(list.response_for(request_with(:method => :post)).body).to eq("post response 1")
|
226
|
+
expect(list.response_for(request_with(:method => :post)).body).to eq("post response 2")
|
219
227
|
end
|
220
228
|
|
221
229
|
context 'when allow_playback_repeats is set to true' do
|
@@ -224,10 +232,12 @@ module VCR
|
|
224
232
|
it 'continues to return the response from the last matching interaction when there are no more' do
|
225
233
|
list.response_for(request_with(:method => :post))
|
226
234
|
|
227
|
-
10.times.map
|
235
|
+
results = 10.times.map do
|
228
236
|
response = list.response_for(request_with(:method => :post))
|
229
237
|
response ? response.body : nil
|
230
|
-
|
238
|
+
end
|
239
|
+
|
240
|
+
expect(results).to eq(["post response 2"] * 10)
|
231
241
|
end
|
232
242
|
end
|
233
243
|
|
@@ -238,16 +248,18 @@ module VCR
|
|
238
248
|
list.response_for(request_with(:method => :post))
|
239
249
|
list.response_for(request_with(:method => :post))
|
240
250
|
|
241
|
-
10.times.map
|
251
|
+
results = 10.times.map do
|
242
252
|
list.response_for(request_with(:method => :post))
|
243
|
-
|
253
|
+
end
|
254
|
+
|
255
|
+
expect(results).to eq([nil] * 10)
|
244
256
|
end
|
245
257
|
end
|
246
258
|
|
247
259
|
it 'does not modify the original interaction array the list was initialized with' do
|
248
260
|
original_dup = original_list_array.dup
|
249
261
|
list.response_for(request_with(:method => :post))
|
250
|
-
original_list_array.
|
262
|
+
expect(original_list_array).to eq original_dup
|
251
263
|
end
|
252
264
|
end
|
253
265
|
end
|
@@ -136,36 +136,36 @@ EOF
|
|
136
136
|
it 'migrates a cassette from the 1.x to 2.x format' do
|
137
137
|
File.open(file_name, 'w') { |f| f.write(original_contents) }
|
138
138
|
subject.migrate!
|
139
|
-
YAML.load_file(file_name).
|
140
|
-
output.
|
139
|
+
expect(YAML.load_file(file_name)).to eq(YAML.load(updated_contents))
|
140
|
+
expect(output).to match(/Migrated example.yml/)
|
141
141
|
end
|
142
142
|
|
143
143
|
it 'ignores files that do not contain arrays' do
|
144
144
|
File.open(file_name, 'w') { |f| f.write(true.to_yaml) }
|
145
145
|
subject.migrate!
|
146
|
-
File.read(file_name).
|
147
|
-
output.
|
146
|
+
expect(File.read(file_name)).to eq(true.to_yaml)
|
147
|
+
expect(output).to match(/Ignored example.yml since it does not appear to be a valid VCR 1.x cassette/)
|
148
148
|
end
|
149
149
|
|
150
150
|
it 'ignores files that contain YAML arrays of other things' do
|
151
151
|
File.open(file_name, 'w') { |f| f.write([{}, {}].to_yaml) }
|
152
152
|
subject.migrate!
|
153
|
-
File.read(file_name).
|
154
|
-
output.
|
153
|
+
expect(File.read(file_name)).to eq([{}, {}].to_yaml)
|
154
|
+
expect(output).to match(/Ignored example.yml since it does not appear to be a valid VCR 1.x cassette/)
|
155
155
|
end
|
156
156
|
|
157
157
|
it 'ignores URIs that have sensitive data substitutions' do
|
158
158
|
modified_contents = original_contents.gsub('example.com', '<HOST>')
|
159
159
|
File.open(file_name, 'w') { |f| f.write(modified_contents) }
|
160
160
|
subject.migrate!
|
161
|
-
YAML.load_file(file_name).
|
161
|
+
expect(YAML.load_file(file_name)).to eq(YAML.load(updated_contents.gsub('example.com', '<HOST>:80')))
|
162
162
|
end
|
163
163
|
|
164
164
|
it 'ignores files that are empty' do
|
165
165
|
File.open(file_name, 'w') { |f| f.write('') }
|
166
166
|
subject.migrate!
|
167
|
-
File.read(file_name).
|
168
|
-
output.
|
167
|
+
expect(File.read(file_name)).to eq('')
|
168
|
+
expect(output).to match(/Ignored example.yml since it could not be parsed as YAML/)
|
169
169
|
end
|
170
170
|
|
171
171
|
shared_examples_for "ignoring invalid YAML" do
|
@@ -174,8 +174,8 @@ EOF
|
|
174
174
|
modified_contents = modified_contents.gsub(/\z/, "<% end %>")
|
175
175
|
File.open(file_name, 'w') { |f| f.write(modified_contents) }
|
176
176
|
subject.migrate!
|
177
|
-
File.read(file_name).
|
178
|
-
output.
|
177
|
+
expect(File.read(file_name)).to eq(modified_contents)
|
178
|
+
expect(output).to match(/Ignored example.yml since it could not be parsed as YAML/)
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
@@ -10,51 +10,51 @@ module VCR
|
|
10
10
|
describe "#[]" do
|
11
11
|
it 'reads from the given file, relative to the configured storage location' do
|
12
12
|
File.open(FileSystem.storage_location + '/foo.txt', 'w') { |f| f.write('1234') }
|
13
|
-
FileSystem["foo.txt"].
|
13
|
+
expect(FileSystem["foo.txt"]).to eq("1234")
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'handles directories in the given file name' do
|
17
17
|
FileUtils.mkdir_p FileSystem.storage_location + '/a'
|
18
18
|
File.open(FileSystem.storage_location + '/a/b', 'w') { |f| f.write('1234') }
|
19
|
-
FileSystem["a/b"].
|
19
|
+
expect(FileSystem["a/b"]).to eq("1234")
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'returns nil if the file does not exist' do
|
23
|
-
FileSystem["non_existant_file"].
|
23
|
+
expect(FileSystem["non_existant_file"]).to be_nil
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "#[]=" do
|
28
28
|
it 'writes the given file contents to the given file name' do
|
29
|
-
File.exist?(FileSystem.storage_location + '/foo.txt').
|
29
|
+
expect(File.exist?(FileSystem.storage_location + '/foo.txt')).to be_false
|
30
30
|
FileSystem["foo.txt"] = "bar"
|
31
|
-
File.read(FileSystem.storage_location + '/foo.txt').
|
31
|
+
expect(File.read(FileSystem.storage_location + '/foo.txt')).to eq("bar")
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'creates any needed intermediary directories' do
|
35
|
-
File.exist?(FileSystem.storage_location + '/a').
|
35
|
+
expect(File.exist?(FileSystem.storage_location + '/a')).to be_false
|
36
36
|
FileSystem["a/b"] = "bar"
|
37
|
-
File.read(FileSystem.storage_location + '/a/b').
|
37
|
+
expect(File.read(FileSystem.storage_location + '/a/b')).to eq("bar")
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
describe "#absolute_path_to_file" do
|
42
42
|
it "returns the absolute path to the given relative file based on the storage location" do
|
43
43
|
expected = File.join(FileSystem.storage_location, "bar/bazz.json")
|
44
|
-
FileSystem.absolute_path_to_file("bar/bazz.json").
|
44
|
+
expect(FileSystem.absolute_path_to_file("bar/bazz.json")).to eq(expected)
|
45
45
|
end
|
46
46
|
|
47
47
|
it "returns nil if the storage_location is not set" do
|
48
48
|
FileSystem.storage_location = nil
|
49
|
-
FileSystem.absolute_path_to_file("bar/bazz.json").
|
49
|
+
expect(FileSystem.absolute_path_to_file("bar/bazz.json")).to be_nil
|
50
50
|
end
|
51
51
|
|
52
52
|
it "sanitizes the file name" do
|
53
53
|
expected = File.join(FileSystem.storage_location, "_t_i-t_1_2_f_n.json")
|
54
|
-
FileSystem.absolute_path_to_file("\nt \t! i-t_1.2_f n.json").
|
54
|
+
expect(FileSystem.absolute_path_to_file("\nt \t! i-t_1.2_f n.json")).to eq(expected)
|
55
55
|
|
56
56
|
expected = File.join(FileSystem.storage_location, "a_1/b")
|
57
|
-
FileSystem.absolute_path_to_file("a 1/b").
|
57
|
+
expect(FileSystem.absolute_path_to_file("a 1/b")).to eq(expected)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -12,7 +12,7 @@ module VCR
|
|
12
12
|
|
13
13
|
it 'overrides the existing persister' do
|
14
14
|
subject[:foo] = :new_persister
|
15
|
-
subject[:foo].
|
15
|
+
expect(subject[:foo]).to be(:new_persister)
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'warns that there is a name collision' do
|
@@ -30,7 +30,7 @@ module VCR
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'returns the named persister' do
|
33
|
-
subject[:file_system].
|
33
|
+
expect(subject[:file_system]).to be(VCR::Cassette::Persisters::FileSystem)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'support/ruby_interpreter'
|
2
2
|
require 'vcr/cassette/serializers'
|
3
3
|
require 'multi_json'
|
4
|
+
|
4
5
|
begin
|
5
6
|
require 'psych' # ensure psych is loaded for these tests if its available
|
6
7
|
rescue LoadError
|
@@ -26,22 +27,22 @@ module VCR
|
|
26
27
|
context "the #{name} serializer" do
|
27
28
|
it 'lazily loads the serializer' do
|
28
29
|
serializers = subject.instance_variable_get(:@serializers)
|
29
|
-
serializers.
|
30
|
-
subject[name].
|
31
|
-
serializers.
|
30
|
+
expect(serializers).not_to have_key(name)
|
31
|
+
expect(subject[name]).not_to be_nil
|
32
|
+
expect(serializers).to have_key(name)
|
32
33
|
end if lazily_loaded
|
33
34
|
|
34
35
|
it "returns '#{file_extension}' as the file extension" do
|
35
|
-
serializer.file_extension.
|
36
|
+
expect(serializer.file_extension).to eq(file_extension)
|
36
37
|
end
|
37
38
|
|
38
39
|
it "can serialize and deserialize a hash" do
|
39
40
|
hash = { "a" => 7, "nested" => { "hash" => [1, 2, 3] }}
|
40
41
|
serialized = serializer.serialize(hash)
|
41
|
-
serialized.
|
42
|
-
serialized.
|
42
|
+
expect(serialized).not_to eq(hash)
|
43
|
+
expect(serialized).to be_a(String)
|
43
44
|
deserialized = serializer.deserialize(serialized)
|
44
|
-
deserialized.
|
45
|
+
expect(deserialized).to eq(hash)
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
@@ -118,7 +119,7 @@ module VCR
|
|
118
119
|
|
119
120
|
it 'overrides the existing serializer' do
|
120
121
|
subject[:foo] = :new_serializer
|
121
|
-
subject[:foo].
|
122
|
+
expect(subject[:foo]).to be(:new_serializer)
|
122
123
|
end
|
123
124
|
|
124
125
|
it 'warns that there is a name collision' do
|
@@ -136,7 +137,7 @@ module VCR
|
|
136
137
|
end
|
137
138
|
|
138
139
|
it 'returns the named serializer' do
|
139
|
-
subject[:yaml].
|
140
|
+
expect(subject[:yaml]).to be(VCR::Cassette::Serializers::YAML)
|
140
141
|
end
|
141
142
|
end
|
142
143
|
|
@@ -147,7 +148,7 @@ module VCR
|
|
147
148
|
it 'serializes things using pysch even if syck is configured as the default YAML engine' do
|
148
149
|
::YAML::ENGINE.yamler = 'syck'
|
149
150
|
serialized = subject[:psych].serialize(problematic_syck_string)
|
150
|
-
subject[:psych].deserialize(serialized).
|
151
|
+
expect(subject[:psych].deserialize(serialized)).to eq(problematic_syck_string)
|
151
152
|
end if defined?(::Psych)
|
152
153
|
|
153
154
|
it 'raises an error if psych cannot be loaded' do
|
@@ -159,8 +160,8 @@ module VCR
|
|
159
160
|
it 'forcibly serializes things using syck even if psych is the currently configured YAML engine' do
|
160
161
|
::YAML::ENGINE.yamler = 'psych'
|
161
162
|
serialized = subject[:syck].serialize(problematic_syck_string)
|
162
|
-
subject[:syck].deserialize(serialized).
|
163
|
-
end if defined?(::Psych) && (RUBY_INTERPRETER != :jruby)
|
163
|
+
expect(subject[:syck].deserialize(serialized)).not_to eq(problematic_syck_string)
|
164
|
+
end if defined?(::Psych) && (RUBY_INTERPRETER != :jruby) && (RUBY_VERSION.to_f < 2.0)
|
164
165
|
end
|
165
166
|
end
|
166
167
|
end
|