import logging import pytest import io import json from ea_chatbot.utils.logging import ContextLoggerAdapter, JsonFormatter @pytest.fixture def json_log_capture(): """Fixture to capture JSON logs.""" log_stream = io.StringIO() logger = logging.getLogger("test_context") logger.setLevel(logging.INFO) for handler in logger.handlers[:]: logger.removeHandler(handler) handler = logging.StreamHandler(log_stream) handler.setFormatter(JsonFormatter()) logger.addHandler(handler) return logger, log_stream def test_context_logger_adapter_injects_metadata(json_log_capture): """Test that ContextLoggerAdapter injects metadata into the log record.""" logger, log_stream = json_log_capture adapter = ContextLoggerAdapter(logger, {"run_id": "123", "node_name": "test_node"}) adapter.info("test message") data = json.loads(log_stream.getvalue()) assert data["message"] == "test message" assert data["run_id"] == "123" assert data["node_name"] == "test_node" def test_context_logger_adapter_override_metadata(json_log_capture): """Test that extra metadata can be provided during call.""" logger, log_stream = json_log_capture adapter = ContextLoggerAdapter(logger, {"run_id": "123"}) # Passing extra context via the 'extra' parameter in standard logging # Note: Our adapter should handle merging this. adapter.info("test message", extra={"node_name": "dynamic_node"}) data = json.loads(log_stream.getvalue()) assert data["run_id"] == "123" assert data["node_name"] == "dynamic_node"