import logging
import unittest
from io import StringIO
from unittest.mock import patch, MagicMock
from mskl.utils.logger import (
RotatingFileHandlerWithPermission,
init_logging_file,
error,
info_without_format
)
class TestRotatingFileHandler(unittest.TestCase):
@patch("os.chmod")
def test_do_rollover_permission(self, mock_chmod):
handler = RotatingFileHandlerWithPermission("test.log", mode='a')
with patch.object(handler, "baseFilename", "test.log"):
handler.doRollover()
mock_chmod.assert_called_once_with("test.log", 0o640)
handler.close()
class TestLoggingFunctions(unittest.TestCase):
def setUp(self):
self.log_stream = StringIO()
self.original_handlers = logging.getLogger().handlers.copy()
logging.getLogger().handlers = []
handler = logging.StreamHandler(self.log_stream)
logging.getLogger().addHandler(handler)
global progress_info
progress_info = ''
def tearDown(self):
logging.getLogger().handlers = self.original_handlers
@patch("logging.error")
def test_error_logging(self, mock_error):
error("Test error")
mock_error.assert_called_once()
args = mock_error.call_args[0][0]
self.assertTrue(args.startswith(' '))
class TestInitLoggingFile(unittest.TestCase):
@patch("os.makedirs")
@patch("logging.getLogger")
@patch("builtins.open", new_callable=MagicMock)
def test_init_logging_file(self, mock_open, mock_get_logger, mock_makedirs):
mock_logger = MagicMock()
mock_get_logger.return_value = mock_logger
test_path = "/var/log/test/app.log"
init_logging_file(test_path)
mock_makedirs.assert_called_once_with("/var/log/test", 0o750)
mock_logger.addHandler.assert_called_once()
handler = mock_logger.addHandler.call_args[0][0]
self.assertIsInstance(handler, RotatingFileHandlerWithPermission)
self.assertEqual(handler.baseFilename, test_path)
self.assertEqual(handler.mode, 'a')
self.assertEqual(handler.encoding, 'utf-8')
self.assertEqual(handler.maxBytes, 1024 ** 2)
self.assertEqual(handler.backupCount, 10)
class TestInfoWithoutFormat(unittest.TestCase):
@patch("logging.info")
def test_direct_logging(self, mock_info):
info_without_format("Raw message")
mock_info.assert_called_once_with("Raw message")