Files
gocryptotrader/exchanges/gateio/gateio_test.go
Gareth Kirwan f05f24da8b Types: Switch convert.StringToFloat64 to types.Number (#1415)
* Types: Add Number type

* Types: Switch StringToFloat64 for Number

This change mostly just renames the type.
convert package and StringToFloat64 represent actions, not types,
and make it misleading to use outside of the API context,
especially when using it for a Float64ToString operation.

* Common: Remove StringToFloat64

Replaced by types.Number

* fixup! Types: Switch StringToFloat64 for Number

Second pass at Okx

* Spellcheck: Fix whitespace handling for okx line
2023-12-20 13:01:27 +11:00

3541 lines
136 KiB
Go

package gateio
import (
"context"
"encoding/json"
"errors"
"log"
"os"
"strconv"
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/core"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/fundingrate"
"github.com/thrasher-corp/gocryptotrader/exchanges/futures"
"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/portfolio/withdraw"
)
// Please supply your own APIKEYS here for due diligence testing
const (
apiKey = ""
apiSecret = ""
canManipulateRealOrders = false
)
var g = &Gateio{}
var spotTradablePair, marginTradablePair, crossMarginTradablePair, futuresTradablePair, optionsTradablePair, deliveryFuturesTradablePair currency.Pair
func TestMain(m *testing.M) {
g.SetDefaults()
cfg := config.GetConfig()
err := cfg.LoadConfig("../../testdata/configtest.json", true)
if err != nil {
log.Fatal("GateIO load config error", err)
}
gConf, err := cfg.GetExchangeConfig("GateIO")
if err != nil {
log.Fatal("GateIO Setup() init error")
}
gConf.API.AuthenticatedSupport = true
gConf.API.AuthenticatedWebsocketSupport = true
gConf.API.Credentials.Key = apiKey
gConf.API.Credentials.Secret = apiSecret
g.Websocket = sharedtestvalues.NewTestWebsocket()
gConf.Features.Enabled.FillsFeed = true
gConf.Features.Enabled.TradeFeed = true
err = g.Setup(gConf)
if err != nil {
log.Fatal("GateIO setup error", err)
}
request.MaxRequestJobs = 200
g.Run(context.Background())
getFirstTradablePairOfAssets()
os.Exit(m.Run())
}
func TestStart(t *testing.T) {
err := g.Start(context.Background(), nil)
if !errors.Is(err, common.ErrNilPointer) {
t.Fatalf("received: '%v' but expected: '%v'", err, common.ErrNilPointer)
}
var testWg sync.WaitGroup
err = g.Start(context.Background(), &testWg)
if err != nil {
t.Fatal(err)
}
testWg.Wait()
}
func TestCancelAllExchangeOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
_, err := g.CancelAllOrders(context.Background(), nil)
if !errors.Is(err, order.ErrCancelOrderIsNil) {
t.Error(err)
}
var orderCancellation = &order.Cancel{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: optionsTradablePair,
AssetType: asset.Options,
}
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
orderCancellation.AssetType = asset.Spot
orderCancellation.Pair = spotTradablePair
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
orderCancellation.Pair = currency.EMPTYPAIR
orderCancellation.AssetType = asset.Margin
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Error(err)
}
orderCancellation.Pair = marginTradablePair
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
orderCancellation.Pair = currency.EMPTYPAIR
orderCancellation.AssetType = asset.CrossMargin
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Error(err)
}
orderCancellation.Pair = crossMarginTradablePair
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
orderCancellation.Pair = currency.EMPTYPAIR
orderCancellation.AssetType = asset.Futures
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Error(err)
}
orderCancellation.Pair = futuresTradablePair
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
orderCancellation.Pair = currency.EMPTYPAIR
orderCancellation.AssetType = asset.DeliveryFutures
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Error(err)
}
orderCancellation.Pair = deliveryFuturesTradablePair
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
}
func TestGetAccountInfo(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
_, err := g.UpdateAccountInfo(context.Background(), asset.Spot)
if err != nil {
t.Error("GetAccountInfo() error", err)
}
if _, err := g.UpdateAccountInfo(context.Background(), asset.Margin); err != nil {
t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err)
}
if _, err := g.UpdateAccountInfo(context.Background(), asset.CrossMargin); err != nil {
t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err)
}
if _, err := g.UpdateAccountInfo(context.Background(), asset.Options); err != nil {
t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err)
}
if _, err := g.UpdateAccountInfo(context.Background(), asset.Futures); err != nil {
t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err)
}
if _, err := g.UpdateAccountInfo(context.Background(), asset.DeliveryFutures); err != nil {
t.Errorf("%s UpdateAccountInfo() error %v", g.Name, err)
}
}
func TestWithdraw(t *testing.T) {
t.Parallel()
cryptocurrencyChains, err := g.GetAvailableTransferChains(context.Background(), currency.BTC)
if err != nil {
t.Fatal(err)
} else if len(cryptocurrencyChains) == 0 {
t.Fatal("no crypto currency chain available")
}
withdrawCryptoRequest := withdraw.Request{
Exchange: g.Name,
Amount: 1,
Currency: currency.BTC,
Description: "WITHDRAW IT ALL",
Crypto: withdraw.CryptoRequest{
Address: core.BitcoinDonationAddress,
Chain: cryptocurrencyChains[0],
},
}
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err = g.WithdrawCryptocurrencyFunds(context.Background(), &withdrawCryptoRequest); err != nil {
t.Errorf("%s WithdrawCryptocurrencyFunds() error: %v", g.Name, err)
}
}
func TestGetOrderInfo(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
_, err := g.GetOrderInfo(context.Background(),
"917591554", spotTradablePair, asset.Spot)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", optionsTradablePair, asset.Options)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", marginTradablePair, asset.Margin)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", crossMarginTradablePair, asset.CrossMargin)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", futuresTradablePair, asset.Futures)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", deliveryFuturesTradablePair, asset.DeliveryFutures)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
}
func TestUpdateTicker(t *testing.T) {
t.Parallel()
_, err := g.UpdateTicker(context.Background(), optionsTradablePair, asset.Options)
if err != nil {
t.Error(err)
}
_, err = g.UpdateTicker(context.Background(), spotTradablePair, asset.Spot)
if err != nil {
t.Error(err)
}
_, err = g.UpdateTicker(context.Background(), marginTradablePair, asset.Margin)
if err != nil {
t.Error(err)
}
_, err = g.UpdateTicker(context.Background(), crossMarginTradablePair, asset.CrossMargin)
if err != nil {
t.Error(err)
}
_, err = g.UpdateTicker(context.Background(), futuresTradablePair, asset.Futures)
if err != nil {
t.Error(err)
}
_, err = g.UpdateTicker(context.Background(), deliveryFuturesTradablePair, asset.DeliveryFutures)
if err != nil {
t.Error(err)
}
}
func TestListSpotCurrencies(t *testing.T) {
t.Parallel()
if _, err := g.ListSpotCurrencies(context.Background()); err != nil {
t.Errorf("%s ListAllCurrencies() error %v", g.Name, err)
}
}
func TestGetCurrencyDetail(t *testing.T) {
t.Parallel()
if _, err := g.GetCurrencyDetail(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetCurrencyDetail() error %v", g.Name, err)
}
}
func TestListAllCurrencyPairs(t *testing.T) {
t.Parallel()
if _, err := g.ListSpotCurrencyPairs(context.Background()); err != nil {
t.Errorf("%s ListAllCurrencyPairs() error %v", g.Name, err)
}
}
func TestGetCurrencyPairDetal(t *testing.T) {
t.Parallel()
if _, err := g.GetCurrencyPairDetail(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}.String()); err != nil {
t.Errorf("%s GetCurrencyPairDetal() error %v", g.Name, err)
}
}
func TestGetTickers(t *testing.T) {
t.Parallel()
if _, err := g.GetTickers(context.Background(), "BTC_USDT", ""); err != nil {
t.Errorf("%s GetTickers() error %v", g.Name, err)
}
}
func TestGetTicker(t *testing.T) {
t.Parallel()
if _, err := g.GetTicker(context.Background(), currency.Pair{Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT}.String(), utc8TimeZone); err != nil {
t.Errorf("%s GetTicker() error %v", g.Name, err)
}
}
func TestGetOrderbook(t *testing.T) {
t.Parallel()
_, err := g.GetOrderbook(context.Background(), spotTradablePair.String(), "0.1", 10, false)
if err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err = g.GetFuturesOrderbook(context.Background(), settle, futuresTradablePair.String(), "", 10, false); err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
settle, err = g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err = g.GetDeliveryOrderbook(context.Background(), settle, "0.1", deliveryFuturesTradablePair, 10, false); err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
if _, err = g.GetOptionsOrderbook(context.Background(), optionsTradablePair, "0.1", 10, false); err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
}
func TestGetMarketTrades(t *testing.T) {
t.Parallel()
if _, err := g.GetMarketTrades(context.Background(), spotTradablePair, 0, "", true, time.Time{}, time.Time{}, 1); err != nil {
t.Errorf("%s GetMarketTrades() error %v", g.Name, err)
}
}
func TestGetCandlesticks(t *testing.T) {
t.Parallel()
if _, err := g.GetCandlesticks(context.Background(), spotTradablePair, 0, time.Time{}, time.Time{}, kline.OneDay); err != nil {
t.Errorf("%s GetCandlesticks() error %v", g.Name, err)
}
}
func TestGetTradingFeeRatio(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetTradingFeeRatio(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}); err != nil {
t.Errorf("%s GetTradingFeeRatio() error %v", g.Name, err)
}
}
func TestGetSpotAccounts(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSpotAccounts(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetSpotAccounts() error %v", g.Name, err)
}
}
func TestCreateBatchOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CreateBatchOrders(context.Background(), []CreateOrderRequestData{
{
CurrencyPair: spotTradablePair,
Side: "sell",
Amount: 0.001,
Price: 12349,
Account: g.assetTypeToString(asset.Spot),
Type: "limit",
},
{
CurrencyPair: currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter},
Side: "buy",
Amount: 1,
Price: 1234567789,
Account: g.assetTypeToString(asset.Spot),
Type: "limit",
},
}); err != nil {
t.Errorf("%s CreateBatchOrders() error %v", g.Name, err)
}
}
func TestGetSpotOpenOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GateioSpotOpenOrders(context.Background(), 0, 0, false); err != nil {
t.Errorf("%s GetSpotOpenOrders() error %v", g.Name, err)
}
}
func TestSpotClosePositionWhenCrossCurrencyDisabled(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.SpotClosePositionWhenCrossCurrencyDisabled(context.Background(), &ClosePositionRequestParam{
Amount: 0.1,
Price: 1234567384,
CurrencyPair: spotTradablePair,
}); err != nil {
t.Errorf("%s SpotClosePositionWhenCrossCurrencyDisabled() error %v", g.Name, err)
}
}
func TestCreateSpotOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.PlaceSpotOrder(context.Background(), &CreateOrderRequestData{
CurrencyPair: spotTradablePair,
Side: "buy",
Amount: 1,
Price: 900000,
Account: g.assetTypeToString(asset.Spot),
Type: "limit",
}); err != nil {
t.Errorf("%s CreateSpotOrder() error %v", g.Name, err)
}
}
func TestGetSpotOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSpotOrders(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "open", 0, 0); err != nil {
t.Errorf("%s GetSpotOrders() error %v", g.Name, err)
}
}
func TestCancelAllOpenOrdersSpecifiedCurrencyPair(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelAllOpenOrdersSpecifiedCurrencyPair(context.Background(), spotTradablePair, order.Sell, asset.Empty); err != nil {
t.Errorf("%s CancelAllOpenOrdersSpecifiedCurrencyPair() error %v", g.Name, err)
}
}
func TestCancelBatchOrdersWithIDList(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelBatchOrdersWithIDList(context.Background(), []CancelOrderByIDParam{
{
CurrencyPair: spotTradablePair,
ID: "1234567",
},
{
CurrencyPair: currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter},
ID: "something",
},
}); err != nil {
t.Errorf("%s CancelBatchOrderWithIDList() error %v", g.Name, err)
}
}
func TestGetSpotOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSpotOrder(context.Background(), "1234", currency.Pair{
Base: currency.BTC,
Delimiter: currency.UnderscoreDelimiter,
Quote: currency.USDT}, asset.Spot); err != nil {
t.Errorf("%s GetSpotOrder() error %v", g.Name, err)
}
}
func TestAmendSpotOrder(t *testing.T) {
t.Parallel()
_, err := g.AmendSpotOrder(context.Background(), "", spotTradablePair, false, &PriceAndAmount{
Price: 1000,
})
if !errors.Is(err, errInvalidOrderID) {
t.Errorf("expecting %v, but found %v", errInvalidOrderID, err)
}
_, err = g.AmendSpotOrder(context.Background(), "123", currency.EMPTYPAIR, false, &PriceAndAmount{
Price: 1000,
})
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Errorf("expecting %v, but found %v", currency.ErrCurrencyPairEmpty, err)
}
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
_, err = g.AmendSpotOrder(context.Background(), "123", spotTradablePair, false, &PriceAndAmount{
Price: 1000,
})
if err != nil {
t.Error(err)
}
}
func TestCancelSingleSpotOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelSingleSpotOrder(context.Background(), "1234",
spotTradablePair.String(), false); err != nil {
t.Errorf("%s CancelSingleSpotOrder() error %v", g.Name, err)
}
}
func TestGetPersonalTradingHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GateIOGetPersonalTradingHistory(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, "", 0, 0, false, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetPersonalTradingHistory() error %v", g.Name, err)
}
}
func TestGetServerTime(t *testing.T) {
t.Parallel()
if _, err := g.GetServerTime(context.Background(), asset.Spot); err != nil {
t.Errorf("%s GetServerTime() error %v", g.Name, err)
}
}
func TestCountdownCancelorder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CountdownCancelorders(context.Background(), CountdownCancelOrderParam{
Timeout: 10,
CurrencyPair: currency.Pair{Base: currency.BTC, Quote: currency.ETH, Delimiter: currency.UnderscoreDelimiter},
}); err != nil {
t.Errorf("%s CountdownCancelorder() error %v", g.Name, err)
}
}
func TestCreatePriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CreatePriceTriggeredOrder(context.Background(), &PriceTriggeredOrderParam{
Trigger: TriggerPriceInfo{
Price: 123,
Rule: ">=",
Expiration: 3600,
},
Put: PutOrderData{
Type: "limit",
Side: "sell",
Price: 2312312,
Amount: 30,
TimeInForce: "gtc",
},
Market: currency.Pair{Base: currency.GT, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter},
}); err != nil {
t.Errorf("%s CreatePriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestGetPriceTriggeredOrderList(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetPriceTriggeredOrderList(context.Background(), "open", currency.EMPTYPAIR, asset.Empty, 0, 0); err != nil {
t.Errorf("%s GetPriceTriggeredOrderList() error %v", g.Name, err)
}
}
func TestCancelAllOpenOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelMultipleSpotOpenOrders(context.Background(), currency.EMPTYPAIR, asset.CrossMargin); err != nil {
t.Errorf("%s CancelAllOpenOrders() error %v", g.Name, err)
}
}
func TestGetSinglePriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSinglePriceTriggeredOrder(context.Background(), "1234"); err != nil {
t.Errorf("%s GetSinglePriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestCancelPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.CancelPriceTriggeredOrder(context.Background(), "1234"); err != nil {
t.Errorf("%s CancelPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestGetMarginAccountList(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMarginAccountList(context.Background(), currency.EMPTYPAIR); err != nil {
t.Errorf("%s GetMarginAccountList() error %v", g.Name, err)
}
}
func TestListMarginAccountBalanceChangeHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.ListMarginAccountBalanceChangeHistory(context.Background(), currency.BTC, currency.Pair{
Base: currency.BTC,
Delimiter: currency.UnderscoreDelimiter,
Quote: currency.USDT}, time.Time{}, time.Time{}, 0, 0); err != nil {
t.Errorf("%s ListMarginAccountBalanceChangeHistory() error %v", g.Name, err)
}
}
func TestGetMarginFundingAccountList(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMarginFundingAccountList(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetMarginFundingAccountList %v", g.Name, err)
}
}
func TestMarginLoan(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.MarginLoan(context.Background(), &MarginLoanRequestParam{
Side: "borrow",
Amount: 1,
Currency: currency.BTC,
CurrencyPair: currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter},
Days: 10,
Rate: 0.0002,
}); err != nil {
t.Errorf("%s MarginLoan() error %v", g.Name, err)
}
}
func TestGetMarginAllLoans(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMarginAllLoans(context.Background(), "open", "lend", "", currency.BTC, currency.Pair{Base: currency.BTC, Delimiter: currency.UnderscoreDelimiter, Quote: currency.USDT}, false, 0, 0); err != nil {
t.Errorf("%s GetMarginAllLoans() error %v", g.Name, err)
}
}
func TestMergeMultipleLendingLoans(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.MergeMultipleLendingLoans(context.Background(), currency.USDT, []string{"123", "23423"}); err != nil {
t.Errorf("%s MergeMultipleLendingLoans() error %v", g.Name, err)
}
}
func TestRetriveOneSingleLoanDetail(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.RetriveOneSingleLoanDetail(context.Background(), "borrow", "123"); err != nil {
t.Errorf("%s RetriveOneSingleLoanDetail() error %v", g.Name, err)
}
}
func TestModifyALoan(t *testing.T) {
t.Parallel()
if _, err := g.ModifyALoan(context.Background(), "1234", &ModifyLoanRequestParam{
Currency: currency.BTC,
Side: "borrow",
AutoRenew: false,
}); !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Errorf("%s ModifyALoan() error %v", g.Name, err)
}
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.ModifyALoan(context.Background(), "1234", &ModifyLoanRequestParam{
Currency: currency.BTC,
Side: "borrow",
AutoRenew: false,
CurrencyPair: currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter},
}); err != nil {
t.Errorf("%s ModifyALoan() error %v", g.Name, err)
}
}
func TestCancelLendingLoan(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.CancelLendingLoan(context.Background(), currency.BTC, "1234"); err != nil {
t.Errorf("%s CancelLendingLoan() error %v", g.Name, err)
}
}
func TestRepayALoan(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.RepayALoan(context.Background(), "1234", &RepayLoanRequestParam{
CurrencyPair: currency.NewPair(currency.BTC, currency.USDT),
Currency: currency.BTC,
Mode: "all",
}); err != nil {
t.Errorf("%s RepayALoan() error %v", g.Name, err)
}
}
func TestListLoanRepaymentRecords(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.ListLoanRepaymentRecords(context.Background(), "1234"); err != nil {
t.Errorf("%s LoanRepaymentRecord() error %v", g.Name, err)
}
}
func TestListRepaymentRecordsOfSpecificLoan(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.ListRepaymentRecordsOfSpecificLoan(context.Background(), "1234", "", 0, 0); err != nil {
t.Errorf("%s error while ListRepaymentRecordsOfSpecificLoan() %v", g.Name, err)
}
}
func TestGetOneSingleloanRecord(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetOneSingleLoanRecord(context.Background(), "1234", "123"); err != nil {
t.Errorf("%s error while GetOneSingleloanRecord() %v", g.Name, err)
}
}
func TestModifyALoanRecord(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.ModifyALoanRecord(context.Background(), "1234", &ModifyLoanRequestParam{
Currency: currency.USDT,
CurrencyPair: currency.NewPair(currency.BTC, currency.USDT),
Side: "lend",
AutoRenew: true,
LoanID: "1234",
}); err != nil {
t.Errorf("%s ModifyALoanRecord() error %v", g.Name, err)
}
}
func TestUpdateUsersAutoRepaymentSetting(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.UpdateUsersAutoRepaymentSetting(context.Background(), true); err != nil {
t.Errorf("%s UpdateUsersAutoRepaymentSetting() error %v", g.Name, err)
}
}
func TestGetUserAutoRepaymentSetting(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetUserAutoRepaymentSetting(context.Background()); err != nil {
t.Errorf("%s GetUserAutoRepaymentSetting() error %v", g.Name, err)
}
}
func TestGetMaxTransferableAmountForSpecificMarginCurrency(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMaxTransferableAmountForSpecificMarginCurrency(context.Background(), currency.BTC, currency.EMPTYPAIR); err != nil {
t.Errorf("%s GetMaxTransferableAmountForSpecificMarginCurrency() error %v", g.Name, err)
}
}
func TestGetMaxBorrowableAmountForSpecificMarginCurrency(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMaxBorrowableAmountForSpecificMarginCurrency(context.Background(), currency.BTC, currency.EMPTYPAIR); err != nil {
t.Errorf("%s GetMaxBorrowableAmountForSpecificMarginCurrency() error %v", g.Name, err)
}
}
func TestCurrencySupportedByCrossMargin(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.CurrencySupportedByCrossMargin(context.Background()); err != nil {
t.Errorf("%s CurrencySupportedByCrossMargin() error %v", g.Name, err)
}
}
func TestGetCrossMarginSupportedCurrencyDetail(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetCrossMarginSupportedCurrencyDetail(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetCrossMarginSupportedCurrencyDetail() error %v", g.Name, err)
}
}
func TestGetCrossMarginAccounts(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetCrossMarginAccounts(context.Background()); err != nil {
t.Errorf("%s GetCrossMarginAccounts() error %v", g.Name, err)
}
}
func TestGetCrossMarginAccountChangeHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetCrossMarginAccountChangeHistory(context.Background(), currency.BTC, time.Time{}, time.Time{}, 0, 6, "in"); err != nil {
t.Errorf("%s GetCrossMarginAccountChangeHistory() error %v", g.Name, err)
}
}
var createCrossMarginBorrowLoanJSON = `{"id": "17", "create_time": 1620381696159, "update_time": 1620381696159, "currency": "EOS", "amount": "110.553635", "text": "web", "status": 2, "repaid": "110.506649705159", "repaid_interest": "0.046985294841", "unpaid_interest": "0.0000074393366667"}`
func TestCreateCrossMarginBorrowLoan(t *testing.T) {
t.Parallel()
var response CrossMarginLoanResponse
if err := json.Unmarshal([]byte(createCrossMarginBorrowLoanJSON), &response); err != nil {
t.Errorf("%s error while deserializing to CrossMarginBorrowLoanResponse %v", g.Name, err)
}
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CreateCrossMarginBorrowLoan(context.Background(), CrossMarginBorrowLoanParams{
Currency: currency.BTC,
Amount: 3,
}); err != nil {
t.Errorf("%s CreateCrossMarginBorrowLoan() error %v", g.Name, err)
}
}
func TestGetCrossMarginBorrowHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetCrossMarginBorrowHistory(context.Background(), 1, currency.BTC, 0, 0, false); err != nil {
t.Errorf("%s GetCrossMarginBorrowHistory() error %v", g.Name, err)
}
}
func TestGetSingleBorrowLoanDetail(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleBorrowLoanDetail(context.Background(), "1234"); err != nil {
t.Errorf("%s GetSingleBorrowLoanDetail() error %v", g.Name, err)
}
}
func TestExecuteRepayment(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.ExecuteRepayment(context.Background(), CurrencyAndAmount{
Currency: currency.USD,
Amount: 1234.55,
}); err != nil {
t.Errorf("%s ExecuteRepayment() error %v", g.Name, err)
}
}
func TestGetCrossMarginRepayments(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetCrossMarginRepayments(context.Background(), currency.BTC, "123", 0, 0, false); err != nil {
t.Errorf("%s GetCrossMarginRepayments() error %v", g.Name, err)
}
}
func TestGetMaxTransferableAmountForSpecificCrossMarginCurrency(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMaxTransferableAmountForSpecificCrossMarginCurrency(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetMaxTransferableAmountForSpecificCrossMarginCurrency() error %v", g.Name, err)
}
}
func TestGetMaxBorrowableAmountForSpecificCrossMarginCurrency(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMaxBorrowableAmountForSpecificCrossMarginCurrency(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetMaxBorrowableAmountForSpecificCrossMarginCurrency() error %v", g.Name, err)
}
}
func TestListCurrencyChain(t *testing.T) {
t.Parallel()
if _, err := g.ListCurrencyChain(context.Background(), currency.BTC); err != nil {
t.Errorf("%s ListCurrencyChain() error %v", g.Name, err)
}
}
func TestGenerateCurrencyDepositAddress(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GenerateCurrencyDepositAddress(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GenerateCurrencyDepositAddress() error %v", g.Name, err)
}
}
func TestGetWithdrawalRecords(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetWithdrawalRecords(context.Background(), currency.BTC, time.Time{}, time.Time{}, 0, 0); err != nil {
t.Errorf("%s GetWithdrawalRecords() error %v", g.Name, err)
}
}
func TestGetDepositRecords(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDepositRecords(context.Background(), currency.BTC, time.Time{}, time.Time{}, 0, 0); err != nil {
t.Errorf("%s GetDepositRecords() error %v", g.Name, err)
}
}
func TestTransferCurrency(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.TransferCurrency(context.Background(), &TransferCurrencyParam{
Currency: currency.BTC,
From: g.assetTypeToString(asset.Spot),
To: g.assetTypeToString(asset.Margin),
Amount: 1202.000,
CurrencyPair: spotTradablePair,
}); err != nil {
t.Errorf("%s TransferCurrency() error %v", g.Name, err)
}
}
func TestSubAccountTransfer(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if err := g.SubAccountTransfer(context.Background(), SubAccountTransferParam{
Currency: currency.BTC,
SubAccount: "12222",
Direction: "to",
Amount: 1,
}); err != nil {
t.Errorf("%s SubAccountTransfer() error %v", g.Name, err)
}
}
func TestGetSubAccountTransferHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.GetSubAccountTransferHistory(context.Background(), "", time.Time{}, time.Time{}, 0, 0); err != nil {
t.Errorf("%s GetSubAccountTransferHistory() error %v", g.Name, err)
}
}
func TestSubAccountTransferToSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if err := g.SubAccountTransferToSubAccount(context.Background(), &InterSubAccountTransferParams{
Currency: currency.BTC,
SubAccountFromUserID: "1234",
SubAccountFromAssetType: asset.Spot,
SubAccountToUserID: "4567",
SubAccountToAssetType: asset.Spot,
Amount: 1234,
}); err != nil {
t.Error(err)
}
}
func TestGetWithdrawalStatus(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetWithdrawalStatus(context.Background(), currency.NewCode("")); err != nil {
t.Errorf("%s GetWithdrawalStatus() error %v", g.Name, err)
}
}
func TestGetSubAccountBalances(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSubAccountBalances(context.Background(), ""); err != nil {
t.Errorf("%s GetSubAccountBalances() error %v", g.Name, err)
}
}
func TestGetSubAccountMarginBalances(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSubAccountMarginBalances(context.Background(), ""); err != nil {
t.Errorf("%s GetSubAccountMarginBalances() error %v", g.Name, err)
}
}
func TestGetSubAccountFuturesBalances(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSubAccountFuturesBalances(context.Background(), "", ""); err != nil {
t.Errorf("%s GetSubAccountFuturesBalance() error %v", g.Name, err)
}
}
func TestGetSubAccountCrossMarginBalances(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSubAccountCrossMarginBalances(context.Background(), ""); err != nil {
t.Errorf("%s GetSubAccountCrossMarginBalances() error %v", g.Name, err)
}
}
func TestGetSavedAddresses(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSavedAddresses(context.Background(), currency.BTC, "", 0); err != nil {
t.Errorf("%s GetSavedAddresses() error %v", g.Name, err)
}
}
func TestGetPersonalTradingFee(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetPersonalTradingFee(context.Background(), currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}, ""); err != nil {
t.Errorf("%s GetPersonalTradingFee() error %v", g.Name, err)
}
}
func TestGetUsersTotalBalance(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetUsersTotalBalance(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetUsersTotalBalance() error %v", g.Name, err)
}
}
func TestGetMarginSupportedCurrencyPairs(t *testing.T) {
t.Parallel()
if _, err := g.GetMarginSupportedCurrencyPairs(context.Background()); err != nil {
t.Errorf("%s GetMarginSupportedCurrencyPair() error %v", g.Name, err)
}
}
func TestGetMarginSupportedCurrencyPair(t *testing.T) {
t.Parallel()
if _, err := g.GetSingleMarginSupportedCurrencyPair(context.Background(), marginTradablePair); err != nil {
t.Errorf("%s GetMarginSupportedCurrencyPair() error %v", g.Name, err)
}
}
func TestGetOrderbookOfLendingLoans(t *testing.T) {
t.Parallel()
if _, err := g.GetOrderbookOfLendingLoans(context.Background(), currency.BTC); err != nil {
t.Errorf("%s GetOrderbookOfLendingLoans() error %v", g.Name, err)
}
}
func TestGetAllFutureContracts(t *testing.T) {
t.Parallel()
_, err := g.GetAllFutureContracts(context.Background(), settleUSD)
if err != nil {
t.Errorf("%s GetAllFutureContracts() error %v", g.Name, err)
}
if _, err = g.GetAllFutureContracts(context.Background(), settleUSDT); err != nil {
t.Errorf("%s GetAllFutureContracts() error %v", g.Name, err)
}
if _, err = g.GetAllFutureContracts(context.Background(), settleBTC); err != nil {
t.Errorf("%s GetAllFutureContracts() error %v", g.Name, err)
}
}
func TestGetSingleContract(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err = g.GetSingleContract(context.Background(), settle, futuresTradablePair.String()); err != nil {
t.Errorf("%s GetSingleContract() error %s", g.Name, err)
}
}
func TestGetFuturesOrderbook(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesOrderbook(context.Background(), settle, futuresTradablePair.String(), "", 0, false); err != nil {
t.Errorf("%s GetFuturesOrderbook() error %v", g.Name, err)
}
}
func TestGetFuturesTradingHistory(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesTradingHistory(context.Background(), settle, futuresTradablePair, 0, 0, "", time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetFuturesTradingHistory() error %v", g.Name, err)
}
}
func TestGetFuturesCandlesticks(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesCandlesticks(context.Background(), settle, futuresTradablePair.String(), time.Time{}, time.Time{}, 0, kline.OneWeek); err != nil {
t.Errorf("%s GetFuturesCandlesticks() error %v", g.Name, err)
}
}
func TestPremiumIndexKLine(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Error(err)
}
if _, err := g.PremiumIndexKLine(context.Background(), settle, futuresTradablePair, time.Time{}, time.Time{}, 0, kline.OneWeek); err != nil {
t.Errorf("%s PremiumIndexKLine() error %v", g.Name, err)
}
}
func TestGetFutureTickers(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesTickers(context.Background(), settle, futuresTradablePair); err != nil {
t.Errorf("%s GetFuturesTickers() error %v", g.Name, err)
}
}
func TestGetFutureFundingRates(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFutureFundingRates(context.Background(), settle, futuresTradablePair, 0); err != nil {
t.Errorf("%s GetFutureFundingRates() error %v", g.Name, err)
}
}
func TestGetFuturesInsuranceBalanceHistory(t *testing.T) {
t.Parallel()
if _, err := g.GetFuturesInsuranceBalanceHistory(context.Background(), settleUSDT, 0); err != nil {
t.Errorf("%s GetFuturesInsuranceBalanceHistory() error %v", g.Name, err)
}
}
func TestGetFutureStats(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Error(err)
}
if _, err := g.GetFutureStats(context.Background(), settle, futuresTradablePair, time.Time{}, kline.OneHour, 0); err != nil {
t.Errorf("%s GetFutureStats() error %v", g.Name, err)
}
}
func TestGetIndexConstituent(t *testing.T) {
t.Parallel()
if _, err := g.GetIndexConstituent(context.Background(), settleUSDT, currency.Pair{Base: currency.BTC, Quote: currency.USDT, Delimiter: currency.UnderscoreDelimiter}.String()); err != nil {
t.Errorf("%s GetIndexConstituent() error %v", g.Name, err)
}
}
func TestGetLiquidationHistory(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Error(err)
}
if _, err := g.GetLiquidationHistory(context.Background(), settle, futuresTradablePair, time.Time{}, time.Time{}, 0); err != nil {
t.Errorf("%s GetLiquidationHistory() error %v", g.Name, err)
}
}
func TestQueryFuturesAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.QueryFuturesAccount(context.Background(), settleUSDT); err != nil {
t.Errorf("%s QueryFuturesAccount() error %v", g.Name, err)
}
}
func TestGetFuturesAccountBooks(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetFuturesAccountBooks(context.Background(), settleUSDT, 0, time.Time{}, time.Time{}, "dnw"); err != nil {
t.Errorf("%s GetFuturesAccountBooks() error %v", g.Name, err)
}
}
func TestGetAllPositionsOfUsers(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetAllFuturesPositionsOfUsers(context.Background(), settleUSDT); err != nil {
t.Errorf("%s GetAllPositionsOfUsers() error %v", g.Name, err)
}
}
func TestGetSinglePosition(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSinglePosition(context.Background(), settleUSDT, currency.Pair{Quote: currency.BTC, Base: currency.USDT}); err != nil {
t.Errorf("%s GetSinglePosition() error %v", g.Name, err)
}
}
func TestUpdatePositionMargin(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateFuturesPositionMargin(context.Background(), settle, 0.01, futuresTradablePair); err != nil {
t.Errorf("%s UpdatePositionMargin() error %v", g.Name, err)
}
}
func TestUpdatePositionLeverage(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateFuturesPositionLeverage(context.Background(), settle, futuresTradablePair, 1, 0); err != nil {
t.Errorf("%s UpdatePositionLeverage() error %v", g.Name, err)
}
}
func TestUpdatePositionRiskLimit(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateFuturesPositionRiskLimit(context.Background(), settle, futuresTradablePair, 10); err != nil {
t.Errorf("%s UpdatePositionRiskLimit() error %v", g.Name, err)
}
}
func TestCreateDeliveryOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.PlaceDeliveryOrder(context.Background(), &OrderCreateParams{
Contract: deliveryFuturesTradablePair,
Size: 6024,
Iceberg: 0,
Price: 3765,
Text: "t-my-custom-id",
Settle: settle,
TimeInForce: gtcTIF,
}); err != nil {
t.Errorf("%s CreateDeliveryOrder() error %v", g.Name, err)
}
}
func TestGetDeliveryOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetDeliveryOrders(context.Background(), deliveryFuturesTradablePair, "open", settle, "", 0, 0, 1); err != nil {
t.Errorf("%s GetDeliveryOrders() error %v", g.Name, err)
}
}
func TestCancelAllDeliveryOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CancelMultipleDeliveryOrders(context.Background(), deliveryFuturesTradablePair, "ask", settle); err != nil {
t.Errorf("%s CancelAllDeliveryOrders() error %v", g.Name, err)
}
}
func TestGetSingleDeliveryOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleDeliveryOrder(context.Background(), settleUSDT, "123456"); err != nil {
t.Errorf("%s GetSingleDeliveryOrder() error %v", g.Name, err)
}
if _, err := g.GetSingleDeliveryOrder(context.Background(), settleBTC, "123456"); err != nil {
t.Errorf("%s GetSingleDeliveryOrder() error %v", g.Name, err)
}
if _, err := g.GetSingleDeliveryOrder(context.Background(), settleUSD, "123456"); !errors.Is(err, errEmptySettlementCurrency) {
t.Errorf("%s GetSingleDeliveryOrder() expected %v, but found %v", g.Name, errEmptySettlementCurrency, err)
}
}
func TestCancelSingleDeliveryOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelSingleDeliveryOrder(context.Background(), settleUSDT, "123456"); err != nil {
t.Errorf("%s CancelSingleDeliveryOrder() error %v", g.Name, err)
}
if _, err := g.CancelSingleDeliveryOrder(context.Background(), settleBTC, "123456"); err != nil {
t.Errorf("%s CancelSingleDeliveryOrder() error %v", g.Name, err)
}
}
func TestGetDeliveryPersonalTradingHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryPersonalTradingHistory(context.Background(), settleUSDT, "", deliveryFuturesTradablePair, 0, 0, 1, ""); err != nil {
t.Errorf("%s GetDeliveryPersonalTradingHistory() error %v", g.Name, err)
}
}
func TestGetDeliveryPositionCloseHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryPositionCloseHistory(context.Background(), settleUSDT, deliveryFuturesTradablePair, 0, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetDeliveryPositionCloseHistory() error %v", g.Name, err)
}
}
func TestGetDeliveryLiquidationHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryLiquidationHistory(context.Background(), settleUSDT, deliveryFuturesTradablePair, 0, time.Now()); err != nil {
t.Errorf("%s GetDeliveryLiquidationHistory() error %v", g.Name, err)
}
}
func TestGetDeliverySettlementHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliverySettlementHistory(context.Background(), settleUSDT, deliveryFuturesTradablePair, 0, time.Now()); err != nil {
t.Errorf("%s GetDeliverySettlementHistory() error %v", g.Name, err)
}
}
func TestGetDeliveryPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryPriceTriggeredOrder(context.Background(), settleUSDT, &FuturesPriceTriggeredOrderParam{
Initial: FuturesInitial{
Price: 1234.,
Size: 12,
Contract: deliveryFuturesTradablePair,
},
Trigger: FuturesTrigger{
Rule: 1,
OrderType: "close-short-position",
Price: 123400,
},
}); err != nil {
t.Errorf("%s GetDeliveryPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestGetDeliveryAllAutoOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryAllAutoOrder(context.Background(), "open", settleUSDT, deliveryFuturesTradablePair, 0, 1); err != nil {
t.Errorf("%s GetDeliveryAllAutoOrder() error %v", g.Name, err)
}
}
func TestCancelAllDeliveryPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CancelAllDeliveryPriceTriggeredOrder(context.Background(), settle, deliveryFuturesTradablePair); err != nil {
t.Errorf("%s CancelAllDeliveryPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestGetSingleDeliveryPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleDeliveryPriceTriggeredOrder(context.Background(), settleBTC, "12345"); err != nil {
t.Errorf("%s GetSingleDeliveryPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestCancelDeliveryPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelDeliveryPriceTriggeredOrder(context.Background(), settleUSDT, "12345"); err != nil {
t.Errorf("%s CancelDeliveryPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestEnableOrDisableDualMode(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.EnableOrDisableDualMode(context.Background(), settleBTC, true); err != nil {
t.Errorf("%s EnableOrDisableDualMode() error %v", g.Name, err)
}
}
func TestRetrivePositionDetailInDualMode(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err = g.RetrivePositionDetailInDualMode(context.Background(), settle, futuresTradablePair); err != nil {
t.Errorf("%s RetrivePositionDetailInDualMode() error %v", g.Name, err)
}
}
func TestUpdatePositionMarginInDualMode(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err = g.UpdatePositionMarginInDualMode(context.Background(), settle, futuresTradablePair, 0.001, "dual_long"); err != nil {
t.Errorf("%s UpdatePositionMarginInDualMode() error %v", g.Name, err)
}
}
func TestUpdatePositionLeverageInDualMode(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err = g.UpdatePositionLeverageInDualMode(context.Background(), settle, futuresTradablePair, 0.001, 0.001); err != nil {
t.Errorf("%s UpdatePositionLeverageInDualMode() error %v", g.Name, err)
}
}
func TestUpdatePositionRiskLimitinDualMode(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err = g.UpdatePositionRiskLimitInDualMode(context.Background(), settle, futuresTradablePair, 10); err != nil {
t.Errorf("%s UpdatePositionRiskLimitinDualMode() error %v", g.Name, err)
}
}
func TestCreateFuturesOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.PlaceFuturesOrder(context.Background(), &OrderCreateParams{
Contract: futuresTradablePair,
Size: 6024,
Iceberg: 0,
Price: 3765,
TimeInForce: "gtc",
Text: "t-my-custom-id",
Settle: settle,
}); err != nil {
t.Errorf("%s CreateFuturesOrder() error %v", g.Name, err)
}
}
func TestGetFuturesOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetFuturesOrders(context.Background(), currency.NewPair(currency.BTC, currency.USD), "open", "", settleBTC, 0, 0, 1); err != nil {
t.Errorf("%s GetFuturesOrders() error %v", g.Name, err)
}
}
func TestCancelMultipleFuturesOpenOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelMultipleFuturesOpenOrders(context.Background(), futuresTradablePair, "ask", settleUSDT); err != nil {
t.Errorf("%s CancelAllOpenOrdersMatched() error %v", g.Name, err)
}
}
func TestGetSingleFuturesPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleFuturesPriceTriggeredOrder(context.Background(), settleBTC, "12345"); err != nil {
t.Errorf("%s GetSingleFuturesPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestCancelFuturesPriceTriggeredOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelFuturesPriceTriggeredOrder(context.Background(), settleUSDT, "12345"); err != nil {
t.Errorf("%s CancelFuturesPriceTriggeredOrder() error %v", g.Name, err)
}
}
func TestCreateBatchFuturesOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, true)
if err != nil {
t.Fatal(err)
}
if _, err := g.PlaceBatchFuturesOrders(context.Background(), settleBTC, []OrderCreateParams{
{
Contract: futuresTradablePair,
Size: 6024,
Iceberg: 0,
Price: 3765,
TimeInForce: "gtc",
Text: "t-my-custom-id",
Settle: settle,
},
{
Contract: currency.NewPair(currency.BTC, currency.USDT),
Size: 232,
Iceberg: 0,
Price: 376225,
TimeInForce: "gtc",
Text: "t-my-custom-id",
Settle: settleBTC,
},
}); err != nil {
t.Errorf("%s CreateBatchFuturesOrders() error %v", g.Name, err)
}
}
func TestGetSingleFuturesOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleFuturesOrder(context.Background(), settleBTC, "12345"); err != nil {
t.Errorf("%s GetSingleFuturesOrder() error %v", g.Name, err)
}
}
func TestCancelSingleFuturesOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelSingleFuturesOrder(context.Background(), settleBTC, "12345"); err != nil {
t.Errorf("%s CancelSingleFuturesOrder() error %v", g.Name, err)
}
}
func TestAmendFuturesOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.AmendFuturesOrder(context.Background(), settleBTC, "1234", AmendFuturesOrderParam{
Price: 12345.990,
}); err != nil {
t.Errorf("%s AmendFuturesOrder() error %v", g.Name, err)
}
}
func TestGetMyPersonalTradingHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMyPersonalTradingHistory(context.Background(), settleBTC, "", "", futuresTradablePair, 0, 0, 0); err != nil {
t.Errorf("%s GetMyPersonalTradingHistory() error %v", g.Name, err)
}
}
func TestGetPositionCloseHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetFuturesPositionCloseHistory(context.Background(), settleBTC, futuresTradablePair, 0, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetPositionCloseHistory() error %v", g.Name, err)
}
}
func TestGetFuturesLiquidationHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetFuturesLiquidationHistory(context.Background(), settleBTC, futuresTradablePair, 0, time.Time{}); err != nil {
t.Errorf("%s GetFuturesLiquidationHistory() error %v", g.Name, err)
}
}
func TestCountdownCancelOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CountdownCancelOrders(context.Background(), settleBTC, CountdownParams{
Timeout: 8,
}); err != nil {
t.Errorf("%s CountdownCancelOrders() error %v", g.Name, err)
}
}
func TestCreatePriceTriggeredFuturesOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CreatePriceTriggeredFuturesOrder(context.Background(), settle, &FuturesPriceTriggeredOrderParam{
Initial: FuturesInitial{
Price: 1234.,
Size: 2,
Contract: futuresTradablePair,
},
Trigger: FuturesTrigger{
Rule: 1,
OrderType: "close-short-position",
},
}); err != nil {
t.Errorf("%s CreatePriceTriggeredFuturesOrder() error %v", g.Name, err)
}
if _, err := g.CreatePriceTriggeredFuturesOrder(context.Background(), settle, &FuturesPriceTriggeredOrderParam{
Initial: FuturesInitial{
Price: 1234.,
Size: 1,
Contract: futuresTradablePair,
},
Trigger: FuturesTrigger{
Rule: 1,
},
}); err != nil {
t.Errorf("%s CreatePriceTriggeredFuturesOrder() error %v", g.Name, err)
}
}
func TestListAllFuturesAutoOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.ListAllFuturesAutoOrders(context.Background(), "open", settleBTC, currency.EMPTYPAIR, 0, 0); err != nil {
t.Errorf("%s ListAllFuturesAutoOrders() error %v", g.Name, err)
}
}
func TestCancelAllFuturesOpenOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(futuresTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CancelAllFuturesOpenOrders(context.Background(), settle, futuresTradablePair); err != nil {
t.Errorf("%s CancelAllFuturesOpenOrders() error %v", g.Name, err)
}
}
func TestGetAllDeliveryContracts(t *testing.T) {
t.Parallel()
if _, err := g.GetAllDeliveryContracts(context.Background(), settleUSDT); err != nil {
t.Errorf("%s GetAllDeliveryContracts() error %v", g.Name, err)
}
}
func TestGetSingleDeliveryContracts(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetSingleDeliveryContracts(context.Background(), settle, deliveryFuturesTradablePair); err != nil {
t.Errorf("%s GetSingleDeliveryContracts() error %v", g.Name, err)
}
}
func TestGetDeliveryOrderbook(t *testing.T) {
t.Parallel()
if _, err := g.GetDeliveryOrderbook(context.Background(), settleUSDT, "0", deliveryFuturesTradablePair, 0, false); err != nil {
t.Errorf("%s GetDeliveryOrderbook() error %v", g.Name, err)
}
}
func TestGetDeliveryTradingHistory(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetDeliveryTradingHistory(context.Background(), settle, "", deliveryFuturesTradablePair, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetDeliveryTradingHistory() error %v", g.Name, err)
}
}
func TestGetDeliveryFuturesCandlesticks(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetDeliveryFuturesCandlesticks(context.Background(), settle, deliveryFuturesTradablePair, time.Time{}, time.Time{}, 0, kline.OneWeek); err != nil {
t.Errorf("%s GetFuturesCandlesticks() error %v", g.Name, err)
}
}
func TestGetDeliveryFutureTickers(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetDeliveryFutureTickers(context.Background(), settle, deliveryFuturesTradablePair); err != nil {
t.Errorf("%s GetDeliveryFutureTickers() error %v", g.Name, err)
}
}
func TestGetDeliveryInsuranceBalanceHistory(t *testing.T) {
t.Parallel()
if _, err := g.GetDeliveryInsuranceBalanceHistory(context.Background(), settleBTC, 0); err != nil {
t.Errorf("%s GetDeliveryInsuranceBalanceHistory() error %v", g.Name, err)
}
}
func TestQueryDeliveryFuturesAccounts(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryFuturesAccounts(context.Background(), settleUSDT); err != nil {
t.Errorf("%s QueryDeliveryFuturesAccounts() error %v", g.Name, err)
}
}
func TestGetDeliveryAccountBooks(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetDeliveryAccountBooks(context.Background(), settleUSDT, 0, time.Time{}, time.Now(), "dnw"); err != nil {
t.Errorf("%s GetDeliveryAccountBooks() error %v", g.Name, err)
}
}
func TestGetAllDeliveryPositionsOfUser(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetAllDeliveryPositionsOfUser(context.Background(), settleUSDT); err != nil {
t.Errorf("%s GetAllDeliveryPositionsOfUser() error %v", g.Name, err)
}
}
func TestGetSingleDeliveryPosition(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleDeliveryPosition(context.Background(), settleUSDT, deliveryFuturesTradablePair); err != nil {
t.Errorf("%s GetSingleDeliveryPosition() error %v", g.Name, err)
}
}
func TestUpdateDeliveryPositionMargin(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
settle, err := g.getSettlementFromCurrency(deliveryFuturesTradablePair, false)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateDeliveryPositionMargin(context.Background(), settle, 0.001, deliveryFuturesTradablePair); err != nil {
t.Errorf("%s UpdateDeliveryPositionMargin() error %v", g.Name, err)
}
}
func TestUpdateDeliveryPositionLeverage(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.UpdateDeliveryPositionLeverage(context.Background(), "usdt", deliveryFuturesTradablePair, 0.001); err != nil {
t.Errorf("%s UpdateDeliveryPositionLeverage() error %v", g.Name, err)
}
}
func TestUpdateDeliveryPositionRiskLimit(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.UpdateDeliveryPositionRiskLimit(context.Background(), "usdt", deliveryFuturesTradablePair, 30); err != nil {
t.Errorf("%s UpdateDeliveryPositionRiskLimit() error %v", g.Name, err)
}
}
func TestGetAllOptionsUnderlyings(t *testing.T) {
t.Parallel()
if _, err := g.GetAllOptionsUnderlyings(context.Background()); err != nil {
t.Errorf("%s GetAllOptionsUnderlyings() error %v", g.Name, err)
}
}
func TestGetExpirationTime(t *testing.T) {
t.Parallel()
if _, err := g.GetExpirationTime(context.Background(), "BTC_USDT"); err != nil {
t.Errorf("%s GetExpirationTime() error %v", g.Name, err)
}
}
func TestGetAllContractOfUnderlyingWithinExpiryDate(t *testing.T) {
t.Parallel()
if _, err := g.GetAllContractOfUnderlyingWithinExpiryDate(context.Background(), "BTC_USDT", time.Time{}); err != nil {
t.Errorf("%s GetAllContractOfUnderlyingWithinExpiryDate() error %v", g.Name, err)
}
}
func TestGetOptionsSpecifiedContractDetail(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionsSpecifiedContractDetail(context.Background(), optionsTradablePair); err != nil {
t.Errorf("%s GetOptionsSpecifiedContractDetail() error %v", g.Name, err)
}
}
func TestGetSettlementHistory(t *testing.T) {
t.Parallel()
if _, err := g.GetSettlementHistory(context.Background(), "BTC_USDT", 0, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetSettlementHistory() error %v", g.Name, err)
}
}
func TestGetOptionsSpecifiedSettlementHistory(t *testing.T) {
t.Parallel()
underlying := "BTC_USDT"
optionsSettlement, err := g.GetSettlementHistory(context.Background(), underlying, 0, 1, time.Time{}, time.Time{})
if err != nil {
t.Fatal(err)
}
cp, err := currency.NewPairFromString(optionsSettlement[0].Contract)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetOptionsSpecifiedContractsSettlement(context.Background(), cp, underlying, optionsSettlement[0].Timestamp.Time().Unix()); err != nil {
t.Errorf("%s GetOptionsSpecifiedContractsSettlement() error %s", g.Name, err)
}
}
func TestGetSupportedFlashSwapCurrencies(t *testing.T) {
t.Parallel()
if _, err := g.GetSupportedFlashSwapCurrencies(context.Background()); err != nil {
t.Errorf("%s GetSupportedFlashSwapCurrencies() error %v", g.Name, err)
}
}
const flashSwapOrderResponseJSON = `{"id": 54646, "create_time": 1651116876378, "update_time": 1651116876378, "user_id": 11135567, "sell_currency": "BTC", "sell_amount": "0.01", "buy_currency": "USDT", "buy_amount": "10", "price": "100", "status": 1}`
func TestCreateFlashSwapOrder(t *testing.T) {
t.Parallel()
var response FlashSwapOrderResponse
if err := json.Unmarshal([]byte(flashSwapOrderResponseJSON), &response); err != nil {
t.Errorf("%s error while deserializing to FlashSwapOrderResponse %v", g.Name, err)
}
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CreateFlashSwapOrder(context.Background(), FlashSwapOrderParams{
PreviewID: "1234",
SellCurrency: currency.USDT,
BuyCurrency: currency.BTC,
BuyAmount: 34234,
SellAmount: 34234,
}); err != nil {
t.Errorf("%s CreateFlashSwapOrder() error %v", g.Name, err)
}
}
func TestGetAllFlashSwapOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetAllFlashSwapOrders(context.Background(), 1, currency.EMPTYCODE, currency.EMPTYCODE, true, 0, 0); err != nil {
t.Errorf("%s GetAllFlashSwapOrders() error %v", g.Name, err)
}
}
func TestGetSingleFlashSwapOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleFlashSwapOrder(context.Background(), "1234"); err != nil {
t.Errorf("%s GetSingleFlashSwapOrder() error %v", g.Name, err)
}
}
func TestInitiateFlashSwapOrderReview(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.InitiateFlashSwapOrderReview(context.Background(), FlashSwapOrderParams{
PreviewID: "1234",
SellCurrency: currency.USDT,
BuyCurrency: currency.BTC,
SellAmount: 100,
}); err != nil {
t.Errorf("%s InitiateFlashSwapOrderReview() error %v", g.Name, err)
}
}
func TestGetMyOptionsSettlements(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetMyOptionsSettlements(context.Background(), "BTC_USDT", currency.EMPTYPAIR, 0, 0, time.Time{}); err != nil {
t.Errorf("%s GetMyOptionsSettlements() error %v", g.Name, err)
}
}
func TestGetOptionAccounts(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetOptionAccounts(context.Background()); err != nil {
t.Errorf("%s GetOptionAccounts() error %v", g.Name, err)
}
}
func TestGetAccountChangingHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetAccountChangingHistory(context.Background(), 0, 0, time.Time{}, time.Time{}, ""); err != nil {
t.Errorf("%s GetAccountChangingHistory() error %v", g.Name, err)
}
}
func TestGetUsersPositionSpecifiedUnderlying(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetUsersPositionSpecifiedUnderlying(context.Background(), ""); err != nil {
t.Errorf("%s GetUsersPositionSpecifiedUnderlying() error %v", g.Name, err)
}
}
func TestGetSpecifiedContractPosition(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
_, err := g.GetSpecifiedContractPosition(context.Background(), currency.EMPTYPAIR)
if err != nil && !errors.Is(err, errInvalidOrMissingContractParam) {
t.Errorf("%s GetSpecifiedContractPosition() error expecting %v, but found %v", g.Name, errInvalidOrMissingContractParam, err)
}
_, err = g.GetSpecifiedContractPosition(context.Background(), optionsTradablePair)
if err != nil {
t.Errorf("%s GetSpecifiedContractPosition() error expecting %v, but found %v", g.Name, errInvalidOrMissingContractParam, err)
}
}
func TestGetUsersLiquidationHistoryForSpecifiedUnderlying(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetUsersLiquidationHistoryForSpecifiedUnderlying(context.Background(), "BTC_USDT", currency.EMPTYPAIR); err != nil {
t.Errorf("%s GetUsersLiquidationHistoryForSpecifiedUnderlying() error %v", g.Name, err)
}
}
func TestPlaceOptionOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
_, err := g.PlaceOptionOrder(context.Background(), OptionOrderParam{
Contract: optionsTradablePair.String(),
OrderSize: -1,
Iceberg: 0,
Text: "-",
TimeInForce: "gtc",
Price: 100,
})
if err != nil {
t.Errorf("%s PlaceOptionOrder() error %v", g.Name, err)
}
}
func TestGetOptionFuturesOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetOptionFuturesOrders(context.Background(), currency.EMPTYPAIR, "", "", 0, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetOptionFuturesOrders() error %v", g.Name, err)
}
}
func TestCancelOptionOpenOrders(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelMultipleOptionOpenOrders(context.Background(), optionsTradablePair, "", ""); err != nil {
t.Errorf("%s CancelOptionOpenOrders() error %v", g.Name, err)
}
}
func TestGetSingleOptionOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleOptionOrder(context.Background(), ""); err != nil && !errors.Is(errInvalidOrderID, err) {
t.Errorf("%s GetSingleOptionorder() expecting %v, but found %v", g.Name, errInvalidOrderID, err)
}
if _, err := g.GetSingleOptionOrder(context.Background(), "1234"); err != nil {
t.Errorf("%s GetSingleOptionOrder() error %v", g.Name, err)
}
}
func TestCancelSingleOrder(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelOptionSingleOrder(context.Background(), "1234"); err != nil {
t.Errorf("%s CancelSingleOrder() error %v", g.Name, err)
}
}
func TestGetOptionsPersonalTradingHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetOptionsPersonalTradingHistory(context.Background(), "BTC_USDT", currency.EMPTYPAIR, 0, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetOptionPersonalTradingHistory() error %v", g.Name, err)
}
}
func TestWithdrawCurrency(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
_, err := g.WithdrawCurrency(context.Background(), WithdrawalRequestParam{})
if err != nil && !errors.Is(err, errInvalidAmount) {
t.Errorf("%s WithdrawCurrency() expecting error %v, but found %v", g.Name, errInvalidAmount, err)
}
_, err = g.WithdrawCurrency(context.Background(), WithdrawalRequestParam{
Currency: currency.BTC,
Amount: 0.00000001,
Chain: "BTC",
Address: core.BitcoinDonationAddress,
})
if err != nil {
t.Errorf("%s WithdrawCurrency() expecting error %v, but found %v", g.Name, errInvalidAmount, err)
}
}
func TestCancelWithdrawalWithSpecifiedID(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CancelWithdrawalWithSpecifiedID(context.Background(), "1234567"); err != nil {
t.Errorf("%s CancelWithdrawalWithSpecifiedID() error %v", g.Name, err)
}
}
func TestGetOptionsOrderbook(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionsOrderbook(context.Background(), optionsTradablePair, "0.1", 9, true); err != nil {
t.Errorf("%s GetOptionsFuturesOrderbooks() error %v", g.Name, err)
}
}
func TestGetOptionsTickers(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionsTickers(context.Background(), "BTC_USDT"); err != nil {
t.Errorf("%s GetOptionsTickers() error %v", g.Name, err)
}
}
func TestGetOptionUnderlyingTickers(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionUnderlyingTickers(context.Background(), "BTC_USDT"); err != nil {
t.Errorf("%s GetOptionUnderlyingTickers() error %v", g.Name, err)
}
}
func TestGetOptionFuturesCandlesticks(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionFuturesCandlesticks(context.Background(), optionsTradablePair, 0, time.Now().Add(-time.Hour*10), time.Time{}, kline.ThirtyMin); err != nil {
t.Error(err)
}
}
func TestGetOptionFuturesMarkPriceCandlesticks(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionFuturesMarkPriceCandlesticks(context.Background(), "BTC_USDT", 0, time.Time{}, time.Time{}, kline.OneMonth); err != nil {
t.Errorf("%s GetOptionFuturesMarkPriceCandlesticks() error %v", g.Name, err)
}
}
func TestGetOptionsTradeHistory(t *testing.T) {
t.Parallel()
if _, err := g.GetOptionsTradeHistory(context.Background(), optionsTradablePair, "C", 0, 0, time.Time{}, time.Time{}); err != nil {
t.Errorf("%s GetOptionsTradeHistory() error %v", g.Name, err)
}
}
// Sub-account endpoints
func TestCreateNewSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CreateNewSubAccount(context.Background(), SubAccountParams{
LoginName: "Sub_Account_for_testing",
}); err != nil {
t.Errorf("%s CreateNewSubAccount() error %v", g.Name, err)
}
}
func TestGetSubAccounts(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSubAccounts(context.Background()); err != nil {
t.Errorf("%s GetSubAccounts() error %v", g.Name, err)
}
}
func TestGetSingleSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetSingleSubAccount(context.Background(), "123423"); err != nil {
t.Errorf("%s GetSingleSubAccount() error %v", g.Name, err)
}
}
// Wrapper test functions
func TestFetchTradablePairs(t *testing.T) {
t.Parallel()
_, err := g.FetchTradablePairs(context.Background(), asset.DeliveryFutures)
if err != nil {
t.Errorf("%s FetchTradablePairs() error %v", g.Name, err)
}
if _, err = g.FetchTradablePairs(context.Background(), asset.Options); err != nil {
t.Errorf("%s FetchTradablePairs() error %v", g.Name, err)
}
_, err = g.FetchTradablePairs(context.Background(), asset.Futures)
if err != nil {
t.Errorf("%s FetchTradablePairs() error %v", g.Name, err)
}
if _, err = g.FetchTradablePairs(context.Background(), asset.Margin); err != nil {
t.Errorf("%s FetchTradablePairs() error %v", g.Name, err)
}
_, err = g.FetchTradablePairs(context.Background(), asset.CrossMargin)
if err != nil {
t.Errorf("%s FetchTradablePairs() error %v", g.Name, err)
}
_, err = g.FetchTradablePairs(context.Background(), asset.Spot)
if err != nil {
t.Errorf("%s FetchTradablePairs() error %v", g.Name, err)
}
}
func TestUpdateTradablePairs(t *testing.T) {
t.Parallel()
if err := g.UpdateTradablePairs(context.Background(), true); err != nil {
t.Errorf("%s UpdateTradablePairs() error %v", g.Name, err)
}
}
func TestUpdateTickers(t *testing.T) {
t.Parallel()
if err := g.UpdateTickers(context.Background(), asset.DeliveryFutures); err != nil {
t.Errorf("%s UpdateTickers() error %v", g.Name, err)
}
if err := g.UpdateTickers(context.Background(), asset.Futures); err != nil {
t.Errorf("%s UpdateTickers() error %v", g.Name, err)
}
if err := g.UpdateTickers(context.Background(), asset.Spot); err != nil {
t.Errorf("%s UpdateTickers() error %v", g.Name, err)
}
if err := g.UpdateTickers(context.Background(), asset.Options); err != nil {
t.Errorf("%s UpdateTickers() error %v", g.Name, err)
}
if err := g.UpdateTickers(context.Background(), asset.CrossMargin); err != nil {
t.Errorf("%s UpdateTickers() error %v", g.Name, err)
}
if err := g.UpdateTickers(context.Background(), asset.Margin); err != nil {
t.Errorf("%s UpdateTickers() error %v", g.Name, err)
}
}
func TestUpdateOrderbook(t *testing.T) {
t.Parallel()
_, err := g.UpdateOrderbook(context.Background(), spotTradablePair, asset.Spot)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
_, err = g.UpdateOrderbook(context.Background(), marginTradablePair, asset.Margin)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
_, err = g.UpdateOrderbook(context.Background(), crossMarginTradablePair, asset.CrossMargin)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
_, err = g.UpdateOrderbook(context.Background(), futuresTradablePair, asset.Futures)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
if _, err = g.UpdateOrderbook(context.Background(), deliveryFuturesTradablePair, asset.DeliveryFutures); err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
if _, err = g.UpdateOrderbook(context.Background(), optionsTradablePair, asset.Options); err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
}
func TestGetWithdrawalsHistory(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if _, err := g.GetWithdrawalsHistory(context.Background(), currency.BTC, asset.Empty); err != nil {
t.Errorf("%s GetWithdrawalsHistory() error %v", g.Name, err)
}
}
func TestGetRecentTrades(t *testing.T) {
t.Parallel()
_, err := g.GetRecentTrades(context.Background(), spotTradablePair, asset.Spot)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), marginTradablePair, asset.Margin)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), crossMarginTradablePair, asset.CrossMargin)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), deliveryFuturesTradablePair, asset.DeliveryFutures)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), futuresTradablePair, asset.Futures)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), optionsTradablePair, asset.Options)
if err != nil {
t.Error(err)
}
}
func TestSubmitOrder(t *testing.T) {
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
_, err := g.SubmitOrder(context.Background(), &order.Submit{
Exchange: g.Name,
Pair: crossMarginTradablePair,
Side: order.Buy,
Type: order.Limit,
Price: 1,
Amount: 1,
AssetType: asset.CrossMargin,
})
if err != nil {
t.Errorf("Order failed to be placed: %v", err)
}
_, err = g.SubmitOrder(context.Background(), &order.Submit{
Exchange: g.Name,
Pair: spotTradablePair,
Side: order.Buy,
Type: order.Limit,
Price: 1,
Amount: 1,
AssetType: asset.Spot,
})
if err != nil {
t.Errorf("Order failed to be placed: %v", err)
}
_, err = g.SubmitOrder(context.Background(), &order.Submit{
Exchange: g.Name,
Pair: optionsTradablePair,
Side: order.Buy,
Type: order.Limit,
Price: 1,
Amount: 1,
AssetType: asset.Options,
})
if err != nil {
t.Errorf("Order failed to be placed: %v", err)
}
_, err = g.SubmitOrder(context.Background(), &order.Submit{
Exchange: g.Name,
Pair: deliveryFuturesTradablePair,
Side: order.Buy,
Type: order.Limit,
Price: 1,
Amount: 1,
AssetType: asset.DeliveryFutures,
})
if err != nil {
t.Errorf("Order failed to be placed: %v", err)
}
_, err = g.SubmitOrder(context.Background(), &order.Submit{
Exchange: g.Name,
Pair: futuresTradablePair,
Side: order.Buy,
Type: order.Limit,
Price: 1,
Amount: 1,
AssetType: asset.Futures,
})
if err != nil {
t.Errorf("Order failed to be placed: %v", err)
}
_, err = g.SubmitOrder(context.Background(), &order.Submit{
Exchange: g.Name,
Pair: marginTradablePair,
Side: order.Buy,
Type: order.Limit,
Price: 1,
Amount: 1,
AssetType: asset.Margin,
})
if err != nil {
t.Errorf("Order failed to be placed: %v", err)
}
}
func TestCancelExchangeOrder(t *testing.T) {
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
var orderCancellation = &order.Cancel{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: currency.NewPair(currency.LTC, currency.BTC),
AssetType: asset.Spot,
}
err := g.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
orderCancellation.AssetType = asset.Margin
err = g.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
orderCancellation.AssetType = asset.CrossMargin
err = g.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
orderCancellation.AssetType = asset.Options
err = g.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
orderCancellation.AssetType = asset.Futures
err = g.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
orderCancellation.AssetType = asset.DeliveryFutures
err = g.CancelOrder(context.Background(), orderCancellation)
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
}
func TestCancelBatchOrders(t *testing.T) {
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
_, err := g.CancelBatchOrders(context.Background(), []order.Cancel{
{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: spotTradablePair,
AssetType: asset.Spot,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: spotTradablePair,
AssetType: asset.Spot,
}})
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
_, err = g.CancelBatchOrders(context.Background(), []order.Cancel{
{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: futuresTradablePair,
AssetType: asset.Futures,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: futuresTradablePair,
AssetType: asset.Futures,
}})
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
_, err = g.CancelBatchOrders(context.Background(), []order.Cancel{
{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: deliveryFuturesTradablePair,
AssetType: asset.DeliveryFutures,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: deliveryFuturesTradablePair,
AssetType: asset.DeliveryFutures,
}})
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
_, err = g.CancelBatchOrders(context.Background(), []order.Cancel{
{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: optionsTradablePair,
AssetType: asset.Options,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: optionsTradablePair,
AssetType: asset.Options,
}})
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
_, err = g.CancelBatchOrders(context.Background(), []order.Cancel{
{
OrderID: "1",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: marginTradablePair,
AssetType: asset.Margin,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: marginTradablePair,
AssetType: asset.Margin,
}})
if err != nil {
t.Errorf("%s CancelOrder error: %v", g.Name, err)
}
}
func TestGetDepositAddress(t *testing.T) {
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
chains, err := g.GetAvailableTransferChains(context.Background(), currency.BTC)
if err != nil {
t.Fatal(err)
}
for i := range chains {
_, err = g.GetDepositAddress(context.Background(), currency.BTC, "", chains[i])
if err != nil {
t.Error("Test Fail - GetDepositAddress error", err)
}
}
}
func TestGetActiveOrders(t *testing.T) {
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
enabledPairs, err := g.GetEnabledPairs(asset.Spot)
if err != nil {
t.Error(err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: enabledPairs[:2],
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.Spot,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
cp, err := currency.NewPairFromString("BTC_USDT")
if err != nil {
t.Error(err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: []currency.Pair{cp},
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.Futures,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: enabledPairs[:2],
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.Margin,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: enabledPairs[:2],
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.CrossMargin,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: currency.Pairs{futuresTradablePair},
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.Futures,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: currency.Pairs{deliveryFuturesTradablePair},
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.DeliveryFutures,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
_, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: currency.Pairs{optionsTradablePair},
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.Options,
})
if err != nil {
t.Errorf(" %s GetActiveOrders() error: %v", g.Name, err)
}
if _, err = g.GetActiveOrders(context.Background(), &order.MultiOrderRequest{
Pairs: currency.Pairs{},
Type: order.AnyType,
Side: order.AnySide,
AssetType: asset.DeliveryFutures,
}); !errors.Is(err, currency.ErrCurrencyPairsEmpty) {
t.Errorf("%s GetActiveOrders() expecting error %v, but found %v", g.Name, currency.ErrCurrencyPairsEmpty, err)
}
}
func TestGetOrderHistory(t *testing.T) {
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
var multiOrderRequest = order.MultiOrderRequest{
Type: order.AnyType,
AssetType: asset.Spot,
Side: order.Buy,
}
enabledPairs, err := g.GetEnabledPairs(asset.Spot)
if err != nil {
t.Fatal(err)
}
multiOrderRequest.Pairs = enabledPairs[:3]
_, err = g.GetOrderHistory(context.Background(), &multiOrderRequest)
if err != nil {
t.Errorf("%s GetOrderhistory() error: %v", g.Name, err)
}
multiOrderRequest.AssetType = asset.Futures
multiOrderRequest.Pairs, err = g.GetEnabledPairs(asset.Futures)
if err != nil {
t.Fatal(err)
}
multiOrderRequest.Pairs = multiOrderRequest.Pairs[len(multiOrderRequest.Pairs)-4:]
_, err = g.GetOrderHistory(context.Background(), &multiOrderRequest)
if err != nil {
t.Errorf("%s GetOrderhistory() error: %v", g.Name, err)
}
multiOrderRequest.AssetType = asset.DeliveryFutures
multiOrderRequest.Pairs, err = g.GetEnabledPairs(asset.DeliveryFutures)
if err != nil {
t.Fatal(err)
}
_, err = g.GetOrderHistory(context.Background(), &multiOrderRequest)
if err != nil {
t.Errorf("%s GetOrderhistory() error: %v", g.Name, err)
}
multiOrderRequest.AssetType = asset.Options
multiOrderRequest.Pairs, err = g.GetEnabledPairs(asset.Options)
if err != nil {
t.Fatal(err)
}
_, err = g.GetOrderHistory(context.Background(), &multiOrderRequest)
if err != nil {
t.Errorf("%s GetOrderhistory() error: %v", g.Name, err)
}
}
func TestGetHistoricCandles(t *testing.T) {
t.Parallel()
startTime := time.Now().Add(-time.Hour * 10)
if _, err := g.GetHistoricCandles(context.Background(), spotTradablePair, asset.Spot, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), marginTradablePair, asset.Margin, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), crossMarginTradablePair, asset.CrossMargin, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), futuresTradablePair, asset.Futures, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), deliveryFuturesTradablePair, asset.DeliveryFutures, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), optionsTradablePair, asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) {
t.Errorf("%s GetHistoricCandles() expecting: %v, but found %v", g.Name, asset.ErrNotSupported, err)
}
if _, err := g.GetHistoricCandles(context.Background(), optionsTradablePair, asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) {
t.Errorf("%s GetHistoricCandles() expecting: %v, but found %v", g.Name, asset.ErrNotSupported, err)
}
}
func TestGetHistoricCandlesExtended(t *testing.T) {
t.Parallel()
startTime := time.Now().Add(-time.Hour * 5)
_, err := g.GetHistoricCandlesExtended(context.Background(),
spotTradablePair, asset.Spot, kline.OneMin, startTime, time.Now())
if err != nil {
t.Fatal(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(),
marginTradablePair, asset.Margin, kline.OneMin, startTime, time.Now())
if err != nil {
t.Fatal(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(),
deliveryFuturesTradablePair, asset.DeliveryFutures, kline.OneMin, time.Now().Add(-time.Hour*5), time.Now())
if err != nil {
t.Error(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(), futuresTradablePair, asset.Futures, kline.OneMin, startTime, time.Now())
if err != nil {
t.Error(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(),
crossMarginTradablePair, asset.CrossMargin, kline.OneMin, startTime, time.Now())
if err != nil {
t.Error(err)
}
if _, err = g.GetHistoricCandlesExtended(context.Background(), optionsTradablePair, asset.Options, kline.OneDay, startTime, time.Now()); !errors.Is(err, asset.ErrNotSupported) {
t.Errorf("%s GetHistoricCandlesExtended() expecting: %v, but found %v", g.Name, asset.ErrNotSupported, err)
}
}
func TestGetAvailableTransferTrains(t *testing.T) {
t.Parallel()
_, err := g.GetAvailableTransferChains(context.Background(), currency.USDT)
if err != nil {
t.Error(err)
}
}
func TestGetUnderlyingFromCurrencyPair(t *testing.T) {
t.Parallel()
if uly, err := g.GetUnderlyingFromCurrencyPair(currency.Pair{Delimiter: currency.UnderscoreDelimiter, Base: currency.BTC, Quote: currency.NewCode("USDT_LLK")}); err != nil {
t.Error(err)
} else if !uly.Equal(currency.NewPair(currency.BTC, currency.USDT)) {
t.Error("unexpected underlying")
}
}
const wsTickerPushDataJSON = `{"time": 1606291803, "channel": "spot.tickers", "event": "update", "result": { "currency_pair": "BTC_USDT", "last": "19106.55", "lowest_ask": "19108.71", "highest_bid": "19106.55", "change_percentage": "3.66", "base_volume": "2811.3042155865", "quote_volume": "53441606.52411221454674732293", "high_24h": "19417.74", "low_24h": "18434.21" }}`
func TestWsTickerPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsTickerPushDataJSON)); err != nil {
t.Errorf("%s websocket ticker push data error: %v", g.Name, err)
}
}
const wsTradePushDataJSON = `{ "time": 1606292218, "channel": "spot.trades", "event": "update", "result": { "id": 309143071, "create_time": 1606292218, "create_time_ms": "1606292218213.4578", "side": "sell", "currency_pair": "BTC_USDT", "amount": "16.4700000000", "price": "0.4705000000"}}`
func TestWsTradePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsTradePushDataJSON)); err != nil {
t.Errorf("%s websocket trade push data error: %v", g.Name, err)
}
}
const wsCandlestickPushDataJSON = `{"time": 1606292600, "channel": "spot.candlesticks", "event": "update", "result": { "t": "1606292580", "v": "2362.32035", "c": "19128.1", "h": "19128.1", "l": "19128.1", "o": "19128.1","n": "1m_BTC_USDT"}}`
func TestWsCandlestickPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsCandlestickPushDataJSON)); err != nil {
t.Errorf("%s websocket candlestick push data error: %v", g.Name, err)
}
}
const wsOrderbookTickerJSON = `{"time": 1606293275, "channel": "spot.book_ticker", "event": "update", "result": { "t": 1606293275123, "u": 48733182, "s": "BTC_USDT", "b": "19177.79", "B": "0.0003341504", "a": "19179.38", "A": "0.09" }}`
func TestWsOrderbookTickerPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsOrderbookTickerJSON)); err != nil {
t.Errorf("%s websocket orderbook push data error: %v", g.Name, err)
}
}
const (
wsOrderbookUpdatePushDataJSON = `{"time": 1606294781, "channel": "spot.order_book_update", "event": "update", "result": { "t": 1606294781123, "e": "depthUpdate", "E": 1606294781,"s": "BTC_USDT","U": 48776301,"u": 48776306,"b": [["19137.74","0.0001"],["19088.37","0"]],"a": [["19137.75","0.6135"]] }}`
wsOrderbookSnapshotPushDataJSON = `{"time":1606295412,"channel": "spot.order_book", "event": "update", "result": { "t": 1606295412123, "lastUpdateId": 48791820, "s": "BTC_USDT", "bids": [ [ "19079.55", "0.0195" ], [ "19079.07", "0.7341"],["19076.23", "0.00011808" ], [ "19073.9", "0.105" ], [ "19068.83", "0.1009" ] ], "asks": [ [ "19080.24", "0.1638" ], [ "19080.91","0.1366"],["19080.92","0.01"],["19081.29","0.01"],["19083.8","0.097"]]}}`
)
func TestWsOrderbookSnapshotPushData(t *testing.T) {
t.Parallel()
err := g.wsHandleData([]byte(wsOrderbookSnapshotPushDataJSON))
if err != nil {
t.Errorf("%s websocket orderbook snapshot push data error: %v", g.Name, err)
}
if err = g.wsHandleData([]byte(wsOrderbookUpdatePushDataJSON)); err != nil {
t.Errorf("%s websocket orderbook update push data error: %v", g.Name, err)
}
}
const wsSpotOrderPushDataJSON = `{"time": 1605175506, "channel": "spot.orders", "event": "update", "result": [ { "id": "30784435", "user": 123456, "text": "t-abc", "create_time": "1605175506", "create_time_ms": "1605175506123", "update_time": "1605175506", "update_time_ms": "1605175506123", "event": "put", "currency_pair": "BTC_USDT", "type": "limit", "account": "spot", "side": "sell", "amount": "1", "price": "10001", "time_in_force": "gtc", "left": "1", "filled_total": "0", "fee": "0", "fee_currency": "USDT", "point_fee": "0", "gt_fee": "0", "gt_discount": true, "rebated_fee": "0", "rebated_fee_currency": "USDT"} ]}`
func TestWsPushOrders(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsSpotOrderPushDataJSON)); err != nil {
t.Errorf("%s websocket orders push data error: %v", g.Name, err)
}
}
const wsUserTradePushDataJSON = `{"time": 1605176741, "channel": "spot.usertrades", "event": "update", "result": [ { "id": 5736713, "user_id": 1000001, "order_id": "30784428", "currency_pair": "BTC_USDT", "create_time": 1605176741, "create_time_ms": "1605176741123.456", "side": "sell", "amount": "1.00000000", "role": "taker", "price": "10000.00000000", "fee": "0.00200000000000", "point_fee": "0", "gt_fee": "0", "text": "apiv4" } ]}`
func TestWsUserTradesPushDataJSON(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsUserTradePushDataJSON)); err != nil {
t.Errorf("%s websocket users trade push data error: %v", g.Name, err)
}
}
const wsBalancesPushDataJSON = `{"time": 1605248616, "channel": "spot.balances", "event": "update", "result": [ { "timestamp": "1605248616", "timestamp_ms": "1605248616123", "user": "1000001", "currency": "USDT", "change": "100", "total": "1032951.325075926", "available": "1022943.325075926"} ]}`
func TestBalancesPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsBalancesPushDataJSON)); err != nil {
t.Errorf("%s websocket balances push data error: %v", g.Name, err)
}
}
const wsMarginBalancePushDataJSON = `{"time": 1605248616, "channel": "spot.funding_balances", "event": "update", "result": [ {"timestamp": "1605248616","timestamp_ms": "1605248616123","user": "1000001","currency": "USDT","change": "100","freeze": "100","lent": "0"} ]}`
func TestMarginBalancePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsMarginBalancePushDataJSON)); err != nil {
t.Errorf("%s websocket margin balance push data error: %v", g.Name, err)
}
}
const wsCrossMarginBalancePushDataJSON = `{"time": 1605248616,"channel": "spot.cross_balances","event": "update", "result": [{"timestamp": "1605248616","timestamp_ms": "1605248616123","user": "1000001","currency": "USDT", "change": "100","total": "1032951.325075926","available": "1022943.325075926"}]}`
func TestCrossMarginBalancePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsCrossMarginBalancePushDataJSON)); err != nil {
t.Errorf("%s websocket cross margin balance push data error: %v", g.Name, err)
}
}
const wsCrossMarginBalanceLoan = `{ "time":1658289372, "channel":"spot.cross_loan", "event":"update", "result":{ "timestamp":1658289372338, "user":"1000001", "currency":"BTC", "change":"0.01", "total":"4.992341029566", "available":"0.078054772536", "borrowed":"0.01", "interest":"0.00001375" }}`
func TestCrossMarginBalanceLoan(t *testing.T) {
t.Parallel()
if err := g.wsHandleData([]byte(wsCrossMarginBalanceLoan)); err != nil {
t.Errorf("%s websocket cross margin loan push data error: %v", g.Name, err)
}
}
const wsFuturesTickerPushDataJSON = `{"time": 1541659086, "channel": "futures.tickers","event": "update", "error": null, "result": [ { "contract": "BTC_USD","last": "118.4","change_percentage": "0.77","funding_rate": "-0.000114","funding_rate_indicative": "0.01875","mark_price": "118.35","index_price": "118.36","total_size": "73648","volume_24h": "745487577","volume_24h_btc": "117", "volume_24h_usd": "419950", "quanto_base_rate": "", "volume_24h_quote": "1665006","volume_24h_settle": "178","volume_24h_base": "5526","low_24h": "99.2","high_24h": "132.5"} ]}`
func TestFuturesTicker(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesTickerPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket push data error: %v", g.Name, err)
}
}
const wsFuturesTradesPushDataJSON = `{"channel": "futures.trades","event": "update", "time": 1541503698, "result": [{"size": -108,"id": 27753479,"create_time": 1545136464,"create_time_ms": 1545136464123,"price": "96.4","contract": "BTC_USD"}]}`
func TestFuturesTrades(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesTradesPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket push data error: %v", g.Name, err)
}
}
const (
wsFuturesOrderbookTickerJSON = `{ "time": 1615366379, "channel": "futures.book_ticker", "event": "update", "error": null, "result": { "t": 1615366379123, "u": 2517661076, "s": "BTC_USD", "b": "54696.6", "B": 37000, "a": "54696.7", "A": 47061 }}`
)
func TestOrderbookData(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesOrderbookTickerJSON), asset.Futures); err != nil {
t.Errorf("%s websocket orderbook ticker push data error: %v", g.Name, err)
}
}
const wsFuturesOrderPushDataJSON = `{ "channel": "futures.orders", "event": "update", "time": 1541505434, "result": [ { "contract": "BTC_USD", "create_time": 1628736847, "create_time_ms": 1628736847325, "fill_price": 40000.4, "finish_as": "filled", "finish_time": 1628736848, "finish_time_ms": 1628736848321, "iceberg": 0, "id": 4872460, "is_close": false, "is_liq": false, "is_reduce_only": false, "left": 0, "mkfr": -0.00025, "price": 40000.4, "refr": 0, "refu": 0, "size": 1, "status": "finished", "text": "-", "tif": "gtc", "tkfr": 0.0005, "user": "110xxxxx" } ]}`
func TestFuturesOrderPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesOrderPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures order push data error: %v", g.Name, err)
}
}
const wsFuturesUsertradesPushDataJSON = `{"time": 1543205083, "channel": "futures.usertrades","event": "update", "error": null, "result": [{"id": "3335259","create_time": 1628736848,"create_time_ms": 1628736848321,"contract": "BTC_USD","order_id": "4872460","size": 1,"price": "40000.4","role": "maker","text": "api","fee": 0.0009290592,"point_fee": 0}]}`
func TestFuturesUserTrades(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesUsertradesPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures user trades push data error: %v", g.Name, err)
}
}
const wsFuturesLiquidationPushDataJSON = `{"channel": "futures.liquidates", "event": "update", "time": 1541505434, "result": [{"entry_price": 209,"fill_price": 215.1,"left": 0,"leverage": 0.0,"liq_price": 213,"margin": 0.007816722941,"mark_price": 213,"order_id": 4093362,"order_price": 215.1,"size": -124,"time": 1541486601,"time_ms": 1541486601123,"contract": "BTC_USD","user": "1040xxxx"} ]}`
func TestFuturesLiquidationPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesLiquidationPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures liquidation push data error: %v", g.Name, err)
}
}
const wsFuturesAutoDelevergesNotification = `{"channel": "futures.auto_deleverages", "event": "update", "time": 1541505434, "result": [{"entry_price": 209,"fill_price": 215.1,"position_size": 10,"trade_size": 10,"time": 1541486601,"time_ms": 1541486601123,"contract": "BTC_USD","user": "1040"} ]}`
func TestFuturesAutoDeleverges(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesAutoDelevergesNotification), asset.Futures); err != nil {
t.Errorf("%s websocket futures auto deleverge push data error: %v", g.Name, err)
}
}
const wsFuturesPositionClosePushDataJSON = ` {"channel": "futures.position_closes", "event": "update", "time": 1541505434, "result": [ { "contract": "BTC_USD", "pnl": -0.000624354791, "side": "long", "text": "web", "time": 1547198562, "time_ms": 1547198562123, "user": "211xxxx" } ]}`
func TestPositionClosePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesPositionClosePushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures position close push data error: %v", g.Name, err)
}
}
const wsFuturesBalanceNotificationPushDataJSON = `{"channel": "futures.balances", "event": "update", "time": 1541505434, "result": [ { "balance": 9.998739899488, "change": -0.000002074115, "text": "BTC_USD:3914424", "time": 1547199246, "time_ms": 1547199246123, "type": "fee", "user": "211xxx" } ]}`
func TestFuturesBalanceNotification(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesBalanceNotificationPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures balance notification push data error: %v", g.Name, err)
}
}
const wsFuturesReduceRiskLimitNotificationPushDataJSON = `{"time": 1551858330, "channel": "futures.reduce_risk_limits", "event": "update", "error": null, "result": [ { "cancel_orders": 0, "contract": "ETH_USD", "leverage_max": 10, "liq_price": 136.53, "maintenance_rate": 0.09, "risk_limit": 450, "time": 1551858330, "time_ms": 1551858330123, "user": "20011" } ]}`
func TestFuturesReduceRiskLimitPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesReduceRiskLimitNotificationPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures reduce risk limit notification push data error: %v", g.Name, err)
}
}
const wsFuturesPositionsNotificationPushDataJSON = `{"time": 1588212926,"channel": "futures.positions", "event": "update", "error": null, "result": [ { "contract": "BTC_USD", "cross_leverage_limit": 0, "entry_price": 40000.36666661111, "history_pnl": -0.000108569505, "history_point": 0, "last_close_pnl": -0.000050123368,"leverage": 0,"leverage_max": 100,"liq_price": 0.1,"maintenance_rate": 0.005,"margin": 49.999890611186,"mode": "single","realised_pnl": -1.25e-8,"realised_point": 0,"risk_limit": 100,"size": 3,"time": 1628736848,"time_ms": 1628736848321,"user": "110xxxxx"}]}`
func TestFuturesPositionsNotification(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesPositionsNotificationPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures positions change notification push data error: %v", g.Name, err)
}
}
const wsFuturesAutoOrdersPushDataJSON = `{"time": 1596798126,"channel": "futures.autoorders", "event": "update", "error": null, "result": [ { "user": 123456, "trigger": { "strategy_type": 0, "price_type": 0, "price": "10000", "rule": 2, "expiration": 86400 }, "initial": { "contract": "BTC_USDT", "size": 10, "price": "10000", "tif": "gtc", "text": "web", "iceberg": 0, "is_close": false, "is_reduce_only": false }, "id": 9256, "trade_id": 0, "status": "open", "reason": "", "create_time": 1596798126, "name": "price_autoorders", "is_stop_order": false, "stop_trigger": { "rule": 0, "trigger_price": "", "order_price": "" } } ]}`
func TestFuturesAutoOrderPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleFuturesData([]byte(wsFuturesAutoOrdersPushDataJSON), asset.Futures); err != nil {
t.Errorf("%s websocket futures auto orders push data error: %v", g.Name, err)
}
}
// ******************************************** Options web-socket unit test funcs ********************
const optionsContractTickerPushDataJSON = `{"time": 1630576352, "channel": "options.contract_tickers", "event": "update", "result": { "name": "BTC_USDT-20211231-59800-P", "last_price": "11349.5", "mark_price": "11170.19", "index_price": "", "position_size": 993, "bid1_price": "10611.7", "bid1_size": 100, "ask1_price": "11728.7", "ask1_size": 100, "vega": "34.8731", "theta": "-72.80588", "rho": "-28.53331", "gamma": "0.00003", "delta": "-0.78311", "mark_iv": "0.86695", "bid_iv": "0.65481", "ask_iv": "0.88145", "leverage": "3.5541112718136" }}`
func TestOptionsContractTickerPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsContractTickerPushDataJSON)); err != nil {
t.Errorf("%s websocket options contract ticker push data failed with error %v", g.Name, err)
}
}
const optionsUnderlyingTickerPushDataJSON = `{"time": 1630576352, "channel": "options.ul_tickers", "event": "update", "result": { "trade_put": 800, "trade_call": 41700, "index_price": "50695.43", "name": "BTC_USDT" }}`
func TestOptionsUnderlyingTickerPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsUnderlyingTickerPushDataJSON)); err != nil {
t.Errorf("%s websocket options underlying ticker push data error: %v", g.Name, err)
}
}
const optionsContractTradesPushDataJSON = `{"time": 1630576356, "channel": "options.trades", "event": "update", "result": [ { "contract": "BTC_USDT-20211231-59800-C", "create_time": 1639144526, "id": 12279, "price": 997.8, "size": -100, "create_time_ms": 1639144526597, "underlying": "BTC_USDT" } ]}`
func TestOptionsContractTradesPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsContractTradesPushDataJSON)); err != nil {
t.Errorf("%s websocket contract trades push data error: %v", g.Name, err)
}
}
const optionsUnderlyingTradesPushDataJSON = `{"time": 1630576356, "channel": "options.ul_trades", "event": "update", "result": [{"contract": "BTC_USDT-20211231-59800-C","create_time": 1639144526,"id": 12279,"price": 997.8,"size": -100,"create_time_ms": 1639144526597,"underlying": "BTC_USDT","is_call": true} ]}`
func TestOptionsUnderlyingTradesPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsUnderlyingTradesPushDataJSON)); err != nil {
t.Errorf("%s websocket underlying trades push data error: %v", g.Name, err)
}
}
const optionsUnderlyingPricePushDataJSON = `{ "time": 1630576356, "channel": "options.ul_price", "event": "update", "result": { "underlying": "BTC_USDT", "price": 49653.24,"time": 1639143988,"time_ms": 1639143988931 }}`
func TestOptionsUnderlyingPricePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsUnderlyingPricePushDataJSON)); err != nil {
t.Errorf("%s websocket underlying price push data error: %v", g.Name, err)
}
}
const optionsMarkPricePushDataJSON = `{ "time": 1630576356, "channel": "options.mark_price", "event": "update", "result": { "contract": "BTC_USDT-20211231-59800-P", "price": 11021.27, "time": 1639143401, "time_ms": 1639143401676 }}`
func TestOptionsMarkPricePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsMarkPricePushDataJSON)); err != nil {
t.Errorf("%s websocket mark price push data error: %v", g.Name, err)
}
}
const optionsSettlementsPushDataJSON = `{ "time": 1630576356, "channel": "options.settlements", "event": "update", "result": { "contract": "BTC_USDT-20211130-55000-P", "orderbook_id": 2, "position_size": 1, "profit": 0.5, "settle_price": 70000, "strike_price": 65000, "tag": "WEEK", "trade_id": 1, "trade_size": 1, "underlying": "BTC_USDT", "time": 1639051907, "time_ms": 1639051907000 }}`
func TestSettlementsPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsSettlementsPushDataJSON)); err != nil {
t.Errorf("%s websocket options settlements push data error: %v", g.Name, err)
}
}
const optionsContractPushDataJSON = `{"time": 1630576356, "channel": "options.contracts", "event": "update", "result": { "contract": "BTC_USDT-20211130-50000-P", "create_time": 1637917026, "expiration_time": 1638230400, "init_margin_high": 0.15, "init_margin_low": 0.1, "is_call": false, "maint_margin_base": 0.075, "maker_fee_rate": 0.0004, "mark_price_round": 0.1, "min_balance_short": 0.5, "min_order_margin": 0.1, "multiplier": 0.0001, "order_price_deviate": 0, "order_price_round": 0.1, "order_size_max": 1, "order_size_min": 10, "orders_limit": 100000, "ref_discount_rate": 0.1, "ref_rebate_rate": 0, "strike_price": 50000, "tag": "WEEK", "taker_fee_rate": 0.0004, "underlying": "BTC_USDT", "time": 1639051907, "time_ms": 1639051907000 }}`
func TestOptionsContractPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsContractPushDataJSON)); err != nil {
t.Errorf("%s websocket options contracts push data error: %v", g.Name, err)
}
}
const (
optionsContractCandlesticksPushDataJSON = `{ "time": 1630650451, "channel": "options.contract_candlesticks", "event": "update", "result": [ { "t": 1639039260, "v": 100, "c": "1041.4", "h": "1041.4", "l": "1041.4", "o": "1041.4", "a": "0", "n": "10s_BTC_USDT-20211231-59800-C" } ]}`
optionsUnderlyingCandlesticksPushDataJSON = `{ "time": 1630650451, "channel": "options.ul_candlesticks", "event": "update", "result": [ { "t": 1639039260, "v": 100, "c": "1041.4", "h": "1041.4", "l": "1041.4", "o": "1041.4", "a": "0", "n": "10s_BTC_USDT" } ]}`
)
func TestOptionsCandlesticksPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsContractCandlesticksPushDataJSON)); err != nil {
t.Errorf("%s websocket options contracts candlestick push data error: %v", g.Name, err)
}
if err := g.wsHandleOptionsData([]byte(optionsUnderlyingCandlesticksPushDataJSON)); err != nil {
t.Errorf("%s websocket options underlying candlestick push data error: %v", g.Name, err)
}
}
const (
optionsOrderbookTickerPushDataJSON = `{ "time": 1630650452, "channel": "options.book_ticker", "event": "update", "result": { "t": 1615366379123, "u": 2517661076, "s": "BTC_USDT-20211130-50000-C", "b": "54696.6", "B": 37000, "a": "54696.7", "A": 47061 }}`
optionsOrderbookUpdatePushDataJSON = `{ "time": 1630650445, "channel": "options.order_book_update", "event": "update", "result": { "t": 1615366381417, "s": "BTC_USDT-20211130-50000-C", "U": 2517661101, "u": 2517661113, "b": [ { "p": "54672.1", "s": 95 }, { "p": "54664.5", "s": 58794 } ], "a": [ { "p": "54743.6", "s": 95 }, { "p": "54742", "s": 95 } ] }}`
optionsOrderbookSnapshotPushDataJSON = `{ "time": 1630650445, "channel": "options.order_book", "event": "all", "result": { "t": 1541500161123, "contract": "BTC_USDT-20211130-50000-C", "id": 93973511, "asks": [ { "p": "97.1", "s": 2245 }, { "p": "97.2", "s": 2245 } ], "bids": [ { "p": "97.2", "s": 2245 }, { "p": "97.1", "s": 2245 } ] }}`
optionsOrderbookSnapshotUpdateEventPushDataJSON = `{"channel": "options.order_book", "event": "update", "time": 1630650445, "result": [ { "p": "49525.6", "s": 7726, "c": "BTC_USDT-20211130-50000-C", "id": 93973511 } ]}`
)
func TestOptionsOrderbookPushData(t *testing.T) {
t.Parallel()
err := g.wsHandleOptionsData([]byte(optionsOrderbookTickerPushDataJSON))
if err != nil {
t.Errorf("%s websocket options orderbook ticker push data error: %v", g.Name, err)
}
if err = g.wsHandleOptionsData([]byte(optionsOrderbookSnapshotPushDataJSON)); err != nil {
t.Errorf("%s websocket options orderbook snapshot push data error: %v", g.Name, err)
}
if err = g.wsHandleOptionsData([]byte(optionsOrderbookUpdatePushDataJSON)); err != nil {
t.Errorf("%s websocket options orderbook update push data error: %v", g.Name, err)
}
if err = g.wsHandleOptionsData([]byte(optionsOrderbookSnapshotUpdateEventPushDataJSON)); err != nil {
t.Errorf("%s websocket options orderbook snapshot update event push data error: %v", g.Name, err)
}
}
const optionsOrderPushDataJSON = `{"time": 1630654851,"channel": "options.orders", "event": "update", "result": [ { "contract": "BTC_USDT-20211130-65000-C", "create_time": 1637897000, "fill_price": 0, "finish_as": "cancelled", "iceberg": 0, "id": 106, "is_close": false, "is_liq": false, "is_reduce_only": false, "left": -10, "mkfr": 0.0004, "price": 15000, "refr": 0, "refu": 0, "size": -10, "status": "finished", "text": "web", "tif": "gtc", "tkfr": 0.0004, "underlying": "BTC_USDT", "user": "9xxx", "time": 1639051907,"time_ms": 1639051907000}]}`
func TestOptionsOrderPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsOrderPushDataJSON)); err != nil {
t.Errorf("%s websocket options orders push data error: %v", g.Name, err)
}
}
const optionsUsersTradesPushDataJSON = `{ "time": 1639144214, "channel": "options.usertrades", "event": "update", "result": [{"id": "1","underlying": "BTC_USDT","order": "557940","contract": "BTC_USDT-20211216-44800-C","create_time": 1639144214,"create_time_ms": 1639144214583,"price": "4999","role": "taker","size": -1}]}`
func TestOptionUserTradesPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsUsersTradesPushDataJSON)); err != nil {
t.Errorf("%s websocket options orders push data error: %v", g.Name, err)
}
}
const optionsLiquidatesPushDataJSON = `{ "channel": "options.liquidates", "event": "update", "time": 1630654851, "result": [ { "user": "1xxxx", "init_margin": 1190, "maint_margin": 1042.5, "order_margin": 0, "time": 1639051907, "time_ms": 1639051907000 } ]}`
func TestOptionsLiquidatesPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsLiquidatesPushDataJSON)); err != nil {
t.Errorf("%s websocket options liquidates push data error: %v", g.Name, err)
}
}
const optionsSettlementPushDataJSON = `{ "channel": "options.user_settlements", "event": "update", "time": 1639051907, "result": [{"contract": "BTC_USDT-20211130-65000-C","realised_pnl": -13.028,"settle_price": 70000,"settle_profit": 5,"size": 10,"strike_price": 65000,"underlying": "BTC_USDT","user": "9xxx","time": 1639051907,"time_ms": 1639051907000}]}`
func TestOptionsSettlementPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsSettlementPushDataJSON)); err != nil {
t.Errorf("%s websocket options settlement push data error: %v", g.Name, err)
}
}
const optionsPositionClosePushDataJSON = `{"channel": "options.position_closes", "event": "update", "time": 1630654851, "result": [{"contract": "BTC_USDT-20211130-50000-C","pnl": -0.0056,"settle_size": 0,"side": "long","text": "web","underlying": "BTC_USDT","user": "11xxxxx","time": 1639051907,"time_ms": 1639051907000}]}`
func TestOptionsPositionClosePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsPositionClosePushDataJSON)); err != nil {
t.Errorf("%s websocket options position close push data error: %v", g.Name, err)
}
}
const optionsBalancePushDataJSON = `{ "channel": "options.balances", "event": "update", "time": 1630654851, "result": [ { "balance": 60.79009,"change": -0.5,"text": "BTC_USDT-20211130-55000-P","type": "set","user": "11xxxx","time": 1639051907,"time_ms": 1639051907000}]}`
func TestOptionsBalancePushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsBalancePushDataJSON)); err != nil {
t.Errorf("%s websocket options balance push data error: %v", g.Name, err)
}
}
const optionsPositionPushDataJSON = `{"time": 1630654851, "channel": "options.positions", "event": "update", "error": null, "result": [ { "entry_price": 0, "realised_pnl": -13.028, "size": 0, "contract": "BTC_USDT-20211130-65000-C", "user": "9010", "time": 1639051907, "time_ms": 1639051907000 } ]}`
func TestOptionsPositionPushData(t *testing.T) {
t.Parallel()
if err := g.wsHandleOptionsData([]byte(optionsPositionPushDataJSON)); err != nil {
t.Errorf("%s websocket options position push data error: %v", g.Name, err)
}
}
const (
futuresOrderbookPushData = `{"time": 1678468497, "time_ms": 1678468497232, "channel": "futures.order_book", "event": "all", "result": { "t": 1678468497168, "id": 4010394406, "contract": "BTC_USD", "asks": [ { "p": "19909", "s": 3100 }, { "p": "19909.1", "s": 5000 }, { "p": "19910", "s": 3100 }, { "p": "19914.4", "s": 4400 }, { "p": "19916.6", "s": 5000 }, { "p": "19917.2", "s": 8255 }, { "p": "19919.2", "s": 5000 }, { "p": "19920.3", "s": 11967 }, { "p": "19922.2", "s": 5000 }, { "p": "19924.2", "s": 5000 }, { "p": "19927.1", "s": 17129 }, { "p": "19927.2", "s": 5000 }, { "p": "19929", "s": 20864 }, { "p": "19929.3", "s": 5000 }, { "p": "19929.7", "s": 24683 }, { "p": "19930.3", "s": 750 }, { "p": "19931.4", "s": 5000 }, { "p": "19931.5", "s": 1 }, { "p": "19934.2", "s": 5000 }, { "p": "19935.4", "s": 1 } ], "bids": [ { "p": "19901.2", "s": 5000 }, { "p": "19900.3", "s": 3100 }, { "p": "19900.2", "s": 5000 }, { "p": "19899.3", "s": 2983 }, { "p": "19899.2", "s": 6035 }, { "p": "19897.2", "s": 5000 }, { "p": "19895.7", "s": 5984 }, { "p": "19895", "s": 5000 }, { "p": "19892.9", "s": 195 }, { "p": "19892.8", "s": 5000 }, { "p": "19889.4", "s": 5000 }, { "p": "19889", "s": 8800 }, { "p": "19888.5", "s": 11968 }, { "p": "19887.1", "s": 5000 }, { "p": "19886.4", "s": 24683 }, { "p": "19885.7", "s": 1 }, { "p": "19883.8", "s": 5000 }, { "p": "19880.2", "s": 5000 }, { "p": "19878.2", "s": 5000 }, { "p": "19876.8", "s": 1 } ] } }`
futuresOrderbookUpdatePushData = `{"time": 1678469222, "time_ms": 1678469222982, "channel": "futures.order_book_update", "event": "update", "result": { "t": 1678469222617, "s": "BTC_USD", "U": 4010424331, "u": 4010424361, "b": [ { "p": "19860.7", "s": 5984 }, { "p": "19858.6", "s": 5000 }, { "p": "19845.4", "s": 20864 }, { "p": "19859.1", "s": 0 }, { "p": "19862.5", "s": 0 }, { "p": "19358", "s": 0 }, { "p": "19864.5", "s": 5000 }, { "p": "19840.7", "s": 0 }, { "p": "19863.6", "s": 3100 }, { "p": "19839.3", "s": 0 }, { "p": "19851.5", "s": 8800 }, { "p": "19720", "s": 0 }, { "p": "19333", "s": 0 }, { "p": "19852.7", "s": 5000 }, { "p": "19861.5", "s": 0 }, { "p": "19860.6", "s": 3100 }, { "p": "19833.6", "s": 0 }, { "p": "19360", "s": 0 }, { "p": "19863.5", "s": 5000 }, { "p": "19736.9", "s": 0 }, { "p": "19838.5", "s": 0 }, { "p": "19841.3", "s": 0 }, { "p": "19858.1", "s": 3100 }, { "p": "19710.9", "s": 0 }, { "p": "19342", "s": 0 }, { "p": "19852.1", "s": 11967 }, { "p": "19343", "s": 0 }, { "p": "19705", "s": 0 }, { "p": "19836.5", "s": 0 }, { "p": "19862.6", "s": 3100 }, { "p": "19729.6", "s": 0 }, { "p": "19849.9", "s": 5000 } ], "a": [ { "p": "19900.5", "s": 0 }, { "p": "19883.1", "s": 11967 }, { "p": "19910.9", "s": 0 }, { "p": "19897.7", "s": 5000 }, { "p": "19875.9", "s": 5984 }, { "p": "19899.6", "s": 0 }, { "p": "19878", "s": 4400 }, { "p": "19877.6", "s": 0 }, { "p": "19889.5", "s": 5000 }, { "p": "19875.5", "s": 3100 }, { "p": "19875.3", "s": 0 }, { "p": "19878.5", "s": 0 }, { "p": "19895.2", "s": 0 }, { "p": "20284.6", "s": 0 }, { "p": "19880.7", "s": 5000 }, { "p": "19875.4", "s": 0 }, { "p": "19985.8", "s": 0 }, { "p": "19887.1", "s": 5000 }, { "p": "19896", "s": 1 }, { "p": "19869.3", "s": 0 }, { "p": "19900", "s": 0 }, { "p": "19875.6", "s": 5000 }, { "p": "19980.6", "s": 0 }, { "p": "19885.1", "s": 5000 }, { "p": "19877.7", "s": 5000 }, { "p": "20000", "s": 0 }, { "p": "19892.2", "s": 8255 }, { "p": "19886.8", "s": 0 }, { "p": "20257.4", "s": 0 }, { "p": "20280", "s": 0 }, { "p": "20002.5", "s": 0 }, { "p": "20263.1", "s": 0 }, { "p": "19900.2", "s": 0 } ] } }`
)
func TestFuturesOrderbookPushData(t *testing.T) {
t.Parallel()
err := g.wsHandleFuturesData([]byte(futuresOrderbookPushData), asset.Futures)
if err != nil {
t.Error(err)
}
err = g.wsHandleFuturesData([]byte(futuresOrderbookUpdatePushData), asset.Futures)
if err != nil {
t.Error(err)
}
}
const futuresCandlesticksPushData = `{"time": 1678469467, "time_ms": 1678469467981, "channel": "futures.candlesticks", "event": "update", "result": [ { "t": 1678469460, "v": 0, "c": "19896", "h": "19896", "l": "19896", "o": "19896", "n": "1m_BTC_USD" } ] }`
func TestFuturesCandlestickPushData(t *testing.T) {
t.Parallel()
err := g.wsHandleFuturesData([]byte(futuresCandlesticksPushData), asset.Futures)
if err != nil {
t.Error(err)
}
}
func TestGenerateDefaultSubscriptions(t *testing.T) {
t.Parallel()
if _, err := g.GenerateDefaultSubscriptions(); err != nil {
t.Error(err)
}
}
func TestGenerateDeliveryFuturesDefaultSubscriptions(t *testing.T) {
t.Parallel()
if _, err := g.GenerateDeliveryFuturesDefaultSubscriptions(); err != nil {
t.Error(err)
}
}
func TestGenerateFuturesDefaultSubscriptions(t *testing.T) {
t.Parallel()
if _, err := g.GenerateFuturesDefaultSubscriptions(); err != nil {
t.Error(err)
}
}
func TestGenerateOptionsDefaultSubscriptions(t *testing.T) {
t.Parallel()
if _, err := g.GenerateOptionsDefaultSubscriptions(); err != nil {
t.Error(err)
}
}
func TestCreateAPIKeysOfSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if _, err := g.CreateAPIKeysOfSubAccount(context.Background(), CreateAPIKeySubAccountParams{
SubAccountUserID: 12345,
Body: &SubAccountKey{
APIKeyName: "12312mnfsndfsfjsdklfjsdlkfj",
Permissions: []APIV4KeyPerm{
{
PermissionName: "wallet",
ReadOnly: false,
},
{
PermissionName: "spot",
ReadOnly: false,
},
{
PermissionName: "futures",
ReadOnly: false,
},
{
PermissionName: "delivery",
ReadOnly: false,
},
{
PermissionName: "earn",
ReadOnly: false,
},
{
PermissionName: "options",
ReadOnly: false,
},
},
},
}); err != nil {
t.Error(err)
}
}
func TestListAllAPIKeyOfSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
_, err := g.GetAllAPIKeyOfSubAccount(context.Background(), 1234)
if err != nil {
t.Error(err)
}
}
func TestUpdateAPIKeyOfSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
if err := g.UpdateAPIKeyOfSubAccount(context.Background(), apiKey, CreateAPIKeySubAccountParams{
SubAccountUserID: 12345,
Body: &SubAccountKey{
APIKeyName: "12312mnfsndfsfjsdklfjsdlkfj",
Permissions: []APIV4KeyPerm{
{
PermissionName: "wallet",
ReadOnly: false,
},
{
PermissionName: "spot",
ReadOnly: false,
},
{
PermissionName: "futures",
ReadOnly: false,
},
{
PermissionName: "delivery",
ReadOnly: false,
},
{
PermissionName: "earn",
ReadOnly: false,
},
{
PermissionName: "options",
ReadOnly: false,
},
},
},
}); err != nil {
t.Error(err)
}
}
func TestGetAPIKeyOfSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
_, err := g.GetAPIKeyOfSubAccount(context.Background(), 1234, "target_api_key")
if err != nil {
t.Error(err)
}
}
func TestLockSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if err := g.LockSubAccount(context.Background(), 1234); err != nil {
t.Error(err)
}
}
func TestUnlockSubAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
if err := g.UnlockSubAccount(context.Background(), 1234); err != nil {
t.Error(err)
}
}
func getFirstTradablePairOfAssets() {
enabledPairs, err := g.GetEnabledPairs(asset.Spot)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.Spot)
}
spotTradablePair = enabledPairs[0]
enabledPairs, err = g.GetEnabledPairs(asset.Margin)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.Margin)
}
marginTradablePair = enabledPairs[0]
enabledPairs, err = g.GetEnabledPairs(asset.CrossMargin)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.CrossMargin)
}
crossMarginTradablePair = enabledPairs[0]
enabledPairs, err = g.GetEnabledPairs(asset.Futures)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.Futures)
}
if len(enabledPairs) == 0 {
var availPairs currency.Pairs
availPairs, err = g.GetAvailablePairs(asset.Futures)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.Futures)
}
futuresTradablePair = availPairs[len(availPairs)-1]
} else {
futuresTradablePair = enabledPairs[len(enabledPairs)-1]
}
enabledPairs, err = g.GetEnabledPairs(asset.Options)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.Options)
}
optionsTradablePair = enabledPairs[0]
enabledPairs, err = g.GetEnabledPairs(asset.DeliveryFutures)
if err != nil {
log.Fatalf("GateIO %v, trying to get %v enabled pairs error", err, asset.DeliveryFutures)
}
deliveryFuturesTradablePair = enabledPairs[0]
}
func TestSettlement(t *testing.T) {
availablePairs, err := g.GetAvailablePairs(asset.Futures)
if err != nil {
t.Fatal(err)
}
for x := range availablePairs {
t.Run(strconv.Itoa(x), func(t *testing.T) {
_, err = g.getSettlementFromCurrency(availablePairs[x], true)
if err != nil {
t.Fatal(err)
}
})
}
availablePairs, err = g.GetAvailablePairs(asset.DeliveryFutures)
if err != nil {
t.Fatal(err)
}
for x := range availablePairs {
t.Run(strconv.Itoa(x), func(t *testing.T) {
_, err = g.getSettlementFromCurrency(availablePairs[x], false)
if err != nil {
t.Fatal(err)
}
})
}
availablePairs, err = g.GetAvailablePairs(asset.Options)
if err != nil {
t.Fatal(err)
}
for x := range availablePairs {
t.Run(strconv.Itoa(x), func(t *testing.T) {
_, err := g.getSettlementFromCurrency(availablePairs[x], false)
if err != nil {
t.Fatal(err)
}
})
}
}
func TestParseGateioMilliSecTimeUnmarshal(t *testing.T) {
t.Parallel()
var timeWhenTesting int64 = 1684981731098
timeWhenTestingString := `"1684981731098"` // Normal string
integerJSON := `{"number": 1684981731098}`
float64JSON := `{"number": 1684981731.098}`
time := time.UnixMilli(timeWhenTesting)
var in gateioTime
err := json.Unmarshal([]byte(timeWhenTestingString), &in)
if err != nil {
t.Fatal(err)
}
if !in.Time().Equal(time) {
t.Fatalf("found %v, but expected %v", in.Time(), time)
}
inInteger := struct {
Number gateioTime `json:"number"`
}{}
err = json.Unmarshal([]byte(integerJSON), &inInteger)
if err != nil {
t.Fatal(err)
}
if !inInteger.Number.Time().Equal(time) {
t.Fatalf("found %v, but expected %v", inInteger.Number.Time(), time)
}
inFloat64 := struct {
Number gateioTime `json:"number"`
}{}
err = json.Unmarshal([]byte(float64JSON), &inFloat64)
if err != nil {
t.Fatal(err)
}
if !inFloat64.Number.Time().Equal(time) {
t.Fatalf("found %v, but expected %v", inFloat64.Number.Time(), time)
}
}
func TestParseGateioTimeUnmarshal(t *testing.T) {
t.Parallel()
var timeWhenTesting int64 = 1684981731
timeWhenTestingString := `"1684981731"`
integerJSON := `{"number": 1684981731}`
float64JSON := `{"number": 1684981731.234}`
timeWhenTestingStringMicroSecond := `"1691122380942.173000"`
whenTime := time.Unix(timeWhenTesting, 0)
var in gateioTime
err := json.Unmarshal([]byte(timeWhenTestingString), &in)
if err != nil {
t.Fatal(err)
}
if !in.Time().Equal(whenTime) {
t.Fatalf("found %v, but expected %v", in.Time(), whenTime)
}
inInteger := struct {
Number gateioTime `json:"number"`
}{}
err = json.Unmarshal([]byte(integerJSON), &inInteger)
if err != nil {
t.Fatal(err)
}
if !inInteger.Number.Time().Equal(whenTime) {
t.Fatalf("found %v, but expected %v", inInteger.Number.Time(), whenTime)
}
inFloat64 := struct {
Number gateioTime `json:"number"`
}{}
err = json.Unmarshal([]byte(float64JSON), &inFloat64)
if err != nil {
t.Fatal(err)
}
msTime := time.UnixMilli(1684981731234)
if !inFloat64.Number.Time().Equal(time.UnixMilli(1684981731234)) {
t.Fatalf("found %v, but expected %v", inFloat64.Number.Time(), msTime)
}
var microSeconds gateioTime
err = json.Unmarshal([]byte(timeWhenTestingStringMicroSecond), &microSeconds)
if err != nil {
t.Fatal(err)
}
if !microSeconds.Time().Equal(time.UnixMicro(1691122380942173)) {
t.Fatalf("found %v, but expected %v", microSeconds.Time(), time.UnixMicro(1691122380942173))
}
}
func TestGateioNumericalValue(t *testing.T) {
t.Parallel()
in := &struct {
Number gateioNumericalValue `json:"number"`
}{}
numberJSON := `{"number":123442.231}`
err := json.Unmarshal([]byte(numberJSON), in)
if err != nil {
t.Fatal(err)
} else if in.Number != 123442.231 {
t.Fatalf("found %f, but expected %f", in.Number, 123442.231)
}
numberJSON = `{"number":"123442.231"}`
err = json.Unmarshal([]byte(numberJSON), in)
if err != nil {
t.Fatal(err)
} else if in.Number != 123442.231 {
t.Fatalf("found %f, but expected %s", in.Number, "123442.231")
}
numberJSON = `{"number":""}`
err = json.Unmarshal([]byte(numberJSON), in)
if err != nil {
t.Fatal(err)
} else if in.Number != 0 {
t.Fatalf("found %f, but expected %d", in.Number, 0)
}
numberJSON = `{"number":0}`
err = json.Unmarshal([]byte(numberJSON), in)
if err != nil {
t.Fatal(err)
} else if in.Number != 0 {
t.Fatalf("found %f, but expected %d", in.Number, 0)
}
}
func TestUpdateOrderExecutionLimits(t *testing.T) {
t.Parallel()
err := g.UpdateTradablePairs(context.Background(), true)
if err != nil {
t.Fatal(err)
}
err = g.UpdateOrderExecutionLimits(context.Background(), 1336)
if !errors.Is(err, asset.ErrNotSupported) {
t.Fatalf("received %v, expected %v", err, asset.ErrNotSupported)
}
err = g.UpdateOrderExecutionLimits(context.Background(), asset.Options)
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatalf("received %v, expected %v", err, common.ErrNotYetImplemented)
}
err = g.UpdateOrderExecutionLimits(context.Background(), asset.Spot)
if err != nil {
t.Fatal(err)
}
avail, err := g.GetAvailablePairs(asset.Spot)
if err != nil {
t.Fatal(err)
}
for i := range avail {
mm, err := g.GetOrderExecutionLimits(asset.Spot, avail[i])
if err != nil {
t.Fatal(err)
}
if mm == (order.MinMaxLevel{}) {
t.Fatal("expected a value")
}
if mm.MinimumBaseAmount <= 0 {
t.Fatalf("MinimumBaseAmount expected 0 but received %v for %v", mm.MinimumBaseAmount, avail[i])
}
// 1INCH_TRY no minimum quote or base values are returned.
if mm.QuoteStepIncrementSize <= 0 {
t.Fatalf("QuoteStepIncrementSize expected 0 but received %v for %v", mm.QuoteStepIncrementSize, avail[i])
}
if mm.AmountStepIncrementSize <= 0 {
t.Fatalf("AmountStepIncrementSize expected 0 but received %v for %v", mm.AmountStepIncrementSize, avail[i])
}
}
}
func TestForceFileStandard(t *testing.T) {
t.Parallel()
err := sharedtestvalues.ForceFileStandard(t, sharedtestvalues.EmptyStringPotentialPattern)
if err != nil {
t.Error(err)
}
if t.Failed() {
t.Fatal("Please use types.Number type instead of `float64` and remove `,string` as strings can be empty in unmarshal process. Then call the Float64() method.")
}
}
func TestGetFuturesContractDetails(t *testing.T) {
t.Parallel()
_, err := g.GetFuturesContractDetails(context.Background(), asset.Spot)
if !errors.Is(err, futures.ErrNotFuturesAsset) {
t.Error(err)
}
_, err = g.GetFuturesContractDetails(context.Background(), asset.PerpetualContract)
if !errors.Is(err, asset.ErrNotSupported) {
t.Error(err)
}
_, err = g.GetFuturesContractDetails(context.Background(), asset.DeliveryFutures)
if !errors.Is(err, nil) {
t.Error(err)
}
_, err = g.GetFuturesContractDetails(context.Background(), asset.Futures)
if !errors.Is(err, nil) {
t.Error(err)
}
}
func TestGetLatestFundingRates(t *testing.T) {
t.Parallel()
_, err := g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{
Asset: asset.USDTMarginedFutures,
Pair: currency.NewPair(currency.BTC, currency.USDT),
IncludePredictedRate: true,
})
if !errors.Is(err, asset.ErrNotSupported) {
t.Error(err)
}
_, err = g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.BTC, currency.USD),
})
if err != nil {
t.Error(err)
}
_, err = g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{
Asset: asset.Futures,
})
if err != nil {
t.Error(err)
}
}
func TestGetHistoricalFundingRates(t *testing.T) {
t.Parallel()
_, err := g.GetHistoricalFundingRates(context.Background(), nil)
if !errors.Is(err, common.ErrNilPointer) {
t.Fatalf("received: %v, expected: %v", err, common.ErrNilPointer)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{})
if !errors.Is(err, asset.ErrNotSupported) {
t.Fatalf("received: %v, expected: %v", err, asset.ErrNotSupported)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
})
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Fatalf("received: %v, expected: %v", err, currency.ErrCurrencyPairEmpty)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
})
if !errors.Is(err, fundingrate.ErrPaymentCurrencyCannotBeEmpty) {
t.Fatalf("received: %v, expected: %v", err, fundingrate.ErrPaymentCurrencyCannotBeEmpty)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
IncludePayments: true,
IncludePredictedRate: true,
})
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatalf("received: %v, expected: %v", err, common.ErrNotYetImplemented)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
IncludePredictedRate: true,
})
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatalf("received: %v, expected: %v", err, common.ErrNotYetImplemented)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
StartDate: time.Now().Add(time.Hour * 16),
EndDate: time.Now(),
})
if !errors.Is(err, common.ErrStartAfterEnd) {
t.Fatalf("received: %v, expected: %v", err, common.ErrStartAfterEnd)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
StartDate: time.Now().Add(-time.Hour * 8008),
EndDate: time.Now(),
})
if !errors.Is(err, fundingrate.ErrFundingRateOutsideLimits) {
t.Fatalf("received: %v, expected: %v", err, fundingrate.ErrFundingRateOutsideLimits)
}
history, err := g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
})
if !errors.Is(err, nil) {
t.Fatalf("received: %v, expected: %v", err, nil)
}
assert.NotEmpty(t, history, "should return values")
}