import logging import sys import pytest from flask._compat import StringIO from flask.logging import default_handler, has_level_handler, \ wsgi_errors_stream @pytest.fixture(autouse=True) def reset_logging(monkeypatch): root_handlers = logging.root.handlers[:] root_level = logging.root.level logger = logging.getLogger('flask.app') logger.handlers = [] logger.setLevel(logging.NOTSET) yield logging.root.handlers[:] = root_handlers logging.root.setLevel(root_level) logger.handlers = [] logger.setLevel(logging.NOTSET) def test_logger(app): assert app.logger.name == 'flask.app' assert app.logger.level == logging.NOTSET assert app.logger.handlers == [default_handler] def test_logger_debug(app): app.debug = True assert app.logger.level == logging.DEBUG assert app.logger.handlers == [default_handler] def test_existing_handler(app): logging.root.addHandler(logging.StreamHandler()) assert app.logger.level == logging.NOTSET assert not app.logger.handlers def test_wsgi_errors_stream(app, client): @app.route('/') def index(): app.logger.error('test') return '' stream = StringIO() client.get('/', errors_stream=stream) assert 'ERROR in test_logging: test' in stream.getvalue() assert wsgi_errors_stream._get_current_object() is sys.stderr with app.test_request_context(errors_stream=stream): assert wsgi_errors_stream._get_current_object() is stream def test_has_level_handler(): logger = logging.getLogger('flask.app') assert not has_level_handler(logger) handler = logging.StreamHandler() logging.root.addHandler(handler) assert has_level_handler(logger) logger.propagate = False assert not has_level_handler(logger) logger.propagate = True handler.setLevel(logging.ERROR) assert not has_level_handler(logger) def test_log_view_exception(app, client): @app.route('/') def index(): raise Exception('test') app.testing = False stream = StringIO() rv = client.get('/', errors_stream=stream) assert rv.status_code == 500 assert rv.data err = stream.getvalue() assert 'Exception on / [GET]' in err assert 'Exception: test' in err