diff options
Diffstat (limited to 't/conftest.py')
-rw-r--r-- | t/conftest.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/t/conftest.py b/t/conftest.py new file mode 100644 index 00000000..9e8e959f --- /dev/null +++ b/t/conftest.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import, unicode_literals + +import atexit +import os +import pytest +import sys + +from kombu.exceptions import VersionMismatch + + +@pytest.fixture(scope='session') +def multiprocessing_workaround(request): + def fin(): + # Workaround for multiprocessing bug where logging + # is attempted after global already collected at shutdown. + canceled = set() + try: + import multiprocessing.util + canceled.add(multiprocessing.util._exit_function) + except (AttributeError, ImportError): + pass + + try: + atexit._exithandlers[:] = [ + e for e in atexit._exithandlers if e[0] not in canceled + ] + except AttributeError: # pragma: no cover + pass # Py3 missing _exithandlers + request.addfinalizer(fin) + + +@pytest.fixture(autouse=True) +def zzzz_test_cases_calls_setup_teardown(request): + if request.instance: + # we set the .patching attribute for every test class. + setup = getattr(request.instance, 'setup', None) + # we also call .setup() and .teardown() after every test method. + teardown = getattr(request.instance, 'teardown', None) + setup and setup() + teardown and request.addfinalizer(teardown) + + +@pytest.fixture(autouse=True) +def test_cases_has_patching(request, patching): + if request.instance: + request.instance.patching = patching + + +@pytest.fixture +def hub(request): + from kombu.async import Hub, get_event_loop, set_event_loop + _prev_hub = get_event_loop() + hub = Hub() + set_event_loop(hub) + + def fin(): + if _prev_hub is not None: + set_event_loop(_prev_hub) + request.addfinalizer(fin) + return hub + + +def find_distribution_modules(name=__name__, file=__file__): + current_dist_depth = len(name.split('.')) - 1 + current_dist = os.path.join(os.path.dirname(file), + *([os.pardir] * current_dist_depth)) + abs = os.path.abspath(current_dist) + dist_name = os.path.basename(abs) + + for dirpath, dirnames, filenames in os.walk(abs): + package = (dist_name + dirpath[len(abs):]).replace('/', '.') + if '__init__.py' in filenames: + yield package + for filename in filenames: + if filename.endswith('.py') and filename != '__init__.py': + yield '.'.join([package, filename])[:-3] + + +def import_all_modules(name=__name__, file=__file__, skip=[]): + for module in find_distribution_modules(name, file): + if module not in skip: + print('preimporting %r for coverage...' % (module,)) + try: + __import__(module) + except (ImportError, VersionMismatch, AttributeError): + pass + + +def is_in_coverage(): + return (os.environ.get('COVER_ALL_MODULES') or + any('--cov' in arg for arg in sys.argv)) + + +@pytest.fixture(scope='session') +def cover_all_modules(): + # so coverage sees all our modules. + if is_in_coverage(): + import_all_modules() |