You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
6.2 KiB

2 weeks ago
import unittest
from unittest.mock import patch, MagicMock, call
import logging
from termcolor import colored
from deepsearcher.utils import log
from deepsearcher.utils.log import ColoredFormatter
class TestColoredFormatter(unittest.TestCase):
"""Tests for the ColoredFormatter class."""
def setUp(self):
"""Set up test fixtures."""
self.formatter = ColoredFormatter("%(levelname)s - %(message)s")
def test_format_debug(self):
"""Test formatting debug level messages."""
record = logging.LogRecord(
"test", logging.DEBUG, "test.py", 1, "Debug message", (), None
)
formatted = self.formatter.format(record)
expected = colored("DEBUG - Debug message", "cyan")
self.assertEqual(formatted, expected)
def test_format_info(self):
"""Test formatting info level messages."""
record = logging.LogRecord(
"test", logging.INFO, "test.py", 1, "Info message", (), None
)
formatted = self.formatter.format(record)
expected = colored("INFO - Info message", "green")
self.assertEqual(formatted, expected)
def test_format_warning(self):
"""Test formatting warning level messages."""
record = logging.LogRecord(
"test", logging.WARNING, "test.py", 1, "Warning message", (), None
)
formatted = self.formatter.format(record)
expected = colored("WARNING - Warning message", "yellow")
self.assertEqual(formatted, expected)
def test_format_error(self):
"""Test formatting error level messages."""
record = logging.LogRecord(
"test", logging.ERROR, "test.py", 1, "Error message", (), None
)
formatted = self.formatter.format(record)
expected = colored("ERROR - Error message", "red")
self.assertEqual(formatted, expected)
def test_format_critical(self):
"""Test formatting critical level messages."""
record = logging.LogRecord(
"test", logging.CRITICAL, "test.py", 1, "Critical message", (), None
)
formatted = self.formatter.format(record)
expected = colored("CRITICAL - Critical message", "magenta")
self.assertEqual(formatted, expected)
def test_format_unknown_level(self):
"""Test formatting messages with unknown log level."""
record = logging.LogRecord(
"test", 60, "test.py", 1, "Custom level message", (), None
)
record.levelname = "CUSTOM"
formatted = self.formatter.format(record)
expected = colored("CUSTOM - Custom level message", "white")
self.assertEqual(formatted, expected)
class TestLogFunctions(unittest.TestCase):
"""Tests for the logging functions."""
def setUp(self):
"""Set up test fixtures."""
# Reset dev mode before each test
log.set_dev_mode(False)
# Create mock for dev_logger
self.mock_dev_logger = MagicMock()
self.dev_logger_patcher = patch("deepsearcher.utils.log.dev_logger", self.mock_dev_logger)
self.dev_logger_patcher.start()
# Create mock for progress_logger
self.mock_progress_logger = MagicMock()
self.progress_logger_patcher = patch("deepsearcher.utils.log.progress_logger", self.mock_progress_logger)
self.progress_logger_patcher.start()
def tearDown(self):
"""Clean up test fixtures."""
self.dev_logger_patcher.stop()
self.progress_logger_patcher.stop()
def test_set_dev_mode(self):
"""Test setting development mode."""
self.assertFalse(log.dev_mode)
log.set_dev_mode(True)
self.assertTrue(log.dev_mode)
log.set_dev_mode(False)
self.assertFalse(log.dev_mode)
def test_set_level(self):
"""Test setting log level."""
log.set_level(logging.DEBUG)
self.mock_dev_logger.setLevel.assert_called_once_with(logging.DEBUG)
def test_debug_in_dev_mode(self):
"""Test debug logging in dev mode."""
log.set_dev_mode(True)
log.debug("Test debug")
self.mock_dev_logger.debug.assert_called_once_with("Test debug")
def test_debug_not_in_dev_mode(self):
"""Test debug logging not in dev mode."""
log.set_dev_mode(False)
log.debug("Test debug")
self.mock_dev_logger.debug.assert_not_called()
def test_info_in_dev_mode(self):
"""Test info logging in dev mode."""
log.set_dev_mode(True)
log.info("Test info")
self.mock_dev_logger.info.assert_called_once_with("Test info")
def test_info_not_in_dev_mode(self):
"""Test info logging not in dev mode."""
log.set_dev_mode(False)
log.info("Test info")
self.mock_dev_logger.info.assert_not_called()
def test_warning_in_dev_mode(self):
"""Test warning logging in dev mode."""
log.set_dev_mode(True)
log.warning("Test warning")
self.mock_dev_logger.warning.assert_called_once_with("Test warning")
def test_warning_not_in_dev_mode(self):
"""Test warning logging not in dev mode."""
log.set_dev_mode(False)
log.warning("Test warning")
self.mock_dev_logger.warning.assert_not_called()
def test_error_in_dev_mode(self):
"""Test error logging in dev mode."""
log.set_dev_mode(True)
log.error("Test error")
self.mock_dev_logger.error.assert_called_once_with("Test error")
def test_error_not_in_dev_mode(self):
"""Test error logging not in dev mode."""
log.set_dev_mode(False)
log.error("Test error")
self.mock_dev_logger.error.assert_not_called()
def test_critical(self):
"""Test critical logging and exception raising."""
with self.assertRaises(RuntimeError) as context:
log.critical("Test critical")
self.mock_dev_logger.critical.assert_called_once_with("Test critical")
self.assertEqual(str(context.exception), "Test critical")
def test_color_print(self):
"""Test color print function."""
log.color_print("Test message")
self.mock_progress_logger.info.assert_called_once_with("Test message")
if __name__ == "__main__":
unittest.main()