vcr 3.0.3 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +5 -5
  2. data/lib/vcr/cassette/erb_renderer.rb +4 -2
  3. data/lib/vcr/cassette/http_interaction_list.rb +14 -9
  4. data/lib/vcr/cassette/migrator.rb +5 -6
  5. data/lib/vcr/cassette/persisters/file_system.rb +9 -1
  6. data/lib/vcr/cassette/serializers/compressed.rb +2 -2
  7. data/lib/vcr/cassette/serializers/json.rb +14 -8
  8. data/lib/vcr/cassette/serializers/psych.rb +10 -2
  9. data/lib/vcr/cassette/serializers/syck.rb +7 -1
  10. data/lib/vcr/cassette/serializers/yaml.rb +14 -2
  11. data/lib/vcr/cassette/serializers.rb +10 -0
  12. data/lib/vcr/cassette.rb +50 -15
  13. data/lib/vcr/configuration.rb +20 -8
  14. data/lib/vcr/deprecations.rb +0 -62
  15. data/lib/vcr/errors.rb +17 -12
  16. data/lib/vcr/library_hooks/excon.rb +8 -0
  17. data/lib/vcr/library_hooks/typhoeus.rb +91 -79
  18. data/lib/vcr/library_hooks/webmock.rb +2 -11
  19. data/lib/vcr/linked_cassette.rb +4 -4
  20. data/lib/vcr/middleware/excon.rb +1 -1
  21. data/lib/vcr/middleware/faraday.rb +10 -1
  22. data/lib/vcr/request_ignorer.rb +8 -1
  23. data/lib/vcr/request_matcher_registry.rb +3 -3
  24. data/lib/vcr/structs.rb +48 -32
  25. data/lib/vcr/test_frameworks/cucumber.rb +16 -5
  26. data/lib/vcr/test_frameworks/rspec.rb +34 -22
  27. data/lib/vcr/util/hooks.rb +1 -0
  28. data/lib/vcr/util/internet_connection.rb +15 -21
  29. data/lib/vcr/version.rb +2 -2
  30. data/lib/vcr.rb +52 -2
  31. metadata +45 -272
  32. data/features/CHANGELOG.md +0 -710
  33. data/features/CONTRIBUTING.md +0 -26
  34. data/features/LICENSE.md +0 -20
  35. data/features/README.md +0 -339
  36. data/features/Upgrade.md +0 -289
  37. data/features/about_these_examples.md +0 -18
  38. data/features/cassettes/allow_unused_http_interactions.feature +0 -100
  39. data/features/cassettes/automatic_re_recording.feature +0 -72
  40. data/features/cassettes/decompress.feature +0 -74
  41. data/features/cassettes/dynamic_erb.feature +0 -100
  42. data/features/cassettes/exclusive.feature +0 -126
  43. data/features/cassettes/format.feature +0 -411
  44. data/features/cassettes/freezing_time.feature +0 -68
  45. data/features/cassettes/naming.feature +0 -28
  46. data/features/cassettes/no_cassette.feature +0 -152
  47. data/features/cassettes/update_content_length_header.feature +0 -112
  48. data/features/configuration/allow_http_connections_when_no_cassette.feature +0 -55
  49. data/features/configuration/cassette_library_dir.feature +0 -31
  50. data/features/configuration/debug_logging.feature +0 -58
  51. data/features/configuration/default_cassette_options.feature +0 -100
  52. data/features/configuration/filter_sensitive_data.feature +0 -153
  53. data/features/configuration/hook_into.feature +0 -172
  54. data/features/configuration/ignore_request.feature +0 -192
  55. data/features/configuration/preserve_exact_body_bytes.feature +0 -108
  56. data/features/configuration/query_parser.feature +0 -84
  57. data/features/configuration/uri_parser.feature +0 -93
  58. data/features/getting_started.md +0 -82
  59. data/features/hooks/after_http_request.feature +0 -58
  60. data/features/hooks/around_http_request.feature +0 -57
  61. data/features/hooks/before_http_request.feature +0 -63
  62. data/features/hooks/before_playback.feature +0 -184
  63. data/features/hooks/before_record.feature +0 -172
  64. data/features/http_libraries/em_http_request.feature +0 -250
  65. data/features/http_libraries/net_http.feature +0 -179
  66. data/features/middleware/faraday.feature +0 -56
  67. data/features/middleware/rack.feature +0 -92
  68. data/features/record_modes/all.feature +0 -82
  69. data/features/record_modes/new_episodes.feature +0 -79
  70. data/features/record_modes/none.feature +0 -72
  71. data/features/record_modes/once.feature +0 -95
  72. data/features/request_matching/README.md +0 -30
  73. data/features/request_matching/body.feature +0 -91
  74. data/features/request_matching/body_as_json.feature +0 -90
  75. data/features/request_matching/custom_matcher.feature +0 -135
  76. data/features/request_matching/headers.feature +0 -85
  77. data/features/request_matching/host.feature +0 -95
  78. data/features/request_matching/identical_request_sequence.feature +0 -89
  79. data/features/request_matching/method.feature +0 -96
  80. data/features/request_matching/path.feature +0 -96
  81. data/features/request_matching/playback_repeats.feature +0 -98
  82. data/features/request_matching/query.feature +0 -97
  83. data/features/request_matching/uri.feature +0 -94
  84. data/features/request_matching/uri_without_param.feature +0 -101
  85. data/features/step_definitions/cli_steps.rb +0 -199
  86. data/features/support/env.rb +0 -46
  87. data/features/support/http_lib_filters.rb +0 -46
  88. data/features/test_frameworks/cucumber.feature +0 -211
  89. data/features/test_frameworks/rspec_macro.feature +0 -81
  90. data/features/test_frameworks/rspec_metadata.feature +0 -150
  91. data/features/test_frameworks/test_unit.feature +0 -49
  92. data/lib/vcr/extensions/net_http_response.rb +0 -36
  93. data/lib/vcr/library_hooks/fakeweb.rb +0 -197
  94. data/lib/vcr/library_hooks/typhoeus_0.4.rb +0 -103
  95. data/spec/acceptance/concurrency_spec.rb +0 -51
  96. data/spec/acceptance/threading_spec.rb +0 -34
  97. data/spec/fixtures/cassette_spec/1_x_cassette.yml +0 -110
  98. data/spec/fixtures/cassette_spec/empty.yml +0 -0
  99. data/spec/fixtures/cassette_spec/example.yml +0 -111
  100. data/spec/fixtures/cassette_spec/with_localhost_requests.yml +0 -111
  101. data/spec/fixtures/fake_example_responses.yml +0 -110
  102. data/spec/fixtures/match_requests_on.yml +0 -187
  103. data/spec/lib/vcr/cassette/erb_renderer_spec.rb +0 -53
  104. data/spec/lib/vcr/cassette/http_interaction_list_spec.rb +0 -295
  105. data/spec/lib/vcr/cassette/migrator_spec.rb +0 -196
  106. data/spec/lib/vcr/cassette/persisters/file_system_spec.rb +0 -75
  107. data/spec/lib/vcr/cassette/persisters_spec.rb +0 -39
  108. data/spec/lib/vcr/cassette/serializers_spec.rb +0 -182
  109. data/spec/lib/vcr/cassette_spec.rb +0 -618
  110. data/spec/lib/vcr/configuration_spec.rb +0 -326
  111. data/spec/lib/vcr/deprecations_spec.rb +0 -85
  112. data/spec/lib/vcr/errors_spec.rb +0 -178
  113. data/spec/lib/vcr/extensions/net_http_response_spec.rb +0 -86
  114. data/spec/lib/vcr/library_hooks/excon_spec.rb +0 -104
  115. data/spec/lib/vcr/library_hooks/fakeweb_spec.rb +0 -169
  116. data/spec/lib/vcr/library_hooks/faraday_spec.rb +0 -68
  117. data/spec/lib/vcr/library_hooks/typhoeus_0.4_spec.rb +0 -36
  118. data/spec/lib/vcr/library_hooks/typhoeus_spec.rb +0 -162
  119. data/spec/lib/vcr/library_hooks/webmock_spec.rb +0 -117
  120. data/spec/lib/vcr/library_hooks_spec.rb +0 -51
  121. data/spec/lib/vcr/middleware/faraday_spec.rb +0 -181
  122. data/spec/lib/vcr/middleware/rack_spec.rb +0 -115
  123. data/spec/lib/vcr/request_ignorer_spec.rb +0 -70
  124. data/spec/lib/vcr/request_matcher_registry_spec.rb +0 -345
  125. data/spec/lib/vcr/structs_spec.rb +0 -732
  126. data/spec/lib/vcr/test_frameworks/cucumber_spec.rb +0 -107
  127. data/spec/lib/vcr/test_frameworks/rspec_spec.rb +0 -94
  128. data/spec/lib/vcr/util/hooks_spec.rb +0 -158
  129. data/spec/lib/vcr/util/internet_connection_spec.rb +0 -37
  130. data/spec/lib/vcr/util/version_checker_spec.rb +0 -31
  131. data/spec/lib/vcr/version_spec.rb +0 -27
  132. data/spec/lib/vcr_spec.rb +0 -354
  133. data/spec/monkey_patches.rb +0 -186
  134. data/spec/spec_helper.rb +0 -63
  135. data/spec/support/configuration_stubbing.rb +0 -8
  136. data/spec/support/cucumber_helpers.rb +0 -39
  137. data/spec/support/fixnum_extension.rb +0 -10
  138. data/spec/support/http_library_adapters.rb +0 -289
  139. data/spec/support/limited_uri.rb +0 -21
  140. data/spec/support/ruby_interpreter.rb +0 -7
  141. data/spec/support/shared_example_groups/excon.rb +0 -63
  142. data/spec/support/shared_example_groups/hook_into_http_library.rb +0 -594
  143. data/spec/support/shared_example_groups/request_hooks.rb +0 -59
  144. data/spec/support/sinatra_app.rb +0 -86
  145. data/spec/support/vcr_localhost_server.rb +0 -76
  146. data/spec/support/vcr_stub_helpers.rb +0 -17
@@ -1,295 +0,0 @@
1
- require 'vcr/util/logger'
2
- require 'vcr/cassette/http_interaction_list'
3
- require 'vcr/request_matcher_registry'
4
- require 'vcr/structs'
5
- require 'support/configuration_stubbing'
6
-
7
- module VCR
8
- class Cassette
9
- describe HTTPInteractionList do
10
- include_context "configuration stubbing"
11
-
12
- ::RSpec::Matchers.define :respond_with do |expected|
13
- match { |a| expected.nil? ? a.nil? : a.body == expected }
14
- end
15
-
16
- before(:each) do
17
- allow(VCR).to receive(:request_matchers).and_return(VCR::RequestMatcherRegistry.new)
18
- allow(config).to receive(:logger).and_return(double.as_null_object)
19
- end
20
-
21
- def request_with(values)
22
- VCR::Request.new.tap do |request|
23
- values.each do |name, value|
24
- request.send("#{name}=", value)
25
- end
26
- end
27
- end
28
-
29
- def response(body)
30
- VCR::Response.new.tap do |r|
31
- r.body = body
32
- r.status = VCR::ResponseStatus.new(200)
33
- end
34
- end
35
-
36
- def interaction(body, request_values)
37
- VCR::HTTPInteraction.new \
38
- request_with(request_values),
39
- response(body)
40
- end
41
-
42
- let(:original_list_array) do [
43
- interaction('put response', :method => :put),
44
- interaction('post response 1', :method => :post),
45
- interaction('post response 2', :method => :post)
46
- ] end
47
-
48
- let(:allow_playback_repeats) { false } # the default
49
- let(:list) { HTTPInteractionList.new(original_list_array, [:method], allow_playback_repeats) }
50
-
51
- describe "#has_used_interaction_matching?" do
52
- it 'returns false when no interactions have been used' do
53
- expect(list).not_to have_used_interaction_matching(request_with(:method => :put))
54
- end
55
-
56
- it 'returns true when there is a matching used interaction (even if there is also an unused one that matches)' do
57
- list.response_for(request_with(:method => :post))
58
- expect(list).to have_used_interaction_matching(request_with(:method => :post))
59
- end
60
-
61
- it 'returns false when none of the used interactions match' do
62
- list.response_for(request_with(:method => :put))
63
- expect(list).not_to have_used_interaction_matching(request_with(:method => :post))
64
- end
65
- end
66
-
67
- describe "#remaining_unused_interaction_count" do
68
- it 'returns the number of unused interactions' do
69
- expect(list.remaining_unused_interaction_count).to eq(3)
70
-
71
- list.response_for(request_with(:method => :get))
72
- expect(list.remaining_unused_interaction_count).to eq(3)
73
-
74
- list.response_for(request_with(:method => :put))
75
- expect(list.remaining_unused_interaction_count).to eq(2)
76
-
77
- list.response_for(request_with(:method => :put))
78
- expect(list.remaining_unused_interaction_count).to eq(2)
79
-
80
- list.response_for(request_with(:method => :post))
81
- expect(list.remaining_unused_interaction_count).to eq(1)
82
-
83
- list.response_for(request_with(:method => :post))
84
- expect(list.remaining_unused_interaction_count).to eq(0)
85
-
86
- list.response_for(request_with(:method => :post))
87
- expect(list.remaining_unused_interaction_count).to eq(0)
88
- end
89
- end
90
-
91
- describe "#assert_no_unused_interactions?" do
92
- it 'should raise a SkippedHTTPRequestError when there are unused interactions left' do
93
- expect {
94
- list.assert_no_unused_interactions!
95
- }.to raise_error(Errors::UnusedHTTPInteractionError)
96
-
97
- list.response_for(request_with(:method => :put))
98
- expect {
99
- list.assert_no_unused_interactions!
100
- }.to raise_error(Errors::UnusedHTTPInteractionError)
101
- end
102
-
103
- it 'should raise nothing when there are no unused interactions left' do
104
- [:put, :post, :post].each do |method|
105
- list.response_for(request_with(:method => method))
106
- end
107
-
108
- expect {
109
- list.assert_no_unused_interactions!
110
- }.not_to raise_error
111
- end
112
-
113
- context 'when the null logger is in use' do
114
- before { allow(config).to receive(:logger).and_return(Logger::Null) }
115
-
116
- it 'includes formatted request details in the error message' do
117
- expect {
118
- list.assert_no_unused_interactions!
119
- }.to raise_error(/\[put/)
120
- end
121
-
122
- it 'includes formatted response details in the error message' do
123
- expect {
124
- list.assert_no_unused_interactions!
125
- }.to raise_error(/\[200 "put response"\]/)
126
- end
127
- end
128
- end
129
-
130
- describe "has_interaction_matching?" do
131
- it 'returns false when the list is empty' do
132
- expect(HTTPInteractionList.new([], [:method])).not_to have_interaction_matching(double)
133
- end
134
-
135
- it 'returns false when there is no matching interaction' do
136
- expect(list).not_to have_interaction_matching(request_with(:method => :get))
137
- end
138
-
139
- it 'returns true when there is a matching interaction' do
140
- expect(list).to have_interaction_matching(request_with(:method => :post))
141
- end
142
-
143
- it 'does not consume the interactions when they match' do
144
- expect(list).to have_interaction_matching(request_with(:method => :post))
145
- expect(list.remaining_unused_interaction_count).to eq(3)
146
- expect(list).to have_interaction_matching(request_with(:method => :post))
147
- expect(list.remaining_unused_interaction_count).to eq(3)
148
- end
149
-
150
- it 'invokes each matcher block to find the matching interaction' do
151
- VCR.request_matchers.register(:foo) { |r1, r2| true }
152
- VCR.request_matchers.register(:bar) { |r1, r2| true }
153
-
154
- calls = 0
155
- VCR.request_matchers.register(:baz) { |r1, r2| calls += 1; calls == 2 }
156
-
157
- list = HTTPInteractionList.new([
158
- interaction('response', :method => :put)
159
- ], [:foo, :bar, :baz])
160
-
161
- expect(list).not_to have_interaction_matching(request_with(:method => :post))
162
- expect(list).to have_interaction_matching(request_with(:method => :post))
163
- end
164
-
165
- it "delegates to the parent list when it can't find a matching interaction" do
166
- parent_list = double(:has_interaction_matching? => true)
167
- expect(HTTPInteractionList.new( [], [:method], false, parent_list)).to have_interaction_matching(double)
168
- parent_list = double(:has_interaction_matching? => false)
169
- expect(HTTPInteractionList.new( [], [:method], false, parent_list)).not_to have_interaction_matching(double)
170
- end
171
-
172
- context 'when allow_playback_repeats is set to true' do
173
- let(:allow_playback_repeats) { true }
174
-
175
- it 'considers used interactions' do
176
- list.response_for(request_with(:method => :put))
177
-
178
- results = 10.times.map do
179
- list.has_interaction_matching?(request_with(:method => :put))
180
- end
181
-
182
- expect(results).to eq([true] * 10)
183
- end
184
- end
185
-
186
- context 'when allow_playback_repeats is set to false' do
187
- let(:allow_playback_repeats) { false }
188
-
189
- it 'does not consider used interactions' do
190
- list.response_for(request_with(:method => :put))
191
-
192
- result = 10.times.map do
193
- list.has_interaction_matching?(request_with(:method => :put))
194
- end
195
-
196
- expect(result).to eq([false] * 10)
197
- end
198
- end
199
- end
200
-
201
- describe "#response_for" do
202
- it 'returns nil when the list is empty' do
203
- expect(HTTPInteractionList.new([], [:method]).response_for(double)).to respond_with(nil)
204
- end
205
-
206
- it 'returns nil when there is no matching interaction' do
207
- response = HTTPInteractionList.new([
208
- interaction('foo', :method => :post),
209
- interaction('foo', :method => :put)
210
- ], [:method]).response_for(
211
- request_with(:method => :get)
212
- )
213
-
214
- expect(response).to respond_with(nil)
215
- end
216
-
217
- it 'returns the first matching interaction' do
218
- list = HTTPInteractionList.new([
219
- interaction('put response', :method => :put),
220
- interaction('post response 1', :method => :post),
221
- interaction('post response 2', :method => :post)
222
- ], [:method])
223
-
224
- expect(list.response_for(request_with(:method => :post))).to respond_with("post response 1")
225
- end
226
-
227
- it 'invokes each matcher block to find the matching interaction' do
228
- VCR.request_matchers.register(:foo) { |r1, r2| true }
229
- VCR.request_matchers.register(:bar) { |r1, r2| true }
230
-
231
- calls = 0
232
- VCR.request_matchers.register(:baz) { |r1, r2| calls += 1; calls == 2 }
233
-
234
- list = HTTPInteractionList.new([
235
- interaction('response', :method => :put)
236
- ], [:foo, :bar, :baz])
237
-
238
- expect(list.response_for(request_with(:method => :post))).to respond_with(nil)
239
- expect(list.response_for(request_with(:method => :post))).to respond_with('response')
240
- end
241
-
242
- it "delegates to the parent list when it can't find a matching interaction" do
243
- parent_list = double(:response_for => response('parent'))
244
- result = HTTPInteractionList.new(
245
- [], [:method], false, parent_list
246
- ).response_for(double)
247
-
248
- expect(result).to respond_with('parent')
249
- end
250
-
251
- it 'consumes the first matching interaction so that it will not be used again' do
252
- expect(list.response_for(request_with(:method => :post)).body).to eq("post response 1")
253
- expect(list.response_for(request_with(:method => :post)).body).to eq("post response 2")
254
- end
255
-
256
- context 'when allow_playback_repeats is set to true' do
257
- let(:allow_playback_repeats) { true }
258
-
259
- it 'continues to return the response from the last matching interaction when there are no more' do
260
- list.response_for(request_with(:method => :post))
261
-
262
- results = 10.times.map do
263
- response = list.response_for(request_with(:method => :post))
264
- response ? response.body : nil
265
- end
266
-
267
- expect(results).to eq(["post response 2"] * 10)
268
- end
269
- end
270
-
271
- context 'when allow_playback_repeats is set to false' do
272
- let(:allow_playback_repeats) { false }
273
-
274
- it 'returns nil when there are no more unused interactions' do
275
- list.response_for(request_with(:method => :post))
276
- list.response_for(request_with(:method => :post))
277
-
278
- results = 10.times.map do
279
- list.response_for(request_with(:method => :post))
280
- end
281
-
282
- expect(results).to eq([nil] * 10)
283
- end
284
- end
285
-
286
- it 'does not modify the original interaction array the list was initialized with' do
287
- original_dup = original_list_array.dup
288
- list.response_for(request_with(:method => :post))
289
- expect(original_list_array).to eq original_dup
290
- end
291
- end
292
- end
293
- end
294
- end
295
-
@@ -1,196 +0,0 @@
1
- require 'tmpdir'
2
- require 'vcr/cassette/migrator'
3
- require 'yaml'
4
-
5
- describe VCR::Cassette::Migrator do
6
- let(:original_contents) { <<-EOF
7
- ---
8
- - !ruby/struct:VCR::HTTPInteraction
9
- request: !ruby/struct:VCR::Request
10
- method: :get
11
- uri: http://example.com:80/foo
12
- body:
13
- headers:
14
- response: !ruby/struct:VCR::Response
15
- status: !ruby/struct:VCR::ResponseStatus
16
- code: 200
17
- message: OK
18
- headers:
19
- content-type:
20
- - text/html;charset=utf-8
21
- content-length:
22
- - "9"
23
- body: Hello foo
24
- http_version: "1.1"
25
- - !ruby/struct:VCR::HTTPInteraction
26
- request: !ruby/struct:VCR::Request
27
- method: :get
28
- uri: http://localhost:7777/bar
29
- body:
30
- headers:
31
- response: !ruby/struct:VCR::Response
32
- status: !ruby/struct:VCR::ResponseStatus
33
- code: 200
34
- message: OK
35
- headers:
36
- content-type:
37
- - text/html;charset=utf-8
38
- content-length:
39
- - "9"
40
- body: Hello bar
41
- http_version: "1.1"
42
- EOF
43
- }
44
-
45
- let(:updated_contents) { <<-EOF
46
- ---
47
- http_interactions:
48
- - request:
49
- method: get
50
- uri: http://example.com/foo
51
- body:
52
- encoding: US-ASCII
53
- string: ""
54
- headers: {}
55
-
56
- response:
57
- status:
58
- code: 200
59
- message: OK
60
- headers:
61
- Content-Type:
62
- - text/html;charset=utf-8
63
- Content-Length:
64
- - "9"
65
- body:
66
- encoding: UTF-8
67
- string: Hello foo
68
- http_version: "1.1"
69
- recorded_at: Wed, 04 May 2011 12:30:00 GMT
70
- - request:
71
- method: get
72
- uri: http://localhost:7777/bar
73
- body:
74
- encoding: US-ASCII
75
- string: ""
76
- headers: {}
77
-
78
- response:
79
- status:
80
- code: 200
81
- message: OK
82
- headers:
83
- Content-Type:
84
- - text/html;charset=utf-8
85
- Content-Length:
86
- - "9"
87
- body:
88
- encoding: UTF-8
89
- string: Hello bar
90
- http_version: "1.1"
91
- recorded_at: Wed, 04 May 2011 12:30:00 GMT
92
- recorded_with: VCR #{VCR.version}
93
- EOF
94
- }
95
-
96
- let(:dir) { './tmp/migrator' }
97
-
98
- before(:each) do
99
- # ensure the directory is empty
100
- FileUtils.rm_rf dir
101
- FileUtils.mkdir_p dir
102
- end
103
-
104
- before(:each) do
105
- # the encoding won't be set on rubies that don't support it
106
- updated_contents.gsub!(/^\s+encoding:.*$/, '')
107
- end unless ''.respond_to?(:encoding)
108
-
109
- # JRuby serializes YAML with some slightly different whitespace.
110
- before(:each) do
111
- [original_contents, updated_contents].each do |contents|
112
- contents.gsub!(/^(\s+)-/, '\1 -')
113
- end
114
- updated_contents.gsub!(/^(- | )/, ' \1')
115
- end if RUBY_PLATFORM == 'java'
116
-
117
- # Use syck on all rubies for consistent results...
118
- around(:each) do |example|
119
- YAML::ENGINE.yamler = 'syck'
120
- begin
121
- example.call
122
- ensure
123
- YAML::ENGINE.yamler = 'psych'
124
- end
125
- end if defined?(YAML::ENGINE) && RUBY_VERSION.to_f < 2.0
126
-
127
- let(:filemtime) { Time.utc(2011, 5, 4, 12, 30) }
128
- let(:out_io) { StringIO.new }
129
- let(:file_name) { File.join(dir, "example.yml") }
130
- let(:output) { out_io.rewind; out_io.read }
131
-
132
- subject { described_class.new(dir, out_io) }
133
-
134
- before(:each) do
135
- allow(File).to receive(:mtime).with(file_name).and_return(filemtime)
136
- end
137
-
138
- it 'migrates a cassette from the 1.x to 2.x format' do
139
- File.open(file_name, 'w') { |f| f.write(original_contents) }
140
- subject.migrate!
141
- expect(YAML.load_file(file_name)).to eq(YAML.load(updated_contents))
142
- expect(output).to match(/Migrated example.yml/)
143
- end
144
-
145
- it 'ignores files that do not contain arrays' do
146
- File.open(file_name, 'w') { |f| f.write(true.to_yaml) }
147
- subject.migrate!
148
- expect(File.read(file_name)).to eq(true.to_yaml)
149
- expect(output).to match(/Ignored example.yml since it does not appear to be a valid VCR 1.x cassette/)
150
- end
151
-
152
- it 'ignores files that contain YAML arrays of other things' do
153
- File.open(file_name, 'w') { |f| f.write([{}, {}].to_yaml) }
154
- subject.migrate!
155
- expect(File.read(file_name)).to eq([{}, {}].to_yaml)
156
- expect(output).to match(/Ignored example.yml since it does not appear to be a valid VCR 1.x cassette/)
157
- end
158
-
159
- it 'ignores URIs that have sensitive data substitutions' do
160
- modified_contents = original_contents.gsub('example.com', '<HOST>')
161
- File.open(file_name, 'w') { |f| f.write(modified_contents) }
162
- subject.migrate!
163
- expect(YAML.load_file(file_name)).to eq(YAML.load(updated_contents.gsub('example.com', '<HOST>:80')))
164
- end
165
-
166
- it 'ignores files that are empty' do
167
- File.open(file_name, 'w') { |f| f.write('') }
168
- subject.migrate!
169
- expect(File.read(file_name)).to eq('')
170
- expect(output).to match(/Ignored example.yml since it could not be parsed as YAML/)
171
- end
172
-
173
- shared_examples_for "ignoring invalid YAML" do
174
- it 'ignores files that cannot be parsed as valid YAML (such as ERB cassettes)' do
175
- modified_contents = original_contents.gsub(/\A---/, "---\n<% 3.times do %>")
176
- modified_contents = modified_contents.gsub(/\z/, "<% end %>")
177
- File.open(file_name, 'w') { |f| f.write(modified_contents) }
178
- subject.migrate!
179
- expect(File.read(file_name)).to eq(modified_contents)
180
- expect(output).to match(/Ignored example.yml since it could not be parsed as YAML/)
181
- end
182
- end
183
-
184
- context 'with syck' do
185
- it_behaves_like "ignoring invalid YAML"
186
- end
187
-
188
- context 'with psych' do
189
- before(:each) do
190
- YAML::ENGINE.yamler = 'psych'
191
- end
192
-
193
- it_behaves_like "ignoring invalid YAML"
194
- end if defined?(YAML::ENGINE)
195
- end
196
-
@@ -1,75 +0,0 @@
1
- require 'spec_helper'
2
- require 'vcr/cassette/persisters/file_system'
3
-
4
- module VCR
5
- class Cassette
6
- class Persisters
7
- describe FileSystem do
8
- before { FileSystem.storage_location = VCR.configuration.cassette_library_dir }
9
-
10
- describe "#[]" do
11
- it 'reads from the given file, relative to the configured storage location' do
12
- File.open(FileSystem.storage_location + '/foo.txt', 'w') { |f| f.write('1234') }
13
- expect(FileSystem["foo.txt"]).to eq("1234")
14
- end
15
-
16
- it 'handles directories in the given file name' do
17
- FileUtils.mkdir_p FileSystem.storage_location + '/a'
18
- File.open(FileSystem.storage_location + '/a/b', 'w') { |f| f.write('1234') }
19
- expect(FileSystem["a/b"]).to eq("1234")
20
- end
21
-
22
- it 'returns nil if the file does not exist' do
23
- expect(FileSystem["non_existant_file"]).to be_nil
24
- end
25
- end
26
-
27
- describe "#[]=" do
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
38
- end
39
-
40
- it 'creates any needed intermediary directories' do
41
- expect(File.exist?(FileSystem.storage_location + '/a')).to be false
42
- FileSystem["a/b"] = "bar"
43
- expect(File.read(FileSystem.storage_location + '/a/b')).to eq("bar")
44
- end
45
- end
46
-
47
- describe "#absolute_path_to_file" do
48
- it "returns the absolute path to the given relative file based on the storage location" do
49
- expected = File.join(FileSystem.storage_location, "bar/bazz.json")
50
- expect(FileSystem.absolute_path_to_file("bar/bazz.json")).to eq(expected)
51
- end
52
-
53
- it "returns nil if the storage_location is not set" do
54
- FileSystem.storage_location = nil
55
- expect(FileSystem.absolute_path_to_file("bar/bazz.json")).to be_nil
56
- end
57
-
58
- it "sanitizes the file name" do
59
- expected = File.join(FileSystem.storage_location, "_t_i-t_1_2_f_n.json")
60
- expect(FileSystem.absolute_path_to_file("\nt \t! i-t_1.2_f n.json")).to eq(expected)
61
-
62
- expected = File.join(FileSystem.storage_location, "a_1/b")
63
- expect(FileSystem.absolute_path_to_file("a 1/b")).to eq(expected)
64
- end
65
-
66
- it 'handles files with no extensions (even when there is a dot in the path)' do
67
- expected = File.join(FileSystem.storage_location, "/foo_bar/baz_qux")
68
- expect(FileSystem.absolute_path_to_file("/foo.bar/baz qux")).to eq(expected)
69
- end
70
- end
71
- end
72
- end
73
- end
74
- end
75
-
@@ -1,39 +0,0 @@
1
- require 'vcr/cassette/persisters'
2
-
3
- module VCR
4
- class Cassette
5
- describe Persisters do
6
- describe "#[]=" do
7
- context 'when there is already a persister registered for the given name' do
8
- before(:each) do
9
- subject[:foo] = :old_persister
10
- allow(subject).to receive :warn
11
- end
12
-
13
- it 'overrides the existing persister' do
14
- subject[:foo] = :new_persister
15
- expect(subject[:foo]).to be(:new_persister)
16
- end
17
-
18
- it 'warns that there is a name collision' do
19
- expect(subject).to receive(:warn).with(
20
- /WARNING: There is already a VCR cassette persister registered for :foo\. Overriding it/
21
- )
22
- subject[:foo] = :new_persister
23
- end
24
- end
25
- end
26
-
27
- describe "#[]" do
28
- it 'raises an error when given an unrecognized persister name' do
29
- expect { subject[:foo] }.to raise_error(ArgumentError)
30
- end
31
-
32
- it 'returns the named persister' do
33
- expect(subject[:file_system]).to be(VCR::Cassette::Persisters::FileSystem)
34
- end
35
- end
36
- end
37
- end
38
- end
39
-