Files
openfe/openfecli/tests/test_utils.py
David W.H. Swenson dbe288a0fa Apply suggestions from code review
Co-authored-by: Irfan Alibay <IAlibay@users.noreply.github.com>
2023-08-01 07:10:09 -05:00

90 lines
2.8 KiB
Python

import os
import pytest
from unittest.mock import patch
import logging
import contextlib
from openfecli.utils import (
import_thing, _should_configure_logger, configure_logger
)
# looks like this can't be done as a fixture; related to
# https://github.com/pytest-dev/pytest/issues/2974
@contextlib.contextmanager
def patch_root_logger():
# use this to hide away some handlers that pytest attaches
old_manager = logging.Logger.manager
old_root = logging.root
new_root = logging.RootLogger(logging.WARNING)
manager = logging.Manager(new_root)
logging.Logger.manager = manager
logging.root = new_root
yield new_root
logging.Logger.manager = old_manager
logging.root = old_root
@pytest.mark.parametrize('import_string,expected', [
('os.path.exists', os.path.exists),
('os.getcwd', os.getcwd),
('os', os),
])
def test_import_thing(import_string, expected):
assert import_thing(import_string) is expected
def test_import_thing_import_error():
with pytest.raises(ImportError):
import_thing('foo.bar')
def test_import_thing_attribute_error():
with pytest.raises(AttributeError):
import_thing('os.foo')
@pytest.mark.parametrize("logger_name, expected", [
("default", True), ("default.default", True),
("level", False), ("level.default", False),
("handler", False), ("handler.default", False),
("default.noprop", False)
])
@pytest.mark.parametrize('with_adapter', [True, False])
def test_should_configure_logger(logger_name, expected, with_adapter):
with patch_root_logger():
logging.getLogger("level").setLevel(logging.INFO)
logging.getLogger("handler").addHandler(logging.NullHandler())
logging.getLogger("default.noprop").propagate = False
logger = logging.getLogger(logger_name)
if with_adapter:
logger = logging.LoggerAdapter(logger, extra={"foo": "bar"})
assert _should_configure_logger(logger) == expected
def test_root_logger_level_configured():
with patch_root_logger():
root = logging.getLogger()
root.setLevel(logging.INFO)
logger = logging.getLogger("default.default")
assert not _should_configure_logger(logger)
@pytest.mark.parametrize('with_handler', [True, False])
def test_configure_logger(with_handler):
handler = logging.NullHandler() if with_handler else None
expected_handlers = [handler] if handler else []
with patch_root_logger():
configure_logger('default.default', handler=handler)
logger = logging.getLogger('default.default')
parent = logging.getLogger('default')
assert logger.isEnabledFor(logging.INFO)
assert not parent.isEnabledFor(logging.INFO)
assert logger.handlers == expected_handlers
assert parent.handlers == []