diff --git a/tests/unit/test_cassettes.py b/tests/unit/test_cassettes.py index 1b310c4..eb54909 100644 --- a/tests/unit/test_cassettes.py +++ b/tests/unit/test_cassettes.py @@ -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): @@ -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") @@ -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() diff --git a/vcr/__init__.py b/vcr/__init__.py index 60af690..ccf8993 100644 --- a/vcr/__init__.py +++ b/vcr/__init__.py @@ -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+ @@ -9,6 +10,9 @@ except ImportError: def emit(self, record): pass +def global_toggle(enabled=True): + cassette.use_cassette._enabled = enabled + logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/vcr/cassette.py b/vcr/cassette.py index fb3c77c..64a927b 100644 --- a/vcr/cassette.py +++ b/vcr/cassette.py @@ -14,15 +14,33 @@ from .matchers import requests_match, uri, method 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):