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

     1  package commands
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	"github.com/status-im/status-go/eth-node/types"
    11  	"github.com/status-im/status-go/params"
    12  	walletCommon "github.com/status-im/status-go/services/wallet/common"
    13  	"github.com/status-im/status-go/signal"
    14  )
    15  
    16  func TestFailToSwitchEthereumChainWithMissingDAppFields(t *testing.T) {
    17  	db, close := SetupTestDB(t)
    18  	defer close()
    19  
    20  	cmd := &SwitchEthereumChainCommand{Db: db}
    21  
    22  	// Missing DApp fields
    23  	request, err := ConstructRPCRequest("wallet_switchEthereumChain", []interface{}{}, nil)
    24  	assert.NoError(t, err)
    25  
    26  	result, err := cmd.Execute(request)
    27  	assert.Equal(t, ErrRequestMissingDAppData, err)
    28  	assert.Empty(t, result)
    29  }
    30  
    31  func TestFailToSwitchEthereumChainWithNoChainId(t *testing.T) {
    32  	db, close := SetupTestDB(t)
    33  	defer close()
    34  
    35  	cmd := &SwitchEthereumChainCommand{Db: db}
    36  
    37  	request, err := ConstructRPCRequest("wallet_switchEthereumChain", []interface{}{}, &testDAppData)
    38  	assert.NoError(t, err)
    39  
    40  	_, err = cmd.Execute(request)
    41  	assert.Equal(t, ErrEmptyRPCParams, err)
    42  }
    43  
    44  func TestFailToSwitchEthereumChainWithUnsupportedChainId(t *testing.T) {
    45  	db, close := SetupTestDB(t)
    46  	defer close()
    47  
    48  	nm := NetworkManagerMock{}
    49  	nm.SetNetworks([]*params.Network{
    50  		{
    51  			ChainID: walletCommon.EthereumMainnet,
    52  		},
    53  	})
    54  
    55  	cmd := &SwitchEthereumChainCommand{
    56  		Db:             db,
    57  		NetworkManager: &nm,
    58  	}
    59  
    60  	params := make([]interface{}, 1)
    61  	params[0] = map[string]interface{}{
    62  		"chainId": "0x1a343",
    63  	} // some unrecoginzed chain id
    64  
    65  	request, err := ConstructRPCRequest("wallet_switchEthereumChain", params, &testDAppData)
    66  	assert.NoError(t, err)
    67  
    68  	_, err = cmd.Execute(request)
    69  	assert.Equal(t, ErrUnsupportedNetwork, err)
    70  }
    71  
    72  func TestSwitchEthereumChainSuccess(t *testing.T) {
    73  	db, close := SetupTestDB(t)
    74  	defer close()
    75  
    76  	nm := NetworkManagerMock{}
    77  	nm.SetNetworks([]*params.Network{
    78  		{
    79  			ChainID: walletCommon.EthereumMainnet,
    80  		},
    81  		{
    82  			ChainID: walletCommon.EthereumGoerli,
    83  		},
    84  	})
    85  
    86  	chainId := fmt.Sprintf(`0x%s`, walletCommon.ChainID(walletCommon.EthereumMainnet).String())
    87  	chainIdSwitched := false
    88  
    89  	signal.SetMobileSignalHandler(signal.MobileSignalHandler(func(s []byte) {
    90  		var evt EventType
    91  		err := json.Unmarshal(s, &evt)
    92  		assert.NoError(t, err)
    93  
    94  		switch evt.Type {
    95  		case signal.EventConnectorDAppChainIdSwitched:
    96  			var ev signal.ConnectorDAppChainIdSwitchedSignal
    97  			err := json.Unmarshal(evt.Event, &ev)
    98  			assert.NoError(t, err)
    99  
   100  			assert.Equal(t, chainId, ev.ChainId)
   101  			assert.Equal(t, testDAppData.URL, ev.URL)
   102  			chainIdSwitched = true
   103  		}
   104  	}))
   105  	t.Cleanup(signal.ResetMobileSignalHandler)
   106  
   107  	cmd := &SwitchEthereumChainCommand{
   108  		Db:             db,
   109  		NetworkManager: &nm,
   110  	}
   111  
   112  	params := make([]interface{}, 1)
   113  	params[0] = map[string]interface{}{
   114  		"chainId": "0x1",
   115  	}
   116  
   117  	request, err := ConstructRPCRequest("wallet_switchEthereumChain", params, &testDAppData)
   118  	assert.NoError(t, err)
   119  
   120  	err = PersistDAppData(db, testDAppData, types.HexToAddress("0x6d0aa2a774b74bb1d36f97700315adf962c69fcg"), walletCommon.EthereumMainnet)
   121  	assert.NoError(t, err)
   122  
   123  	response, err := cmd.Execute(request)
   124  	assert.NoError(t, err)
   125  	assert.Equal(t, chainId, response)
   126  	assert.True(t, chainIdSwitched)
   127  }