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 }