import logging import pytest from ea_chatbot.utils.logging import get_logger @pytest.fixture(autouse=True) def reset_logging(): """Reset the ea_chatbot logger handlers before each test.""" logger = logging.getLogger("ea_chatbot") # Remove all existing handlers for handler in logger.handlers[:]: logger.removeHandler(handler) yield # Also clean up after test for handler in logger.handlers[:]: logger.removeHandler(handler) def test_get_logger_singleton(): """Test that get_logger returns the same logger instance for the same name.""" logger1 = get_logger("test_logger") logger2 = get_logger("test_logger") assert logger1 is logger2 def test_get_logger_rich_handler(): """Test that get_logger configures a RichHandler on root.""" get_logger("test_rich") root = logging.getLogger("ea_chatbot") # Check if any handler is a RichHandler handler_names = [h.__class__.__name__ for h in root.handlers] assert "RichHandler" in handler_names def test_get_logger_level(): """Test that get_logger sets the correct log level.""" logger = get_logger("test_level", level="DEBUG") assert logger.level == logging.DEBUG def test_json_formatter_serializes_dict(): """Test that JsonFormatter serializes log records to JSON.""" from ea_chatbot.utils.logging import JsonFormatter import json formatter = JsonFormatter() record = logging.LogRecord( name="test", level=logging.INFO, pathname="test.py", lineno=10, msg="test message", args=(), exc_info=None ) formatted = formatter.format(record) data = json.loads(formatted) assert data["message"] == "test message" assert data["level"] == "INFO" assert "timestamp" in data def test_get_logger_file_handler(tmp_path): """Test that get_logger configures a file handler on root.""" log_file = tmp_path / "test.json" logger = get_logger("test_file", log_file=str(log_file)) root = logging.getLogger("ea_chatbot") handler_names = [h.__class__.__name__ for h in root.handlers] assert "RotatingFileHandler" in handler_names logger.info("file log test") # Check if file exists and has content assert log_file.exists() content = log_file.read_text() assert "file log test" in content