import pytest import logging import sys from pathlib import Path from unittest.mock import patch, MagicMock from apitest.config.config_manager import ConfigManager from apitest.config.logger_manager import LoggerManager class TestLoggerManager: """测试LoggerManager日志管理器""" @pytest.fixture def mock_config_manager(self): """模拟配置管理器""" config_manager = MagicMock(spec=ConfigManager) config_manager.get_log_level.return_value = "INFO" config_manager.get_log_format.return_value = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" config_manager.get_log_file.return_value = None return config_manager @pytest.fixture def logger_manager(self, mock_config_manager): """创建日志管理器实例""" return LoggerManager(mock_config_manager) def test_logger_manager_initialization(self, mock_config_manager): """测试日志管理器初始化""" logger_manager = LoggerManager(mock_config_manager) assert logger_manager.config_manager == mock_config_manager assert isinstance(logger_manager._loggers, dict) @pytest.fixture def mock_config_manager_with_file(self, tmp_path): """模拟带日志文件的配置管理器""" config_manager = MagicMock(spec=ConfigManager) config_manager.get_log_level.return_value = "DEBUG" config_manager.get_log_format.return_value = "%(name)s - %(levelname)s - %(message)s" config_manager.get_log_file.return_value = tmp_path / "test.log" return config_manager def test_logger_manager_with_file(self, mock_config_manager_with_file): """测试带日志文件的日志管理器初始化""" logger_manager = LoggerManager(mock_config_manager_with_file) assert logger_manager.config_manager == mock_config_manager_with_file def test_get_logger(self, logger_manager): """测试获取日志记录器""" logger = logger_manager.get_logger("test_logger") assert isinstance(logger, logging.Logger) assert logger.name == "test_logger" assert "test_logger" in logger_manager._loggers def test_get_logger_cached(self, logger_manager): """测试获取缓存的日志记录器""" logger1 = logger_manager.get_logger("test_logger") logger2 = logger_manager.get_logger("test_logger") assert logger1 is logger2 def test_set_level(self, logger_manager): """测试设置日志级别""" logger_manager.set_level("DEBUG") root_logger = logging.getLogger() assert root_logger.level == logging.DEBUG def test_add_file_handler(self, logger_manager, tmp_path): """测试添加文件处理器""" log_file = tmp_path / "test_add_handler.log" initial_handler_count = len([h for h in logging.getLogger().handlers if isinstance(h, logging.FileHandler)]) logger_manager.add_file_handler(log_file) root_logger = logging.getLogger() file_handlers = [h for h in root_logger.handlers if isinstance(h, logging.FileHandler)] assert len(file_handlers) > initial_handler_count new_handlers = file_handlers[initial_handler_count:] assert len(new_handlers) > 0 assert str(log_file) in new_handlers[0].baseFilename def test_add_file_handler_with_level(self, logger_manager, tmp_path): """测试添加带级别的文件处理器""" log_file = tmp_path / "test_add_handler_level.log" initial_handler_count = len([h for h in logging.getLogger().handlers if isinstance(h, logging.FileHandler)]) logger_manager.add_file_handler(log_file, "ERROR") root_logger = logging.getLogger() file_handlers = [h for h in root_logger.handlers if isinstance(h, logging.FileHandler)] assert len(file_handlers) > initial_handler_count new_handlers = file_handlers[initial_handler_count:] assert len(new_handlers) > 0 assert new_handlers[0].level == logging.ERROR def test_remove_all_handlers(self, logger_manager): """测试移除所有处理器""" original_handler_count = len(logging.getLogger().handlers) logger_manager.remove_all_handlers() assert len(logging.getLogger().handlers) == 0 @patch('apitest.config.logger_manager.setup_logger') def test_setup_logger_function(self, mock_setup): """测试setup_logger函数""" from apitest.config.logger_manager import setup_logger mock_config = MagicMock(spec=ConfigManager) setup_logger(mock_config) mock_setup.assert_called_once_with(mock_config) class TestSetupLoggerIntegration: """测试setup_logger集成""" def test_setup_logger_creates_logger_manager(self): """测试setup_logger创建日志管理器""" config_data = { "logging": { "level": "INFO", "format": "%(name)s - %(levelname)s - %(message)s", "file": None } } with patch('apitest.config.config_manager.ConfigManager') as mock_config_class: mock_config = MagicMock(spec=ConfigManager) mock_config.get_log_level.return_value = "INFO" mock_config.get_log_format.return_value = "%(name)s - %(levelname)s - %(message)s" mock_config.get_log_file.return_value = None mock_config_class.return_value = mock_config from apitest.config.logger_manager import setup_logger logger_manager = setup_logger(mock_config) assert isinstance(logger_manager, LoggerManager) assert logger_manager.config_manager == mock_config