vcr 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/CHANGELOG.md +14 -2
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +20 -2
  4. data/README.md +6 -1
  5. data/Rakefile +6 -44
  6. data/benchmarks/http_stubbing_libraries.rb +4 -4
  7. data/cucumber.yml +14 -0
  8. data/features/README.md +21 -0
  9. data/features/cassettes/automatic_re_recording.feature +68 -0
  10. data/features/cassettes/dynamic_erb.feature +90 -0
  11. data/features/cassettes/format.feature +81 -0
  12. data/features/cassettes/no_cassette.feature +38 -0
  13. data/features/cassettes/record_modes/all.feature +78 -0
  14. data/features/cassettes/record_modes/new_episodes.feature +71 -0
  15. data/features/cassettes/record_modes/none.feature +65 -0
  16. data/features/cassettes/request_matching.feature +379 -0
  17. data/features/configuration/cassette_library_dir.feature +28 -0
  18. data/features/configuration/default_cassette_options.feature +80 -0
  19. data/features/configuration/ignore_localhost.feature +103 -0
  20. data/features/configuration/stub_with.feature +164 -0
  21. data/features/http_libraries/net_http.feature +137 -0
  22. data/features/step_definitions/cli_steps.rb +82 -0
  23. data/features/support/aruba_workaround/aruba_patches.rb +36 -0
  24. data/features/support/aruba_workaround/background_process.rb +4 -0
  25. data/features/support/env.rb +16 -102
  26. data/features/support/http_lib_filters.rb +37 -0
  27. data/features/support/vcr_cucumber_helpers.rb +34 -0
  28. data/features/test_frameworks/cucumber.feature +109 -0
  29. data/features/test_frameworks/rspec.feature +110 -0
  30. data/features/test_frameworks/shoulda.feature +64 -0
  31. data/features/test_frameworks/test_unit.feature +46 -0
  32. data/lib/vcr/cassette.rb +1 -1
  33. data/lib/vcr/structs.rb +64 -13
  34. data/lib/vcr/version.rb +1 -1
  35. data/{FullBuildRakeFile → script/FullBuildRakeFile} +0 -0
  36. data/script/full_build +1 -0
  37. data/spec/extensions/net_http_spec.rb +1 -1
  38. data/spec/spec_helper.rb +1 -1
  39. data/spec/structs_spec.rb +47 -16
  40. data/spec/support/vcr_localhost_server.rb +11 -5
  41. data/vcr.gemspec +2 -1
  42. metadata +82 -77
  43. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/regex_cassette.yml +0 -43
  44. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette1.yml +0 -43
  45. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette2.yml +0 -63
  46. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette3.yml +0 -85
  47. data/features/fixtures/vcr_cassettes/1.9.1/erb_cassette.yml +0 -36
  48. data/features/fixtures/vcr_cassettes/1.9.1/match_requests_on.yml +0 -35
  49. data/features/fixtures/vcr_cassettes/1.9.1/nested_replay_cassette.yml +0 -32
  50. data/features/fixtures/vcr_cassettes/1.9.1/not_the_real_response.yml +0 -43
  51. data/features/fixtures/vcr_cassettes/1.9.1/record_all.yml +0 -62
  52. data/features/fixtures/vcr_cassettes/1.9.1/replay_localhost_cassette.yml +0 -32
  53. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/regex_cassette.yml +0 -43
  54. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/replay_cassette1.yml +0 -43
  55. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/replay_cassette2.yml +0 -47
  56. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/replay_cassette3.yml +0 -85
  57. data/features/fixtures/vcr_cassettes/not_1.9.1/erb_cassette.yml +0 -36
  58. data/features/fixtures/vcr_cassettes/not_1.9.1/match_requests_on.yml +0 -35
  59. data/features/fixtures/vcr_cassettes/not_1.9.1/nested_replay_cassette.yml +0 -24
  60. data/features/fixtures/vcr_cassettes/not_1.9.1/not_the_real_response.yml +0 -43
  61. data/features/fixtures/vcr_cassettes/not_1.9.1/record_all.yml +0 -61
  62. data/features/fixtures/vcr_cassettes/not_1.9.1/replay_localhost_cassette.yml +0 -32
  63. data/features/http_client.feature +0 -16
  64. data/features/net_http.feature +0 -38
  65. data/features/record_response.feature +0 -95
  66. data/features/replay_recorded_response.feature +0 -96
  67. data/features/rspec.feature +0 -100
  68. data/features/step_definitions/http_client_steps.rb +0 -7
  69. data/features/step_definitions/net_http_steps.rb +0 -49
  70. data/features/step_definitions/vcr_steps.rb +0 -252
  71. data/features/webmock.feature +0 -26
  72. data/full_build +0 -1
@@ -1,14 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.2 (November 16, 2010)
4
+
5
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.3.1...v1.3.2)
6
+
7
+ * Fix serialized structs so that they are normalized andthey will be the same
8
+ regardless of which HTTP library made the request.
9
+ * Status "OK " => "OK"
10
+ * Body '' => nil
11
+ * Headers {} => nil
12
+ * Remove extraneous headers added by the HTTP lib (i.e. Typhoeus user agent)
13
+ * Rewrite cucumber features in a more documentation-oriented style.
14
+
3
15
  ## 1.3.1 (November 11, 2010)
4
16
 
5
- [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.3.0...v.1.3.1)
17
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.3.0...v1.3.1)
6
18
 
7
19
  * Update WebMock adapter to work with (and require) newly released WebMock 1.6.0.
8
20
 
9
21
  ## 1.3.0 (November 11, 2010)
10
22
 
11
- [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.2.0...v.1.3.0)
23
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.2.0...v1.3.0)
12
24
 
13
25
  * Moved documentation from README to [Wiki](http://github.com/myronmarston/vcr/wiki).
14
26
  * Refactoring and code cleanup.
data/Gemfile CHANGED
@@ -13,11 +13,14 @@ group :development do
13
13
  platforms :jruby do
14
14
  gem 'jruby-openssl'
15
15
  end
16
+
17
+ gem 'shoulda'
16
18
  end
17
19
 
18
20
  # Additional gems that are useful, but not required for development.
19
21
  group :extras do
20
22
  gem 'guard-rspec'
23
+ gem 'relish'
21
24
 
22
25
  platforms :mri do
23
26
  gem 'rcov'
@@ -1,14 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vcr (1.3.1)
4
+ vcr (1.3.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
9
  addressable (2.2.2)
10
10
  archive-tar-minitar (0.5.2)
11
- aruba (0.2.1)
11
+ aruba (0.2.4)
12
+ background_process
13
+ cucumber (~> 0.9.3)
14
+ background_process (1.2)
12
15
  bouncy-castle-java (1.5.0145.2)
13
16
  builder (2.1.2)
14
17
  columnize (0.3.1)
@@ -49,6 +52,7 @@ GEM
49
52
  linecache (0.43)
50
53
  linecache19 (0.5.11)
51
54
  ruby_core_source (>= 0.1.4)
55
+ mime-types (1.16)
52
56
  open_gem (1.4.2)
53
57
  launchy (~> 0.3.5)
54
58
  patron (0.4.9)
@@ -56,6 +60,12 @@ GEM
56
60
  rake (0.8.7)
57
61
  rb-fsevent (0.3.6)
58
62
  rcov (0.9.9)
63
+ relish (0.1.1)
64
+ archive-tar-minitar (~> 0.5.2)
65
+ json (~> 1.4.6)
66
+ rest-client (~> 1.6.1)
67
+ rest-client (1.6.1)
68
+ mime-types (>= 1.16)
59
69
  rspec (2.1.0)
60
70
  rspec-core (~> 2.1.0)
61
71
  rspec-expectations (~> 2.1.0)
@@ -79,8 +89,13 @@ GEM
79
89
  ruby-debug-base19 (>= 0.11.19)
80
90
  ruby_core_source (0.1.4)
81
91
  archive-tar-minitar (>= 0.5.2)
92
+ shoulda (2.9.2)
93
+ sinatra (1.1.0)
94
+ rack (~> 1.1)
95
+ tilt (~> 1.1)
82
96
  term-ansicolor (1.0.5)
83
97
  thor (0.14.4)
98
+ tilt (1.1)
84
99
  timecop (0.3.5)
85
100
  typhoeus (0.2.0)
86
101
  webmock (1.6.0)
@@ -106,10 +121,13 @@ DEPENDENCIES
106
121
  rake (~> 0.8.7)
107
122
  rb-fsevent
108
123
  rcov
124
+ relish
109
125
  rspec (~> 2.1.0)
110
126
  ruby-debug
111
127
  ruby-debug-base19 (= 0.11.23)
112
128
  ruby-debug19
129
+ shoulda
130
+ sinatra (~> 1.1.0)
113
131
  timecop (~> 0.3.5)
114
132
  typhoeus (~> 0.2.0)
115
133
  vcr!
data/README.md CHANGED
@@ -53,7 +53,12 @@ maintenance) and accurate (the response from example.com will contain the same h
53
53
 
54
54
  ## Usage
55
55
 
56
- Visit the [wiki](http://github.com/myronmarston/vcr/wiki) for usage info and documentation.
56
+ Browse the [cucumber features](http://relishapp.com/myronmarston/vcr) or visit
57
+ the [wiki](http://github.com/myronmarston/vcr/wiki) for usage info and
58
+ documentation.
59
+
60
+ The [VCR talk given at Philly.rb](http://philly-rb-vcr-talk.heroku.com/) also
61
+ contains good usage info.
57
62
 
58
63
  ## Development
59
64
 
data/Rakefile CHANGED
@@ -4,9 +4,6 @@ Bundler::GemHelper.install_tasks
4
4
 
5
5
  require 'rake'
6
6
  require "rspec/core/rake_task"
7
- $LOAD_PATH.unshift 'spec'
8
-
9
- require 'support/ruby_interpreter'
10
7
 
11
8
  RSpec::Core::RakeTask.new(:spec) do |t|
12
9
  #t.rspec_opts = %w[--format documentation]
@@ -22,50 +19,15 @@ task :cleanup_rcov_files do
22
19
  rm_rf 'coverage.data'
23
20
  end
24
21
 
25
- permutations = {
26
- 'fakeweb' => %w( net/http typhoeus ),
27
- 'typhoeus' => %w( typhoeus ),
28
- 'webmock' => %w( net/http typhoeus httpclient patron em-http-request curb )
29
- }
30
-
31
- permutations.delete('typhoeus') if RUBY_INTERPRETER == :jruby
32
-
33
22
  require 'cucumber/rake/task'
34
- namespace :features do
35
- permutations.each do |http_stubbing_adapter, http_libraries|
36
- features_subtasks = []
37
-
38
- namespace http_stubbing_adapter do
39
- http_libraries.each do |http_lib|
40
- next if RUBY_INTERPRETER != :mri && %w( patron em-http-request curb ).include?(http_lib)
41
- next if RUBY_INTERPRETER == :jruby && http_lib == 'typhoeus'
23
+ Cucumber::Rake::Task.new
42
24
 
43
- sanitized_http_lib = http_lib.gsub('/', '_')
44
- features_subtasks << "features:#{http_stubbing_adapter}:#{sanitized_http_lib}"
25
+ task :default => [:spec, :cucumber]
45
26
 
46
- task "#{sanitized_http_lib}_prep" do
47
- ENV['HTTP_STUBBING_ADAPTER'] = http_stubbing_adapter
48
- ENV['HTTP_LIB'] = http_lib
49
- end
50
-
51
- Cucumber::Rake::Task.new(
52
- { sanitized_http_lib => "#{features_subtasks.last}_prep" },
53
- "Run the features using #{http_stubbing_adapter} and #{http_lib}") do |t|
54
- t.cucumber_opts = ['--format', 'progress', '--tags', "@#{http_stubbing_adapter},@all_http_libs,@#{sanitized_http_lib}"]
55
-
56
- # disable scenarios on heroku that can't pass due to heroku's restrictions
57
- t.cucumber_opts += ['--tags', '~@spawns_localhost_server'] if ENV.keys.include?('HEROKU_SLUG')
58
- end
59
- end
60
- end
61
-
62
- desc "Run the features using #{http_stubbing_adapter} and each of #{http_stubbing_adapter}'s supported http libraries"
63
- task http_stubbing_adapter => features_subtasks
64
- end
27
+ desc "Push cukes to relishapp using the relish-client-gem"
28
+ task :relish do
29
+ sh "relish push vcr"
65
30
  end
66
31
 
67
- desc "Run the features using each supported permutation of http stubbing library and http library."
68
- task :features => permutations.keys.map { |a| "features:#{a}" }
69
-
70
- task :default => [:spec, :features]
32
+ task :release => :relish
71
33
 
@@ -50,10 +50,10 @@ end
50
50
  # Output on my machine:
51
51
  #
52
52
  # Benchmarking Single setup/teardown:
53
- # webmock 0.000000 0.000000 5.870000 ( 6.211840)
54
- # fakeweb 0.000000 0.000000 1.840000 ( 1.940935)
53
+ # webmock 0.000000 0.000000 8.500000 ( 8.559143)
54
+ # fakeweb 0.000000 0.000000 1.900000 ( 1.967160)
55
55
  #
56
56
  #
57
57
  # Benchmarking Setup/teardown for each http request:
58
- # webmock 0.000000 0.000000 7.710000 ( 7.776178)
59
- # fakeweb 0.000000 0.000000 2.410000 ( 2.420550)
58
+ # webmock 0.000000 0.000000 9.710000 ( 9.764760)
59
+ # fakeweb 0.000000 0.000000 2.470000 ( 2.479292)
@@ -0,0 +1,14 @@
1
+ <%
2
+ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
+ rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} --strict --tags ~@wip"
5
+ interp_opts = if RUBY_PLATFORM == 'java'
6
+ ' --tags ~@exclude-jruby'
7
+ else
8
+ ''
9
+ end
10
+ %>
11
+ default: <%= std_opts %><%= interp_opts %> features
12
+ wip: --tags @wip:30 --wip features
13
+ rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip<%= interp_opts %>
14
+
@@ -0,0 +1,21 @@
1
+ ## VCR
2
+
3
+ The cucumber features provided here demonstrate all of the major features of
4
+ VCR. These features are executable documentation for VCR.
5
+
6
+ Many of the examples use one (or both) of these helper functions
7
+ provided by `vcr_cucumber_helpers.rb`:
8
+
9
+ * `start_sinatra_app`: starts a sinatra application on the given port.
10
+ The server automatically shuts down when the ruby script ends. Many
11
+ examples re-run the script without the sinatra server to demonstrate
12
+ the replaying of a recorded HTTP response.
13
+ * `include_http_adapter_for`: includes a module that implements a common
14
+ HTTP interface for the given HTTP library. The `response_body_for`
15
+ method will make an HTTP request using the given this library. This
16
+ allows scenarios to be run against each different supported HTTP
17
+ library.
18
+
19
+ If you have ideas to clarify or improve any of these cucumber features,
20
+ please submit an [issue](https://github.com/myronmarston/vcr/issues) or
21
+ pull request.
@@ -0,0 +1,68 @@
1
+ Feature: Automatic Re-recording
2
+
3
+ Over time, your cassettes may get out-of-date. APIs change and sites you
4
+ scrape get updated. VCR provides a facility to automatically re-record your
5
+ cassettes. Enable re-recording using the :re_record_interval option.
6
+
7
+ The value provided should be an interval (expressed in seconds) that
8
+ determines how often VCR will re-record the cassette. When a cassette
9
+ is used, VCR checks the file modification time; if more time than the
10
+ interval has passed, VCR will use the :all record mode to cause it be
11
+ re-recorded.
12
+
13
+ Background:
14
+ Given a previously recorded cassette file "cassettes/example.yml" with:
15
+ """
16
+ ---
17
+ - !ruby/struct:VCR::HTTPInteraction
18
+ request: !ruby/struct:VCR::Request
19
+ method: :get
20
+ uri: http://localhost:7777/
21
+ body:
22
+ headers:
23
+ response: !ruby/struct:VCR::Response
24
+ status: !ruby/struct:VCR::ResponseStatus
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ content-length:
29
+ - "12"
30
+ body: Old Response
31
+ http_version: "1.1"
32
+ """
33
+ And a file named "re_record.rb" with:
34
+ """
35
+ require 'vcr_cucumber_helpers'
36
+
37
+ start_sinatra_app(:port => 7777) do
38
+ get('/') { 'New Response' }
39
+ end
40
+
41
+ require 'vcr'
42
+
43
+ VCR.config do |c|
44
+ c.stub_with :fakeweb
45
+ c.cassette_library_dir = 'cassettes'
46
+ end
47
+
48
+ VCR.use_cassette('example', :record => :new_episodes, :re_record_interval => 7.days) do
49
+ puts Net::HTTP.get_response('localhost', '/', 7777).body
50
+ end
51
+ """
52
+
53
+ Scenario: Cassette is not re-recorded when not enough time has passed
54
+ Given 6 days have passed since the cassette was recorded
55
+ When I run "ruby re_record.rb"
56
+ Then the output should contain "Old Response"
57
+ But the output should not contain "New Response"
58
+ And the file "cassettes/example.yml" should contain "body: Old Response"
59
+ But the file "cassettes/example.yml" should not contain "body: New Response"
60
+
61
+ Scenario: Cassette is re-recorded when enough time has passed
62
+ Given 8 days have passed since the cassette was recorded
63
+ When I run "ruby re_record.rb"
64
+ Then the output should contain "New Response"
65
+ But the output should not contain "Old Response"
66
+ And the file "cassettes/example.yml" should contain "body: New Response"
67
+ But the file "cassettes/example.yml" should not contain "body: Old Response"
68
+
@@ -0,0 +1,90 @@
1
+ Feature: Dynamic ERB cassettes
2
+
3
+ By default, cassettes are static: the exact response that was received
4
+ when the cassette was recorded will be replayed for all future requests.
5
+ Usually, this is fine, but in some cases you need something more dynamic.
6
+ You can use ERB for this.
7
+
8
+ To enable ERB evaluation of a cassette, pass the `:erb => true` option
9
+ to a cassette. If you want to pass variables to the cassette, you can
10
+ pass the names and values of the variables in a hash (`:erb => { ... }`).
11
+
12
+ Scenario: Enable dynamic ERB cassette evalutation using :erb => true
13
+ Given a previously recorded cassette file "cassettes/dynamic.yml" with:
14
+ """
15
+ ---
16
+ - !ruby/struct:VCR::HTTPInteraction
17
+ request: !ruby/struct:VCR::Request
18
+ method: :get
19
+ uri: http://example.com:80/foo?a=<%= 'b' * 3 %>
20
+ body:
21
+ headers:
22
+ response: !ruby/struct:VCR::Response
23
+ status: !ruby/struct:VCR::ResponseStatus
24
+ code: 200
25
+ message: OK
26
+ headers:
27
+ content-type:
28
+ - text/html;charset=utf-8
29
+ content-length:
30
+ - "9"
31
+ body: Hello <%= 'bar'.next %>
32
+ http_version: "1.1"
33
+ """
34
+ And a file named "dynamic_erb_example.rb" with:
35
+ """
36
+ require 'vcr'
37
+
38
+ VCR.config do |c|
39
+ c.stub_with :fakeweb
40
+ c.cassette_library_dir = 'cassettes'
41
+ c.default_cassette_options = { :record => :none }
42
+ end
43
+
44
+ VCR.use_cassette('dynamic', :erb => true) do
45
+ response = Net::HTTP.get_response('example.com', '/foo?a=bbb')
46
+ puts "Response: #{response.body}"
47
+ end
48
+ """
49
+ When I run "ruby dynamic_erb_example.rb"
50
+ Then it should pass with "Response: Hello bas"
51
+
52
+ Scenario: Pass arguments to the ERB using :erb => { ... }
53
+ Given a previously recorded cassette file "cassettes/dynamic.yml" with:
54
+ """
55
+ ---
56
+ - !ruby/struct:VCR::HTTPInteraction
57
+ request: !ruby/struct:VCR::Request
58
+ method: :get
59
+ uri: http://example.com:80/foo?a=<%= arg1 %>
60
+ body:
61
+ headers:
62
+ response: !ruby/struct:VCR::Response
63
+ status: !ruby/struct:VCR::ResponseStatus
64
+ code: 200
65
+ message: OK
66
+ headers:
67
+ content-type:
68
+ - text/html;charset=utf-8
69
+ content-length:
70
+ - "9"
71
+ body: Hello <%= arg2 %>
72
+ http_version: "1.1"
73
+ """
74
+ And a file named "dynamic_erb_example.rb" with:
75
+ """
76
+ require 'vcr'
77
+
78
+ VCR.config do |c|
79
+ c.stub_with :fakeweb
80
+ c.cassette_library_dir = 'cassettes'
81
+ c.default_cassette_options = { :record => :none }
82
+ end
83
+
84
+ VCR.use_cassette('dynamic', :erb => { :arg1 => 7, :arg2 => 'baz' }) do
85
+ response = Net::HTTP.get_response('example.com', '/foo?a=7')
86
+ puts "Response: #{response.body}"
87
+ end
88
+ """
89
+ When I run "ruby dynamic_erb_example.rb"
90
+ Then it should pass with "Response: Hello baz"
@@ -0,0 +1,81 @@
1
+ Feature: Cassette format
2
+
3
+ VCR Cassettes are YAML files that contain all of the information
4
+ about the requests and corresponding responses in a
5
+ human-readable/editable format. A cassette contains an array
6
+ of HTTP interactions, each of which has the following:
7
+
8
+ * Request method, uri, body, headers
9
+ * Response status (code & message), headers, body, http version
10
+
11
+ Scenario Outline: Request/Response data is saved to disk as YAML
12
+ Given a file named "cassette_format.rb" with:
13
+ """
14
+ require 'vcr_cucumber_helpers'
15
+ include_http_adapter_for("<http_lib>")
16
+
17
+ start_sinatra_app(:port => 7777) do
18
+ get('/:path') { ARGV[0] + ' ' + params[:path] }
19
+ end
20
+
21
+ require 'vcr'
22
+
23
+ VCR.config do |c|
24
+ c.stub_with <stub_with>
25
+ c.cassette_library_dir = 'cassettes'
26
+ end
27
+
28
+ VCR.use_cassette('example', :record => :new_episodes) do
29
+ make_http_request(:get, "http://localhost:7777/foo")
30
+ make_http_request(:get, "http://localhost:7777/bar")
31
+ end
32
+ """
33
+ When I run "ruby cassette_format.rb 'Hello'"
34
+ Then the file "cassettes/example.yml" should contain YAML like:
35
+ """
36
+ ---
37
+ - !ruby/struct:VCR::HTTPInteraction
38
+ request: !ruby/struct:VCR::Request
39
+ method: :get
40
+ uri: http://localhost:7777/foo
41
+ body:
42
+ headers:
43
+ response: !ruby/struct:VCR::Response
44
+ status: !ruby/struct:VCR::ResponseStatus
45
+ code: 200
46
+ message: OK
47
+ headers:
48
+ content-type:
49
+ - text/html;charset=utf-8
50
+ content-length:
51
+ - "9"
52
+ body: Hello foo
53
+ http_version: "1.1"
54
+ - !ruby/struct:VCR::HTTPInteraction
55
+ request: !ruby/struct:VCR::Request
56
+ method: :get
57
+ uri: http://localhost:7777/bar
58
+ body:
59
+ headers:
60
+ response: !ruby/struct:VCR::Response
61
+ status: !ruby/struct:VCR::ResponseStatus
62
+ code: 200
63
+ message: OK
64
+ headers:
65
+ content-type:
66
+ - text/html;charset=utf-8
67
+ content-length:
68
+ - "9"
69
+ body: Hello bar
70
+ http_version: "1.1"
71
+ """
72
+
73
+ Examples:
74
+ | stub_with | http_lib |
75
+ | :fakeweb | net/http |
76
+ | :webmock | net/http |
77
+ | :webmock | httpclient |
78
+ | :webmock | patron |
79
+ | :webmock | curb |
80
+ | :webmock | em-http-request |
81
+ | :typhoeus | typhoeus |