Skip to content

Commit

Permalink
Allow requests to be ignored by defining a block.
Browse files Browse the repository at this point in the history
This is much more flexible than the other config options for ignoring
requests.

Closes vcr#90.
  • Loading branch information
myronmarston committed Nov 9, 2011
1 parent 69131bf commit 531896c
Show file tree
Hide file tree
Showing 9 changed files with 237 additions and 160 deletions.
61 changes: 0 additions & 61 deletions features/configuration/ignore_hosts.feature

This file was deleted.

97 changes: 0 additions & 97 deletions features/configuration/ignore_localhost.feature

This file was deleted.

186 changes: 186 additions & 0 deletions features/configuration/ignore_request.feature
@@ -0,0 +1,186 @@
Feature: Ignore Request

By default, VCR hooks into every request, either allowing it and recording
it, or playing back a recorded response, or raising an error to force you
to deal with the new request. In some situations, you may prefer to have
VCR ignore some requests.

VCR provides 3 configuration options to accomplish this:

* `ignore_request { |req| ... }` will ignore any request for which the
given block returns true.
* `ignore_hosts 'foo.com', 'bar.com'` allows you to specify particular
hosts to ignore.
* `ignore_localhost = true` is equivalent to `ignore_hosts 'localhost',
'127.0.0.1', '0.0.0.0'`. It is particularly useful for when you use
VCR with a javascript-enabled capybara driver, since capybara boots
your rack app and makes localhost requests to it to check that it has
booted.

Ignored requests are not recorded and are always allowed, regardless of
the record mode, and even outside of a `VCR.use_cassette` block.

Background:
Given a file named "sinatra_app.rb" with:
"""ruby
response_count = 0
start_sinatra_app(:port => 7777) do
get('/') { "Port 7777 Response #{response_count += 1}" }
end
"""

Scenario Outline: ignore requests to a specific port
Given a file named "ignore_request.rb" with:
"""ruby
include_http_adapter_for("<http_lib>")
require 'sinatra_app.rb'
response_count = 0
start_sinatra_app(:port => 8888) do
get('/') { "Port 8888 Response #{response_count += 1}" }
end
require 'vcr'
VCR.configure do |c|
c.ignore_request do |request|
URI(request.uri).port == 7777
end
c.cassette_library_dir = 'cassettes'
<configuration>
end
VCR.use_cassette('example') do
puts response_body_for(:get, "http://localhost:8888/")
end
VCR.use_cassette('example') do
puts response_body_for(:get, "http://localhost:7777/")
end
puts response_body_for(:get, "http://localhost:7777/")
puts response_body_for(:get, "http://localhost:8888/")
"""
When I run `ruby ignore_request.rb`
Then it should fail with "Real HTTP connections are disabled. Request: GET http://localhost:8888/"
And the output should contain:
"""
Port 8888 Response 1
Port 7777 Response 1
Port 7777 Response 2
"""
And the file "cassettes/example.yml" should contain "body: Port 8888"
And the file "cassettes/example.yml" should not contain "body: Port 7777"

Examples:
| configuration | http_lib |
| c.hook_into :fakeweb | net/http |
| c.hook_into :webmock | net/http |
| c.hook_into :typhoeus | typhoeus |
| c.hook_into :excon | excon |
| c.hook_into :faraday | faraday (w/ net_http) |

Scenario Outline: ignored host requests are not recorded and are always allowed
Given a file named "ignore_hosts.rb" with:
"""ruby
include_http_adapter_for("<http_lib>")
require 'sinatra_app.rb'
require 'vcr'
VCR.configure do |c|
c.ignore_hosts '127.0.0.1', 'localhost'
c.cassette_library_dir = 'cassettes'
<configuration>
end
VCR.use_cassette('example') do
puts response_body_for(:get, "http://localhost:7777/")
end
puts response_body_for(:get, "http://localhost:7777/")
"""
When I run `ruby ignore_hosts.rb`
Then it should pass with:
"""
Port 7777 Response 1
Port 7777 Response 2
"""
And the file "cassettes/example.yml" should not exist

Examples:
| configuration | http_lib |
| c.hook_into :fakeweb | net/http |
| c.hook_into :webmock | net/http |
| c.hook_into :typhoeus | typhoeus |
| c.hook_into :excon | excon |
| c.hook_into :faraday | faraday (w/ net_http) |

Scenario Outline: localhost requests are not treated differently by default
Given a file named "localhost_not_ignored.rb" with:
"""ruby
include_http_adapter_for("<http_lib>")
require 'sinatra_app.rb'
require 'vcr'
VCR.configure do |c|
c.cassette_library_dir = 'cassettes'
<configuration>
end
VCR.use_cassette('localhost') do
response_body_for(:get, "http://localhost:7777/")
end
response_body_for(:get, "http://localhost:7777/")
"""
When I run `ruby localhost_not_ignored.rb`
Then it should fail with "Real HTTP connections are disabled"
And the file "cassettes/localhost.yml" should contain "body: Port 7777 Response 1"

Examples:
| configuration | http_lib |
| c.hook_into :fakeweb | net/http |
| c.hook_into :webmock | net/http |
| c.hook_into :typhoeus | typhoeus |
| c.hook_into :excon | excon |
| c.hook_into :faraday | faraday (w/ net_http) |

Scenario Outline: localhost requests are allowed and not recorded when ignore_localhost = true
Given a file named "ignore_localhost_true.rb" with:
"""ruby
include_http_adapter_for("<http_lib>")
require 'sinatra_app.rb'
require 'vcr'
VCR.configure do |c|
c.ignore_localhost = true
c.cassette_library_dir = 'cassettes'
<configuration>
end
VCR.use_cassette('localhost') do
puts response_body_for(:get, "http://localhost:7777/")
end
puts response_body_for(:get, "http://localhost:7777/")
"""
When I run `ruby ignore_localhost_true.rb`
Then it should pass with:
"""
Port 7777 Response 1
Port 7777 Response 2
"""
And the file "cassettes/localhost.yml" should not exist

Examples:
| configuration | http_lib |
| c.hook_into :fakeweb | net/http |
| c.hook_into :webmock | net/http |
| c.hook_into :typhoeus | typhoeus |
| c.hook_into :excon | excon |
| c.hook_into :faraday | faraday (w/ net_http) |

4 changes: 4 additions & 0 deletions lib/vcr/configuration.rb
Expand Up @@ -48,6 +48,10 @@ def ignore_localhost=(value)
VCR.request_ignorer.ignore_localhost = value
end

def ignore_request(&block)
VCR.request_ignorer.ignore_request(&block)
end

attr_writer :allow_http_connections_when_no_cassette
def allow_http_connections_when_no_cassette?
!!@allow_http_connections_when_no_cassette
Expand Down
14 changes: 13 additions & 1 deletion lib/vcr/request_ignorer.rb
@@ -1,10 +1,21 @@
require 'uri'
require 'set'
require 'vcr/util/hooks'

module VCR
class RequestIgnorer
include VCR::Hooks

define_hook :ignore_request

LOCALHOST_ALIASES = %w( localhost 127.0.0.1 0.0.0.0 )

def initialize
ignore_request do |request|
ignored_hosts.include?(URI(request.uri).host)
end
end

def ignore_localhost=(value)
if value
ignore_hosts(*LOCALHOST_ALIASES)
Expand All @@ -18,7 +29,8 @@ def ignore_hosts(*hosts)
end

def ignore?(request)
ignored_hosts.include?(URI(request.uri).host)
tag = nil # we don't use tags here...
invoke_hook(:ignore_request, tag, request).any?
end

private
Expand Down

0 comments on commit 531896c

Please sign in to comment.