"""Unit tests for devx.utils.logging.""" from __future__ import annotations import logging from pathlib import Path from unittest.mock import patch from devx.utils.logging import get_logger class TestGetLogger: def test_returns_logger_with_handlers(self) -> None: logger = get_logger("test_devx_unit_1") assert logger.handlers assert isinstance(logger.handlers[0], logging.FileHandler) def test_idempotent(self) -> None: logger1 = get_logger("test_devx_unit_2") initial_count = len(logger1.handlers) logger2 = get_logger("test_devx_unit_2") assert logger1 is logger2 assert len(logger2.handlers) == initial_count def test_log_level_is_debug(self) -> None: logger = get_logger("test_devx_unit_3") assert logger.level == logging.DEBUG def test_file_handler_level_is_debug(self) -> None: logger = get_logger("test_devx_unit_4") file_handler = logger.handlers[0] assert file_handler.level == logging.DEBUG def test_default_name(self) -> None: logger = get_logger() assert logger.name == "devx" def test_creates_log_directory(self, tmp_path: Path) -> None: with patch.object(Path, "home", return_value=tmp_path): get_logger("test_app_creates_dir") log_dir = tmp_path / ".local" / "state" / "test_app_creates_dir" / "logs" assert log_dir.exists() assert (log_dir / "test_app_creates_dir.log").exists() def test_formatter_includes_timestamp(self) -> None: logger = get_logger("test_devx_unit_5") file_handler = logger.handlers[0] fmt = file_handler.formatter assert fmt is not None assert "%(asctime)s" in fmt._fmt assert "%(levelname)s" in fmt._fmt assert "%(name)s" in fmt._fmt assert "%(message)s" in fmt._fmt