//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) } }) } }