testing: bybit references, bybit mock testing, pair formatting, standards improvement (#1322)

* fixes tests

* pair formats and extra fixes

* quick change before shazbert sees

* sneaky lint

* adds bybit mock testing and fixes test

* whoops

* error response instead

* classic forgetting to lint

* bybit live test no longer auto-records results

* ty thrasher- Update exchanges/bybit/bybit_wrapper.go

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>

---------

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
This commit is contained in:
Scott
2023-08-21 14:48:56 +10:00
committed by GitHub
parent 577817c46e
commit c7b3ace78c
16 changed files with 92170 additions and 120 deletions

View File

@@ -0,0 +1,62 @@
//go:build mock_test_off
// This will build if build tag mock_test_off is parsed and will do live testing
// using all tests in (exchange)_test.go
package bybit
import (
"context"
"log"
"os"
"testing"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues"
)
var mockTests = true
func TestMain(m *testing.M) {
cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil {
log.Fatal("Bybit load config error", err)
}
bybitConfig, err := cfg.GetExchangeConfig("Bybit")
if err != nil {
log.Fatal("Bybit Setup() init error", err)
}
bybitConfig.API.AuthenticatedSupport = true
bybitConfig.API.Credentials.Key = apiKey
bybitConfig.API.Credentials.Secret = apiSecret
b.SetDefaults()
b.Websocket = sharedtestvalues.NewTestWebsocket()
err = b.Setup(bybitConfig)
if err != nil {
log.Fatal("Bybit setup error", err)
}
request.MaxRequestJobs = 100
b.Websocket.DataHandler = sharedtestvalues.GetWebsocketInterfaceChannelOverride()
log.Printf(sharedtestvalues.LiveTesting, b.Name)
err = b.UpdateTradablePairs(context.Background(), true)
if err != nil {
log.Fatal("Bybit setup error", err)
}
// Turn on all pairs for testing
supportedAssets := b.GetAssetTypes(false)
for x := range supportedAssets {
avail, err := b.GetAvailablePairs(supportedAssets[x])
if err != nil {
log.Fatal(err)
}
err = b.CurrencyPairs.StorePairs(supportedAssets[x], avail, true)
if err != nil {
log.Fatal(err)
}
}
os.Exit(m.Run())
}

View File

@@ -0,0 +1,80 @@
//go:build !mock_test_off
// This will build if build tag mock_test_off is not parsed and will try to mock
// all tests in _test.go
package bybit
import (
"context"
"log"
"os"
"testing"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/exchanges/mock"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues"
)
const mockfile = "../../testdata/http_mock/bybit/bybit.json"
var mockTests = true
func TestMain(m *testing.M) {
cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil {
log.Fatal("Bybit load config error", err)
}
bybitConfig, err := cfg.GetExchangeConfig("Bybit")
if err != nil {
log.Fatal("Bybit Setup() init error", err)
}
b.SkipAuthCheck = true
bybitConfig.API.AuthenticatedSupport = true
bybitConfig.API.Credentials.Key = apiKey
bybitConfig.API.Credentials.Secret = apiSecret
b.SetDefaults()
b.Websocket = sharedtestvalues.NewTestWebsocket()
err = b.Setup(bybitConfig)
if err != nil {
log.Fatal("Bybit setup error", err)
}
serverDetails, newClient, err := mock.NewVCRServer(mockfile)
if err != nil {
log.Fatalf("Mock server error %s", err)
}
err = b.SetHTTPClient(newClient)
if err != nil {
log.Fatalf("Mock server error %s", err)
}
endpointMap := b.API.Endpoints.GetURLMap()
for k := range endpointMap {
err = b.API.Endpoints.SetRunning(k, serverDetails)
if err != nil {
log.Fatal(err)
}
}
request.MaxRequestJobs = 100
log.Printf(sharedtestvalues.MockTesting, b.Name)
err = b.UpdateTradablePairs(context.Background(), true)
if err != nil {
log.Fatal("Bybit setup error", err)
}
// Turn on all pairs for testing
supportedAssets := b.GetAssetTypes(false)
for x := range supportedAssets {
avail, err := b.GetAvailablePairs(supportedAssets[x])
if err != nil {
log.Fatal(err)
}
err = b.CurrencyPairs.StorePairs(supportedAssets[x], avail, true)
if err != nil {
log.Fatal(err)
}
}
os.Exit(m.Run())
}

View File

@@ -3,8 +3,6 @@ package bybit
import (
"context"
"errors"
"log"
"os"
"strconv"
"strings"
"sync"
@@ -12,12 +10,10 @@ import (
"time"
"github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/kline"
"github.com/thrasher-corp/gocryptotrader/exchanges/order"
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
"github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues"
"github.com/thrasher-corp/gocryptotrader/exchanges/ticker"
"github.com/thrasher-corp/gocryptotrader/portfolio/withdraw"
@@ -32,52 +28,6 @@ const (
var b = &Bybit{}
func TestMain(m *testing.M) {
b.SetDefaults()
cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil {
log.Fatal(err)
}
exchCfg, err := cfg.GetExchangeConfig("Bybit")
if err != nil {
log.Fatal(err)
}
exchCfg.API.AuthenticatedSupport = true
exchCfg.API.AuthenticatedWebsocketSupport = false
exchCfg.API.Credentials.Key = apiKey
exchCfg.API.Credentials.Secret = apiSecret
b.Websocket = sharedtestvalues.NewTestWebsocket()
request.MaxRequestJobs = 100
err = b.Setup(exchCfg)
if err != nil {
log.Fatal(err)
}
err = b.UpdateTradablePairs(context.Background(), false)
if err != nil {
log.Fatal(err)
}
// Turn on all pairs for testing
supportedAssets := b.GetAssetTypes(false)
for x := range supportedAssets {
avail, err := b.GetAvailablePairs(supportedAssets[x])
if err != nil {
log.Fatal(err)
}
err = b.CurrencyPairs.StorePairs(supportedAssets[x], avail, true)
if err != nil {
log.Fatal(err)
}
}
os.Exit(m.Run())
}
func TestStart(t *testing.T) {
t.Parallel()
err := b.Start(context.Background(), nil)
@@ -128,7 +78,13 @@ func TestGetTrades(t *testing.T) {
func TestGetKlines(t *testing.T) {
t.Parallel()
_, err := b.GetKlines(context.Background(), "BTCUSDT", "5m", 2000, time.Now().Add(-time.Hour*1), time.Now())
s := time.Now().Add(-time.Hour)
e := time.Now()
if mockTests {
s = time.Unix(1691897100, 0).Round(kline.FiveMin.Duration())
e = time.Unix(1691907100, 0).Round(kline.FiveMin.Duration())
}
_, err := b.GetKlines(context.Background(), "BTCUSDT", "5m", 2000, s, e)
if err != nil {
t.Fatal(err)
}
@@ -2067,7 +2023,6 @@ func TestUpdateTicker(t *testing.T) {
if err != nil {
t.Error(err)
}
_, err = b.UpdateTicker(context.Background(), pair, asset.USDTMarginedFutures)
if err != nil {
t.Error(err)
@@ -2083,18 +2038,27 @@ func TestUpdateTicker(t *testing.T) {
t.Error(err)
}
// Futures update dynamically, so fetch the available tradable futures for this test
availPairs, err := b.FetchTradablePairs(context.Background(), asset.Futures)
if err != nil {
t.Fatal(err)
var pairs currency.Pairs
if mockTests {
var pair2 currency.Pair
pair2, err = currency.NewPairFromString("BTCUSD-U23")
if err != nil {
t.Fatal(err)
}
pairs = pairs.Add(pair2)
} else {
// Futures update dynamically, so fetch the available tradable futures for this test
pairs, err = b.FetchTradablePairs(context.Background(), asset.Futures)
if err != nil {
t.Fatal(err)
}
// Needs to be set before calling extractCurrencyPair
if err = b.SetPairs(pairs, asset.Futures, true); err != nil {
t.Fatal(err)
}
}
// Needs to be set before calling extractCurrencyPair
if err = b.SetPairs(availPairs, asset.Futures, true); err != nil {
t.Fatal(err)
}
_, err = b.UpdateTicker(context.Background(), availPairs[0], asset.Futures)
_, err = b.UpdateTicker(context.Background(), pairs[0], asset.Futures)
if err != nil {
t.Error(err)
}
@@ -2178,12 +2142,7 @@ func TestFetchTradablePairs(t *testing.T) {
func TestUpdateTradablePairs(t *testing.T) {
t.Parallel()
err := b.UpdateTradablePairs(context.Background(), false)
if err != nil {
t.Error(err)
}
err = b.UpdateTradablePairs(context.Background(), true)
err := b.UpdateTradablePairs(context.Background(), true)
if err != nil {
t.Error(err)
}
@@ -2238,25 +2197,28 @@ func TestGetHistoricCandles(t *testing.T) {
if err != nil {
t.Fatal(err)
}
end := time.Now()
start := end.AddDate(0, 0, -3)
e := time.Now()
s := e.AddDate(0, 0, -3)
if mockTests {
s = time.Unix(1691897100, 0).Truncate(kline.OneDay.Duration())
e = time.Unix(1692007100, 0).Truncate(kline.OneDay.Duration())
}
_, err = b.GetHistoricCandles(context.Background(), pair, asset.Spot, kline.OneDay, start, end)
_, err = b.GetHistoricCandles(context.Background(), pair, asset.Spot, kline.OneDay, s, e)
if err != nil {
t.Error(err)
}
_, err = b.GetHistoricCandles(context.Background(), pair, asset.USDTMarginedFutures, kline.OneDay, start, end)
_, err = b.GetHistoricCandles(context.Background(), pair, asset.USDTMarginedFutures, kline.OneDay, s, e)
if err != nil {
t.Error(err)
}
pair1, err := currency.NewPairFromString("BTCUSD")
pair1, err := currency.NewPairFromString("BTC-USD")
if err != nil {
t.Fatal(err)
}
_, err = b.GetHistoricCandles(context.Background(), pair1, asset.CoinMarginedFutures, kline.OneHour, start, end)
_, err = b.GetHistoricCandles(context.Background(), pair1, asset.CoinMarginedFutures, kline.OneHour, s, e)
if err != nil {
t.Error(err)
}
@@ -2265,8 +2227,17 @@ func TestGetHistoricCandles(t *testing.T) {
if err != nil {
t.Fatal(err)
}
var pair2 currency.Pair
if mockTests {
pair2, err = currency.NewPairFromString("BTCUSD-U23")
if err != nil {
t.Fatal(err)
}
} else {
pair2 = enabled[0]
}
_, err = b.GetHistoricCandles(context.Background(), enabled[0], asset.Futures, kline.OneHour, start, end)
_, err = b.GetHistoricCandles(context.Background(), pair2, asset.Futures, kline.OneHour, s, e)
if err != nil {
t.Error(err)
}
@@ -2276,7 +2247,7 @@ func TestGetHistoricCandles(t *testing.T) {
t.Fatal(err)
}
_, err = b.GetHistoricCandles(context.Background(), pair3, asset.USDCMarginedFutures, kline.OneDay, start, end)
_, err = b.GetHistoricCandles(context.Background(), pair3, asset.USDCMarginedFutures, kline.OneDay, s, e)
if err != nil {
t.Error(err)
}
@@ -2288,16 +2259,19 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
if err != nil {
t.Fatal(err)
}
e := time.Now()
s := e.AddDate(0, 0, -3)
if mockTests {
s = time.Unix(1691897100, 0).Truncate(kline.OneDay.Duration())
e = time.Unix(1692007100, 0).Truncate(kline.OneDay.Duration())
}
startTime := time.Now().Add(-time.Hour * 24 * 3)
end := time.Now().Add(-time.Hour * 1)
_, err = b.GetHistoricCandlesExtended(context.Background(), pair, asset.Spot, kline.OneMin, startTime, end)
_, err = b.GetHistoricCandlesExtended(context.Background(), pair, asset.Spot, kline.OneDay, s, e)
if err != nil {
t.Error(err)
}
_, err = b.GetHistoricCandlesExtended(context.Background(), pair, asset.USDTMarginedFutures, kline.OneMin, startTime, end)
_, err = b.GetHistoricCandlesExtended(context.Background(), pair, asset.USDTMarginedFutures, kline.OneDay, s, e)
if err != nil {
t.Error(err)
}
@@ -2306,8 +2280,7 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetHistoricCandlesExtended(context.Background(), pair1, asset.CoinMarginedFutures, kline.OneHour, startTime, end)
_, err = b.GetHistoricCandlesExtended(context.Background(), pair1, asset.CoinMarginedFutures, kline.OneHour, s, e)
if err != nil {
t.Error(err)
}
@@ -2316,8 +2289,17 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
if err != nil {
t.Fatal(err)
}
var pair2 currency.Pair
if mockTests {
pair2, err = currency.NewPairFromString("BTCUSD-U23")
if err != nil {
t.Fatal(err)
}
} else {
pair2 = enabled[0]
}
_, err = b.GetHistoricCandlesExtended(context.Background(), enabled[0], asset.Futures, kline.OneDay, startTime, end)
_, err = b.GetHistoricCandlesExtended(context.Background(), pair2, asset.Futures, kline.OneHour, s, e)
if err != nil {
t.Error(err)
}
@@ -2327,7 +2309,7 @@ func TestGetHistoricCandlesExtended(t *testing.T) {
t.Fatal(err)
}
_, err = b.GetHistoricCandlesExtended(context.Background(), pair3, asset.USDCMarginedFutures, kline.FiveMin, startTime, end)
_, err = b.GetHistoricCandlesExtended(context.Background(), pair3, asset.USDCMarginedFutures, kline.OneDay, s, e)
if err != nil {
t.Error(err)
}
@@ -2979,8 +2961,11 @@ func TestGetUSDCKlines(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetUSDCKlines(context.Background(), pair, "5", time.Now().Add(-time.Hour), 0)
s := time.Now().Add(-time.Hour)
if mockTests {
s = time.Unix(1691897100, 0)
}
_, err = b.GetUSDCKlines(context.Background(), pair, "5", s, 0)
if err != nil {
t.Error(err)
}
@@ -2992,8 +2977,11 @@ func TestGetUSDCMarkPriceKlines(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetUSDCMarkPriceKlines(context.Background(), pair, "5", time.Now().Add(-time.Hour), 0)
s := time.Now().Add(-time.Hour)
if mockTests {
s = time.Unix(1691897100, 0)
}
_, err = b.GetUSDCMarkPriceKlines(context.Background(), pair, "5", s, 0)
if err != nil {
t.Error(err)
}
@@ -3005,8 +2993,11 @@ func TestGetUSDCIndexPriceKlines(t *testing.T) {
if err != nil {
t.Fatal(err)
}
_, err = b.GetUSDCIndexPriceKlines(context.Background(), pair, "5", time.Now().Add(-time.Hour), 0)
s := time.Now().Add(-time.Hour)
if mockTests {
s = time.Unix(1691897100, 0)
}
_, err = b.GetUSDCIndexPriceKlines(context.Background(), pair, "5", s, 0)
if err != nil {
t.Error(err)
}
@@ -3018,8 +3009,12 @@ func TestGetUSDCPremiumIndexKlines(t *testing.T) {
if err != nil {
t.Fatal(err)
}
s := time.Now().Add(-time.Hour)
if mockTests {
s = time.Unix(1692077100, 0)
}
_, err = b.GetUSDCPremiumIndexKlines(context.Background(), pair, "5", time.Now().Add(-time.Hour), 0)
_, err = b.GetUSDCPremiumIndexKlines(context.Background(), pair, "5", s, 0)
if err != nil {
t.Error(err)
}
@@ -3350,6 +3345,9 @@ func TestCancelBatchOrders(t *testing.T) {
func TestUpdateTickers(t *testing.T) {
t.Parallel()
if mockTests {
t.Skip("test it not relevant in a mock setting")
}
supportedAssets := b.GetAssetTypes(false)
ctx := context.Background()
for x := range supportedAssets {
@@ -3375,9 +3373,12 @@ func TestUpdateTickers(t *testing.T) {
func TestGetTickersV5(t *testing.T) {
t.Parallel()
_, err := b.GetTickersV5(context.Background(), "bruh", "", "")
if err != nil && err.Error() != "Illegal category" {
t.Error(err)
var err error
if !mockTests {
_, err = b.GetTickersV5(context.Background(), "bruh", "", "")
if err != nil && err.Error() != "Illegal category" {
t.Error(err)
}
}
_, err = b.GetTickersV5(context.Background(), "option", "", "")

View File

@@ -2126,7 +2126,8 @@ func (by *Bybit) UpdateOrderExecutionLimits(ctx context.Context, a asset.Item) e
var pair currency.Pair
pair, err = avail.DeriveFrom(pairsData[x].Name)
if err != nil {
return err
log.Warnf(log.ExchangeSys, "%s unable to load limits for %v, pair data missing", by.Name, pairsData[x].Name)
continue
}
limits = append(limits, order.MinMaxLevel{

View File

@@ -171,17 +171,17 @@ func (e *ExecutionLimits) GetOrderExecutionLimits(a asset.Item, cp currency.Pair
m1, ok := e.m[a]
if !ok {
return MinMaxLevel{}, errExchangeLimitAsset
return MinMaxLevel{}, fmt.Errorf("%w %v", errExchangeLimitAsset, a)
}
m2, ok := m1[cp.Base.Item]
if !ok {
return MinMaxLevel{}, errExchangeLimitBase
return MinMaxLevel{}, fmt.Errorf("%w %v", errExchangeLimitBase, cp.Base)
}
limit, ok := m2[cp.Quote.Item]
if !ok {
return MinMaxLevel{}, errExchangeLimitQuote
return MinMaxLevel{}, fmt.Errorf("%w %v", errExchangeLimitQuote, cp.Quote)
}
return limit, nil

View File

@@ -248,7 +248,7 @@ func (r *Requester) doRequest(ctx context.Context, endpoint EndpointLimit, newRe
// This dumps http responses for future mocking implementations
err = mock.HTTPRecord(resp, r.name, contents)
if err != nil {
return fmt.Errorf("mock recording failure %s", err)
return fmt.Errorf("mock recording failure %w, request %v: resp: %v", err, req, resp)
}
}