blockbook/db/fiat_test.go
2023-02-01 17:58:37 +01:00

290 lines
8.7 KiB
Go

//go:build unittest
package db
import (
"reflect"
"testing"
"time"
"github.com/linxGnu/grocksdb"
)
func TestRocksTickers(t *testing.T) {
d := setupRocksDB(t, &testBitcoinParser{
BitcoinParser: bitcoinTestnetParser(),
})
defer closeAndDestroyRocksDB(t, d)
// Test valid formats
for _, date := range []string{"20190130", "2019013012", "201901301250", "20190130125030"} {
_, err := FiatRatesConvertDate(date)
if err != nil {
t.Errorf("%v", err)
}
}
// Test invalid formats
for _, date := range []string{"01102019", "10201901", "", "abc", "20190130xxx"} {
_, err := FiatRatesConvertDate(date)
if err == nil {
t.Errorf("Wrongly-formatted date \"%v\" marked as valid!", date)
}
}
// Test storing & finding tickers
pastKey, _ := time.Parse(FiatRatesTimeFormat, "20190627000000")
futureKey, _ := time.Parse(FiatRatesTimeFormat, "20190630000000")
ts1, _ := time.Parse(FiatRatesTimeFormat, "20190628000000")
ticker1 := &CurrencyRatesTicker{
Timestamp: ts1,
Rates: map[string]float32{
"usd": 20000,
"eur": 18000,
},
TokenRates: map[string]float32{
"0x6B175474E89094C44Da98b954EedeAC495271d0F": 17.2,
},
}
ts2, _ := time.Parse(FiatRatesTimeFormat, "20190629000000")
ticker2 := &CurrencyRatesTicker{
Timestamp: ts2,
Rates: map[string]float32{
"usd": 30000,
},
TokenRates: map[string]float32{
"0x82dF128257A7d7556262E1AB7F1f639d9775B85E": 13.1,
"0x6B175474E89094C44Da98b954EedeAC495271d0F": 17.5,
},
}
wb := grocksdb.NewWriteBatch()
defer wb.Destroy()
err := d.FiatRatesStoreTicker(wb, ticker1)
if err != nil {
t.Errorf("Error storing ticker! %v", err)
}
err = d.FiatRatesStoreTicker(wb, ticker2)
if err != nil {
t.Errorf("Error storing ticker! %v", err)
}
err = d.WriteBatch(wb)
if err != nil {
t.Errorf("Error storing ticker! %v", err)
}
// test FiatRatesGetTicker with ticker that should be in DB
t1, err := d.FiatRatesGetTicker(&ts1)
if err != nil || t1 == nil {
t.Fatalf("FiatRatesGetTicker t1 %v", err)
}
if !reflect.DeepEqual(t1, ticker1) {
t.Fatalf("FiatRatesGetTicker(t1) = %v, want %v", *t1, *ticker1)
}
// test FiatRatesGetTicker with ticker that is not in DB
t2, err := d.FiatRatesGetTicker(&pastKey)
if err != nil || t2 != nil {
t.Fatalf("FiatRatesGetTicker t2 %v, %v", err, t2)
}
ticker, err := d.FiatRatesFindTicker(&pastKey, "", "") // should find the closest key (ticker1)
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker1.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker1.Timestamp, ticker.Timestamp)
}
ticker, err = d.FiatRatesFindLastTicker("", "") // should find the last key (ticker2)
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker2.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker1.Timestamp, ticker.Timestamp)
}
ticker, err = d.FiatRatesFindTicker(&futureKey, "", "") // should not find anything
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker != nil {
t.Errorf("Ticker found, but the timestamp is older than the last ticker entry.")
}
ticker, err = d.FiatRatesFindTicker(&pastKey, "", "0x6B175474E89094C44Da98b954EedeAC495271d0F") // should find the closest key (ticker1)
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker1.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker1.Timestamp, ticker.Timestamp)
}
ticker, err = d.FiatRatesFindTicker(&pastKey, "", "0x82dF128257A7d7556262E1AB7F1f639d9775B85E") // should find the last key (ticker2)
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker2.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker2.Timestamp, ticker.Timestamp)
}
ticker, err = d.FiatRatesFindLastTicker("eur", "") // should find the closest key (ticker1)
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker1.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker1.Timestamp, ticker.Timestamp)
}
ticker, err = d.FiatRatesFindLastTicker("usd", "") // should find the last key (ticker2)
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker2.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker2.Timestamp, ticker.Timestamp)
}
ticker, err = d.FiatRatesFindLastTicker("aud", "") // should not find any key
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker != nil {
t.Errorf("Ticker %v found unexpectedly for aud vsCurrency", ticker)
}
ticker, err = d.FiatRatesGetCurrentTicker("", "")
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker != nil {
t.Errorf("FiatRatesGetCurrentTicker %v found unexpectedly", ticker)
}
d.FiatRatesSetCurrentTicker(ticker1)
ticker, err = d.FiatRatesGetCurrentTicker("", "")
if err != nil {
t.Errorf("TestRocksTickers err: %+v", err)
} else if ticker == nil {
t.Errorf("Ticker not found")
} else if ticker.Timestamp.Format(FiatRatesTimeFormat) != ticker1.Timestamp.Format(FiatRatesTimeFormat) {
t.Errorf("Incorrect ticker found. Expected: %v, found: %+v", ticker1.Timestamp, ticker.Timestamp)
}
d.FiatRatesSetCurrentTicker(nil)
}
func Test_packUnpackCurrencyRatesTicker(t *testing.T) {
type args struct {
}
tests := []struct {
name string
data CurrencyRatesTicker
}{
{
name: "empty",
data: CurrencyRatesTicker{},
},
{
name: "rates",
data: CurrencyRatesTicker{
Rates: map[string]float32{
"usd": 2129.2341123,
"eur": 1332.51234,
},
},
},
{
name: "rates&tokenrates",
data: CurrencyRatesTicker{
Rates: map[string]float32{
"usd": 322129.987654321,
"eur": 291332.12345678,
},
TokenRates: map[string]float32{
"0x82dF128257A7d7556262E1AB7F1f639d9775B85E": 0.4092341123,
"0x6B175474E89094C44Da98b954EedeAC495271d0F": 12.32323232323232,
"0xdAC17F958D2ee523a2206206994597C13D831ec7": 1332421341235.51234,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
packed := packCurrencyRatesTicker(&tt.data)
got, err := unpackCurrencyRatesTicker(packed)
if err != nil {
t.Errorf("unpackCurrencyRatesTicker() error = %v", err)
return
}
if !reflect.DeepEqual(got, &tt.data) {
t.Errorf("unpackCurrencyRatesTicker() = %v, want %v", *got, tt.data)
}
})
}
}
func TestCurrencyRatesTicker_ConvertToken(t *testing.T) {
ticker := &CurrencyRatesTicker{
Rates: map[string]float32{
"usd": 2129.987654321,
"eur": 1332.12345678,
},
TokenRates: map[string]float32{
"0x82df128257a7d7556262e1ab7f1f639d9775b85e": 0.4092341123,
"0x6b175474e89094c44da98b954eedeac495271d0f": 12.32323232323232,
"0xdac17f958d2ee523a2206206994597c13d831ec7": 1332421341235.51234,
},
}
type args struct {
baseValue float64
toCurrency string
}
tests := []struct {
name string
value float64
token string
toCurrency string
want float64
}{
{
name: "usd 0x82df128257a7d7556262e1ab7f1f639d9775b85e",
value: 10,
token: "0x82df128257a7d7556262e1ab7f1f639d9775b85e",
toCurrency: "usd",
want: 8716.635514874506,
},
{
name: "eur 0xdac17f958d2ee523a2206206994597c13d831ec7",
value: 23.123,
token: "0xdac17f958d2ee523a2206206994597c13d831ec7",
toCurrency: "eur",
want: 4.104216071804417e+16,
},
{
name: "eur 0xdac17f958d2ee523a2206206994597c13d831ec8",
value: 23.123,
token: "0xdac17f958d2ee523a2206206994597c13d831ec8",
toCurrency: "eur",
want: 0,
},
{
name: "eur 0xdac17f958d2ee523a2206206994597c13d831ec7",
value: 23.123,
token: "0xdac17f958d2ee523a2206206994597c13d831ec7",
toCurrency: "czk",
want: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := ticker.ConvertToken(tt.value, tt.token, tt.toCurrency); got != tt.want {
t.Errorf("CurrencyRatesTicker.ConvertToken() = %v, want %v", got, tt.want)
}
})
}
}