42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import io
|
|
import json
|
|
import logging
|
|
|
|
from quartermaster.logging_config import LOG_CONFIG
|
|
|
|
|
|
def _build_formatter():
|
|
"""Instantiate the JSON formatter from LOG_CONFIG for direct testing."""
|
|
from pydoc import locate
|
|
|
|
cfg = dict(LOG_CONFIG["formatters"]["json"])
|
|
factory_path = cfg.pop("()")
|
|
factory = locate(factory_path)
|
|
assert factory is not None, f"formatter factory not importable: {factory_path}"
|
|
return factory(**cfg)
|
|
|
|
|
|
def test_log_config_emits_json_with_required_fields():
|
|
formatter = _build_formatter()
|
|
stream = io.StringIO()
|
|
handler = logging.StreamHandler(stream)
|
|
handler.setFormatter(formatter)
|
|
|
|
logger = logging.getLogger("tests.logging_smoke")
|
|
logger.handlers = [handler]
|
|
logger.propagate = False
|
|
logger.setLevel(logging.INFO)
|
|
|
|
logger.info("smoke message", extra={"event": "smoke"})
|
|
|
|
line = stream.getvalue().strip()
|
|
assert line, "formatter produced no output"
|
|
payload = json.loads(line)
|
|
|
|
assert payload["event"] == "smoke"
|
|
assert payload["level"] == "INFO"
|
|
assert payload["logger"] == "tests.logging_smoke"
|
|
assert payload["message"] == "smoke message"
|
|
assert "timestamp" in payload
|