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 }