9194ef5abd
Docs/Test Workflow / Test docs build (push) Failing after 0s
Check links & references / links-check (push) Failing after 1s
Pytest/Test Workflow / Import Test and Pytest Run (ubuntu-latest, 3.10) (push) Failing after 0s
Pytest/Test Workflow / Import Test and Pytest Run (ubuntu-latest, 3.11) (push) Failing after 0s
PR Conflict Labeler / main (push) Failing after 2s
Pytest/Test Workflow / Import Test and Pytest Run (ubuntu-latest, 3.12) (push) Failing after 2s
Pytest/Test Workflow / Import Test and Pytest Run (ubuntu-latest, 3.13) (push) Failing after 0s
Pytest/Test Workflow / Build this Package (push) Failing after 5s
Pytest/Test Workflow / Import Test and Pytest Run (macos-latest, 3.10) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (macos-latest, 3.11) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (macos-latest, 3.12) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (macos-latest, 3.13) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (windows-latest, 3.10) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (windows-latest, 3.11) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (windows-latest, 3.12) (push) Has been cancelled
Pytest/Test Workflow / Import Test and Pytest Run (windows-latest, 3.13) (push) Has been cancelled
Pytest/Test Workflow / testing-guardian (push) Has been cancelled
81 lines
3.2 KiB
Python
81 lines
3.2 KiB
Python
import logging
|
|
import sys
|
|
from unittest.mock import patch
|
|
|
|
from supervision.utils.logger import _get_logger
|
|
|
|
|
|
class TestGetLogger:
|
|
def test_default_name(self) -> None:
|
|
"""Logger is created with default name."""
|
|
logger = _get_logger()
|
|
assert logger.name == "supervision"
|
|
|
|
def test_custom_name(self) -> None:
|
|
"""Logger is created with provided name."""
|
|
logger = _get_logger("supervision.test_module")
|
|
assert logger.name == "supervision.test_module"
|
|
|
|
def test_default_level_is_info(self) -> None:
|
|
"""Logger defaults to INFO level when LOG_LEVEL env var is not set."""
|
|
with patch.dict("os.environ", {}, clear=True):
|
|
# Use a unique name to avoid cached logger state from other tests
|
|
logger = _get_logger("supervision.test_default_level")
|
|
assert logger.level == logging.INFO
|
|
|
|
def test_explicit_level(self) -> None:
|
|
"""Logger uses the explicitly provided level."""
|
|
logger = _get_logger("supervision.test_explicit_level", level=logging.DEBUG)
|
|
assert logger.level == logging.DEBUG
|
|
|
|
def test_log_level_env_var(self) -> None:
|
|
"""Logger respects the LOG_LEVEL environment variable."""
|
|
with patch.dict("os.environ", {"LOG_LEVEL": "DEBUG"}):
|
|
logger = _get_logger("supervision.test_env_level")
|
|
assert logger.level == logging.DEBUG
|
|
|
|
def test_log_level_env_var_warning(self) -> None:
|
|
"""Logger respects the LOG_LEVEL=WARNING environment variable."""
|
|
with patch.dict("os.environ", {"LOG_LEVEL": "WARNING"}):
|
|
logger = _get_logger("supervision.test_env_warning")
|
|
assert logger.level == logging.WARNING
|
|
|
|
def test_two_handlers_configured(self) -> None:
|
|
"""Logger has exactly two handlers: one for stdout, one for stderr."""
|
|
logger = _get_logger("supervision.test_handlers")
|
|
assert len(logger.handlers) == 2
|
|
|
|
def test_stdout_handler_present(self) -> None:
|
|
"""Logger has a StreamHandler pointing to stdout."""
|
|
logger = _get_logger("supervision.test_stdout")
|
|
stdout_handlers = [
|
|
h
|
|
for h in logger.handlers
|
|
if isinstance(h, logging.StreamHandler) and h.stream is sys.stdout
|
|
]
|
|
assert len(stdout_handlers) == 1
|
|
|
|
def test_stderr_handler_present(self) -> None:
|
|
"""Logger has a StreamHandler pointing to stderr for warnings."""
|
|
logger = _get_logger("supervision.test_stderr")
|
|
stderr_handlers = [
|
|
h
|
|
for h in logger.handlers
|
|
if isinstance(h, logging.StreamHandler) and h.stream is sys.stderr
|
|
]
|
|
assert len(stderr_handlers) == 1
|
|
|
|
def test_no_propagation(self) -> None:
|
|
"""Logger does not propagate to the root logger."""
|
|
logger = _get_logger("supervision.test_propagation")
|
|
assert not logger.propagate
|
|
|
|
def test_idempotent_no_duplicate_handlers(self) -> None:
|
|
"""Calling _get_logger twice with the same name does not add extra handlers."""
|
|
name = "supervision.test_idempotent"
|
|
logger1 = _get_logger(name)
|
|
handler_count = len(logger1.handlers)
|
|
logger2 = _get_logger(name)
|
|
assert len(logger2.handlers) == handler_count
|
|
assert logger1 is logger2
|