"""Tests for core.logging_config."""
from __future__ import annotations
import logging
import sys
from types import SimpleNamespace
import core.logging_config as logging_config_module
from core.models import RequestContext
def _restore_root_logger(handlers, level):
root = logging.getLogger()
root.handlers = handlers
root.setLevel(level)
def test_context_filter_injects_request_context():
record = logging.LogRecord("test", logging.INFO, __file__, 1, "message", (), None)
ctx = RequestContext("acct", "user", "agent", "session", "trace")
filt = logging_config_module.ContextFilter(ctx)
assert filt.filter(record) is True
assert record.account_id == "acct"
assert record.user_id == "user"
assert record.agent_id == "agent"
assert record.trace_id == "trace"
def test_context_filter_uses_na_when_context_missing():
record = logging.LogRecord("test", logging.INFO, __file__, 1, "message", (), None)
assert logging_config_module.ContextFilter().filter(record) is True
assert record.account_id == "N/A"
assert record.trace_id == "N/A"
def test_setup_logging_json_success_and_file_handler(monkeypatch, tmp_path):
original_handlers = list(logging.getLogger().handlers)
original_level = logging.getLogger().level
fake_module = SimpleNamespace(
jsonlogger=SimpleNamespace(JsonFormatter=logging.Formatter),
)
monkeypatch.setitem(sys.modules, "pythonjsonlogger", fake_module)
log_path = tmp_path / "app.log"
logging_config_module.setup_logging(level="debug", json_output=True, log_file=str(log_path))
root = logging.getLogger()
try:
assert root.level == logging.DEBUG
assert len(root.handlers) == 2
assert any(isinstance(handler, logging.FileHandler) for handler in root.handlers)
finally:
_restore_root_logger(original_handlers, original_level)
def test_setup_logging_json_fallback_without_pythonjsonlogger(monkeypatch):
original_import = __import__
original_handlers = list(logging.getLogger().handlers)
original_level = logging.getLogger().level
def failing_import(name, *args, **kwargs):
if name == "pythonjsonlogger":
raise ImportError("missing")
return original_import(name, *args, **kwargs)
monkeypatch.setattr("builtins.__import__", failing_import)
logging_config_module.setup_logging(level="warning", json_output=True)
root = logging.getLogger()
try:
assert root.level == logging.WARNING
assert len(root.handlers) == 1
assert root.handlers[0].stream is sys.stderr
finally:
_restore_root_logger(original_handlers, original_level)
def test_get_logger_and_with_context_attach_filter():
logger = logging_config_module.get_logger("context-engine.test")
ctx = RequestContext("acct", "user", "agent", "session", "trace")
adapter = logging_config_module.with_context(logger, ctx)
assert isinstance(adapter, logging_config_module.ContextLoggerAdapter)
assert adapter.ctx == ctx