"""Tests for the logging adapter.""" import logging import pytest from owsclient.logging_adapter import ( OwsClientLoggerAdapter, get_logger, ) def test_get_logger_returns_adapter() -> None: """Test that get_logger returns a LoggerAdapter instance.""" logger = get_logger("test") assert isinstance(logger, OwsClientLoggerAdapter) assert isinstance(logger.logger, logging.Logger) def test_logging_with_default_extras( caplog: pytest.LogCaptureFixture, ) -> None: """Test that default extras are included in log records.""" logger = get_logger("test") with caplog.at_level(logging.INFO): logger.info("Test message") # Verify the call was made with merged extras assert len(caplog.records) == 1 assert caplog.records[0].levelname == "INFO" assert getattr(caplog.records[0], "library") == { "name": "python-owsclient", "language": "python", } def test_logging_with_instance_extras( caplog: pytest.LogCaptureFixture, ) -> None: """Test that instance-level extras are included.""" logger = get_logger("test", extra={"component": "auth"}) with caplog.at_level(logging.INFO): logger.info("Test message") assert len(caplog.records) == 1 assert caplog.records[0].levelname == "INFO" assert getattr(caplog.records[0], "library") == { "name": "python-owsclient", "language": "python", } assert getattr(caplog.records[0], "component") == "auth" def test_logging_extras_precedence( caplog: pytest.LogCaptureFixture, ) -> None: """Test that per-call extras are included and can override.""" logger = get_logger("test", extra={"component": "auth", "request_id": "123"}) with caplog.at_level(logging.WARNING): logger.warning( "Test message", extra={ "level": "warning", "request_id": "not-123", "component": "not-auth", "library": "overwritten", }, ) assert len(caplog.records) == 1 assert caplog.records[0].levelname == "WARNING" assert getattr(caplog.records[0], "library") == "overwritten" assert getattr(caplog.records[0], "request_id") == "not-123" assert getattr(caplog.records[0], "component") == "not-auth" def test_adapter_process_method() -> None: """Test the process method directly.""" base_logger = logging.getLogger("test") adapter = OwsClientLoggerAdapter( base_logger, extra={"instance_key": "instance_value"} ) msg, kwargs = adapter.process("Test message", {"extra": {"call_key": "call_value"}}) assert msg == "Test message" assert kwargs["extra"]["library"] == { "name": "python-owsclient", "language": "python", } assert kwargs["extra"]["instance_key"] == "instance_value" assert kwargs["extra"]["call_key"] == "call_value"