Files
gocryptotrader/exchanges/gateio/gateio_test.go
Ryan O'Hara-Reid f23cc004fd Gateio: Implement GetHistoricalFundingRates wrapper func (#1385)
* adds funding rate implementations and improvements

* merge fixes x1

* lint

* kucoin funding rates func make

* migrate sync-manager to keys

* some kucoin work

* adds some kucoin wrapper funcs

* ehhh, todo

* kucoin position

* start of orders

* adds the kucoin tests yay

* multiplier

* nits, EWS includes order limits

* NotYetImplemented, IsPerp improvements, cleaning

* lint, test fix, huobi time

* fixes issues, improves testing

* fixes linters I WRECKED

* local lint but remote lint, lint, lint, lint

* fixes err

* skip CI

* lint

* Supported rates, binance endpoints

* fixes weird mocktest problems

* no, CZ is invalid

* fixes some new EWS test errors

* gateio: Add func GetHistoricalFundingRates

* glorious: nits

* rm: print call

* glorious: nits fix test

---------

Co-authored-by: Scott <scott.grant@thrasher.io>
Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
2023-11-22 10:52:26 +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 convert.StringToFloat64 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")
}