def test_abort_when_not_closed(self, mock_internal_close, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._is_closed = False transaction.abort() mock_internal_close.assert_called_once_with() mock_session.abort_transaction.assert_called_once_with()
def test_close_client_error(self, mock_abort, mock_executor, mock_logger_warning, mock_session): ce = ClientError(MOCK_CLIENT_ERROR_MESSAGE, MOCK_ERROR_MESSAGE) mock_abort.side_effect = ce transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction.close() mock_abort.assert_called_once_with() mock_logger_warning.assert_called_once()
def test_update_hash_empty_list_parameters(self, mock_to_qldb_hash, mock_executor, mock_session): mock_to_qldb_hash.return_value = mock_to_qldb_hash transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._update_hash(MOCK_STATEMENT, []) mock_to_qldb_hash.assert_has_calls([call(MOCK_ID), call(MOCK_STATEMENT)]) self.assertEqual(transaction._txn_hash, mock_to_qldb_hash.dot())
def test_execute_statement_when_closed(self, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._is_closed = True self.assertRaises(TransactionClosedError, transaction._execute_statement, MOCK_STATEMENT)
def test_update_hash(self, mock_to_qldb_hash, mock_executor, mock_session): mock_to_qldb_hash.return_value = mock_to_qldb_hash transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._update_hash(MOCK_STATEMENT, (MOCK_PARAMETER_1, MOCK_PARAMETER_2)) mock_to_qldb_hash.assert_has_calls([call(MOCK_ID), call(MOCK_STATEMENT), call(MOCK_PARAMETER_1), call(MOCK_PARAMETER_2)], any_order=True) self.assertEqual(transaction._txn_hash, mock_to_qldb_hash.dot())
def test_execute_statement_with_invalid_parameters(self, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) with self.assertRaises(TypeError): transaction._execute_statement(MOCK_STATEMENT, INVALID_MOCK_PARAMETER)
def test_commit(self, mock_internal_close, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) mock_session.commit_transaction.return_value = {"TransactionId": transaction.transaction_id, "CommitDigest": transaction._txn_hash.get_qldb_hash()} transaction.commit() mock_session.commit_transaction.assert_called_once_with(transaction.transaction_id, transaction._txn_hash.get_qldb_hash()) mock_internal_close.assert_called_once_with()
def test_close_child_cursors(self, mock_cursor_1, mock_cursor_2, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._cursors = [mock_cursor_1, mock_cursor_2] transaction._close_child_cursors() self.assertEqual(transaction._cursors, []) mock_cursor_1.close.assert_called_once_with() mock_cursor_2.close.assert_called_once_with()
def test_execute_statement_read_ahead_2(self, mock_cursor, mock_update_hash, mock_executor, mock_session): mock_update_hash.return_value = None mock_cursor.return_value = mock_cursor mock_session.execute_statement.return_value = MOCK_FIRST_PAGE_RESULT transaction = Transaction(mock_session, 2, MOCK_ID, mock_executor) cursor = transaction.execute_statement(MOCK_STATEMENT) mock_session.execute_statement.assert_called_once_with(MOCK_ID, MOCK_STATEMENT, ()) mock_update_hash.assert_called_once_with(MOCK_STATEMENT, ()) mock_cursor.assert_called_once_with(MOCK_STATEMENT_RESULT, mock_session, MOCK_ID, 2, mock_executor) self.assertEqual(transaction._cursors, [mock_cursor]) self.assertEqual(cursor, mock_cursor)
def test_execute_statement_with_native_parameters(self, mock_cursor, mock_update_hash, mock_executor, mock_session): mock_update_hash.return_value = None mock_cursor.return_value = mock_cursor mock_session.execute_statement.return_value = MOCK_FIRST_PAGE_RESULT transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) cursor = transaction.execute_statement(MOCK_STATEMENT, NATIVE_PARAMETER_1, NATIVE_PARAMETER_2) mock_session.execute_statement.assert_called_once_with(MOCK_ID, MOCK_STATEMENT, (ION_PARAMETER_1, ION_PARAMETER_1)) mock_update_hash.assert_called_once_with(MOCK_STATEMENT, (ION_PARAMETER_1, ION_PARAMETER_2)) mock_cursor.assert_called_once_with(MOCK_STATEMENT_RESULT, mock_session, MOCK_ID) self.assertEqual(transaction._cursors, [mock_cursor]) self.assertEqual(cursor, mock_cursor)
def test_commit_with_non_matching_commit_result(self, mock_internal_close, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) mock_session.commit_transaction.return_value = {"CommitDigest": 'Non-matching CommitDigest'} self.assertRaises(IllegalStateError, transaction.commit) mock_internal_close.assert_called_once_with()
def test_getters(self, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) is_closed = transaction.is_closed self.assertEqual(is_closed, transaction._is_closed) transaction_id = transaction.transaction_id self.assertEqual(transaction_id, transaction._id)
def test_commit_client_error(self, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) ce = ClientError(MOCK_CLIENT_ERROR_MESSAGE, MOCK_ERROR_MESSAGE) mock_session._commit_transaction.side_effect = ce self.assertRaises(ClientError, transaction._commit) mock_session._commit_transaction.assert_called_once_with( transaction._id, transaction._txn_hash.get_qldb_hash())
def test_context_manager_with_invalid_session_error(self, mock_close, mock_executor, mock_session): mock_invalid_session_error_message = {'Error': {'Code': 'InvalidSessionException', 'Message': MOCK_ERROR_MESSAGE}} mock_invalid_session_error = ClientError(mock_invalid_session_error_message, MOCK_ERROR_MESSAGE) mock_session.execute_statement.side_effect = mock_invalid_session_error with self.assertRaises(ClientError): with Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) as transaction: transaction.execute_statement('select * from foo') mock_close.assert_called_once_with()
def test_commit_occ_conflict_exception(self, mock_is_occ_conflict_exception, mock_internal_close, mock_executor, mock_session): mock_is_occ_conflict_exception.return_value = True transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) ce = ClientError(MOCK_CLIENT_ERROR_MESSAGE, MOCK_ERROR_MESSAGE) mock_session.commit_transaction.side_effect = ce self.assertRaises(ClientError, transaction.commit) mock_session.commit_transaction.assert_called_once_with(transaction._id, transaction._txn_hash.get_qldb_hash()) mock_internal_close.assert_called_once_with() mock_is_occ_conflict_exception.assert_called_once_with(ce)
def test_Transaction(self, mock_to_qldb_hash, mock_executor, mock_session): mock_to_qldb_hash.return_value = mock_to_qldb_hash transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) self.assertEqual(transaction._session, mock_session) self.assertEqual(transaction._read_ahead, MOCK_READ_AHEAD) self.assertEqual(transaction._cursors, []) self.assertEqual(transaction._id, MOCK_ID) self.assertEqual(transaction._txn_hash, mock_to_qldb_hash) self.assertEqual(transaction._executor, mock_executor) mock_to_qldb_hash.assert_called_once_with(MOCK_ID)
def test_commit_abort_txn_raises_client_exception(self, mock_executor, mock_logger_warning, mock_internal_close, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) ce = ClientError(MOCK_CLIENT_ERROR_MESSAGE, MOCK_ERROR_MESSAGE) mock_session.commit_transaction.side_effect = ce ce2 = ClientError(MOCK_CLIENT_ERROR_MESSAGE, MOCK_ERROR_MESSAGE) mock_session.abort_transaction.side_effect = ce2 self.assertRaises(ClientError, transaction.commit) mock_session.commit_transaction.assert_called_once_with(transaction._id, transaction._txn_hash.get_qldb_hash()) mock_logger_warning.assert_called_once() self.assertEqual(mock_internal_close.call_count, 2)
def test_internal_close(self, mock_cursor_1, mock_cursor_2, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._cursors = [mock_cursor_1, mock_cursor_2] transaction._is_closed = False transaction._internal_close() self.assertTrue(transaction._is_closed) self.assertEqual(transaction._cursors, []) mock_cursor_1.close.assert_called_once_with() mock_cursor_2.close.assert_called_once_with()
def test_context_manager(self, mock_close, mock_executor, mock_session): with Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor): pass mock_close.assert_called_once_with()
def test_commit_when_closed(self, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._is_closed = True self.assertRaises(TransactionClosedError, transaction._commit)
def test_get_transaction_id(self, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction_id = transaction.transaction_id self.assertEqual(transaction_id, transaction._id)
def test_close(self, mock_abort, mock_executor, mock_session): transaction = Transaction(mock_session, MOCK_READ_AHEAD, MOCK_ID, mock_executor) transaction._close() mock_abort.assert_called_once_with()