"""Test logging.""" import logging import uuid from datetime import datetime from unittest.mock import Mock, patch import pytest from grass import logger from grass.logger import CustomAdapter def test_handler_creation(): """Test the creation of the handler.""" dsn = 'dsn value' handler = logger.DSNHandler(dsn) assert handler.dsn == dsn def test_get_full_message(): """Test getting a full message.""" record = Mock() message = 'Message' record.msg = message record.exc_info = None record.created = datetime.now().timestamp() handler = logger.DSNHandler('dsn') assert handler.get_full_message(record) == message @patch('traceback.format_exception') def test_get_full_message_with_exception(trace): """Test getting message from exception.""" record = Mock() record.exc_info = ['one', 'two'] trace.return_value = ['trace', 'two'] record.created = datetime.now().timestamp() handler = logger.DSNHandler('dsn') assert handler.get_full_message(record) trace.assert_called_once_with('one', 'two') @patch('grass.logger.session') def test_get_full_message_with_text(session): """Test emiting a message.""" record = Mock() message = 'Message' correlation_id = uuid.uuid1() record.msg = message record.exc_info = None record.created = datetime.now().timestamp() record.correlation_id = correlation_id handler = logger.DSNHandler('dsn') handler.emit(record) assert session.post.called @patch('grass.logger.session') def test_get_full_message_with_random_exception(session): """Test emiting a message.""" session.post = Mock(side_effect=SystemExit) record = Mock() record.msg = 'Message' record.exc_info = None record.created = datetime.now().timestamp() record.correlation_id = uuid.uuid1() handler = logger.DSNHandler('dsn') with pytest.raises(SystemExit): handler.emit(record) @patch('grass.logger.session') def test_get_full_message_with_except(session): """Test emiting a message.""" session.post = Mock(side_effect=Exception()) record = Mock() record.msg = 'Message' record.exc_info = None record.created = datetime.now().timestamp() record.correlation_id = uuid.uuid1() handler = logger.DSNHandler('dsn') handler.handleError = Mock() handler.emit(record) handler.handleError.assert_called_with(record) @pytest.mark.parametrize( ('context', 'level', 'expected'), [ ( dict(correlation_id='54410be4-9439-11ea-94fe-3052cb7d76a7'), logging.ERROR, '[54410be4-9439-11ea-94fe-3052cb7d76a7] Some msg', ), ( dict(correlation_id='54410be4-9439-11ea-94fe-3052cb7d76a7'), logging.INFO, '[54410be4-9439-11ea-94fe-3052cb7d76a7] Some msg', ), (dict(), logging.INFO, '[] Some msg'), ], ) def test_custom_adapter(context, level, expected, caplog): """Test CustomAdapter.""" test_logger = logging.getLogger('grass-test') adapter = CustomAdapter(test_logger, context) adapter.log(level, 'Some msg') for record in caplog.records: assert record.levelname == logging.getLevelName(level) assert record.name == 'grass-test' assert record.msg == expected