vcr 2.0.0.beta2 → 2.0.0.rc1
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.
- data/.gitignore +1 -0
- data/.travis.yml +0 -2
- data/CHANGELOG.md +22 -1
- data/CONTRIBUTING.md +46 -0
- data/Gemfile +1 -9
- data/README.md +8 -2
- data/Rakefile +12 -1
- data/cucumber.yml +8 -9
- data/features/.nav +10 -4
- data/features/cassettes/format.feature +1 -1
- data/features/cassettes/no_cassette.feature +8 -11
- data/features/configuration/allow_http_connections_when_no_cassette.feature +4 -4
- data/features/configuration/filter_sensitive_data.feature +3 -0
- data/features/configuration/hook_into.feature +4 -8
- data/features/configuration/ignore_request.feature +191 -0
- data/features/getting_started.md +38 -21
- data/features/hooks/after_http_request.feature +44 -0
- data/features/hooks/around_http_request.feature +56 -0
- data/features/hooks/before_http_request.feature +44 -0
- data/features/hooks/before_playback.feature +181 -0
- data/features/hooks/before_record.feature +172 -0
- data/features/middleware/faraday.feature +7 -3
- data/features/record_modes/none.feature +2 -1
- data/features/record_modes/once.feature +2 -1
- data/features/request_matching/body.feature +2 -2
- data/features/request_matching/custom_matcher.feature +2 -2
- data/features/request_matching/headers.feature +2 -2
- data/features/request_matching/host.feature +2 -2
- data/features/request_matching/identical_request_sequence.feature +2 -2
- data/features/request_matching/method.feature +2 -2
- data/features/request_matching/path.feature +2 -2
- data/features/request_matching/playback_repeats.feature +2 -1
- data/features/request_matching/uri.feature +2 -2
- data/features/support/env.rb +21 -12
- data/features/test_frameworks/cucumber.feature +9 -4
- data/features/test_frameworks/{rspec.feature → rspec_macro.feature} +7 -7
- data/features/test_frameworks/rspec_metadata.feature +90 -0
- data/lib/vcr.rb +1 -1
- data/lib/vcr/cassette.rb +3 -3
- data/lib/vcr/cassette/http_interaction_list.rb +13 -9
- data/lib/vcr/cassette/migrator.rb +1 -1
- data/lib/vcr/configuration.rb +37 -0
- data/lib/vcr/errors.rb +172 -6
- data/lib/vcr/library_hooks.rb +4 -6
- data/lib/vcr/library_hooks/excon.rb +23 -11
- data/lib/vcr/library_hooks/fakeweb.rb +85 -24
- data/lib/vcr/library_hooks/faraday.rb +30 -2
- data/lib/vcr/library_hooks/typhoeus.rb +25 -3
- data/lib/vcr/library_hooks/webmock.rb +25 -36
- data/lib/vcr/middleware/faraday.rb +23 -5
- data/lib/vcr/request_handler.rb +12 -1
- data/lib/vcr/request_ignorer.rb +12 -1
- data/lib/vcr/request_matcher_registry.rb +1 -9
- data/lib/vcr/structs.rb +32 -2
- data/lib/vcr/test_frameworks/rspec.rb +28 -0
- data/lib/vcr/util/hooks.rb +12 -4
- data/lib/vcr/util/version_checker.rb +2 -0
- data/lib/vcr/version.rb +1 -1
- data/spec/fixtures/cassette_spec/example.yml +1 -1
- data/spec/fixtures/{fake_example.com_responses.yml → fake_example_responses.yml} +0 -0
- data/spec/monkey_patches.rb +1 -1
- data/spec/spec_helper.rb +3 -1
- data/spec/support/http_library_adapters.rb +4 -3
- data/spec/support/shared_example_groups/hook_into_http_library.rb +194 -12
- data/spec/support/shared_example_groups/request_hooks.rb +58 -0
- data/spec/support/shared_example_groups/version_checking.rb +5 -0
- data/spec/support/sinatra_app.rb +17 -9
- data/spec/support/vcr_stub_helpers.rb +17 -0
- data/spec/vcr/cassette/http_interaction_list_spec.rb +28 -29
- data/spec/vcr/cassette/migrator_spec.rb +6 -7
- data/spec/vcr/cassette_spec.rb +5 -5
- data/spec/vcr/configuration_spec.rb +51 -32
- data/spec/vcr/deprecations_spec.rb +0 -8
- data/spec/vcr/errors_spec.rb +129 -0
- data/spec/vcr/library_hooks/excon_spec.rb +21 -4
- data/spec/vcr/library_hooks/fakeweb_spec.rb +71 -3
- data/spec/vcr/library_hooks/faraday_spec.rb +45 -0
- data/spec/vcr/library_hooks/typhoeus_spec.rb +31 -1
- data/spec/vcr/library_hooks/webmock_spec.rb +26 -3
- data/spec/vcr/middleware/faraday_spec.rb +84 -1
- data/spec/vcr/request_ignorer_spec.rb +16 -0
- data/spec/vcr/request_matcher_registry_spec.rb +0 -26
- data/spec/vcr/structs_spec.rb +61 -1
- data/spec/vcr/test_frameworks/rspec_spec.rb +32 -0
- data/spec/vcr/util/hooks_spec.rb +73 -63
- data/spec/vcr_spec.rb +2 -2
- data/vcr.gemspec +5 -5
- metadata +51 -31
- data/features/configuration/hooks.feature +0 -270
- data/features/configuration/ignore_hosts.feature +0 -61
- data/features/configuration/ignore_localhost.feature +0 -97
@@ -42,8 +42,10 @@ module VCR
|
|
42
42
|
case
|
43
43
|
when @major < @min_major then :too_low
|
44
44
|
when @major > @max_major then :too_high
|
45
|
+
when @major > @min_major then :ok
|
45
46
|
when @minor < @min_minor then :too_low
|
46
47
|
when @minor > @max_minor then :too_high
|
48
|
+
when @minor > @min_minor then :ok
|
47
49
|
when @patch < @min_patch then :too_low
|
48
50
|
end
|
49
51
|
end
|
data/lib/vcr/version.rb
CHANGED
File without changes
|
data/spec/monkey_patches.rb
CHANGED
@@ -40,7 +40,7 @@ module MonkeyPatches
|
|
40
40
|
def disable_all!
|
41
41
|
realias_all :without_monkeypatches
|
42
42
|
|
43
|
-
if defined?(::WebMock)
|
43
|
+
if defined?(::WebMock::HttpLibAdapters)
|
44
44
|
::WebMock::HttpLibAdapters::NetHttpAdapter.disable!
|
45
45
|
::WebMock::HttpLibAdapters::TyphoeusAdapter.disable! if defined?(::Typhoeus)
|
46
46
|
::WebMock::CallbackRegistry.reset
|
data/spec/spec_helper.rb
CHANGED
@@ -25,12 +25,13 @@ module VCR
|
|
25
25
|
end
|
26
26
|
|
27
27
|
RSpec.configure do |config|
|
28
|
+
config.order = :rand
|
28
29
|
config.color_enabled = true
|
29
30
|
config.debug = (using_git && RUBY_INTERPRETER == :mri && !%w[ 1.9.3 ].include?(RUBY_VERSION) && !ENV['CI'])
|
30
31
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
31
32
|
|
32
33
|
tmp_dir = File.expand_path('../../tmp/cassette_library_dir', __FILE__)
|
33
|
-
config.before(:each) do
|
34
|
+
config.before(:each, :skip_vcr_reset => lambda { |v| v != true }) do
|
34
35
|
VCR.reset!
|
35
36
|
VCR.configuration.cassette_library_dir = tmp_dir
|
36
37
|
end
|
@@ -54,3 +55,4 @@ RSpec.configure do |config|
|
|
54
55
|
config.alias_it_should_behave_like_to :it_performs, 'it performs'
|
55
56
|
end
|
56
57
|
|
58
|
+
VCR::SinatraApp.boot
|
@@ -156,7 +156,7 @@ HTTP_LIBRARY_ADAPTERS['typhoeus'] = Module.new do
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def normalize_request_headers(headers)
|
159
|
-
headers
|
159
|
+
headers
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
@@ -172,7 +172,9 @@ HTTP_LIBRARY_ADAPTERS['excon'] = Module.new do
|
|
172
172
|
end
|
173
173
|
|
174
174
|
def make_http_request(method, url, body = nil, headers = {})
|
175
|
-
Excon
|
175
|
+
# There are multiple ways to use Excon but this is how fog (the main user of excon) uses it:
|
176
|
+
# https://github.com/fog/fog/blob/v1.1.1/lib/fog/aws/rds.rb#L139-147
|
177
|
+
Excon::Connection.new(url).request(:method => method.to_s.upcase, :body => body, :headers => headers)
|
176
178
|
end
|
177
179
|
|
178
180
|
def normalize_request_headers(headers)
|
@@ -219,7 +221,6 @@ end
|
|
219
221
|
|
220
222
|
def faraday_connection(url_root)
|
221
223
|
Faraday::Connection.new(:url => url_root) do |builder|
|
222
|
-
builder.use VCR::Middleware::Faraday
|
223
224
|
builder.adapter faraday_adapter
|
224
225
|
end
|
225
226
|
end
|
@@ -1,14 +1,10 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
|
3
|
-
NET_CONNECT_NOT_ALLOWED_ERROR = /
|
3
|
+
NET_CONNECT_NOT_ALLOWED_ERROR = /An HTTP request has been made that VCR does not know how to handle/
|
4
4
|
|
5
|
-
shared_examples_for "a hook into an HTTP library" do |library, *other|
|
5
|
+
shared_examples_for "a hook into an HTTP library" do |library_hook_name, library, *other|
|
6
6
|
include HeaderDowncaser
|
7
|
-
|
8
|
-
def interactions_from(file)
|
9
|
-
hashes = YAML.load_file(File.join(VCR::SPEC_ROOT, 'fixtures', file))['http_interactions']
|
10
|
-
hashes.map { |h| VCR::HTTPInteraction.from_hash(h) }
|
11
|
-
end
|
7
|
+
include VCRStubHelpers
|
12
8
|
|
13
9
|
unless adapter_module = HTTP_LIBRARY_ADAPTERS[library]
|
14
10
|
raise ArgumentError.new("No http library adapter module could be found for #{library}")
|
@@ -19,10 +15,6 @@ shared_examples_for "a hook into an HTTP library" do |library, *other|
|
|
19
15
|
describe "using #{adapter_module.http_library_name}", :unless => http_lib_unsupported do
|
20
16
|
include adapter_module
|
21
17
|
|
22
|
-
def stub_requests(*args)
|
23
|
-
VCR.stub(:http_interactions => VCR::Cassette::HTTPInteractionList.new(*args))
|
24
|
-
end
|
25
|
-
|
26
18
|
# Necessary for ruby 1.9.2. On 1.9.2 we get an error when we use super,
|
27
19
|
# so this gives us another alias we can use for the original method.
|
28
20
|
alias make_request make_http_request
|
@@ -117,6 +109,196 @@ shared_examples_for "a hook into an HTTP library" do |library, *other|
|
|
117
109
|
test_playback "with an encoded ampersand", "http://example.com:80/search?q=#{CGI.escape("Q&A")}"
|
118
110
|
end
|
119
111
|
|
112
|
+
describe "using the library's stubbing/disconnection APIs" do
|
113
|
+
let!(:request_url) { "http://localhost:#{VCR::SinatraApp.port}/foo" }
|
114
|
+
|
115
|
+
if method_defined?(:disable_real_connections)
|
116
|
+
it 'can make a real request when VCR is turned off' do
|
117
|
+
enable_real_connections
|
118
|
+
VCR.turn_off!
|
119
|
+
get_body_string(make_http_request(:get, request_url)).should eq("FOO!")
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'does not mess with VCR when real connections are disabled' do
|
123
|
+
VCR.insert_cassette('example')
|
124
|
+
disable_real_connections
|
125
|
+
|
126
|
+
VCR.should_receive(:record_http_interaction) do |interaction|
|
127
|
+
interaction.request.uri.should eq(request_url)
|
128
|
+
end
|
129
|
+
|
130
|
+
make_http_request(:get, request_url)
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'can disable real connections when VCR is turned off' do
|
134
|
+
VCR.turn_off!
|
135
|
+
expected_error = disable_real_connections
|
136
|
+
|
137
|
+
expect {
|
138
|
+
make_http_request(:get, request_url)
|
139
|
+
}.to raise_error(expected_error)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
if method_defined?(:directly_stub_request)
|
144
|
+
it 'can directly stub the request when VCR is turned off' do
|
145
|
+
VCR.turn_off!
|
146
|
+
directly_stub_request(:get, request_url, "stubbed response")
|
147
|
+
get_body_string(make_http_request(:get, request_url)).should eq("stubbed response")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "request hooks" do
|
153
|
+
context 'when there is an around_http_request hook' do
|
154
|
+
before(:each) do
|
155
|
+
# ensure that all the other library hooks are disabled so that we don't
|
156
|
+
# get double-hookage (such as for WebMock and Typhoeus both invoking the
|
157
|
+
# hooks for a typhoeus request)
|
158
|
+
VCR.library_hooks.stub(:disabled?) { |lib_name| lib_name != library_hook_name }
|
159
|
+
end
|
160
|
+
|
161
|
+
let(:request_url) { "http://localhost:#{VCR::SinatraApp.port}/foo" }
|
162
|
+
|
163
|
+
it 'yields the request to the block' do
|
164
|
+
yielded_request = nil
|
165
|
+
VCR.configuration.around_http_request do |request|
|
166
|
+
yielded_request = request
|
167
|
+
request.proceed
|
168
|
+
end
|
169
|
+
|
170
|
+
VCR.use_cassette('new_cassette') do
|
171
|
+
make_http_request(:get, request_url)
|
172
|
+
end
|
173
|
+
|
174
|
+
yielded_request.method.should eq(:get)
|
175
|
+
yielded_request.uri.should eq(request_url)
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'can be used to use a cassette for a request' do
|
179
|
+
VCR.configuration.around_http_request do |request|
|
180
|
+
VCR.use_cassette('new_cassette', &request)
|
181
|
+
end
|
182
|
+
|
183
|
+
VCR.should_receive(:record_http_interaction) do
|
184
|
+
VCR.current_cassette.name.should eq('new_cassette')
|
185
|
+
end
|
186
|
+
|
187
|
+
VCR.current_cassette.should be_nil
|
188
|
+
make_http_request(:get, request_url)
|
189
|
+
VCR.current_cassette.should be_nil
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'nests them inside each other, making the first declared hook the outermost' do
|
193
|
+
order = []
|
194
|
+
|
195
|
+
VCR.configure do |c|
|
196
|
+
c.ignore_request { |r| true }
|
197
|
+
c.around_http_request do |request|
|
198
|
+
order << :before_1
|
199
|
+
request.proceed
|
200
|
+
order << :after_1
|
201
|
+
end
|
202
|
+
|
203
|
+
c.around_http_request do |request|
|
204
|
+
order << :before_2
|
205
|
+
request.proceed
|
206
|
+
order << :after_2
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
make_http_request(:get, request_url)
|
211
|
+
|
212
|
+
order.should eq([:before_1, :before_2, :after_2, :after_1])
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'raises an appropriate error if the hook does not call request.proceed' do
|
216
|
+
VCR.configuration.ignore_request { |r| true }
|
217
|
+
hook_declaration = "#{__FILE__}:#{__LINE__ + 1}"
|
218
|
+
VCR.configuration.around_http_request { |r| }
|
219
|
+
|
220
|
+
expect {
|
221
|
+
make_http_request(:get, request_url)
|
222
|
+
}.to raise_error { |error|
|
223
|
+
error.message.should include('must call #proceed on the yielded request')
|
224
|
+
error.message.should include(hook_declaration)
|
225
|
+
}
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'does not get a dead fiber error when multiple requests are made' do
|
229
|
+
VCR.configuration.around_http_request do |request|
|
230
|
+
VCR.use_cassette('new_cassette', &request)
|
231
|
+
end
|
232
|
+
|
233
|
+
3.times { make_http_request(:get, request_url) }
|
234
|
+
end
|
235
|
+
end if RUBY_VERSION >= '1.9'
|
236
|
+
|
237
|
+
context "when the request is ignored" do
|
238
|
+
before(:each) do
|
239
|
+
VCR.configuration.ignore_request { |r| true }
|
240
|
+
end
|
241
|
+
|
242
|
+
it_behaves_like "request hooks", library_hook_name
|
243
|
+
end
|
244
|
+
|
245
|
+
context 'when the request is recorded' do
|
246
|
+
let!(:inserted_cassette) { VCR.insert_cassette('new_cassette') }
|
247
|
+
|
248
|
+
it_behaves_like "request hooks", library_hook_name do
|
249
|
+
let(:string_in_cassette) { 'example.com get response 1 with path=foo' }
|
250
|
+
|
251
|
+
it 'plays back the cassette when a request is made' do
|
252
|
+
VCR.eject_cassette
|
253
|
+
VCR.configure do |c|
|
254
|
+
c.cassette_library_dir = File.join(VCR::SPEC_ROOT, 'fixtures')
|
255
|
+
c.before_http_request do |request|
|
256
|
+
VCR.insert_cassette('fake_example_responses', :record => :none)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
get_body_string(make_http_request(:get, 'http://example.com/foo')).should eq(string_in_cassette)
|
260
|
+
end
|
261
|
+
|
262
|
+
specify 'the after_http_request hook can be used to eject a cassette after the request is recorded' do
|
263
|
+
VCR.configuration.after_http_request { |request| VCR.eject_cassette }
|
264
|
+
|
265
|
+
VCR.should_receive(:record_http_interaction) do |interaction|
|
266
|
+
VCR.current_cassette.should be(inserted_cassette)
|
267
|
+
end
|
268
|
+
|
269
|
+
make_request
|
270
|
+
VCR.current_cassette.should be_nil
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
context 'when a stubbed response is played back for the request' do
|
276
|
+
before(:each) do
|
277
|
+
stub_requests([http_interaction(request_url)], [:method, :uri])
|
278
|
+
end
|
279
|
+
|
280
|
+
it_behaves_like "request hooks", library_hook_name
|
281
|
+
end
|
282
|
+
|
283
|
+
context 'when the request is not allowed' do
|
284
|
+
it_behaves_like "request hooks", library_hook_name do
|
285
|
+
undef assert_expected_response
|
286
|
+
def assert_expected_response(response)
|
287
|
+
response.should be_nil
|
288
|
+
end
|
289
|
+
|
290
|
+
undef make_request
|
291
|
+
def make_request(disabled = false)
|
292
|
+
if disabled
|
293
|
+
make_http_request(:get, request_url)
|
294
|
+
else
|
295
|
+
expect { make_http_request(:get, request_url) }.to raise_error(NET_CONNECT_NOT_ALLOWED_ERROR)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
120
302
|
describe '.stub_requests using specific match_attributes' do
|
121
303
|
before(:each) { VCR.stub(:real_http_connections_allowed? => false) }
|
122
304
|
let(:interactions) { interactions_from('match_requests_on.yml') }
|
@@ -277,7 +459,7 @@ shared_examples_for "a hook into an HTTP library" do |library, *other|
|
|
277
459
|
end
|
278
460
|
|
279
461
|
context 'when some requests are stubbed' do
|
280
|
-
let(:interactions) { interactions_from('
|
462
|
+
let(:interactions) { interactions_from('fake_example_responses.yml') }
|
281
463
|
before(:each) do
|
282
464
|
stub_requests(interactions, VCR::RequestMatcherRegistry::DEFAULT_MATCHERS)
|
283
465
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
shared_examples_for "request hooks" do |library_hook_name|
|
2
|
+
let(:request_url) { "http://localhost:#{VCR::SinatraApp.port}/foo" }
|
3
|
+
|
4
|
+
before(:each) do
|
5
|
+
# ensure that all the other library hooks are disabled so that we don't
|
6
|
+
# get double-hookage (such as for WebMock and Typhoeus both invoking the
|
7
|
+
# hooks for a typhoeus request)
|
8
|
+
VCR.library_hooks.stub(:disabled?) { |lib_name| lib_name != library_hook_name }
|
9
|
+
end
|
10
|
+
|
11
|
+
def make_request(disabled = false)
|
12
|
+
make_http_request(:get, request_url)
|
13
|
+
end
|
14
|
+
|
15
|
+
def assert_expected_response(response)
|
16
|
+
response.status.code.should eq(200)
|
17
|
+
response.body.should eq('FOO!')
|
18
|
+
end
|
19
|
+
|
20
|
+
[:before_http_request, :after_http_request].each do |hook|
|
21
|
+
specify "the #{hook} hook is only called once per request" do
|
22
|
+
call_count = 0
|
23
|
+
VCR.configuration.send(hook) { |r| call_count += 1 }
|
24
|
+
|
25
|
+
make_request
|
26
|
+
call_count.should eq(1)
|
27
|
+
end
|
28
|
+
|
29
|
+
specify "the #{hook} hook yields the request" do
|
30
|
+
request = nil
|
31
|
+
VCR.configuration.send(hook) { |r| request = r }
|
32
|
+
|
33
|
+
make_request
|
34
|
+
request.method.should be(:get)
|
35
|
+
request.uri.should eq(request_url)
|
36
|
+
end
|
37
|
+
|
38
|
+
specify "the #{hook} hook is not called if the library hook is disabled" do
|
39
|
+
VCR.library_hooks.should respond_to(:disabled?)
|
40
|
+
VCR.library_hooks.stub(:disabled? => true)
|
41
|
+
|
42
|
+
hook_called = false
|
43
|
+
VCR.configuration.send(hook) { |r| hook_called = true }
|
44
|
+
|
45
|
+
make_request(:disabled)
|
46
|
+
hook_called.should be_false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
specify "the after_http_request hook yields the response if there is one and the second block arg is given" do
|
51
|
+
response = nil
|
52
|
+
VCR.configuration.after_http_request { |req, res| response = res }
|
53
|
+
|
54
|
+
make_request
|
55
|
+
assert_expected_response(response)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -1,6 +1,11 @@
|
|
1
1
|
shared_examples_for "version checking" do |library, options|
|
2
2
|
file = options[:file] || "vcr/library_hooks/#{library.downcase}.rb"
|
3
3
|
|
4
|
+
before(:each) do
|
5
|
+
# ensure we don't get double callback registration by reloading the file...
|
6
|
+
stub_callback_registration if respond_to?(:stub_callback_registration)
|
7
|
+
end
|
8
|
+
|
4
9
|
context 'when loading the library hook file', :disable_warnings => true do
|
5
10
|
options[:valid].each do |version|
|
6
11
|
it "does nothing when #{library}'s version is #{version}" do
|
data/spec/support/sinatra_app.rb
CHANGED
@@ -40,20 +40,28 @@ module VCR
|
|
40
40
|
"Response #{$record_and_playback_response_count += 1}"
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
post '/record-and-playback' do
|
44
|
+
"Response #{$record_and_playback_response_count += 1}"
|
45
45
|
end
|
46
46
|
|
47
47
|
@_boot_failed = false
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
raise
|
49
|
+
class << self
|
50
|
+
def port
|
51
|
+
server.port
|
52
|
+
end
|
53
|
+
|
54
|
+
def server
|
55
|
+
raise "Sinatra app failed to boot." if @_boot_failed
|
56
|
+
@server ||= begin
|
57
|
+
VCR::LocalhostServer.new(new)
|
58
|
+
rescue
|
59
|
+
@_boot_failed = true
|
60
|
+
raise
|
61
|
+
end
|
56
62
|
end
|
63
|
+
|
64
|
+
alias boot server
|
57
65
|
end
|
58
66
|
end
|
59
67
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module VCRStubHelpers
|
2
|
+
def interactions_from(file)
|
3
|
+
hashes = YAML.load_file(File.join(VCR::SPEC_ROOT, 'fixtures', file))['http_interactions']
|
4
|
+
hashes.map { |h| VCR::HTTPInteraction.from_hash(h) }
|
5
|
+
end
|
6
|
+
|
7
|
+
def stub_requests(*args)
|
8
|
+
VCR.stub(:http_interactions => VCR::Cassette::HTTPInteractionList.new(*args))
|
9
|
+
end
|
10
|
+
|
11
|
+
def http_interaction(url, response_body = "FOO!", status_code = 200)
|
12
|
+
request = VCR::Request.new(:get, request_url)
|
13
|
+
response_status = VCR::ResponseStatus.new(status_code)
|
14
|
+
response = VCR::Response.new(response_status, nil, response_body, '1.1')
|
15
|
+
VCR::HTTPInteraction.new(request, response)
|
16
|
+
end
|
17
|
+
end
|