Files
openfe/openfecli/tests/test_utils.py
Alyssa Travitz 588f552ca9 add ruff isort linting rule (#1665)
* isort for docs and utils

* isort for top-level openfe, analysis, setup

* isort setup/

* isort storage/

* isort protocols

* isort openn_afe

* isort openmm_rfe

* isort all protocols

* apply isort to openfe/tests

* apply isort to openfecli

* apply isort to devtools/

* add TODO for setup init
2025-11-10 21:58:30 +00:00

95 lines
2.8 KiB
Python

import contextlib
import logging
import os
from unittest.mock import patch
import pytest
from openfecli.utils import _should_configure_logger, configure_logger, import_thing
# 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 == []