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