"""Tests for the mysql connector.""" from unittest.mock import MagicMock from oto import status import pytest from promo_player.connectors import mysql from promo_player.constants import error @pytest.mark.parametrize('capture_exception', (True, False)) def test_autosession(monkeypatch, capture_exception): """Test autosession method creates a partial of autosession_decorate.""" function = mysql.autosession(capture_exception=capture_exception) assert function.func == mysql.autosession_decorate assert function.keywords.get('capture_exception') == capture_exception @pytest.mark.parametrize('capture_exception', (True, False)) def test_autosession_decorate(monkeypatch, capture_exception): """Test autosession decorate creates a partial of autosession_decorate.""" decorated_function = MagicMock function = mysql.autosession_decorate( decorated_function, capture_exception=capture_exception) assert function.func == mysql.autosession_context assert function.keywords.get('function') == decorated_function assert function.keywords.get('capture_exception') == capture_exception def test_autosession_context(monkeypatch): """Test the autosession context.""" session = MagicMock() monkeypatch.setattr( mysql, '_db_session', MagicMock(return_value=session)) decorated_function = MagicMock() values = ('a', 'list', 'of', 'random') keywords = {'entity_type': 'release', 'entity_id': 20874} mysql.autosession_context( *values, function=decorated_function, **keywords) # ensure the session is provided as one of the arguments. decorated_function.assert_called_with( *values, session=session, **keywords) # Verify session is created, committed, and closed on sucessful run. assert mysql._db_session.called assert session.commit.called assert session.close.called assert not session.rollback.called assert decorated_function.called @pytest.mark.parametrize('capture_exception', (True, False)) def test_autosession_context_on_exception(monkeypatch, capture_exception): """Test the autosession context with exception.""" session = MagicMock() monkeypatch.setattr(mysql, 'sentry_capture_exception', MagicMock()) monkeypatch.setattr( mysql, '_db_session', MagicMock(return_value=session)) decorated_function = MagicMock(side_effect=Exception(), ) response = mysql.autosession_context( function=decorated_function, capture_exception=capture_exception) # Verify session is created, rollback, and closed on unsuccessful run. assert mysql._db_session.called assert session.rollback.called assert session.close.called assert decorated_function.called assert not session.commit.called assert not response assert response.errors.get('code') == error.ERROR_CODE_MYSQL assert response.errors.get('message') == error.ERROR_MESSAGE_DB_ISSUE assert response.status == status.INTERNAL_ERROR