github.com/status-im/status-go@v1.1.0/services/wallet/api_test.go (about) 1 package wallet 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 "testing" 10 "time" 11 12 "github.com/ethereum/go-ethereum/event" 13 14 "github.com/stretchr/testify/require" 15 16 gomock "go.uber.org/mock/gomock" 17 18 "github.com/status-im/status-go/appdatabase" 19 "github.com/status-im/status-go/multiaccounts/accounts" 20 "github.com/status-im/status-go/params" 21 "github.com/status-im/status-go/rpc" 22 "github.com/status-im/status-go/services/wallet/onramp" 23 mock_onramp "github.com/status-im/status-go/services/wallet/onramp/mock" 24 "github.com/status-im/status-go/services/wallet/requests" 25 "github.com/status-im/status-go/services/wallet/walletconnect" 26 "github.com/status-im/status-go/t/helpers" 27 "github.com/status-im/status-go/walletdatabase" 28 ) 29 30 // TestAPI_GetWalletConnectActiveSessions tames coverage 31 func TestAPI_GetWalletConnectActiveSessions(t *testing.T) { 32 db, close := walletconnect.SetupTestDB(t) 33 defer close() 34 api := &API{ 35 s: &Service{db: db}, 36 } 37 38 sessions, err := api.GetWalletConnectActiveSessions(context.Background(), 0) 39 require.NoError(t, err) 40 require.Equal(t, 0, len(sessions)) 41 } 42 43 // TestAPI_HashMessageEIP191 44 func TestAPI_HashMessageEIP191(t *testing.T) { 45 api := &API{} 46 47 res := api.HashMessageEIP191(context.Background(), []byte("test")) 48 require.Equal(t, "0x4a5c5d454721bbbb25540c3317521e71c373ae36458f960d2ad46ef088110e95", res.String()) 49 } 50 51 func TestAPI_IsChecksumValidForAddress(t *testing.T) { 52 api := &API{} 53 54 res, err := api.IsChecksumValidForAddress("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") 55 require.NoError(t, err) 56 require.False(t, res) 57 58 res, err = api.IsChecksumValidForAddress("0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa") 59 require.NoError(t, err) 60 require.True(t, res) 61 } 62 63 func TestAPI_GetCryptoOnRamps(t *testing.T) { 64 ctrl := gomock.NewController(t) 65 defer ctrl.Finish() 66 67 provider0 := mock_onramp.NewMockProvider(ctrl) 68 id0 := "provider0" 69 provider0.EXPECT().ID().Return(id0).AnyTimes() 70 provider1 := mock_onramp.NewMockProvider(ctrl) 71 id1 := "provider1" 72 provider1.EXPECT().ID().Return(id1).AnyTimes() 73 providers := []onramp.Provider{provider0, provider1} 74 onrampManager := onramp.NewManager(providers) 75 76 api := &API{ 77 s: &Service{cryptoOnRampManager: onrampManager}, 78 } 79 80 ctx := context.Background() 81 82 // Check returned providers 83 provider0.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{ID: id0}, nil) 84 provider1.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{ID: id1}, nil) 85 86 retProviders, err := api.GetCryptoOnRamps(ctx) 87 require.NoError(t, err) 88 require.Equal(t, len(providers), len(retProviders)) 89 require.Equal(t, id0, retProviders[0].ID) 90 require.Equal(t, id1, retProviders[1].ID) 91 92 // Check error handling 93 provider0.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{}, errors.New("error")) 94 provider1.EXPECT().GetCryptoOnRamp(ctx).Return(onramp.CryptoOnRamp{ID: id1}, nil) 95 retProviders, err = api.GetCryptoOnRamps(ctx) 96 require.NoError(t, err) 97 require.Equal(t, 1, len(retProviders)) 98 require.Equal(t, id1, retProviders[0].ID) 99 100 // Check URL retrieval 101 provider1.EXPECT().GetURL(ctx, onramp.Parameters{}).Return("url", nil) 102 url, err := api.GetCryptoOnRampURL(ctx, id1, onramp.Parameters{}) 103 require.NoError(t, err) 104 require.Equal(t, "url", url) 105 } 106 107 func TestAPI_GetAddressDetails(t *testing.T) { 108 appDB, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) 109 require.NoError(t, err) 110 defer appDB.Close() 111 112 accountsDb, err := accounts.NewDB(appDB) 113 require.NoError(t, err) 114 defer accountsDb.Close() 115 116 db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{}) 117 require.NoError(t, err) 118 defer db.Close() 119 120 accountFeed := &event.Feed{} 121 122 chainID := uint64(1) 123 address := "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 124 125 providerConfig := params.ProviderConfig{ 126 Enabled: true, 127 Name: rpc.ProviderStatusProxy, 128 User: "user1", 129 Password: "pass1", 130 } 131 providerConfigs := []params.ProviderConfig{providerConfig} 132 133 // Create a new server that delays the response by 1 second 134 serverWith1SecDelay := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 135 time.Sleep(1 * time.Second) 136 fmt.Fprintln(w, `{"result": "0x10"}`) 137 })) 138 defer serverWith1SecDelay.Close() 139 140 networks := []params.Network{ 141 { 142 ChainID: chainID, 143 DefaultRPCURL: serverWith1SecDelay.URL, 144 DefaultFallbackURL: serverWith1SecDelay.URL, 145 }, 146 } 147 c, err := rpc.NewClient(nil, chainID, params.UpstreamRPCConfig{}, networks, appDB, providerConfigs) 148 require.NoError(t, err) 149 150 chainClient, err := c.EthClient(chainID) 151 require.NoError(t, err) 152 chainClient.SetWalletNotifier(func(chainID uint64, message string) {}) 153 c.SetWalletNotifier(func(chainID uint64, message string) {}) 154 155 service := NewService(db, accountsDb, appDB, c, accountFeed, nil, nil, nil, ¶ms.NodeConfig{}, nil, nil, nil, nil, nil, "") 156 157 api := &API{ 158 s: service, 159 } 160 161 // Test getting address details using `GetAddressDetails` call, that always waits for the request to finish 162 details, err := api.GetAddressDetails(context.Background(), 1, address) 163 require.NoError(t, err) 164 require.Equal(t, true, details.HasActivity) 165 166 // empty params 167 details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{}) 168 require.Error(t, err) 169 require.ErrorIs(t, err, requests.ErrAddresInvalid) 170 require.Nil(t, details) 171 172 // no response longer than the set timeout 173 details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{ 174 Address: address, 175 TimeoutInMilliseconds: 500, 176 }) 177 require.NoError(t, err) 178 require.Equal(t, false, details.HasActivity) 179 180 // timeout longer than the response time 181 details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{ 182 Address: address, 183 TimeoutInMilliseconds: 1200, 184 }) 185 require.NoError(t, err) 186 require.Equal(t, true, details.HasActivity) 187 188 // specific chain and timeout longer than the response time 189 details, err = api.AddressDetails(context.Background(), &requests.AddressDetails{ 190 Address: address, 191 ChainIDs: []uint64{chainID}, 192 TimeoutInMilliseconds: 1200, 193 }) 194 require.NoError(t, err) 195 require.Equal(t, true, details.HasActivity) 196 }