Upload folder using huggingface_hub
Browse files- tests/test_logging_module.py +107 -0
tests/test_logging_module.py
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import logging
|
| 2 |
+
import os
|
| 3 |
+
import sys
|
| 4 |
+
from datetime import datetime
|
| 5 |
+
from ankigen.logging import setup_logger
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def test_setup_logger_returns_logger():
|
| 9 |
+
"""1) setup_logger returns a logging.Logger"""
|
| 10 |
+
logger = setup_logger("test_returns_logger")
|
| 11 |
+
assert isinstance(logger, logging.Logger)
|
| 12 |
+
assert logger.name == "test_returns_logger"
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def test_setup_logger_handlers(tmp_path, monkeypatch):
|
| 16 |
+
"""2) Logger has exactly 2 handlers (StreamHandler + FileHandler)"""
|
| 17 |
+
# Redirect home directory to tmp_path to avoid creating files in actual home
|
| 18 |
+
monkeypatch.setattr(
|
| 19 |
+
"ankigen.logging.os.path.expanduser", lambda x: str(tmp_path) if x == "~" else x
|
| 20 |
+
)
|
| 21 |
+
|
| 22 |
+
logger = setup_logger("test_handlers")
|
| 23 |
+
|
| 24 |
+
# Check number of handlers
|
| 25 |
+
assert len(logger.handlers) == 2
|
| 26 |
+
|
| 27 |
+
handler_types = [type(h) for h in logger.handlers]
|
| 28 |
+
# One should be StreamHandler (for console)
|
| 29 |
+
assert any(
|
| 30 |
+
issubclass(t, logging.StreamHandler) and not issubclass(t, logging.FileHandler)
|
| 31 |
+
for t in handler_types
|
| 32 |
+
)
|
| 33 |
+
# One should be FileHandler
|
| 34 |
+
assert any(issubclass(t, logging.FileHandler) for t in handler_types)
|
| 35 |
+
|
| 36 |
+
# Verify StreamHandler uses stdout
|
| 37 |
+
console_handler = next(
|
| 38 |
+
h
|
| 39 |
+
for h in logger.handlers
|
| 40 |
+
if isinstance(h, logging.StreamHandler)
|
| 41 |
+
and not isinstance(h, logging.FileHandler)
|
| 42 |
+
)
|
| 43 |
+
assert console_handler.stream == sys.stdout
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def test_file_handler_path_pattern(tmp_path, monkeypatch):
|
| 47 |
+
"""3) File handler writes to the correct path pattern"""
|
| 48 |
+
monkeypatch.setattr(
|
| 49 |
+
"ankigen.logging.os.path.expanduser", lambda x: str(tmp_path) if x == "~" else x
|
| 50 |
+
)
|
| 51 |
+
|
| 52 |
+
name = "test_path"
|
| 53 |
+
logger = setup_logger(name)
|
| 54 |
+
|
| 55 |
+
file_handler = next(
|
| 56 |
+
h for h in logger.handlers if isinstance(h, logging.FileHandler)
|
| 57 |
+
)
|
| 58 |
+
log_file_path = file_handler.baseFilename
|
| 59 |
+
|
| 60 |
+
timestamp = datetime.now().strftime("%Y%m%d")
|
| 61 |
+
# Expected pattern: ~/.ankigen/logs/{name}_{YYYYMMDD}.log
|
| 62 |
+
expected_path = tmp_path / ".ankigen" / "logs" / f"{name}_{timestamp}.log"
|
| 63 |
+
|
| 64 |
+
assert os.path.abspath(log_file_path) == os.path.abspath(str(expected_path))
|
| 65 |
+
# Check if the directory was created
|
| 66 |
+
assert os.path.exists(os.path.dirname(log_file_path))
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def test_setup_logger_clears_old_handlers(tmp_path, monkeypatch):
|
| 70 |
+
"""4) Calling setup_logger twice with same name clears old handlers (no duplicates)"""
|
| 71 |
+
monkeypatch.setattr(
|
| 72 |
+
"ankigen.logging.os.path.expanduser", lambda x: str(tmp_path) if x == "~" else x
|
| 73 |
+
)
|
| 74 |
+
|
| 75 |
+
name = "test_clear_handlers"
|
| 76 |
+
logger = setup_logger(name)
|
| 77 |
+
assert len(logger.handlers) == 2
|
| 78 |
+
initial_handlers = list(logger.handlers)
|
| 79 |
+
|
| 80 |
+
# Call again with same name
|
| 81 |
+
logger2 = setup_logger(name)
|
| 82 |
+
assert logger is logger2
|
| 83 |
+
assert len(logger2.handlers) == 2
|
| 84 |
+
|
| 85 |
+
# Ensure handlers were replaced, not accumulated
|
| 86 |
+
for handler in initial_handlers:
|
| 87 |
+
assert handler not in logger2.handlers
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
def test_custom_log_level_respected():
|
| 91 |
+
"""5) Custom log_level is respected"""
|
| 92 |
+
name_debug = "test_log_level_debug"
|
| 93 |
+
logger_debug = setup_logger(name_debug, log_level=logging.DEBUG)
|
| 94 |
+
assert logger_debug.level == logging.DEBUG
|
| 95 |
+
|
| 96 |
+
name_info = "test_log_level_info"
|
| 97 |
+
logger_info = setup_logger(name_info, log_level=logging.INFO)
|
| 98 |
+
assert logger_info.level == logging.INFO
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
def test_custom_name_creates_distinct_logger():
|
| 102 |
+
"""6) Custom name creates a distinct logger"""
|
| 103 |
+
logger1 = setup_logger("logger1")
|
| 104 |
+
logger2 = setup_logger("logger2")
|
| 105 |
+
assert logger1.name == "logger1"
|
| 106 |
+
assert logger2.name == "logger2"
|
| 107 |
+
assert logger1 is not logger2
|