vcr 3.0.3 → 6.2.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.
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 +63 -16
  13. data/lib/vcr/configuration.rb +21 -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 +29 -2
  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
-