vcr 2.0.0.beta2 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +0 -2
  3. data/CHANGELOG.md +22 -1
  4. data/CONTRIBUTING.md +46 -0
  5. data/Gemfile +1 -9
  6. data/README.md +8 -2
  7. data/Rakefile +12 -1
  8. data/cucumber.yml +8 -9
  9. data/features/.nav +10 -4
  10. data/features/cassettes/format.feature +1 -1
  11. data/features/cassettes/no_cassette.feature +8 -11
  12. data/features/configuration/allow_http_connections_when_no_cassette.feature +4 -4
  13. data/features/configuration/filter_sensitive_data.feature +3 -0
  14. data/features/configuration/hook_into.feature +4 -8
  15. data/features/configuration/ignore_request.feature +191 -0
  16. data/features/getting_started.md +38 -21
  17. data/features/hooks/after_http_request.feature +44 -0
  18. data/features/hooks/around_http_request.feature +56 -0
  19. data/features/hooks/before_http_request.feature +44 -0
  20. data/features/hooks/before_playback.feature +181 -0
  21. data/features/hooks/before_record.feature +172 -0
  22. data/features/middleware/faraday.feature +7 -3
  23. data/features/record_modes/none.feature +2 -1
  24. data/features/record_modes/once.feature +2 -1
  25. data/features/request_matching/body.feature +2 -2
  26. data/features/request_matching/custom_matcher.feature +2 -2
  27. data/features/request_matching/headers.feature +2 -2
  28. data/features/request_matching/host.feature +2 -2
  29. data/features/request_matching/identical_request_sequence.feature +2 -2
  30. data/features/request_matching/method.feature +2 -2
  31. data/features/request_matching/path.feature +2 -2
  32. data/features/request_matching/playback_repeats.feature +2 -1
  33. data/features/request_matching/uri.feature +2 -2
  34. data/features/support/env.rb +21 -12
  35. data/features/test_frameworks/cucumber.feature +9 -4
  36. data/features/test_frameworks/{rspec.feature → rspec_macro.feature} +7 -7
  37. data/features/test_frameworks/rspec_metadata.feature +90 -0
  38. data/lib/vcr.rb +1 -1
  39. data/lib/vcr/cassette.rb +3 -3
  40. data/lib/vcr/cassette/http_interaction_list.rb +13 -9
  41. data/lib/vcr/cassette/migrator.rb +1 -1
  42. data/lib/vcr/configuration.rb +37 -0
  43. data/lib/vcr/errors.rb +172 -6
  44. data/lib/vcr/library_hooks.rb +4 -6
  45. data/lib/vcr/library_hooks/excon.rb +23 -11
  46. data/lib/vcr/library_hooks/fakeweb.rb +85 -24
  47. data/lib/vcr/library_hooks/faraday.rb +30 -2
  48. data/lib/vcr/library_hooks/typhoeus.rb +25 -3
  49. data/lib/vcr/library_hooks/webmock.rb +25 -36
  50. data/lib/vcr/middleware/faraday.rb +23 -5
  51. data/lib/vcr/request_handler.rb +12 -1
  52. data/lib/vcr/request_ignorer.rb +12 -1
  53. data/lib/vcr/request_matcher_registry.rb +1 -9
  54. data/lib/vcr/structs.rb +32 -2
  55. data/lib/vcr/test_frameworks/rspec.rb +28 -0
  56. data/lib/vcr/util/hooks.rb +12 -4
  57. data/lib/vcr/util/version_checker.rb +2 -0
  58. data/lib/vcr/version.rb +1 -1
  59. data/spec/fixtures/cassette_spec/example.yml +1 -1
  60. data/spec/fixtures/{fake_example.com_responses.yml → fake_example_responses.yml} +0 -0
  61. data/spec/monkey_patches.rb +1 -1
  62. data/spec/spec_helper.rb +3 -1
  63. data/spec/support/http_library_adapters.rb +4 -3
  64. data/spec/support/shared_example_groups/hook_into_http_library.rb +194 -12
  65. data/spec/support/shared_example_groups/request_hooks.rb +58 -0
  66. data/spec/support/shared_example_groups/version_checking.rb +5 -0
  67. data/spec/support/sinatra_app.rb +17 -9
  68. data/spec/support/vcr_stub_helpers.rb +17 -0
  69. data/spec/vcr/cassette/http_interaction_list_spec.rb +28 -29
  70. data/spec/vcr/cassette/migrator_spec.rb +6 -7
  71. data/spec/vcr/cassette_spec.rb +5 -5
  72. data/spec/vcr/configuration_spec.rb +51 -32
  73. data/spec/vcr/deprecations_spec.rb +0 -8
  74. data/spec/vcr/errors_spec.rb +129 -0
  75. data/spec/vcr/library_hooks/excon_spec.rb +21 -4
  76. data/spec/vcr/library_hooks/fakeweb_spec.rb +71 -3
  77. data/spec/vcr/library_hooks/faraday_spec.rb +45 -0
  78. data/spec/vcr/library_hooks/typhoeus_spec.rb +31 -1
  79. data/spec/vcr/library_hooks/webmock_spec.rb +26 -3
  80. data/spec/vcr/middleware/faraday_spec.rb +84 -1
  81. data/spec/vcr/request_ignorer_spec.rb +16 -0
  82. data/spec/vcr/request_matcher_registry_spec.rb +0 -26
  83. data/spec/vcr/structs_spec.rb +61 -1
  84. data/spec/vcr/test_frameworks/rspec_spec.rb +32 -0
  85. data/spec/vcr/util/hooks_spec.rb +73 -63
  86. data/spec/vcr_spec.rb +2 -2
  87. data/vcr.gemspec +5 -5
  88. metadata +51 -31
  89. data/features/configuration/hooks.feature +0 -270
  90. data/features/configuration/ignore_hosts.feature +0 -61
  91. data/features/configuration/ignore_localhost.feature +0 -97
data/.gitignore CHANGED
@@ -32,5 +32,6 @@ features/README.md
32
32
  features/CHANGELOG.md
33
33
  features/LICENSE.md
34
34
  features/Upgrade.md
35
+ features/CONTRIBUTING.md
35
36
 
36
37
  .rvmrc
data/.travis.yml CHANGED
@@ -7,8 +7,6 @@ rvm:
7
7
  - 1.9.3
8
8
  - ree
9
9
  - jruby
10
- - rbx
11
- - rbx-2.0
12
10
  branches:
13
11
  only:
14
12
  - master
data/CHANGELOG.md CHANGED
@@ -1,6 +1,27 @@
1
1
  ## In git
2
2
 
3
- [Full Changelog](http://github.com/myronmarston/vcr/compare/v2.0.0.beta2...master)
3
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v2.0.0.rc1...master)
4
+
5
+ ## 2.0.0 RC 1 (December 8, 2011)
6
+
7
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v2.0.0.beta2...v2.0.0.rc1)
8
+
9
+ * Add Faraday hook that automatically inserts the VCR middleware so that
10
+ you can use VCR with Faraday without needing to insert the middleware
11
+ yourself. Use `VCR.configure { |c| c.hook_into :faraday }`.
12
+ * Add `ignore_request` config option. Pass it a block that returns
13
+ true if the given request should be ignored.
14
+ * Improve the unhandled HTTP request error message so that it lists
15
+ different options for how to get VCR to handle it.
16
+ * Add {before,after,around}_http_request hooks.
17
+ * Updated WebMock integration and bumped up required version to 1.7.8.
18
+ * Test against latest Excon (0.7.9) and confirm that VCR works fine with
19
+ it.
20
+ * Add define_cassette_placeholder as an alias for filter_sensitive_data.
21
+ * Fix Faraday middleware so that it works properly when you use parallel
22
+ requests.
23
+ * Integrate VCR with RSpec metadata. Thanks to [Ryan Bates](https://github.com/ryanb)
24
+ for the great idea.
4
25
 
5
26
  ## 2.0.0 Beta 2 (November 6, 2011)
6
27
 
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,46 @@
1
+ ## Contributing
2
+
3
+ Install [bundler](http://gembundler.com/) and use it to install all the development dependencies:
4
+
5
+ ```console
6
+ gem install bundler
7
+ bundle install
8
+ ```
9
+
10
+ Next setup the Git submodules:
11
+
12
+ ```console
13
+ git submodule init
14
+ git submodule update
15
+ ```
16
+
17
+ or using the single command form
18
+
19
+ ```console
20
+ git submodule update --init
21
+ ```
22
+
23
+ You should be able to run the tests now:
24
+
25
+ ```console
26
+ bundle exec rake
27
+ ```
28
+
29
+ VCR uses [RSpec 2](http://github.com/rspec/rspec) for unit tests. The specs are written in a very "focused" style, where each spec is concerned only with exercising the object under test, using mocks as necessary. You can run the specs using `rake spec`.
30
+
31
+ [Cucumber](http://cukes.info/) is used for end-to-end full stack integration tests that also function as VCR's documentation.
32
+
33
+ ## Problems running bundle install?
34
+
35
+ If you get an error while running `bundle install`, it may be one of the "extras" gems which are not required for development. Try installing it without these gems.
36
+
37
+ ```console
38
+ bundle install --without extras
39
+ ```
40
+
41
+ If you are getting an error installing `rb-fsevent` gem, you may want to temporarily change the Gemfile to use the pre-release version of the gem.
42
+
43
+ ```ruby
44
+ gem 'rb-fsevent', '0.9.0.pre4'
45
+ ```
46
+
data/Gemfile CHANGED
@@ -2,14 +2,6 @@ source :rubygems
2
2
  gemspec
3
3
 
4
4
  group :development do
5
- # patron and em-http-request can't install on JRuby, so we have to limit their platform here.
6
- platforms :ruby do
7
- gem 'patron', '~> 0.4.15'
8
- gem 'em-http-request', '~> 0.3.0'
9
- gem 'curb', '0.7.15'
10
- gem 'typhoeus', '~> 0.3.2'
11
- end
12
-
13
5
  platforms :jruby do
14
6
  gem 'jruby-openssl'
15
7
  end
@@ -28,7 +20,7 @@ group :extras do
28
20
  gem 'rb-fsevent'
29
21
  end
30
22
 
31
- platforms :mri_18 do
23
+ platforms :mri_18, :jruby do
32
24
  gem 'ruby-debug'
33
25
  end
34
26
 
data/README.md CHANGED
@@ -11,9 +11,9 @@ require 'rubygems'
11
11
  require 'test/unit'
12
12
  require 'vcr'
13
13
 
14
- VCR.config do |c|
14
+ VCR.configure do |c|
15
15
  c.cassette_library_dir = 'fixtures/vcr_cassettes'
16
- c.stub_with :webmock # or :fakeweb
16
+ c.hook_into :webmock # or :fakeweb
17
17
  end
18
18
 
19
19
  class VCRTest < Test::Unit::TestCase
@@ -117,6 +117,8 @@ VCR has been tested on the following ruby interpreters:
117
117
  * Report issues on [GitHub Issues](http://github.com/myronmarston/vcr/issues).
118
118
  * Pull requests are very welcome! Please include spec and/or feature coverage for every patch,
119
119
  and create a topic branch for every separate change you make.
120
+ * See the [Contributing](https://github.com/myronmarston/vcr/blob/master/CONTRIBUTING.md)
121
+ guide for instructions on running the specs and features.
120
122
 
121
123
  If you find VCR useful, please recommend me on [working with rails](http://workingwithrails.com/person/16590-myron-marston).
122
124
 
@@ -139,11 +141,15 @@ Thanks also to the following people who have contributed patches or helpful sugg
139
141
  * [Bartosz Blimke](http://github.com/bblimke)
140
142
  * [Ben Hutton](http://github.com/benhutton)
141
143
  * [Bradley Isotope](https://github.com/bradleyisotope)
144
+ * [Carlos Kirkconnell](https://github.com/kirkconnell)
142
145
  * [Eric Allam](http://github.com/rubymaverick)
146
+ * [Flaviu Simihaian](https://github.com/closedbracket)
143
147
  * [Justin Smestad](https://github.com/jsmestad)
144
148
  * [Karl Baum](https://github.com/kbaum)
145
149
  * [Nathaniel Bibler](https://github.com/nbibler)
146
150
  * [Oliver Searle-Barnes](https://github.com/opsb)
151
+ * [Paco Guzmán](https://github.com/pacoguzman)
152
+ * [Ryan Bates](https://github.com/ryanb)
147
153
  * [Sathya Sekaran](https://github.com/sfsekaran)
148
154
  * [Wesley Beary](https://github.com/geemus)
149
155
 
data/Rakefile CHANGED
@@ -72,7 +72,7 @@ end
72
72
 
73
73
  desc "Push cukes to relishapp using the relish-client-gem"
74
74
  task :relish do
75
- %w[ README.md CHANGELOG.md Upgrade.md LICENSE ].each do |file|
75
+ %w[ README.md CHANGELOG.md Upgrade.md LICENSE CONTRIBUTING.md].each do |file|
76
76
  ensure_relish_doc_symlinked(file)
77
77
  end
78
78
 
@@ -136,3 +136,14 @@ task :migrate_cucumber_cassettes do
136
136
  end
137
137
  end
138
138
 
139
+ desc "Run the last cuke directly"
140
+ task :run_last_cuke do
141
+ command = ENV.fetch('CMD') do
142
+ raise "Must pass CMD"
143
+ end
144
+
145
+ Dir.chdir("tmp/aruba") do
146
+ sh "RUBYOPT='-I.:../../lib -r../../features/support/vcr_cucumber_helpers' ruby #{command}"
147
+ end
148
+ end
149
+
data/cucumber.yml CHANGED
@@ -1,14 +1,13 @@
1
1
  <%
2
2
  rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
3
  rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'Cucumber::Formatter::Fuubar'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
- std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'Cucumber::Formatter::Fuubar'} --strict --tags ~@wip"
5
- interp_opts = if defined?(RUBY_ENGINE)
6
- " --tags ~@exclude-#{RUBY_ENGINE}"
7
- else
8
- ''
9
- end
4
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'Cucumber::Formatter::Fuubar'} --strict"
5
+
6
+ exclusions = ["--tags ~@exclude-#{RUBY_VERSION.split('.').first(2).join}"].tap do |a|
7
+ a << "--tags ~@exclude-#{RUBY_ENGINE}" if defined?(RUBY_ENGINE)
8
+ end.join(' ')
10
9
  %>
11
- default: <%= std_opts %><%= interp_opts %> features
12
- wip: --tags @wip:30 --wip features<%= interp_opts %>
13
- rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip<%= interp_opts %>
10
+ default: <%= std_opts %> --tags ~@wip <%= exclusions %> features
11
+ wip: --tags @wip <%= exclusions %> features
12
+ rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip <%= exclusions %>
14
13
 
data/features/.nav CHANGED
@@ -3,6 +3,7 @@
3
3
  - CHANGELOG.md (Changelog)
4
4
  - about_these_examples.md (About These Examples)
5
5
  - LICENSE.md (License)
6
+ - CONTRIBUTING.md (Contributing)
6
7
  - cassettes:
7
8
  - format.feature
8
9
  - naming.feature
@@ -20,11 +21,15 @@
20
21
  - cassette_library_dir.feature
21
22
  - hook_into.feature
22
23
  - default_cassette_options.feature
23
- - ignore_hosts.feature
24
- - ignore_localhost.feature
25
- - hooks.feature
24
+ - ignore_request.feature
26
25
  - filter_sensitive_data.feature
27
26
  - allow_http_connections_when_no_cassette.feature
27
+ - hooks:
28
+ - before_record.feature
29
+ - before_playback.feature
30
+ - before_http_request.feature
31
+ - after_http_request.feature
32
+ - around_http_request.feature
28
33
  - request_matching:
29
34
  - method.feature
30
35
  - uri.feature
@@ -39,7 +44,8 @@
39
44
  - test_frameworks:
40
45
  - test_unit.feature
41
46
  - shoulda.feature
42
- - rspec.feature
47
+ - rspec_metadata.feature
48
+ - rspec_macro.feature
43
49
  - cucumber.feature
44
50
  - middleware:
45
51
  - rack.feature
@@ -122,7 +122,7 @@ Feature: Cassette format
122
122
  | c.hook_into :webmock | typhoeus |
123
123
  | c.hook_into :typhoeus | typhoeus |
124
124
  | c.hook_into :excon | excon |
125
- | | faraday (w/ net_http) |
125
+ | c.hook_into :faraday | faraday (w/ net_http) |
126
126
 
127
127
  Scenario: Request/Response data can be saved as JSON
128
128
  Given a file named "cassette_json.rb" with:
@@ -7,9 +7,8 @@ Feature: Error for HTTP request made when no cassette is in use
7
7
  made so you can use a VCR cassette at that point in your code.
8
8
 
9
9
  If you want to allow an HTTP request to proceed as normal, you can
10
- set the `allow_http_connections_when_no_cassette` configuration option
11
- (see configuration/allow_http_connections_when_no_cassette.feature) or
12
- you can temporarily turn VCR off:
10
+ set the [allow\_http\_connections\_when\_no\_cassette](../configuration/allow-http-connections-when-no-cassette)
11
+ configuration option or you can temporarily turn VCR off:
13
12
 
14
13
  - `VCR.turn_off!` => turn VCR off so HTTP requests are allowed.
15
14
  Cassette insertions will trigger an error.
@@ -19,6 +18,7 @@ Feature: Error for HTTP request made when no cassette is in use
19
18
  - `VCR.turned_off { ... }` => turn VCR off for the duration of the
20
19
  provided block.
21
20
 
21
+ @exclude-jruby
22
22
  Scenario Outline: Error for request when no cassette is in use
23
23
  Given a file named "no_cassette_error.rb" with:
24
24
  """ruby
@@ -34,10 +34,7 @@ Feature: Error for HTTP request made when no cassette is in use
34
34
  response_body_for(:get, 'http://example.com/')
35
35
  """
36
36
  When I run `ruby no_cassette_error.rb`
37
- Then it should fail with "Real HTTP connections are disabled"
38
- And the output should contain each of the following:
39
- | You can use VCR to automatically record this request and replay it later. |
40
- | no_cassette_error.rb:10 |
37
+ Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
41
38
 
42
39
  Examples:
43
40
  | configuration | http_lib |
@@ -50,7 +47,7 @@ Feature: Error for HTTP request made when no cassette is in use
50
47
  | c.hook_into :webmock | typhoeus |
51
48
  | c.hook_into :typhoeus | typhoeus |
52
49
  | c.hook_into :excon | excon |
53
- | | faraday (w/ net_http) |
50
+ | c.hook_into :faraday | faraday (w/ net_http) |
54
51
 
55
52
  Scenario: Temporarily turn VCR off to allow HTTP requests to procede as normal
56
53
  Given a file named "turn_off_vcr.rb" with:
@@ -69,7 +66,7 @@ Feature: Error for HTTP request made when no cassette is in use
69
66
  puts context
70
67
  puts Net::HTTP.get_response('localhost', '/', 7777).body
71
68
  rescue => e
72
- puts "Error: #{e.message}"
69
+ puts "Error: #{e.class}"
73
70
  end
74
71
 
75
72
  VCR.turned_off do
@@ -93,7 +90,7 @@ Feature: Error for HTTP request made when no cassette is in use
93
90
  And the output should contain:
94
91
  """
95
92
  Outside of VCR.turned_off block
96
- Error: Real HTTP connections are disabled.
93
+ Error: VCR::Errors::UnhandledHTTPRequestError
97
94
  """
98
95
  And the output should contain:
99
96
  """
@@ -103,7 +100,7 @@ Feature: Error for HTTP request made when no cassette is in use
103
100
  And the output should contain:
104
101
  """
105
102
  After calling VCR.turn_on!
106
- Error: Real HTTP connections are disabled.
103
+ Error: VCR::Errors::UnhandledHTTPRequestError
107
104
  """
108
105
 
109
106
  Scenario: Turning VCR off prevents cassettes from being inserted
@@ -1,9 +1,9 @@
1
1
  Feature: Allow HTTP connections when no cassette
2
2
 
3
- Usually, HTTP requests made when no cassette is inserted will result
4
- in an error (see cassettes/no_cassette.feature). You can set the
5
- `allow_http_connections_when_no_cassette` configuration option to
6
- true to allow requests, if you do not want to use VCR for everything.
3
+ Usually, HTTP requests made when no cassette is inserted will [result in an
4
+ error](../cassettes/error-for-http-request-made-when-no-cassette-is-in-use).
5
+ You can set the `allow_http_connections_when_no_cassette` configuration option
6
+ to true to allow requests, if you do not want to use VCR for everything.
7
7
 
8
8
  Background:
9
9
  Given a file named "vcr_setup.rb" with:
@@ -1,5 +1,8 @@
1
1
  Feature: Filter sensitive data
2
2
 
3
+ Note: this config option is also available as `define_cassette_placeholder`
4
+ to reflect the fact that it is useful for more than just sensitive data.
5
+
3
6
  The `filter_sensitive_data` configuration option can be used to prevent
4
7
  sensitive data from being written to your cassette files. This may be
5
8
  important if you commit your cassettes files to source control and do
@@ -15,10 +15,7 @@ Feature: hook_into
15
15
  - :typhoeus can be used to hook into itself (as long as you use Typhoeus::Hydra,
16
16
  but not Typhoeus::Easy or Typhoeus::Multi).
17
17
  - :excon can be used to hook into itself.
18
-
19
- In addition, you can use VCR with Faraday if you use the provided
20
- middleware in your Faraday connection stack. When you use VCR with Faraday,
21
- you do not need to configure `hook_into` (since the middleware is sufficient).
18
+ - :faraday can be used to hook into itself.
22
19
 
23
20
  There are some addiitonal trade offs to consider when deciding which
24
21
  option to use:
@@ -85,8 +82,8 @@ Feature: hook_into
85
82
  | c.hook_into :webmock | typhoeus |
86
83
  | c.hook_into :typhoeus | typhoeus |
87
84
  | c.hook_into :excon | excon |
88
- | | faraday (w/ net_http) |
89
- | | faraday (w/ typhoeus) |
85
+ | c.hook_into :faraday | faraday (w/ net_http) |
86
+ | c.hook_into :faraday | faraday (w/ typhoeus) |
90
87
 
91
88
  @exclude-jruby
92
89
  Scenario Outline: Use Typhoeus, Excon and Faraday in combination with FakeWeb or WebMock
@@ -117,7 +114,6 @@ Feature: hook_into
117
114
 
118
115
  def faraday_response
119
116
  Faraday::Connection.new(:url => 'http://localhost:7777') do |builder|
120
- builder.use VCR::Middleware::Faraday
121
117
  builder.adapter :<faraday_adapter>
122
118
  end.get('/faraday').body
123
119
  end
@@ -128,7 +124,7 @@ Feature: hook_into
128
124
  puts "Faraday 1: #{faraday_response}"
129
125
 
130
126
  VCR.configure do |c|
131
- c.hook_into <hook_into>, :typhoeus, :excon
127
+ c.hook_into <hook_into>, :typhoeus, :excon, :faraday
132
128
  c.cassette_library_dir = 'vcr_cassettes'
133
129
  c.ignore_localhost = false
134
130
  end
@@ -0,0 +1,191 @@
1
+ Feature: Ignore Request
2
+
3
+ By default, VCR hooks into every request, either allowing it and recording
4
+ it, or playing back a recorded response, or raising an error to force you
5
+ to deal with the new request. In some situations, you may prefer to have
6
+ VCR ignore some requests.
7
+
8
+ VCR provides 3 configuration options to accomplish this:
9
+
10
+ * `ignore_request { |req| ... }` will ignore any request for which the
11
+ given block returns true.
12
+ * `ignore_hosts 'foo.com', 'bar.com'` allows you to specify particular
13
+ hosts to ignore.
14
+ * `ignore_localhost = true` is equivalent to `ignore_hosts 'localhost',
15
+ '127.0.0.1', '0.0.0.0'`. It is particularly useful for when you use
16
+ VCR with a javascript-enabled capybara driver, since capybara boots
17
+ your rack app and makes localhost requests to it to check that it has
18
+ booted.
19
+
20
+ Ignored requests are not recorded and are always allowed, regardless of
21
+ the record mode, and even outside of a `VCR.use_cassette` block.
22
+
23
+ Background:
24
+ Given a file named "sinatra_app.rb" with:
25
+ """ruby
26
+ response_count = 0
27
+ start_sinatra_app(:port => 7777) do
28
+ get('/') { "Port 7777 Response #{response_count += 1}" }
29
+ end
30
+ """
31
+
32
+ @exclude-jruby
33
+ Scenario Outline: ignore requests to a specific port
34
+ Given a file named "ignore_request.rb" with:
35
+ """ruby
36
+ include_http_adapter_for("<http_lib>")
37
+ require 'sinatra_app.rb'
38
+
39
+ response_count = 0
40
+ start_sinatra_app(:port => 8888) do
41
+ get('/') { "Port 8888 Response #{response_count += 1}" }
42
+ end
43
+
44
+ require 'vcr'
45
+
46
+ VCR.configure do |c|
47
+ c.ignore_request do |request|
48
+ URI(request.uri).port == 7777
49
+ end
50
+
51
+ c.cassette_library_dir = 'cassettes'
52
+ <configuration>
53
+ end
54
+
55
+ VCR.use_cassette('example') do
56
+ puts response_body_for(:get, "http://localhost:8888/")
57
+ end
58
+
59
+ VCR.use_cassette('example') do
60
+ puts response_body_for(:get, "http://localhost:7777/")
61
+ end
62
+
63
+ puts response_body_for(:get, "http://localhost:7777/")
64
+ puts response_body_for(:get, "http://localhost:8888/")
65
+ """
66
+ When I run `ruby ignore_request.rb`
67
+ Then it should fail with:
68
+ """
69
+ An HTTP request has been made that VCR does not know how to handle:
70
+ GET http://localhost:8888/
71
+ """
72
+ And the output should contain:
73
+ """
74
+ Port 8888 Response 1
75
+ Port 7777 Response 1
76
+ Port 7777 Response 2
77
+ """
78
+ And the file "cassettes/example.yml" should contain "body: Port 8888"
79
+ And the file "cassettes/example.yml" should not contain "body: Port 7777"
80
+
81
+ Examples:
82
+ | configuration | http_lib |
83
+ | c.hook_into :fakeweb | net/http |
84
+ | c.hook_into :webmock | net/http |
85
+ | c.hook_into :typhoeus | typhoeus |
86
+ | c.hook_into :faraday | faraday (w/ net_http) |
87
+
88
+ Scenario Outline: ignored host requests are not recorded and are always allowed
89
+ Given a file named "ignore_hosts.rb" with:
90
+ """ruby
91
+ include_http_adapter_for("<http_lib>")
92
+ require 'sinatra_app.rb'
93
+
94
+ require 'vcr'
95
+
96
+ VCR.configure do |c|
97
+ c.ignore_hosts '127.0.0.1', 'localhost'
98
+ c.cassette_library_dir = 'cassettes'
99
+ <configuration>
100
+ end
101
+
102
+ VCR.use_cassette('example') do
103
+ puts response_body_for(:get, "http://localhost:7777/")
104
+ end
105
+
106
+ puts response_body_for(:get, "http://localhost:7777/")
107
+ """
108
+ When I run `ruby ignore_hosts.rb`
109
+ Then it should pass with:
110
+ """
111
+ Port 7777 Response 1
112
+ Port 7777 Response 2
113
+ """
114
+ And the file "cassettes/example.yml" should not exist
115
+
116
+ Examples:
117
+ | configuration | http_lib |
118
+ | c.hook_into :fakeweb | net/http |
119
+ | c.hook_into :webmock | net/http |
120
+ | c.hook_into :typhoeus | typhoeus |
121
+ | c.hook_into :excon | excon |
122
+ | c.hook_into :faraday | faraday (w/ net_http) |
123
+
124
+ @exclude-jruby
125
+ Scenario Outline: localhost requests are not treated differently by default
126
+ Given a file named "localhost_not_ignored.rb" with:
127
+ """ruby
128
+ include_http_adapter_for("<http_lib>")
129
+ require 'sinatra_app.rb'
130
+
131
+ require 'vcr'
132
+
133
+ VCR.configure do |c|
134
+ c.cassette_library_dir = 'cassettes'
135
+ <configuration>
136
+ end
137
+
138
+ VCR.use_cassette('localhost') do
139
+ response_body_for(:get, "http://localhost:7777/")
140
+ end
141
+
142
+ response_body_for(:get, "http://localhost:7777/")
143
+ """
144
+ When I run `ruby localhost_not_ignored.rb`
145
+ Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
146
+ And the file "cassettes/localhost.yml" should contain "body: Port 7777 Response 1"
147
+
148
+ Examples:
149
+ | configuration | http_lib |
150
+ | c.hook_into :fakeweb | net/http |
151
+ | c.hook_into :webmock | net/http |
152
+ | c.hook_into :typhoeus | typhoeus |
153
+ | c.hook_into :excon | excon |
154
+ | c.hook_into :faraday | faraday (w/ net_http) |
155
+
156
+ Scenario Outline: localhost requests are allowed and not recorded when ignore_localhost = true
157
+ Given a file named "ignore_localhost_true.rb" with:
158
+ """ruby
159
+ include_http_adapter_for("<http_lib>")
160
+ require 'sinatra_app.rb'
161
+
162
+ require 'vcr'
163
+
164
+ VCR.configure do |c|
165
+ c.ignore_localhost = true
166
+ c.cassette_library_dir = 'cassettes'
167
+ <configuration>
168
+ end
169
+
170
+ VCR.use_cassette('localhost') do
171
+ puts response_body_for(:get, "http://localhost:7777/")
172
+ end
173
+
174
+ puts response_body_for(:get, "http://localhost:7777/")
175
+ """
176
+ When I run `ruby ignore_localhost_true.rb`
177
+ Then it should pass with:
178
+ """
179
+ Port 7777 Response 1
180
+ Port 7777 Response 2
181
+ """
182
+ And the file "cassettes/localhost.yml" should not exist
183
+
184
+ Examples:
185
+ | configuration | http_lib |
186
+ | c.hook_into :fakeweb | net/http |
187
+ | c.hook_into :webmock | net/http |
188
+ | c.hook_into :typhoeus | typhoeus |
189
+ | c.hook_into :excon | excon |
190
+ | c.hook_into :faraday | faraday (w/ net_http) |
191
+