import logging from io import StringIO from unittest.mock import patch from model_data.utils import setup_logger, is_percentage_or_number, correct_spelling class TestLogger: def test_setup_logger_default(self): log_stream = StringIO() handler = logging.StreamHandler(log_stream) logger = setup_logger() logger.addHandler(handler) # log something logger.info("Hello World!") log_stream.seek(0) # assert that log was written assert log_stream.read() == "Hello World!\n" # remove the handler after use logger.removeHandler(handler) @patch('logging.FileHandler') def test_setup_logger_file(self, mock_file_handler): # setup the logger logger = setup_logger(log_file='test.log', overwrite_handler=True) # assert FileHandler was called correctly mock_file_handler.assert_called_once_with('test.log') # clean up after use for handler in logger.handlers[:]: handler.close() logger.removeHandler(handler) def test_setup_logger_loglevel(self): log_stream = StringIO() handler = logging.StreamHandler(log_stream) logger = setup_logger(level=logging.DEBUG) logger.addHandler(handler) # log something logger.debug("Hello World!") log_stream.seek(0) # assert that log was written assert log_stream.read() == "Hello World!\n" # remove the handler after use logger.removeHandler(handler) def test_is_percentage_or_number(self): assert is_percentage_or_number("88") assert is_percentage_or_number("88%") assert not is_percentage_or_number("abc") assert not is_percentage_or_number("") assert not is_percentage_or_number("88.0") # only integer numbers or percentages assert is_percentage_or_number("101%") # numbers over 100 allowed assert not is_percentage_or_number("-1") # negative numbers not allowed def test_correct_spelling(self): assert correct_spelling("speling") == "spelling" assert correct_spelling("88") == "88" # numbers are left unchanged assert correct_spelling("corerct") == "correct" assert correct_spelling("excllent") == "excellent" assert correct_spelling("") == "" # empty string should return an empty string assert correct_spelling("88%") == "88%" # percentages are left unchanged