diff --git a/wagtail/tests/utils/assert_logs.py b/wagtail/tests/utils/assert_logs.py deleted file mode 100644 index 21bffcdc3..000000000 --- a/wagtail/tests/utils/assert_logs.py +++ /dev/null @@ -1,83 +0,0 @@ -import logging -from collections import namedtuple - - -# Implementation of TestCase.assertLogs for pre-3.4 Python versions. -# Borrowed from https://github.com/django/django/pull/3467/commits/1b4f10963628bb68246c193f1124a1f7b6e4c696 - -class _BaseTestCaseContext: - def __init__(self, test_case): - self.test_case = test_case - - def _raiseFailure(self, standardMsg): - msg = self.test_case._formatMessage(self.msg, standardMsg) - raise self.test_case.failureException(msg) - - -_LoggingWatcher = namedtuple("_LoggingWatcher", ["records", "output"]) - - -class _CapturingHandler(logging.Handler): - """ - A logging handler capturing all (raw and formatted) logging output. - """ - - def __init__(self): - logging.Handler.__init__(self) - self.watcher = _LoggingWatcher([], []) - - def flush(self): - pass - - def emit(self, record): - self.watcher.records.append(record) - msg = self.format(record) - self.watcher.output.append(msg) - - -class _AssertLogsContext(_BaseTestCaseContext): - """A context manager used to implement TestCase.assertLogs().""" - - # original format is "%(levelname)s:%(name)s:%(message)s" - LOGGING_FORMAT = "%(message)s" - - def __init__(self, test_case, logger_name, level): - _BaseTestCaseContext.__init__(self, test_case) - self.logger_name = logger_name - if level: - if getattr(logging, '_nameToLevel', False): - self.level = logging._nameToLevel.get(level, level) - else: - self.level = logging._levelNames.get(level, level) - else: - self.level = logging.INFO - self.msg = None - - def __enter__(self): - if isinstance(self.logger_name, logging.Logger): - logger = self.logger = self.logger_name - else: - logger = self.logger = logging.getLogger(self.logger_name) - formatter = logging.Formatter(self.LOGGING_FORMAT) - handler = _CapturingHandler() - handler.setFormatter(formatter) - self.watcher = handler.watcher - self.old_handlers = logger.handlers[:] - self.old_level = logger.level - self.old_propagate = logger.propagate - logger.handlers = [handler] - logger.setLevel(self.level) - logger.propagate = False - return handler.watcher - - def __exit__(self, exc_type, exc_value, tb): - self.logger.handlers = self.old_handlers - self.logger.propagate = self.old_propagate - self.logger.setLevel(self.old_level) - if exc_type is not None: - # let unexpected exceptions pass through - return False - if len(self.watcher.records) == 0: - self._raiseFailure( - "no logs of level {} or higher triggered on {}" - .format(logging.getLevelName(self.level), self.logger.name)) diff --git a/wagtail/tests/utils/wagtail_tests.py b/wagtail/tests/utils/wagtail_tests.py index 7b96b8405..f6dc31912 100644 --- a/wagtail/tests/utils/wagtail_tests.py +++ b/wagtail/tests/utils/wagtail_tests.py @@ -1,12 +1,9 @@ -import sys import warnings from contextlib import contextmanager from django.contrib.auth import get_user_model from django.test.testcases import assert_and_parse_html -from .assert_logs import _AssertLogsContext - class WagtailTestUtils: @@ -56,45 +53,6 @@ class WagtailTestUtils: line=w.line ) - # borrowed from https://github.com/django/django/commit/9f427617e4559012e1c2fd8fce46cbe225d8515d - @staticmethod - def reset_warning_registry(): - """ - Clear warning registry for all modules. This is required in some tests - because of a bug in Python that prevents warnings.simplefilter("always") - from always making warnings appear: http://bugs.python.org/issue4180 - - The bug was fixed in Python 3.4.2. - """ - key = "__warningregistry__" - for mod in list(sys.modules.values()): - if hasattr(mod, key): - getattr(mod, key).clear() - - # Configuring LOGGING_FORMAT is not possible without subclassing - # unittest.TestCase, so use this implementation even on Python 3.4 - def assertLogs(self, logger=None, level=None): - """Fail unless a log message of level *level* or higher is emitted - on *logger_name* or its children. If omitted, *level* defaults to - INFO and *logger* defaults to the root logger. - - This method must be used as a context manager, and will yield - a recording object with two attributes: `output` and `records`. - At the end of the context manager, the `output` attribute will - be a list of the matching formatted log messages and the - `records` attribute will be a list of the corresponding LogRecord - objects. - - Example:: - - with self.assertLogs('foo', level='INFO') as cm: - logging.getLogger('foo').info('first message') - logging.getLogger('foo.bar').error('second message') - self.assertEqual(cm.output, ['INFO:foo:first message', - 'ERROR:foo.bar:second message']) - """ - return _AssertLogsContext(self, logger, level) - @contextmanager def register_hook(self, hook_name, fn, order=0): from wagtail.core import hooks