github.com/status-im/status-go@v1.1.0/services/wallet/transfer/block_ranges_sequential_dao_test.go (about)

     1  package transfer
     2  
     3  import (
     4  	"database/sql"
     5  	"math/big"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/ethereum/go-ethereum/common"
    11  	"github.com/status-im/status-go/t/helpers"
    12  	"github.com/status-im/status-go/walletdatabase"
    13  )
    14  
    15  func setupBlockRangesTestDB(t *testing.T) (*sql.DB, func()) {
    16  	db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{})
    17  	require.NoError(t, err)
    18  	return db, func() {
    19  		require.NoError(t, db.Close())
    20  	}
    21  }
    22  
    23  func TestBlockRangeSequentialDAO_updateTokenRange(t *testing.T) {
    24  	walletDb, stop := setupBlockRangesTestDB(t)
    25  	defer stop()
    26  
    27  	type fields struct {
    28  		db *sql.DB
    29  	}
    30  	type args struct {
    31  		chainID       uint64
    32  		account       common.Address
    33  		newBlockRange *BlockRange
    34  	}
    35  	tests := []struct {
    36  		name    string
    37  		fields  fields
    38  		args    args
    39  		wantErr bool
    40  	}{
    41  		{
    42  			"testTokenBlockRange",
    43  			fields{db: walletDb},
    44  			args{
    45  				chainID: 1,
    46  				account: common.Address{},
    47  				newBlockRange: &BlockRange{
    48  					LastKnown: big.NewInt(1),
    49  				},
    50  			},
    51  			false,
    52  		},
    53  	}
    54  	for _, tt := range tests {
    55  		t.Run(tt.name, func(t *testing.T) {
    56  			b := &BlockRangeSequentialDAO{
    57  				db: tt.fields.db,
    58  			}
    59  
    60  			err := b.upsertRange(tt.args.chainID, tt.args.account, newEthTokensBlockRanges())
    61  			require.NoError(t, err)
    62  
    63  			if err := b.updateTokenRange(tt.args.chainID, tt.args.account, tt.args.newBlockRange); (err != nil) != tt.wantErr {
    64  				t.Errorf("BlockRangeSequentialDAO.updateTokenRange() error = %v, wantErr %v", err, tt.wantErr)
    65  			}
    66  
    67  			ethTokensBlockRanges, _, err := b.getBlockRange(tt.args.chainID, tt.args.account)
    68  			require.NoError(t, err)
    69  			require.NotNil(t, ethTokensBlockRanges.tokens)
    70  			require.Equal(t, tt.args.newBlockRange.LastKnown, ethTokensBlockRanges.tokens.LastKnown)
    71  		})
    72  	}
    73  }
    74  
    75  func TestBlockRangeSequentialDAO_updateEthRange(t *testing.T) {
    76  	walletDb, stop := setupBlockRangesTestDB(t)
    77  	defer stop()
    78  
    79  	type fields struct {
    80  		db *sql.DB
    81  	}
    82  	type args struct {
    83  		chainID       uint64
    84  		account       common.Address
    85  		newBlockRange *BlockRange
    86  	}
    87  	tests := []struct {
    88  		name    string
    89  		fields  fields
    90  		args    args
    91  		wantErr bool
    92  	}{
    93  		{
    94  			"testEthBlockRange",
    95  			fields{db: walletDb},
    96  			args{
    97  				chainID: 1,
    98  				account: common.Address{},
    99  				newBlockRange: &BlockRange{
   100  					Start:      big.NewInt(2),
   101  					FirstKnown: big.NewInt(1),
   102  					LastKnown:  big.NewInt(3),
   103  				},
   104  			},
   105  			false,
   106  		},
   107  	}
   108  	for _, tt := range tests {
   109  		t.Run(tt.name, func(t *testing.T) {
   110  			b := &BlockRangeSequentialDAO{
   111  				db: tt.fields.db,
   112  			}
   113  
   114  			// Initial insert
   115  			dummyBlockRange := NewBlockRange()
   116  			dummyBlockRange.FirstKnown = big.NewInt(2) // To confirm that it is updated it must be greater than newBlockRange.FirstKnown
   117  			if err := b.upsertEthRange(tt.args.chainID, tt.args.account, dummyBlockRange); (err != nil) != tt.wantErr {
   118  				t.Errorf("BlockRangeSequentialDAO.upsertEthRange() insert error = %v, wantErr %v", err, tt.wantErr)
   119  			}
   120  
   121  			ethTokensBlockRanges, _, err := b.getBlockRange(tt.args.chainID, tt.args.account)
   122  			require.NoError(t, err)
   123  			require.NotNil(t, ethTokensBlockRanges.eth)
   124  			require.Equal(t, dummyBlockRange.Start, ethTokensBlockRanges.eth.Start)
   125  			require.Equal(t, dummyBlockRange.FirstKnown, ethTokensBlockRanges.eth.FirstKnown)
   126  			require.Equal(t, dummyBlockRange.LastKnown, ethTokensBlockRanges.eth.LastKnown)
   127  
   128  			// Update
   129  			if err := b.upsertEthRange(tt.args.chainID, tt.args.account, tt.args.newBlockRange); (err != nil) != tt.wantErr {
   130  				t.Errorf("BlockRangeSequentialDAO.upsertEthRange() update error = %v, wantErr %v", err, tt.wantErr)
   131  			}
   132  
   133  			ethTokensBlockRanges, _, err = b.getBlockRange(tt.args.chainID, tt.args.account)
   134  			require.NoError(t, err)
   135  			require.NotNil(t, ethTokensBlockRanges.eth)
   136  			require.Equal(t, tt.args.newBlockRange.Start, ethTokensBlockRanges.eth.Start)
   137  			require.Equal(t, tt.args.newBlockRange.LastKnown, ethTokensBlockRanges.eth.LastKnown)
   138  			require.Equal(t, tt.args.newBlockRange.FirstKnown, ethTokensBlockRanges.eth.FirstKnown)
   139  		})
   140  	}
   141  }