github.com/status-im/status-go@v1.1.0/services/connector/commands/send_transaction_test.go (about)

     1  package commands
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	hexutil "github.com/ethereum/go-ethereum/common/hexutil"
    11  	"github.com/status-im/status-go/eth-node/types"
    12  	"github.com/status-im/status-go/signal"
    13  	"github.com/status-im/status-go/transactions"
    14  )
    15  
    16  func prepareSendTransactionRequest(dApp signal.ConnectorDApp, from types.Address) (RPCRequest, error) {
    17  	sendArgs := transactions.SendTxArgs{
    18  		From:  from,
    19  		To:    &types.Address{0x02},
    20  		Value: &hexutil.Big{},
    21  		Data:  types.HexBytes("0x0"),
    22  	}
    23  
    24  	sendArgsJSON, err := json.Marshal(sendArgs)
    25  	if err != nil {
    26  		return RPCRequest{}, err
    27  	}
    28  
    29  	var sendArgsMap map[string]interface{}
    30  	err = json.Unmarshal(sendArgsJSON, &sendArgsMap)
    31  	if err != nil {
    32  		return RPCRequest{}, err
    33  	}
    34  
    35  	params := []interface{}{sendArgsMap}
    36  
    37  	return ConstructRPCRequest("eth_sendTransaction", params, &dApp)
    38  }
    39  
    40  func TestFailToSendTransactionWithoutPermittedDApp(t *testing.T) {
    41  	db, close := SetupTestDB(t)
    42  	defer close()
    43  
    44  	cmd := &SendTransactionCommand{Db: db}
    45  
    46  	// Don't save dApp in the database
    47  	request, err := prepareSendTransactionRequest(testDAppData, types.Address{0x1})
    48  	assert.NoError(t, err)
    49  
    50  	_, err = cmd.Execute(request)
    51  	assert.Equal(t, ErrDAppIsNotPermittedByUser, err)
    52  }
    53  
    54  func TestFailToSendTransactionWithWrongAddress(t *testing.T) {
    55  	db, close := SetupTestDB(t)
    56  	defer close()
    57  
    58  	cmd := &SendTransactionCommand{Db: db}
    59  
    60  	err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1))
    61  	assert.NoError(t, err)
    62  
    63  	request, err := prepareSendTransactionRequest(testDAppData, types.Address{0x02})
    64  	assert.NoError(t, err)
    65  
    66  	_, err = cmd.Execute(request)
    67  	assert.Equal(t, ErrParamsFromAddressIsNotShared, err)
    68  }
    69  
    70  func TestSendTransactionWithSignalTimout(t *testing.T) {
    71  	db, close := SetupTestDB(t)
    72  	defer close()
    73  
    74  	clientHandler := NewClientSideHandler()
    75  
    76  	cmd := &SendTransactionCommand{
    77  		Db:            db,
    78  		ClientHandler: clientHandler,
    79  	}
    80  
    81  	err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1))
    82  	assert.NoError(t, err)
    83  
    84  	request, err := prepareSendTransactionRequest(testDAppData, types.Address{0x01})
    85  	assert.NoError(t, err)
    86  
    87  	backupWalletResponseMaxInterval := WalletResponseMaxInterval
    88  	WalletResponseMaxInterval = 1 * time.Millisecond
    89  
    90  	_, err = cmd.Execute(request)
    91  	assert.Equal(t, ErrWalletResponseTimeout, err)
    92  	WalletResponseMaxInterval = backupWalletResponseMaxInterval
    93  }
    94  
    95  func TestSendTransactionWithSignalAccepted(t *testing.T) {
    96  	db, close := SetupTestDB(t)
    97  	defer close()
    98  
    99  	fakedTransactionHash := types.Hash{0x051}
   100  
   101  	clientHandler := NewClientSideHandler()
   102  
   103  	cmd := &SendTransactionCommand{
   104  		Db:            db,
   105  		ClientHandler: clientHandler,
   106  	}
   107  
   108  	err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1))
   109  	assert.NoError(t, err)
   110  
   111  	request, err := prepareSendTransactionRequest(testDAppData, types.Address{0x01})
   112  	assert.NoError(t, err)
   113  
   114  	signal.SetMobileSignalHandler(signal.MobileSignalHandler(func(s []byte) {
   115  		var evt EventType
   116  		err := json.Unmarshal(s, &evt)
   117  		assert.NoError(t, err)
   118  
   119  		switch evt.Type {
   120  		case signal.EventConnectorSendTransaction:
   121  			var ev signal.ConnectorSendTransactionSignal
   122  			err := json.Unmarshal(evt.Event, &ev)
   123  			assert.NoError(t, err)
   124  
   125  			err = clientHandler.SendTransactionAccepted(SendTransactionAcceptedArgs{
   126  				Hash:      fakedTransactionHash,
   127  				RequestID: ev.RequestID,
   128  			})
   129  			assert.NoError(t, err)
   130  		}
   131  	}))
   132  	t.Cleanup(signal.ResetMobileSignalHandler)
   133  
   134  	response, err := cmd.Execute(request)
   135  	assert.NoError(t, err)
   136  	assert.Equal(t, response, fakedTransactionHash.String())
   137  }
   138  
   139  func TestSendTransactionWithSignalRejected(t *testing.T) {
   140  	db, close := SetupTestDB(t)
   141  	defer close()
   142  
   143  	clientHandler := NewClientSideHandler()
   144  
   145  	cmd := &SendTransactionCommand{
   146  		Db:            db,
   147  		ClientHandler: clientHandler,
   148  	}
   149  
   150  	err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1))
   151  	assert.NoError(t, err)
   152  
   153  	request, err := prepareSendTransactionRequest(testDAppData, types.Address{0x01})
   154  	assert.NoError(t, err)
   155  
   156  	signal.SetMobileSignalHandler(signal.MobileSignalHandler(func(s []byte) {
   157  		var evt EventType
   158  		err := json.Unmarshal(s, &evt)
   159  		assert.NoError(t, err)
   160  
   161  		switch evt.Type {
   162  		case signal.EventConnectorSendTransaction:
   163  			var ev signal.ConnectorSendTransactionSignal
   164  			err := json.Unmarshal(evt.Event, &ev)
   165  			assert.NoError(t, err)
   166  
   167  			err = clientHandler.SendTransactionRejected(RejectedArgs{
   168  				RequestID: ev.RequestID,
   169  			})
   170  			assert.NoError(t, err)
   171  		}
   172  	}))
   173  	t.Cleanup(signal.ResetMobileSignalHandler)
   174  
   175  	_, err = cmd.Execute(request)
   176  	assert.Equal(t, ErrSendTransactionRejectedByUser, err)
   177  }