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, &params.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  }