github.com/status-im/status-go@v1.1.0/services/local-notifications/core_test.go (about)

     1  package localnotifications
     2  
     3  import (
     4  	"fmt"
     5  	"math/big"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	w_common "github.com/status-im/status-go/services/wallet/common"
    13  	"github.com/status-im/status-go/services/wallet/transfer"
    14  	"github.com/status-im/status-go/services/wallet/walletevent"
    15  	"github.com/status-im/status-go/signal"
    16  	"github.com/status-im/status-go/t/helpers"
    17  	"github.com/status-im/status-go/t/utils"
    18  	"github.com/status-im/status-go/walletdatabase"
    19  
    20  	"github.com/ethereum/go-ethereum/common"
    21  	"github.com/ethereum/go-ethereum/core/types"
    22  	"github.com/ethereum/go-ethereum/event"
    23  )
    24  
    25  func createWalletDb(t *testing.T) (*transfer.Database, func()) {
    26  	db, cleanup, err := helpers.SetupTestSQLDB(walletdatabase.DbInitializer{}, "local-notifications-tests-wallet-")
    27  	require.NoError(t, err)
    28  	return transfer.NewDB(db), func() {
    29  		require.NoError(t, cleanup())
    30  	}
    31  }
    32  
    33  func TestServiceStartStop(t *testing.T) {
    34  	db, stop := setupAppTestDb(t)
    35  	defer stop()
    36  
    37  	walletDb, walletStop := createWalletDb(t)
    38  	defer walletStop()
    39  
    40  	s, err := NewService(db, walletDb, 1777)
    41  	require.NoError(t, err)
    42  	require.NoError(t, s.Start())
    43  	require.Equal(t, true, s.IsStarted())
    44  
    45  	require.NoError(t, s.Stop())
    46  	require.Equal(t, false, s.IsStarted())
    47  }
    48  
    49  func TestWalletSubscription(t *testing.T) {
    50  	db, stop := setupAppTestDb(t)
    51  	defer stop()
    52  
    53  	walletDb, walletStop := createWalletDb(t)
    54  	defer walletStop()
    55  
    56  	feed := &event.Feed{}
    57  	s, err := NewService(db, walletDb, 1777)
    58  	require.NoError(t, err)
    59  	require.NoError(t, s.Start())
    60  	require.Equal(t, true, s.IsStarted())
    61  
    62  	require.NoError(t, s.SubscribeWallet(feed))
    63  	require.Equal(t, true, s.IsWatchingWallet())
    64  
    65  	s.StartWalletWatcher()
    66  	require.Equal(t, true, s.IsWatchingWallet())
    67  
    68  	s.StopWalletWatcher()
    69  	require.Equal(t, false, s.IsWatchingWallet())
    70  
    71  	require.NoError(t, s.Stop())
    72  	require.Equal(t, false, s.IsStarted())
    73  }
    74  
    75  func TestTransactionNotification(t *testing.T) {
    76  	db, stop := setupAppTestDb(t)
    77  	defer stop()
    78  
    79  	walletDb, walletStop := createWalletDb(t)
    80  	defer walletStop()
    81  
    82  	s, err := NewService(db, walletDb, 1777)
    83  	require.NoError(t, err)
    84  	require.NoError(t, s.Start())
    85  	require.Equal(t, true, s.IsStarted())
    86  
    87  	var signalEvent []byte
    88  
    89  	signalHandler := signal.MobileSignalHandler(func(s []byte) {
    90  		signalEvent = s
    91  	})
    92  
    93  	signal.SetMobileSignalHandler(signalHandler)
    94  	t.Cleanup(signal.ResetMobileSignalHandler)
    95  
    96  	feed := &event.Feed{}
    97  	require.NoError(t, s.SubscribeWallet(feed))
    98  	s.WatchingEnabled = true
    99  
   100  	s.StartWalletWatcher()
   101  
   102  	header := &transfer.DBHeader{
   103  		Number:  big.NewInt(1),
   104  		Hash:    common.Hash{1},
   105  		Address: common.Address{1},
   106  	}
   107  	tx := types.NewTransaction(1, common.Address{1}, nil, 10, big.NewInt(10), nil)
   108  	receipt := types.NewReceipt(nil, false, 100)
   109  	receipt.Logs = []*types.Log{}
   110  	transfers := []transfer.Transfer{
   111  		{
   112  			ID:          common.Hash{1},
   113  			Type:        w_common.Type("eth"),
   114  			BlockHash:   header.Hash,
   115  			BlockNumber: header.Number,
   116  			Transaction: tx,
   117  			Receipt:     receipt,
   118  			Address:     header.Address,
   119  		},
   120  	}
   121  	require.NoError(t, walletDb.SaveBlocks(1777, []*transfer.DBHeader{header}))
   122  	require.NoError(t, transfer.SaveTransfersMarkBlocksLoaded(walletDb, 1777, header.Address, transfers, []*big.Int{header.Number}))
   123  
   124  	feed.Send(walletevent.Event{
   125  		Type:     transfer.EventRecentHistoryReady,
   126  		Accounts: []common.Address{header.Address},
   127  	})
   128  
   129  	feed.Send(walletevent.Event{
   130  		Type:        transfer.EventNewTransfers,
   131  		BlockNumber: header.Number,
   132  		Accounts:    []common.Address{header.Address},
   133  	})
   134  
   135  	require.NoError(t, utils.Eventually(func() error {
   136  		if signalEvent == nil {
   137  			return fmt.Errorf("signal was not handled")
   138  		}
   139  		require.True(t, strings.Contains(string(signalEvent), `"type":"local-notifications"`))
   140  		require.True(t, strings.Contains(string(signalEvent), `"to":"`+header.Address.Hex()))
   141  		return nil
   142  	}, 2*time.Second, 100*time.Millisecond))
   143  
   144  	require.NoError(t, s.Stop())
   145  }