Skip to content

Commit

Permalink
Add global toggle to use_cassette.
Browse files Browse the repository at this point in the history
  • Loading branch information
colonelpanic8 committed Sep 17, 2014
1 parent 0cfe63e commit 366e2b7
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
26 changes: 24 additions & 2 deletions tests/unit/test_cassettes.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
from six.moves import http_client as httplib

import pytest
import yaml
import mock

from vcr.cassette import Cassette
from vcr.errors import UnhandledHTTPRequestError
from vcr import global_toggle


def test_cassette_load(tmpdir):
Expand Down Expand Up @@ -69,11 +73,11 @@ def test_cassette_cant_read_same_request_twice():


@mock.patch('vcr.cassette.requests_match', return_value=True)
@mock.patch('vcr.cassette.load_cassette', lambda *args, **kwargs: (('foo',), (mock.MagicMock(),)))
@mock.patch('vcr.cassette.load_cassette',
lambda *args, **kwargs: (('foo',), (mock.MagicMock(),)))
@mock.patch('vcr.cassette.Cassette.can_play_response_for', return_value=True)
@mock.patch('vcr.stubs.VCRHTTPResponse')
def test_function_decorated_with_use_cassette_can_be_invoked_multiple_times(*args):
from six.moves import http_client as httplib
@Cassette.use_cassette('test')
def decorated_function():
conn = httplib.HTTPConnection("www.python.org")
Expand All @@ -96,3 +100,21 @@ def test_cassette_all_played():
a.append('foo', 'bar')
a.play_response('foo')
assert a.all_played

@mock.patch('vcr.cassette.install')
@mock.patch('vcr.cassette.reset')
def test_global_toggle(mock_reset, mock_install):
@Cassette.use_cassette('test')
def function():
pass

global_toggle(enabled=False)

function()
assert mock_install.call_count == 0
assert mock_reset.call_count == 0

global_toggle(enabled=True)
function()
mock_install.assert_called_once_with(mock.ANY)
mock_reset.assert_called_once_with()
4 changes: 4 additions & 0 deletions vcr/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import logging
from .config import VCR
from . import cassette

# Set default logging handler to avoid "No handler found" warnings.
try: # Python 2.7+
Expand All @@ -9,6 +10,9 @@ class NullHandler(logging.Handler):
def emit(self, record):
pass

def global_toggle(enabled=True):
cassette.use_cassette._enabled = enabled


logging.getLogger(__name__).addHandler(NullHandler())

Expand Down
20 changes: 19 additions & 1 deletion vcr/cassette.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,33 @@
from .errors import UnhandledHTTPRequestError


class NullContextDecorator(object):

def __init__(self, *args, **kwargs):
pass

def __enter__(self, *args):
return self

def __exit__(self, *args):
pass

def __call__(self, function):
return function


class use_cassette(object):

_enabled = True

def __init__(self, cls, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self.cls = cls

def __enter__(self):
self._cassette = self.cls.load(*self.args, **self.kwargs)
self._cassette = self.cls.load(*self.args, **self.kwargs) if self._enabled \
else NullContextDecorator()
return self._cassette.__enter__()

def __exit__(self, *args):
Expand Down

0 comments on commit 366e2b7

Please sign in to comment.