Files
slic/tests/test_utils_logcfg.py
T
tligui_y c96d71f714
Run CI Tests / test (push) Successful in 39s
Update tests/test_utils_logcfg.py
2025-07-28 16:48:25 +02:00

88 lines
2.6 KiB
Python

import logging
import logzero
import pytest
import tempfile
import subprocess
import os
import sys
import textwrap
from logzero import logger as log
from slic.utils.logcfg import add_log_Level, logcfg, setup_import_logging
# Set for all the tests
@pytest.fixture(scope="module", autouse=True)
def setup_custom_levels():
add_log_Level(log, "LONG", logging.INFO + 5, func_name="long")
add_log_Level(log, "ENLARGE", logging.INFO + 6, func_name="enlarge")
logcfg("LONG")
setup_import_logging()
# Test simple custom log
@pytest.mark.parametrize("levelname, logfunc, message", [
("LONG", lambda msg: log.long(msg), "This is a LONG message"),
("ENLARGE", lambda msg: log.enlarge(msg), "Please ENLARGE this!"),
])
def test_custom_log_outputs(levelname, logfunc, message, capsys):
# Remove all handlers to avoid duplicate logs
for h in log.handlers[:]:
log.removeHandler(h)
# Create a new handler that logs to stderr
handler = logging.StreamHandler(sys.stderr)
formatter = logzero.LogFormatter()
handler.setFormatter(formatter)
log.addHandler(handler)
logcfg(levelname)
# Call and capture
logfunc(message)
captured = capsys.readouterr().err
print("Captured stderr:", repr(captured))
assert message in captured, f"Expected message '{message}' not found in log"
assert levelname in captured, f"Expected level '{levelname}' not present in log"
# Test subprocess: top-level import logs only once
def test_import_logging_once_per_module():
code = textwrap.dedent("""
import sys
from slic.utils.logcfg import setup_import_logging, add_log_Level, logcfg
from logzero import logger as log
import logging
add_log_Level(log, "TRACE", logging.DEBUG - 1, func_name="trace")
logcfg("TRACE")
setup_import_logging()
import json
import math
import io
import random
""")
with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as tmp:
tmp.write(code)
tmp_path = tmp.name
env = os.environ.copy()
root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
env["PYTHONPATH"] = root_path + os.pathsep + env.get("PYTHONPATH", "")
result = subprocess.run([sys.executable, tmp_path], capture_output=True, text=True, env=env)
os.remove(tmp_path)
assert result.returncode == 0, f"Script failed:\n{result.stderr}"
stderr = result.stderr
lines = stderr.splitlines()
for mod in ["json", "math", "io", "random"]:
count = sum(1 for line in lines if f"importing: {mod}" in line)
assert count == 1, f"Expected 1 import log for '{mod}', found {count}"