fix(wallet): fix blocks ranges update error, add tests (#4560)

Fixes #4559
This commit is contained in:
IvanBelyakoff 2024-01-17 12:08:56 +01:00 committed by GitHub
parent 3af8cfc054
commit 3a4dfff20b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 150 additions and 5 deletions

View File

@ -116,13 +116,17 @@ func (b *BlockRangeSequentialDAO) upsertEthRange(chainID uint64, account common.
"start", blockRange.Start, "first", blockRange.FirstKnown, "last", blockRange.LastKnown)
upsert, err := b.db.Prepare(`REPLACE INTO blocks_ranges_sequential
(network_id, address, blk_start, blk_first, blk_last) VALUES (?, ?, ?, ?, ?)`)
(network_id, address, blk_start, blk_first, blk_last, token_blk_start, token_blk_first, token_blk_last) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
if err != nil {
return err
}
_, err = upsert.Exec(chainID, account, (*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown),
(*bigint.SQLBigInt)(blockRange.LastKnown))
if ethTokensBlockRange.tokens == nil {
ethTokensBlockRange.tokens = NewBlockRange()
}
_, err = upsert.Exec(chainID, account, (*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown), (*bigint.SQLBigInt)(blockRange.LastKnown),
(*bigint.SQLBigInt)(ethTokensBlockRange.tokens.Start), (*bigint.SQLBigInt)(ethTokensBlockRange.tokens.FirstKnown), (*bigint.SQLBigInt)(ethTokensBlockRange.tokens.LastKnown))
return err
}
@ -145,8 +149,8 @@ func (b *BlockRangeSequentialDAO) updateTokenRange(chainID uint64, account commo
return err
}
_, err = update.Exec(chainID, account, (*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown),
(*bigint.SQLBigInt)(blockRange.LastKnown))
_, err = update.Exec((*bigint.SQLBigInt)(blockRange.Start), (*bigint.SQLBigInt)(blockRange.FirstKnown),
(*bigint.SQLBigInt)(blockRange.LastKnown), chainID, account)
return err
}

View File

@ -0,0 +1,141 @@
package transfer
import (
"database/sql"
"math/big"
"testing"
"github.com/stretchr/testify/require"
"github.com/ethereum/go-ethereum/common"
"github.com/status-im/status-go/t/helpers"
"github.com/status-im/status-go/walletdatabase"
)
func setupBlockRangesTestDB(t *testing.T) (*sql.DB, func()) {
db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{})
require.NoError(t, err)
return db, func() {
require.NoError(t, db.Close())
}
}
func TestBlockRangeSequentialDAO_updateTokenRange(t *testing.T) {
walletDb, stop := setupBlockRangesTestDB(t)
defer stop()
type fields struct {
db *sql.DB
}
type args struct {
chainID uint64
account common.Address
newBlockRange *BlockRange
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
{
"testTokenBlockRange",
fields{db: walletDb},
args{
chainID: 1,
account: common.Address{},
newBlockRange: &BlockRange{
LastKnown: big.NewInt(1),
},
},
false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := &BlockRangeSequentialDAO{
db: tt.fields.db,
}
err := b.upsertRange(tt.args.chainID, tt.args.account, newEthTokensBlockRanges())
require.NoError(t, err)
if err := b.updateTokenRange(tt.args.chainID, tt.args.account, tt.args.newBlockRange); (err != nil) != tt.wantErr {
t.Errorf("BlockRangeSequentialDAO.updateTokenRange() error = %v, wantErr %v", err, tt.wantErr)
}
ethTokensBlockRanges, err := b.getBlockRange(tt.args.chainID, tt.args.account)
require.NoError(t, err)
require.NotNil(t, ethTokensBlockRanges.tokens)
require.Equal(t, tt.args.newBlockRange.LastKnown, ethTokensBlockRanges.tokens.LastKnown)
})
}
}
func TestBlockRangeSequentialDAO_updateEthRange(t *testing.T) {
walletDb, stop := setupBlockRangesTestDB(t)
defer stop()
type fields struct {
db *sql.DB
}
type args struct {
chainID uint64
account common.Address
newBlockRange *BlockRange
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
{
"testEthBlockRange",
fields{db: walletDb},
args{
chainID: 1,
account: common.Address{},
newBlockRange: &BlockRange{
Start: big.NewInt(2),
FirstKnown: big.NewInt(1),
LastKnown: big.NewInt(3),
},
},
false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := &BlockRangeSequentialDAO{
db: tt.fields.db,
}
// Initial insert
dummyBlockRange := NewBlockRange()
dummyBlockRange.FirstKnown = big.NewInt(2) // To confirm that it is updated it must be greater than newBlockRange.FirstKnown
if err := b.upsertEthRange(tt.args.chainID, tt.args.account, dummyBlockRange); (err != nil) != tt.wantErr {
t.Errorf("BlockRangeSequentialDAO.upsertEthRange() insert error = %v, wantErr %v", err, tt.wantErr)
}
ethTokensBlockRanges, err := b.getBlockRange(tt.args.chainID, tt.args.account)
require.NoError(t, err)
require.NotNil(t, ethTokensBlockRanges.eth)
require.Equal(t, dummyBlockRange.Start, ethTokensBlockRanges.eth.Start)
require.Equal(t, dummyBlockRange.FirstKnown, ethTokensBlockRanges.eth.FirstKnown)
require.Equal(t, dummyBlockRange.LastKnown, ethTokensBlockRanges.eth.LastKnown)
// Update
if err := b.upsertEthRange(tt.args.chainID, tt.args.account, tt.args.newBlockRange); (err != nil) != tt.wantErr {
t.Errorf("BlockRangeSequentialDAO.upsertEthRange() update error = %v, wantErr %v", err, tt.wantErr)
}
ethTokensBlockRanges, err = b.getBlockRange(tt.args.chainID, tt.args.account)
require.NoError(t, err)
require.NotNil(t, ethTokensBlockRanges.eth)
require.Equal(t, tt.args.newBlockRange.Start, ethTokensBlockRanges.eth.Start)
require.Equal(t, tt.args.newBlockRange.LastKnown, ethTokensBlockRanges.eth.LastKnown)
require.Equal(t, tt.args.newBlockRange.FirstKnown, ethTokensBlockRanges.eth.FirstKnown)
})
}
}