"""Tests for utility modules.
Requirements covered:
- Logging configuration
- General utilities
"""
import logging
import pytest
from jana_mcp.utils.logging import setup_logging
class TestLoggingSetup:
"""Test logging configuration."""
def test_setup_logging_returns_logger(self):
"""Test setup_logging returns a logger instance."""
logger = setup_logging("INFO")
assert isinstance(logger, logging.Logger)
def test_setup_logging_default_level(self):
"""Test setup_logging uses INFO by default."""
logger = setup_logging()
# The root logger should be at INFO level
root = logging.getLogger()
assert root.level == logging.INFO
def test_setup_logging_debug_level(self):
"""Test setup_logging configures DEBUG level."""
logger = setup_logging("DEBUG")
root = logging.getLogger()
assert root.level == logging.DEBUG
def test_setup_logging_warning_level(self):
"""Test setup_logging configures WARNING level."""
logger = setup_logging("WARNING")
root = logging.getLogger()
assert root.level == logging.WARNING
def test_setup_logging_error_level(self):
"""Test setup_logging configures ERROR level."""
logger = setup_logging("ERROR")
root = logging.getLogger()
assert root.level == logging.ERROR
def test_setup_logging_case_insensitive(self):
"""Test setup_logging handles lowercase level names."""
logger = setup_logging("info")
root = logging.getLogger()
assert root.level == logging.INFO
def test_setup_logging_reduces_httpx_noise(self):
"""Test setup_logging reduces httpx logging level."""
setup_logging("DEBUG")
httpx_logger = logging.getLogger("httpx")
assert httpx_logger.level >= logging.WARNING
def test_setup_logging_reduces_httpcore_noise(self):
"""Test setup_logging reduces httpcore logging level."""
setup_logging("DEBUG")
httpcore_logger = logging.getLogger("httpcore")
assert httpcore_logger.level >= logging.WARNING
def test_setup_logging_returns_jana_mcp_logger(self):
"""Test setup_logging returns jana_mcp logger."""
logger = setup_logging("INFO")
assert logger.name == "jana_mcp"
def test_setup_logging_adds_handler(self):
"""Test setup_logging adds console handler."""
# Clear existing handlers
root = logging.getLogger()
root.handlers.clear()
setup_logging("INFO")
assert len(root.handlers) > 0
def test_setup_logging_clears_previous_handlers(self):
"""Test setup_logging clears existing handlers."""
root = logging.getLogger()
# Add a dummy handler
root.addHandler(logging.NullHandler())
initial_count = len(root.handlers)
setup_logging("INFO")
# Should have cleared and added new handler
# (may have 1 handler after setup)
assert len(root.handlers) <= initial_count
class TestLoggingFormatter:
"""Test logging formatter configuration."""
def test_log_format_includes_timestamp(self, caplog):
"""Test log format includes timestamp."""
setup_logging("INFO")
logger = logging.getLogger("jana_mcp")
logger.info("Test message")
# Check that formatter is applied
root = logging.getLogger()
for handler in root.handlers:
if hasattr(handler, "formatter") and handler.formatter:
format_str = handler.formatter._fmt
assert "asctime" in format_str or "%(asctime)" in format_str
def test_log_format_includes_level(self, caplog):
"""Test log format includes level name."""
setup_logging("INFO")
root = logging.getLogger()
for handler in root.handlers:
if hasattr(handler, "formatter") and handler.formatter:
format_str = handler.formatter._fmt
assert "levelname" in format_str or "%(levelname)" in format_str
def test_log_format_includes_name(self, caplog):
"""Test log format includes logger name."""
setup_logging("INFO")
root = logging.getLogger()
for handler in root.handlers:
if hasattr(handler, "formatter") and handler.formatter:
format_str = handler.formatter._fmt
assert "name" in format_str or "%(name)" in format_str