vcr 2.9.3 → 3.0.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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/features/about_these_examples.md +1 -1
  3. data/features/cassettes/automatic_re_recording.feature +4 -4
  4. data/features/cassettes/decompress.feature +3 -3
  5. data/features/cassettes/exclusive.feature +11 -8
  6. data/features/cassettes/format.feature +135 -32
  7. data/features/cassettes/naming.feature +2 -2
  8. data/features/cassettes/no_cassette.feature +4 -4
  9. data/features/configuration/allow_http_connections_when_no_cassette.feature +6 -3
  10. data/features/configuration/cassette_library_dir.feature +2 -2
  11. data/features/configuration/debug_logging.feature +15 -8
  12. data/features/configuration/filter_sensitive_data.feature +8 -7
  13. data/features/configuration/hook_into.feature +8 -8
  14. data/features/configuration/ignore_request.feature +13 -14
  15. data/features/configuration/preserve_exact_body_bytes.feature +5 -5
  16. data/features/configuration/uri_parser.feature +15 -11
  17. data/features/hooks/after_http_request.feature +5 -4
  18. data/features/hooks/around_http_request.feature +3 -3
  19. data/features/hooks/before_http_request.feature +4 -2
  20. data/features/hooks/before_playback.feature +14 -15
  21. data/features/hooks/before_record.feature +10 -10
  22. data/features/http_libraries/em_http_request.feature +6 -3
  23. data/features/http_libraries/net_http.feature +15 -5
  24. data/features/middleware/faraday.feature +2 -2
  25. data/features/middleware/rack.feature +4 -4
  26. data/features/record_modes/all.feature +5 -5
  27. data/features/record_modes/new_episodes.feature +2 -2
  28. data/features/record_modes/once.feature +3 -3
  29. data/features/step_definitions/cli_steps.rb +37 -39
  30. data/features/support/env.rb +29 -26
  31. data/features/support/http_lib_filters.rb +0 -7
  32. data/features/test_frameworks/cucumber.feature +11 -10
  33. data/features/test_frameworks/rspec_macro.feature +5 -30
  34. data/features/test_frameworks/rspec_metadata.feature +9 -8
  35. data/features/test_frameworks/test_unit.feature +5 -2
  36. data/lib/vcr.rb +86 -14
  37. data/lib/vcr/cassette.rb +4 -2
  38. data/lib/vcr/cassette/serializers.rb +10 -8
  39. data/lib/vcr/cassette/serializers/compressed.rb +45 -0
  40. data/lib/vcr/configuration.rb +38 -17
  41. data/lib/vcr/library_hooks/fakeweb.rb +1 -0
  42. data/lib/vcr/library_hooks/faraday.rb +5 -1
  43. data/lib/vcr/middleware/faraday.rb +13 -9
  44. data/lib/vcr/test_frameworks/cucumber.rb +39 -5
  45. data/lib/vcr/version.rb +1 -1
  46. data/spec/acceptance/concurrency_spec.rb +51 -0
  47. data/spec/{vcr → lib/vcr}/cassette/erb_renderer_spec.rb +0 -0
  48. data/spec/{vcr → lib/vcr}/cassette/http_interaction_list_spec.rb +0 -0
  49. data/spec/{vcr → lib/vcr}/cassette/migrator_spec.rb +10 -9
  50. data/spec/{vcr → lib/vcr}/cassette/persisters/file_system_spec.rb +0 -0
  51. data/spec/{vcr → lib/vcr}/cassette/persisters_spec.rb +0 -0
  52. data/spec/{vcr → lib/vcr}/cassette/serializers_spec.rb +8 -2
  53. data/spec/{vcr → lib/vcr}/cassette_spec.rb +0 -0
  54. data/spec/{vcr → lib/vcr}/configuration_spec.rb +0 -0
  55. data/spec/{vcr → lib/vcr}/deprecations_spec.rb +0 -0
  56. data/spec/{vcr → lib/vcr}/errors_spec.rb +0 -0
  57. data/spec/{vcr → lib/vcr}/extensions/net_http_response_spec.rb +0 -0
  58. data/spec/{vcr → lib/vcr}/library_hooks/excon_spec.rb +0 -0
  59. data/spec/{vcr → lib/vcr}/library_hooks/fakeweb_spec.rb +0 -0
  60. data/spec/{vcr → lib/vcr}/library_hooks/faraday_spec.rb +0 -0
  61. data/spec/{vcr → lib/vcr}/library_hooks/typhoeus_0.4_spec.rb +0 -0
  62. data/spec/{vcr → lib/vcr}/library_hooks/typhoeus_spec.rb +0 -0
  63. data/spec/{vcr → lib/vcr}/library_hooks/webmock_spec.rb +2 -2
  64. data/spec/{vcr → lib/vcr}/library_hooks_spec.rb +0 -0
  65. data/spec/{vcr → lib/vcr}/middleware/faraday_spec.rb +0 -0
  66. data/spec/{vcr → lib/vcr}/middleware/rack_spec.rb +0 -0
  67. data/spec/{vcr → lib/vcr}/request_ignorer_spec.rb +0 -0
  68. data/spec/{vcr → lib/vcr}/request_matcher_registry_spec.rb +0 -0
  69. data/spec/{vcr → lib/vcr}/structs_spec.rb +0 -0
  70. data/spec/{vcr → lib/vcr}/test_frameworks/cucumber_spec.rb +0 -0
  71. data/spec/{vcr → lib/vcr}/test_frameworks/rspec_spec.rb +0 -0
  72. data/spec/{vcr → lib/vcr}/util/hooks_spec.rb +0 -0
  73. data/spec/{vcr → lib/vcr}/util/internet_connection_spec.rb +0 -0
  74. data/spec/{vcr → lib/vcr}/util/version_checker_spec.rb +0 -0
  75. data/spec/{vcr → lib/vcr}/version_spec.rb +0 -0
  76. data/spec/{vcr_spec.rb → lib/vcr_spec.rb} +2 -2
  77. data/spec/spec_helper.rb +21 -50
  78. data/spec/support/cucumber_helpers.rb +39 -0
  79. data/spec/support/limited_uri.rb +1 -11
  80. data/spec/support/shared_example_groups/hook_into_http_library.rb +2 -1
  81. data/spec/support/vcr_localhost_server.rb +2 -3
  82. metadata +475 -123
  83. data/.gemtest +0 -0
  84. data/.gitignore +0 -52
  85. data/.gitmodules +0 -3
  86. data/.rspec +0 -2
  87. data/.travis.yml +0 -27
  88. data/.yardopts +0 -9
  89. data/Appraisals +0 -5
  90. data/CHANGELOG.md +0 -987
  91. data/CONTRIBUTING.md +0 -26
  92. data/Gemfile +0 -54
  93. data/Gemfile.lock +0 -159
  94. data/LICENSE +0 -20
  95. data/README.md +0 -243
  96. data/Rakefile +0 -197
  97. data/Upgrade.md +0 -289
  98. data/benchmarks/http_stubbing_libraries.rb +0 -59
  99. data/benchmarks/null_logging.rb +0 -62
  100. data/cucumber.yml +0 -16
  101. data/features/.nav +0 -62
  102. data/features/cassettes/persistence.feature +0 -63
  103. data/features/support/vcr_cucumber_helpers.rb +0 -46
  104. data/gemfiles/typhoeus_old.gemfile +0 -34
  105. data/gemfiles/typhoeus_old.gemfile.lock +0 -133
  106. data/script/ci.sh +0 -27
  107. data/spec/capture_warnings.rb +0 -73
  108. data/spec/quality_spec.rb +0 -51
  109. data/vcr.gemspec +0 -23
@@ -11,7 +11,7 @@ Feature: cassette_library_dir
11
11
  Scenario: cassette_library_dir
12
12
  Given a file named "cassette_library_dir.rb" with:
13
13
  """ruby
14
- start_sinatra_app(:port => 7777) do
14
+ $server = start_sinatra_app do
15
15
  get('/') { "Hello" }
16
16
  end
17
17
 
@@ -23,7 +23,7 @@ Feature: cassette_library_dir
23
23
  end
24
24
 
25
25
  VCR.use_cassette('localhost') do
26
- Net::HTTP.get_response('localhost', '/', 7777)
26
+ Net::HTTP.get_response('localhost', '/', $server.port)
27
27
  end
28
28
  """
29
29
  And the directory "vcr/cassettes" does not exist
@@ -10,7 +10,7 @@ Feature: Debug Logging
10
10
  Given a file named "debug_logger.rb" with:
11
11
  """ruby
12
12
  if ARGV.include?('--with-server')
13
- start_sinatra_app(:port => 7777) do
13
+ $server = start_sinatra_app do
14
14
  get('/') { "Hello World" }
15
15
  end
16
16
  end
@@ -21,31 +21,38 @@ Feature: Debug Logging
21
21
  c.hook_into :webmock
22
22
  c.cassette_library_dir = 'cassettes'
23
23
  c.debug_logger = File.open(ARGV.first, 'w')
24
+ c.default_cassette_options = {
25
+ :match_requests_on => [:method, :host, :path]
26
+ }
24
27
  end
25
28
 
26
29
  VCR.use_cassette('example') do
27
- Net::HTTP.get_response(URI("http://localhost:7777/"))
30
+ port = $server ? $server.port : 7777
31
+ Net::HTTP.get_response(URI("http://localhost:#{port}/"))
28
32
  end
29
33
  """
30
34
  When I run `ruby debug_logger.rb record.log --with-server`
35
+ Given that port numbers in "record.log" are normalized to "7777"
31
36
  Then the file "record.log" should contain exactly:
32
37
  """
33
- [Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
38
+ [Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :host, :path], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
34
39
  [webmock] Handling request: [get http://localhost:7777/] (disabled: false)
35
- [Cassette: 'example'] Initialized HTTPInteractionList with request matchers [:method, :uri] and 0 interaction(s): { }
40
+ [Cassette: 'example'] Initialized HTTPInteractionList with request matchers [:method, :host, :path] and 0 interaction(s): { }
36
41
  [webmock] Identified request type (recordable) for [get http://localhost:7777/]
37
42
  [Cassette: 'example'] Recorded HTTP interaction [get http://localhost:7777/] => [200 "Hello World"]
38
43
 
39
44
  """
40
45
  When I run `ruby debug_logger.rb playback.log`
46
+ Given that port numbers in "playback.log" are normalized to "7777"
41
47
  Then the file "playback.log" should contain exactly:
42
48
  """
43
- [Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
49
+ [Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :host, :path], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
44
50
  [webmock] Handling request: [get http://localhost:7777/] (disabled: false)
45
- [Cassette: 'example'] Initialized HTTPInteractionList with request matchers [:method, :uri] and 1 interaction(s): { [get http://localhost:7777/] => [200 "Hello World"] }
46
- [Cassette: 'example'] Checking if [get http://localhost:7777/] matches [get http://localhost:7777/] using [:method, :uri]
51
+ [Cassette: 'example'] Initialized HTTPInteractionList with request matchers [:method, :host, :path] and 1 interaction(s): { [get http://localhost:7777/] => [200 "Hello World"] }
52
+ [Cassette: 'example'] Checking if [get http://localhost:7777/] matches [get http://localhost:7777/] using [:method, :host, :path]
47
53
  [Cassette: 'example'] method (matched): current request [get http://localhost:7777/] vs [get http://localhost:7777/]
48
- [Cassette: 'example'] uri (matched): current request [get http://localhost:7777/] vs [get http://localhost:7777/]
54
+ [Cassette: 'example'] host (matched): current request [get http://localhost:7777/] vs [get http://localhost:7777/]
55
+ [Cassette: 'example'] path (matched): current request [get http://localhost:7777/] vs [get http://localhost:7777/]
49
56
  [Cassette: 'example'] Found matching interaction for [get http://localhost:7777/] at index 0: [200 "Hello World"]
50
57
  [webmock] Identified request type (stubbed_by_vcr) for [get http://localhost:7777/]
51
58
 
@@ -30,7 +30,7 @@ Feature: Filter sensitive data
30
30
  Given a file named "filtering.rb" with:
31
31
  """ruby
32
32
  if ARGV.include?('--with-server')
33
- start_sinatra_app(:port => 7777) do
33
+ $server = start_sinatra_app do
34
34
  get('/') { "Hello World" }
35
35
  end
36
36
  end
@@ -45,7 +45,7 @@ Feature: Filter sensitive data
45
45
  end
46
46
 
47
47
  VCR.use_cassette('filtering') do
48
- response = Net::HTTP.get_response('localhost', '/', 7777)
48
+ response = Net::HTTP.get_response('localhost', '/', $server ? $server.port : 0)
49
49
  puts "Response: #{response.body}"
50
50
  end
51
51
  """
@@ -63,7 +63,7 @@ Feature: Filter sensitive data
63
63
  """ruby
64
64
  if ARGV.include?('--with-server')
65
65
  response_count = 0
66
- start_sinatra_app(:port => 7777) do
66
+ $server = start_sinatra_app do
67
67
  get('/') { "Hello World #{response_count += 1 }" }
68
68
  end
69
69
  end
@@ -77,12 +77,12 @@ Feature: Filter sensitive data
77
77
  end
78
78
 
79
79
  VCR.use_cassette('tagged', :tag => :my_tag) do
80
- response = Net::HTTP.get_response('localhost', '/', 7777)
80
+ response = Net::HTTP.get_response('localhost', '/', $server ? $server.port : 0)
81
81
  puts "Tagged Response: #{response.body}"
82
82
  end
83
83
 
84
84
  VCR.use_cassette('untagged', :record => :new_episodes) do
85
- response = Net::HTTP.get_response('localhost', '/', 7777)
85
+ response = Net::HTTP.get_response('localhost', '/', $server ? $server.port : 0)
86
86
  puts "Untagged Response: #{response.body}"
87
87
  end
88
88
  """
@@ -104,7 +104,7 @@ Feature: Filter sensitive data
104
104
  include_http_adapter_for('net/http')
105
105
 
106
106
  if ARGV.include?('--with-server')
107
- start_sinatra_app(:port => 7777) do
107
+ $server = start_sinatra_app do
108
108
  helpers do
109
109
  def request_header_for(header_key_fragment)
110
110
  key = env.keys.find { |k| k =~ /#{header_key_fragment}/i }
@@ -132,8 +132,9 @@ Feature: Filter sensitive data
132
132
  end
133
133
 
134
134
  VCR.use_cassette('example', :match_requests_on => [:method, :uri, :headers]) do
135
+ port = $server ? $server.port : 0
135
136
  puts "Response: " + response_body_for(
136
- :get, 'http://localhost:7777/', nil,
137
+ :get, "http://localhost:#{port}/", nil,
137
138
  'X-Http-Username' => 'john.doe',
138
139
  'X-Http-Password' => USER_PASSWORDS['john.doe']
139
140
  )
@@ -41,11 +41,11 @@ Feature: hook_into
41
41
  require 'vcr'
42
42
  VCR.configure { |c| c.ignore_localhost = true }
43
43
 
44
- start_sinatra_app(:port => 7777) do
44
+ $server = start_sinatra_app do
45
45
  get('/') { ARGV[0] }
46
46
  end
47
47
 
48
- puts "The response for request 1 was: #{response_body_for(:get, "http://localhost:7777/")}"
48
+ puts "The response for request 1 was: #{response_body_for(:get, "http://localhost:#{$server.port}/")}"
49
49
 
50
50
  VCR.configure do |c|
51
51
  <configuration>
@@ -55,7 +55,7 @@ Feature: hook_into
55
55
  end
56
56
 
57
57
  VCR.use_cassette('example') do
58
- puts "The response for request 2 was: #{response_body_for(:get, "http://localhost:7777/")}"
58
+ puts "The response for request 2 was: #{response_body_for(:get, "http://localhost:#{$server.port}/")}"
59
59
  end
60
60
  """
61
61
  When I run `ruby hook_into_http_lib_combo.rb 'Hello World'`
@@ -97,24 +97,24 @@ Feature: hook_into
97
97
 
98
98
  VCR.configure { |c| c.ignore_localhost = true }
99
99
 
100
- start_sinatra_app(:port => 7777) do
100
+ $server = start_sinatra_app do
101
101
  get('/:path') { "#{ARGV[0]} #{params[:path]}" }
102
102
  end
103
103
 
104
104
  def net_http_response
105
- Net::HTTP.get_response('localhost', '/net_http', 7777).body
105
+ Net::HTTP.get_response('localhost', '/net_http', $server.port).body
106
106
  end
107
107
 
108
108
  def typhoeus_response
109
- Typhoeus::Request.get("http://localhost:7777/typhoeus").body
109
+ Typhoeus::Request.get("http://localhost:#{$server.port}/typhoeus").body
110
110
  end
111
111
 
112
112
  def excon_response
113
- Excon.get("http://localhost:7777/excon").body
113
+ Excon.get("http://localhost:#{$server.port}/excon").body
114
114
  end
115
115
 
116
116
  def faraday_response
117
- Faraday::Connection.new(:url => 'http://localhost:7777') do |builder|
117
+ Faraday::Connection.new(:url => "http://localhost:#{$server.port}") do |builder|
118
118
  builder.adapter :<faraday_adapter>
119
119
  end.get('/faraday').body
120
120
  end
@@ -24,7 +24,7 @@ Feature: Ignore Request
24
24
  Given a file named "sinatra_app.rb" with:
25
25
  """ruby
26
26
  response_count = 0
27
- start_sinatra_app(:port => 7777) do
27
+ $server = start_sinatra_app do
28
28
  get('/') { "Port 7777 Response #{response_count += 1}" }
29
29
  end
30
30
  """
@@ -37,7 +37,7 @@ Feature: Ignore Request
37
37
  require 'sinatra_app.rb'
38
38
 
39
39
  response_count = 0
40
- start_sinatra_app(:port => 8888) do
40
+ $server_8888 = start_sinatra_app do
41
41
  get('/') { "Port 8888 Response #{response_count += 1}" }
42
42
  end
43
43
 
@@ -45,7 +45,7 @@ Feature: Ignore Request
45
45
 
46
46
  VCR.configure do |c|
47
47
  c.ignore_request do |request|
48
- URI(request.uri).port == 7777
48
+ URI(request.uri).port == $server.port
49
49
  end
50
50
 
51
51
  c.default_cassette_options = { :serialize_with => :syck }
@@ -54,21 +54,20 @@ Feature: Ignore Request
54
54
  end
55
55
 
56
56
  VCR.use_cassette('example') do
57
- puts response_body_for(:get, "http://localhost:8888/")
57
+ puts response_body_for(:get, "http://localhost:#{$server_8888.port}/")
58
58
  end
59
59
 
60
60
  VCR.use_cassette('example') do
61
- puts response_body_for(:get, "http://localhost:7777/")
61
+ puts response_body_for(:get, "http://localhost:#{$server.port}/")
62
62
  end
63
63
 
64
- puts response_body_for(:get, "http://localhost:7777/")
65
- puts response_body_for(:get, "http://localhost:8888/")
64
+ puts response_body_for(:get, "http://localhost:#{$server.port}/")
65
+ puts response_body_for(:get, "http://localhost:#{$server_8888.port}/")
66
66
  """
67
67
  When I run `ruby ignore_request.rb`
68
68
  Then it should fail with an error like:
69
69
  """
70
70
  An HTTP request has been made that VCR does not know how to handle:
71
- GET http://localhost:8888/
72
71
  """
73
72
  And the output should contain:
74
73
  """
@@ -101,10 +100,10 @@ Feature: Ignore Request
101
100
  end
102
101
 
103
102
  VCR.use_cassette('example') do
104
- puts response_body_for(:get, "http://localhost:7777/")
103
+ puts response_body_for(:get, "http://localhost:#{$server.port}/")
105
104
  end
106
105
 
107
- puts response_body_for(:get, "http://localhost:7777/")
106
+ puts response_body_for(:get, "http://localhost:#{$server.port}/")
108
107
  """
109
108
  When I run `ruby ignore_hosts.rb`
110
109
  Then it should pass with:
@@ -138,10 +137,10 @@ Feature: Ignore Request
138
137
  end
139
138
 
140
139
  VCR.use_cassette('localhost') do
141
- response_body_for(:get, "http://localhost:7777/")
140
+ response_body_for(:get, "http://localhost:#{$server.port}/")
142
141
  end
143
142
 
144
- response_body_for(:get, "http://localhost:7777/")
143
+ response_body_for(:get, "http://localhost:#{$server.port}/")
145
144
  """
146
145
  When I run `ruby localhost_not_ignored.rb`
147
146
  Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
@@ -170,10 +169,10 @@ Feature: Ignore Request
170
169
  end
171
170
 
172
171
  VCR.use_cassette('localhost') do
173
- puts response_body_for(:get, "http://localhost:7777/")
172
+ puts response_body_for(:get, "http://localhost:#{$server.port}/")
174
173
  end
175
174
 
176
- puts response_body_for(:get, "http://localhost:7777/")
175
+ puts response_body_for(:get, "http://localhost:#{$server.port}/")
177
176
  """
178
177
  When I run `ruby ignore_localhost_true.rb`
179
178
  Then it should pass with:
@@ -24,7 +24,7 @@ Feature: Preserve Exact Body Bytes
24
24
  string = "abc \xFA"
25
25
  puts "Valid encoding: #{string.valid_encoding?}"
26
26
 
27
- start_sinatra_app(:port => 7777) do
27
+ $server = start_sinatra_app do
28
28
  get('/') { string }
29
29
  end
30
30
 
@@ -43,7 +43,7 @@ Feature: Preserve Exact Body Bytes
43
43
  puts
44
44
  puts label
45
45
  VCR.use_cassette('example', :serialize_with => :json) do
46
- body = Net::HTTP.get_response(URI("http://localhost:7777/")).body
46
+ body = Net::HTTP.get_response('localhost', '/', $server.port).body
47
47
  puts "Body: #{body.inspect}"
48
48
  end
49
49
  end
@@ -71,7 +71,7 @@ Feature: Preserve Exact Body Bytes
71
71
  Scenario: Preserve exact bytes for cassette with `:preserve_exact_body_bytes` option
72
72
  Given a file named "preserve.rb" with:
73
73
  """ruby
74
- start_sinatra_app(:port => 7777) do
74
+ $server = start_sinatra_app do
75
75
  get('/') { "Hello World" }
76
76
  end
77
77
 
@@ -89,11 +89,11 @@ Feature: Preserve Exact Body Bytes
89
89
  end
90
90
 
91
91
  VCR.use_cassette('preserve_bytes', :preserve_exact_body_bytes => true) do
92
- Net::HTTP.get_response(URI("http://localhost:7777/"))
92
+ Net::HTTP.get_response('localhost', '/', $server.port)
93
93
  end
94
94
 
95
95
  VCR.use_cassette('dont_preserve_bytes') do
96
- Net::HTTP.get_response(URI("http://localhost:7777/"))
96
+ Net::HTTP.get_response('localhost', '/', $server.port)
97
97
  end
98
98
  """
99
99
  When I run `ruby preserve.rb`
@@ -27,7 +27,7 @@ Feature: uri_parser
27
27
  http_interactions:
28
28
  - request:
29
29
  method: get
30
- uri: http://bad_url.example.com/
30
+ uri: http://example.com/hello
31
31
  body:
32
32
  encoding: UTF-8
33
33
  string: ""
@@ -51,16 +51,25 @@ Feature: uri_parser
51
51
  Given a file named "uri_parser.rb" with:
52
52
  """ruby
53
53
  require 'vcr'
54
- require 'addressable/uri'
54
+ require 'uri'
55
+
56
+ module MyURI
57
+ def self.parse(url)
58
+ uri = URI.parse(url)
59
+ uri.host = 'example.com'
60
+ uri.path = '/hello'
61
+ uri
62
+ end
63
+ end
55
64
 
56
65
  VCR.configure do |c|
57
- c.uri_parser = Addressable::URI
66
+ c.uri_parser = MyURI
58
67
  c.hook_into :webmock
59
68
  c.cassette_library_dir = 'cassettes'
60
69
  end
61
70
 
62
71
  VCR.use_cassette('example') do
63
- puts Net::HTTP.get_response('bad_url.example.com', '/').body
72
+ puts Net::HTTP.get_response('evil.org', '/projects').body
64
73
  end
65
74
  """
66
75
  When I run `ruby uri_parser.rb`
@@ -70,7 +79,6 @@ Feature: uri_parser
70
79
  Given a file named "uri_parser_default.rb" with:
71
80
  """ruby
72
81
  require 'vcr'
73
- require 'addressable/uri'
74
82
 
75
83
  VCR.configure do |c|
76
84
  c.hook_into :webmock
@@ -78,12 +86,8 @@ Feature: uri_parser
78
86
  end
79
87
 
80
88
  VCR.use_cassette('example') do
81
- puts Net::HTTP.get_response('bad_url.example.com', '/').body
89
+ puts Net::HTTP.get_response('example.com', '/hello').body
82
90
  end
83
91
  """
84
92
  When I run `ruby uri_parser_default.rb`
85
- Then it should fail with an error like:
86
- """
87
- URI::InvalidURIError
88
- """
89
-
93
+ Then it should pass with "Hello"
@@ -22,7 +22,7 @@ Feature: after_http_request hook
22
22
  """ruby
23
23
  include_http_adapter_for("<http_lib>")
24
24
 
25
- start_sinatra_app(:port => 7777) do
25
+ $server = start_sinatra_app do
26
26
  get('/foo') { "Hello World (foo)" }
27
27
  get('/bar') { "Hello World (bar)" }
28
28
  end
@@ -34,12 +34,13 @@ Feature: after_http_request hook
34
34
  c.cassette_library_dir = 'cassettes'
35
35
  c.ignore_localhost = true
36
36
  c.after_http_request(:ignored?, lambda { |req| req.uri =~ /foo/ }) do |request, response|
37
- puts "Response for #{request.method} #{request.uri}: #{response.body}"
37
+ uri = request.uri.sub(/:\d+/, ":7777")
38
+ puts "Response for #{request.method} #{uri}: #{response.body}"
38
39
  end
39
40
  end
40
41
 
41
- make_http_request(:get, "http://localhost:7777/foo")
42
- make_http_request(:get, "http://localhost:7777/bar")
42
+ make_http_request(:get, "http://localhost:#{$server.port}/foo")
43
+ make_http_request(:get, "http://localhost:#{$server.port}/bar")
43
44
  """
44
45
  When I run `ruby after_http_request.rb`
45
46
  Then the output should contain "Response for get http://localhost:7777/foo: Hello World (foo)"
@@ -19,7 +19,7 @@ Feature: around_http_request hook
19
19
  include_http_adapter_for("<http_lib>")
20
20
 
21
21
  request_count = 0
22
- start_sinatra_app(:port => 7777) do
22
+ $server = start_sinatra_app do
23
23
  get('/') { "Response #{request_count += 1 }" }
24
24
  end
25
25
 
@@ -34,8 +34,8 @@ Feature: around_http_request hook
34
34
  end
35
35
  end
36
36
 
37
- puts "Response for request 1: " + response_body_for(:get, "http://localhost:7777/")
38
- puts "Response for request 2: " + response_body_for(:get, "http://localhost:7777/")
37
+ puts "Response for request 1: " + response_body_for(:get, "http://localhost:#{$server.port}/")
38
+ puts "Response for request 2: " + response_body_for(:get, "http://localhost:#{$server.port}/")
39
39
  """
40
40
  When I run `ruby globally_handle_requests.rb`
41
41
  Then it should pass with:
@@ -23,7 +23,7 @@ Feature: before_http_request hook
23
23
  include_http_adapter_for("<http_lib>")
24
24
 
25
25
  if ARGV.include?('--with-server')
26
- start_sinatra_app(:port => 7777) do
26
+ $server = start_sinatra_app do
27
27
  get('/') { "Hello World" }
28
28
  end
29
29
  end
@@ -41,10 +41,12 @@ Feature: before_http_request hook
41
41
  end
42
42
 
43
43
  VCR.use_cassette('hook_example') do
44
- make_http_request(:get, "http://localhost:7777/")
44
+ port = $server ? $server.port : 0
45
+ make_http_request(:get, "http://localhost:#{port}/")
45
46
  end
46
47
  """
47
48
  When I run `ruby before_http_request.rb run1.log --with-server`
49
+ Given that port numbers in "run1.log" are normalized to "7777"
48
50
  Then the file "run1.log" should contain "before real request: get http://localhost:7777/"
49
51
  When I run `ruby before_http_request.rb run2.log`
50
52
  Then the file "run2.log" should not exist
@@ -10,8 +10,7 @@ Feature: before_playback hook
10
10
  You can also call `#ignore!` on the HTTP interaction to prevent VCR
11
11
  from playing it back.
12
12
 
13
- If you don't your hook to apply to all cassettes, you can use tags for
14
- this purpose. Consider this code:
13
+ You can use tags to specify a cassette, otherwise your hook will apply to all cassettes. Consider this code:
15
14
 
16
15
  VCR.configure do |c|
17
16
  c.before_playback(:twitter) { ... } # modify the interactions somehow
@@ -26,25 +25,25 @@ Feature: before_playback hook
26
25
  Background:
27
26
  Given a previously recorded cassette file "cassettes/example.yml" with:
28
27
  """
29
- ---
30
- http_interactions:
31
- - request:
28
+ ---
29
+ http_interactions:
30
+ - request:
32
31
  method: get
33
32
  uri: http://localhost:7777/
34
- body:
33
+ body:
35
34
  encoding: UTF-8
36
35
  string: ""
37
36
  headers: {}
38
- response:
39
- status:
37
+ response:
38
+ status:
40
39
  code: 200
41
40
  message: OK
42
- headers:
43
- Content-Type:
41
+ headers:
42
+ Content-Type:
44
43
  - text/html;charset=utf-8
45
- Content-Length:
44
+ Content-Length:
46
45
  - "20"
47
- body:
46
+ body:
48
47
  encoding: UTF-8
49
48
  string: previously recorded response
50
49
  http_version: "1.1"
@@ -99,7 +98,7 @@ Feature: before_playback hook
99
98
  Scenario: Prevent playback by ignoring interaction in before_playback hook
100
99
  Given a file named "before_playback_ignore.rb" with:
101
100
  """ruby
102
- start_sinatra_app(:port => 7777) do
101
+ $server = start_sinatra_app do
103
102
  get('/') { "sinatra response" }
104
103
  end
105
104
 
@@ -111,8 +110,8 @@ Feature: before_playback hook
111
110
  c.before_playback { |i| i.ignore! }
112
111
  end
113
112
 
114
- VCR.use_cassette('localhost', :record => :new_episodes) do
115
- response = Net::HTTP.get_response('localhost', '/', 7777)
113
+ VCR.use_cassette('localhost', :record => :new_episodes, :match_requests_on => [:method, :host, :path]) do
114
+ response = Net::HTTP.get_response('localhost', '/', $server.port)
116
115
  puts "Response: #{response.body}"
117
116
  end
118
117
  """