import logging import pytest from kanta.logging import configure_logging, log_change @pytest.fixture(autouse=True) def _reset_kanta_loggers(): yield for name in ("kanta", "kanta.transaction", "kanta.bootstrap", "kanta.migration"): logger = logging.getLogger(name) logger.setLevel(logging.NOTSET) logger.propagate = True logger.handlers.clear() def test_configure_logging_defaults(): kanta_logger = logging.getLogger("kanta") configure_logging() assert kanta_logger.level == logging.INFO assert not kanta_logger.propagate assert kanta_logger.handlers def test_configure_logging_disables_specific_loggers(): configure_logging(bootstrap=False, migration=False, transaction=False) assert not logging.getLogger("kanta.bootstrap").propagate assert not logging.getLogger("kanta.migration").propagate assert not logging.getLogger("kanta.transaction").propagate def test_configure_logging_skiproot_false_leaves_kanta_propagation(): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging(bootstrap=False, skiproot=False) assert kanta_logger.propagate assert not kanta_logger.handlers assert not logging.getLogger("kanta.bootstrap").propagate def test_log_change_no_diff(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change("test", {}) captured = capsys.readouterr() assert "test" in captured.err def test_log_change_appends_extra_string(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change("export", {}, extra="mydb.db") captured = capsys.readouterr() assert "export" in captured.err assert "mydb.db" in captured.err def test_log_change_headerfmt_replaces_header(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change( "update", {}, headerfmt=lambda action, user, extra: f"CUSTOM {action} {extra['id']}", extra={"id": 7}, ) captured = capsys.readouterr() assert "CUSTOM update 7" in captured.err def test_log_change_headerfmt_none_falls_back(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change("update", {}, user="alice", headerfmt=lambda *args: None) captured = capsys.readouterr() assert "update" in captured.err assert "alice" in captured.err def test_log_change_log_diff_false(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change("update", {"counter": 5}, previous={}, log_diff=False) captured = capsys.readouterr() assert "update" in captured.err assert "counter" not in captured.err def test_log_change_log_header_false(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change("update", {"counter": 5}, previous={}, log_header=False) captured = capsys.readouterr() assert "update" not in captured.err assert "counter" in captured.err def test_log_change_both_disabled_logs_nothing(capsys): kanta_logger = logging.getLogger("kanta") kanta_logger.handlers.clear() configure_logging() log_change("update", {"counter": 5}, previous={}, log_header=False, log_diff=False) captured = capsys.readouterr() assert captured.err == ""