github.com/status-im/status-go@v1.1.0/services/wallet/transfer/multi_transaction_db_test.go (about)

     1  package transfer
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"github.com/ethereum/go-ethereum/common"
    10  	"github.com/ethereum/go-ethereum/common/hexutil"
    11  	wallet_common "github.com/status-im/status-go/services/wallet/common"
    12  	"github.com/status-im/status-go/t/helpers"
    13  	"github.com/status-im/status-go/walletdatabase"
    14  )
    15  
    16  func setupTestMultiTransactionDB(t *testing.T) (*MultiTransactionDB, func()) {
    17  	db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{})
    18  	require.NoError(t, err)
    19  	SetMultiTransactionIDGenerator(StaticIDCounter()) // to have different multi-transaction IDs even with fast execution
    20  	return NewMultiTransactionDB(db), func() {
    21  		require.NoError(t, db.Close())
    22  	}
    23  }
    24  func TestCreateMultiTransaction(t *testing.T) {
    25  	mtDB, cleanup := setupTestMultiTransactionDB(t)
    26  	defer cleanup()
    27  
    28  	tr := generateTestTransfer(0)
    29  	multiTransaction := GenerateTestSendMultiTransaction(tr)
    30  
    31  	err := mtDB.CreateMultiTransaction(&multiTransaction)
    32  	require.NoError(t, err)
    33  
    34  	// Add assertions here to verify the result of the CreateMultiTransaction method
    35  	details := NewMultiTxDetails()
    36  	details.IDs = []wallet_common.MultiTransactionIDType{multiTransaction.ID}
    37  	mtx, err := mtDB.ReadMultiTransactions(details)
    38  	require.NoError(t, err)
    39  	require.Len(t, mtx, 1)
    40  	require.True(t, areMultiTransactionsEqual(&multiTransaction, mtx[0]))
    41  }
    42  func TestReadMultiTransactions(t *testing.T) {
    43  	mtDB, cleanup := setupTestMultiTransactionDB(t)
    44  	defer cleanup()
    45  
    46  	// Create test multi transactions
    47  	tr := generateTestTransfer(0)
    48  	mt1 := GenerateTestSendMultiTransaction(tr)
    49  	tr20 := generateTestTransfer(1)
    50  	tr21 := generateTestTransfer(2)
    51  	mt2 := GenerateTestBridgeMultiTransaction(tr20, tr21)
    52  	tr3 := generateTestTransfer(3)
    53  	mt3 := GenerateTestSwapMultiTransaction(tr3, "SNT", 100)
    54  
    55  	require.NotEqual(t, mt1.ID, mt2.ID)
    56  	require.NotEqual(t, mt1.ID, mt3.ID)
    57  
    58  	err := mtDB.CreateMultiTransaction(&mt1)
    59  	require.NoError(t, err)
    60  	err = mtDB.CreateMultiTransaction(&mt2)
    61  	require.NoError(t, err)
    62  	err = mtDB.CreateMultiTransaction(&mt3)
    63  	require.NoError(t, err)
    64  
    65  	// Read multi transactions
    66  	details := NewMultiTxDetails()
    67  	details.IDs = []wallet_common.MultiTransactionIDType{mt1.ID, mt2.ID, mt3.ID}
    68  	mtx, err := mtDB.ReadMultiTransactions(details)
    69  	require.NoError(t, err)
    70  	require.Len(t, mtx, 3)
    71  	require.True(t, areMultiTransactionsEqual(&mt1, mtx[0]))
    72  	require.True(t, areMultiTransactionsEqual(&mt2, mtx[1]))
    73  	require.True(t, areMultiTransactionsEqual(&mt3, mtx[2]))
    74  }
    75  
    76  func TestUpdateMultiTransaction(t *testing.T) {
    77  	mtDB, cleanup := setupTestMultiTransactionDB(t)
    78  	defer cleanup()
    79  
    80  	// Create test multi transaction
    81  	tr := generateTestTransfer(0)
    82  	multiTransaction := GenerateTestSendMultiTransaction(tr)
    83  
    84  	err := mtDB.CreateMultiTransaction(&multiTransaction)
    85  	require.NoError(t, err)
    86  
    87  	// Update the multi transaction
    88  	multiTransaction.FromNetworkID = 1
    89  	multiTransaction.FromTxHash = common.Hash{1}
    90  	multiTransaction.FromAddress = common.Address{2}
    91  	multiTransaction.FromAsset = "fromAsset1"
    92  	multiTransaction.FromAmount = (*hexutil.Big)(big.NewInt(234))
    93  	multiTransaction.ToNetworkID = 2
    94  	multiTransaction.ToTxHash = common.Hash{3}
    95  	multiTransaction.ToAddress = common.Address{4}
    96  	multiTransaction.ToAsset = "toAsset1"
    97  	multiTransaction.ToAmount = (*hexutil.Big)(big.NewInt(345))
    98  	multiTransaction.Type = MultiTransactionBridge
    99  	multiTransaction.CrossTxID = "crossTxD2"
   100  
   101  	err = mtDB.UpdateMultiTransaction(&multiTransaction)
   102  	require.NoError(t, err)
   103  
   104  	// Read the updated multi transaction
   105  	details := NewMultiTxDetails()
   106  	details.IDs = []wallet_common.MultiTransactionIDType{multiTransaction.ID}
   107  	mtx, err := mtDB.ReadMultiTransactions(details)
   108  	require.NoError(t, err)
   109  	require.Len(t, mtx, 1)
   110  	require.True(t, areMultiTransactionsEqual(&multiTransaction, mtx[0]))
   111  }
   112  
   113  func TestDeleteMultiTransaction(t *testing.T) {
   114  	mtDB, cleanup := setupTestMultiTransactionDB(t)
   115  	defer cleanup()
   116  
   117  	// Create test multi transaction
   118  	tr := generateTestTransfer(0)
   119  	multiTransaction := GenerateTestSendMultiTransaction(tr)
   120  
   121  	err := mtDB.CreateMultiTransaction(&multiTransaction)
   122  	require.NoError(t, err)
   123  
   124  	// Delete the multi transaction
   125  	err = mtDB.DeleteMultiTransaction(multiTransaction.ID)
   126  	require.NoError(t, err)
   127  
   128  	// Read the deleted multi transaction
   129  	mtx, err := mtDB.ReadMultiTransactions(&MultiTxDetails{
   130  		IDs: []wallet_common.MultiTransactionIDType{multiTransaction.ID}})
   131  	require.NoError(t, err)
   132  	require.Len(t, mtx, 0)
   133  }