Skip to content

Commit

Permalink
satellite/payments/storjscan: Add unit tests for multiple Chain IDs
Browse files Browse the repository at this point in the history
Change-Id: I4da73658ce76dd65efbef884456a2049c0bb5a55
  • Loading branch information
dlamarmorgan authored and Storj Robot committed Mar 6, 2024
1 parent 52881d2 commit a11197f
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 19 deletions.
37 changes: 27 additions & 10 deletions satellite/payments/storjscan/chore_test.go
Expand Up @@ -6,6 +6,7 @@ package storjscan_test
import (
"net/http"
"net/http/httptest"
"sort"
"strconv"
"testing"
"time"
Expand All @@ -29,7 +30,7 @@ func TestChore(t *testing.T) {
now := time.Now().Round(time.Second).UTC()

const confirmations = 12
chainIds := []int64{1337}
chainIds := []int64{1337, 5}

var pmnts []storjscan.Payment
var cachedPayments []storjscan.CachedPayment
Expand All @@ -44,8 +45,9 @@ func TestChore(t *testing.T) {
addPayments := func(count int) {
l := len(pmnts)
for i := l; i < l+count; i++ {
chainId := chainIds[i%len(chainIds)]
payment := storjscan.Payment{
ChainID: chainIds[0],
ChainID: chainId,
From: blockchaintest.NewAddress(),
To: blockchaintest.NewAddress(),
TokenValue: currency.AmountFromBaseUnits(int64(i)*100000000, currency.StorjToken),
Expand Down Expand Up @@ -73,14 +75,25 @@ func TestChore(t *testing.T) {
})
}

latestBlocks = []storjscan.Header{{
ChainID: pmnts[len(pmnts)-1].ChainID,
Hash: pmnts[len(pmnts)-1].BlockHash,
Number: pmnts[len(pmnts)-1].BlockNumber,
Timestamp: pmnts[len(pmnts)-1].Timestamp,
}}
latestBlocks = []storjscan.Header{
{
ChainID: pmnts[len(pmnts)-1].ChainID,
Hash: pmnts[len(pmnts)-1].BlockHash,
Number: pmnts[len(pmnts)-1].BlockNumber,
Timestamp: pmnts[len(pmnts)-1].Timestamp,
},
{
ChainID: pmnts[len(pmnts)-2].ChainID,
Hash: pmnts[len(pmnts)-2].BlockHash,
Number: pmnts[len(pmnts)-2].BlockNumber,
Timestamp: pmnts[len(pmnts)-2].Timestamp,
},
}
for _, header := range latestBlocks {
for i := 0; i < len(cachedPayments); i++ {
if cachedPayments[i].ChainID != header.ChainID {
continue
}
if header.Number-cachedPayments[i].BlockNumber >= confirmations {
cachedPayments[i].Status = payments.PaymentStatusConfirmed
} else {
Expand Down Expand Up @@ -142,19 +155,23 @@ func TestChore(t *testing.T) {

last, err := paymentsDB.LastBlocks(ctx, payments.PaymentStatusPending)
require.NoError(t, err)
require.EqualValues(t, 99, last[chainIds[0]])
require.EqualValues(t, 98, last[chainIds[0]])
require.EqualValues(t, 99, last[chainIds[1]])
actual, err := paymentsDB.List(ctx)
require.NoError(t, err)
sort.Slice(actual, func(i, j int) bool { return actual[i].BlockNumber < actual[j].BlockNumber })
require.Equal(t, cachedPayments, actual)

addPayments(100)
chore.TransactionCycle.TriggerWait()

last, err = paymentsDB.LastBlocks(ctx, payments.PaymentStatusPending)
require.NoError(t, err)
require.EqualValues(t, 199, last[chainIds[0]])
require.EqualValues(t, 198, last[chainIds[0]])
require.EqualValues(t, 199, last[chainIds[1]])
actual, err = paymentsDB.List(ctx)
require.NoError(t, err)
sort.Slice(actual, func(i, j int) bool { return actual[i].BlockNumber < actual[j].BlockNumber })
require.Equal(t, cachedPayments, actual)

require.Equal(t, reqCounter, cachedReqCounter+2)
Expand Down
43 changes: 34 additions & 9 deletions satellite/payments/storjscan/client_test.go
Expand Up @@ -6,6 +6,7 @@ package storjscan_test
import (
"net/http"
"net/http/httptest"
"sort"
"strconv"
"testing"
"time"
Expand All @@ -23,12 +24,13 @@ import (
func TestClientMocked(t *testing.T) {
ctx := testcontext.New(t)
now := time.Now().Round(time.Second).UTC()
chainIds := []int64{1337}
chainIds := []int64{1337, 5}

var payments []storjscan.Payment
for i := 0; i < 100; i++ {
chainId := chainIds[i%len(chainIds)]
payments = append(payments, storjscan.Payment{
ChainID: chainIds[0],
ChainID: chainId,
From: blockchaintest.NewAddress(),
To: blockchaintest.NewAddress(),
TokenValue: currency.AmountFromBaseUnits(int64(i)*100000000, currency.StorjToken),
Expand All @@ -40,12 +42,20 @@ func TestClientMocked(t *testing.T) {
Timestamp: now.Add(time.Duration(i) * time.Second),
})
}
latestBlocks := []storjscan.Header{{
ChainID: payments[len(payments)-1].ChainID,
Hash: payments[len(payments)-1].BlockHash,
Number: payments[len(payments)-1].BlockNumber,
Timestamp: payments[len(payments)-1].Timestamp,
}}
latestBlocks := []storjscan.Header{
{
ChainID: payments[len(payments)-1].ChainID,
Hash: payments[len(payments)-1].BlockHash,
Number: payments[len(payments)-1].BlockNumber,
Timestamp: payments[len(payments)-1].Timestamp,
},
{
ChainID: payments[len(payments)-2].ChainID,
Hash: payments[len(payments)-2].BlockHash,
Number: payments[len(payments)-2].BlockNumber,
Timestamp: payments[len(payments)-2].Timestamp,
},
}

const (
identifier = "eu"
Expand Down Expand Up @@ -84,15 +94,30 @@ func TestClientMocked(t *testing.T) {
require.NoError(t, err)
require.Equal(t, latestBlocks, actual.LatestBlocks)
require.Equal(t, len(payments), len(actual.Payments))
sort.Slice(actual.Payments, func(i, j int) bool { return actual.Payments[i].BlockNumber < actual.Payments[j].BlockNumber })
require.Equal(t, payments, actual.Payments)
})
t.Run("all payments from 50", func(t *testing.T) {
actual, err := client.AllPayments(ctx, map[int64]int64{chainIds[0]: 50})
actual, err := client.AllPayments(ctx, map[int64]int64{chainIds[0]: 50, chainIds[1]: 50})
require.NoError(t, err)
require.Equal(t, latestBlocks, actual.LatestBlocks)
require.Equal(t, 50, len(actual.Payments))
sort.Slice(actual.Payments, func(i, j int) bool { return actual.Payments[i].BlockNumber < actual.Payments[j].BlockNumber })
require.Equal(t, payments[50:], actual.Payments)
})
t.Run("all payments different start per chain ID", func(t *testing.T) {
actual, err := client.AllPayments(ctx, map[int64]int64{chainIds[0]: 50, chainIds[1]: 0})
require.NoError(t, err)
require.Equal(t, latestBlocks, actual.LatestBlocks)
require.Equal(t, 75, len(actual.Payments))
sort.Slice(payments, func(i, j int) bool {
if payments[i].ChainID == payments[j].ChainID {
return payments[i].BlockNumber < payments[j].BlockNumber
}
return payments[i].ChainID > payments[j].ChainID
})
require.Equal(t, payments[25:], actual.Payments)
})
}

func TestClientMockedUnauthorized(t *testing.T) {
Expand Down
107 changes: 107 additions & 0 deletions satellite/payments/storjscan/service_test.go
Expand Up @@ -355,6 +355,113 @@ func TestListPayments(t *testing.T) {
})
}

func TestListPaymentsMultipleChainIds(t *testing.T) {
satellitedbtest.Run(t, func(ctx *testcontext.Context, t *testing.T, db satellite.DB) {
paymentsDB := db.StorjscanPayments()
now := time.Now().Truncate(time.Second).UTC()

wallet1 := blockchaintest.NewAddress()
walletPaymentsBatch1 := []payments.WalletPayment{
{
From: blockchaintest.NewAddress(),
To: wallet1,
TokenValue: currency.AmountFromBaseUnits(100, currency.StorjToken),
USDValue: currency.AmountFromBaseUnits(100, currency.USDollarsMicro),
Status: payments.PaymentStatusConfirmed,
ChainID: 5,
BlockHash: blockchaintest.NewHash(),
BlockNumber: 0,
Transaction: blockchaintest.NewHash(),
LogIndex: 1,
Timestamp: now,
},
{
From: blockchaintest.NewAddress(),
To: wallet1,
TokenValue: currency.AmountFromBaseUnits(100, currency.StorjToken),
USDValue: currency.AmountFromBaseUnits(100, currency.USDollarsMicro),
Status: payments.PaymentStatusConfirmed,
ChainID: 1337,
BlockHash: blockchaintest.NewHash(),
BlockNumber: 0,
Transaction: blockchaintest.NewHash(),
LogIndex: 2,
Timestamp: now,
},
{
From: blockchaintest.NewAddress(),
To: wallet1,
TokenValue: currency.AmountFromBaseUnits(100, currency.StorjToken),
USDValue: currency.AmountFromBaseUnits(100, currency.USDollarsMicro),
Status: payments.PaymentStatusConfirmed,
ChainID: 5,
BlockHash: blockchaintest.NewHash(),
BlockNumber: 0,
Transaction: blockchaintest.NewHash(),
LogIndex: 3,
Timestamp: now,
},
{
From: blockchaintest.NewAddress(),
To: wallet1,
TokenValue: currency.AmountFromBaseUnits(200, currency.StorjToken),
USDValue: currency.AmountFromBaseUnits(100, currency.USDollarsMicro),
Status: payments.PaymentStatusConfirmed,
ChainID: 1337,
BlockHash: blockchaintest.NewHash(),
BlockNumber: 1,
Transaction: blockchaintest.NewHash(),
LogIndex: 0,
Timestamp: now.Add(15 * time.Second),
},
}

var cachedPayments1 []storjscan.CachedPayment
for _, pmnt := range walletPaymentsBatch1 {
cachedPayments1 = append(cachedPayments1, storjscan.CachedPayment{
From: pmnt.From,
To: pmnt.To,
TokenValue: pmnt.TokenValue,
USDValue: pmnt.USDValue,
Status: pmnt.Status,
ChainID: pmnt.ChainID,
BlockHash: pmnt.BlockHash,
BlockNumber: pmnt.BlockNumber,
Transaction: pmnt.Transaction,
LogIndex: pmnt.LogIndex,
Timestamp: pmnt.Timestamp,
})
}

err := paymentsDB.InsertBatch(ctx, cachedPayments1)
require.NoError(t, err)

confirmedPayments, err := paymentsDB.ListConfirmed(ctx, billing.StorjScanEthereumSource, 1337, 0, 0)
require.NoError(t, err)
require.Equal(t, 2, len(confirmedPayments))
for _, act := range confirmedPayments {
for _, exp := range cachedPayments1 {
if act.BlockHash == exp.BlockHash && act.LogIndex == exp.LogIndex {
compareTransactions(t, exp, act)
break
}
}
}

confirmedPayments, err = paymentsDB.ListConfirmed(ctx, billing.StorjScanEthereumSource, 5, 0, 0)
require.NoError(t, err)
require.Equal(t, 2, len(confirmedPayments))
for _, act := range confirmedPayments {
for _, exp := range cachedPayments1 {
if act.BlockHash == exp.BlockHash && act.LogIndex == exp.LogIndex {
compareTransactions(t, exp, act)
break
}
}
}
})
}

// compareTransactions is a helper method to compare tx used to create db entry,
// with the tx returned from the db.
func compareTransactions(t *testing.T, exp, act storjscan.CachedPayment) {
Expand Down

0 comments on commit a11197f

Please sign in to comment.