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 }