Files
gocryptotrader/exchanges/gateio/gateio_test.go
Ryan O'Hara-Reid ac731ce283 websocket/gateio: Support multi connection management and integrate with GateIO (#1580)
* gateio: Add multi asset websocket support WIP.

* meow

* Add tests and shenanigans

* integrate flushing and for enabling/disabling pairs from rpc shenanigans

* some changes

* linter: fixes strikes again.

* Change name ConnectionAssociation -> ConnectionCandidate for better clarity on purpose. Change connections map to point to candidate to track subscriptions for future dynamic connections holder and drop struct ConnectionDetails.

* Add subscription tests (state functional)

* glorious:nits + proxy handling

* Spelling

* linter: fixerino

* instead of nil, dont do nil.

* clean up nils

* cya nils

* don't need to set URL or check if its running

* stop ping handler routine leak

* * Fix bug where reader routine on error that is not a disconnection error but websocket frame error or anything really makes the reader routine return and then connection never cycles and the buffer gets filled.
* Handle reconnection via an errors.Is check which is simpler and in that scope allow for quick disconnect reconnect without waiting for connection cycle.
* Dial now uses code from DialContext but just calls context.Background()
* Don't allow reader to return on parse binary response error. Just output error and return a non nil response

* Allow rollback on connect on any error across all connections

* fix shadow jutsu

* glorious/gk: nitters - adds in ws mock server

* linter: fix

* fix deadlock on connection as the previous channel had no reader and would hang connection reader for eternity.

* gk: nits

* Leak issue and edge case

* gk: nits

* gk: drain brain

* glorious: nits

* Update exchanges/stream/websocket.go

Co-authored-by: Scott <gloriousCode@users.noreply.github.com>

* glorious: nits

* add tests

* linter: fix

* After merge

* Add error connection info

* Fix edge case where it does not reconnect made by an already closed connection

* stream coverage

* glorious: nits

* glorious: nits removed asset error handling in stream package

* linter: fix

* rm block

* Add basic readme

* fix asset enabled flush cycle for multi connection

* spella: fix

* linter: fix

* Add glorious suggestions, fix some race thing

* reinstate name before any routine gets spawned

* stop on error in mock tests

* glorious: nits

* glorious: nits found in CI build

* Add test for drain, bumped wait times as there seems to be something happening on macos CI builds, used context.WithTimeout because its instant.

* mutex across shutdown and connect for protection

* lint: fix

* test time withoffset, reinstate stop

* fix whoops

* const trafficCheckInterval; rm testmain

* y

* fix lint

* bump time check window

* stream: fix intermittant test failures while testing routines and remove code that is not needed.

* spells

* cant do what I did

* protect race due to routine.

* update testURL

* use mock websocket connection instead of test URL's

* linter: fix

* remove url because its throwing errors on CI builds

* connections drop all the time, don't need to worry about not being able to echo back ws data as it can be easily reviewed _test file side.

* remove another superfluous url thats not really set up for this

* spawn overwatch routine when there is no errors, inline checker instead of waiting for a time period, add sleep inline with echo handler as this is really quick and wanted to ensure that latency is handing correctly

* linter: fixerino uperino

* glorious: panix

* linter: things

* whoops

* defer lock and use functions that don't require locking in SetProxyAddress

* lint: fix

* thrasher: nits

---------

Co-authored-by: shazbert <ryan.oharareid@thrasher.io>
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
2024-10-10 15:09:52 +11:00

3685 lines
148 KiB
Go

package gateio
import (
"context"
"encoding/json"
"errors"
"log"
"os"
"strconv"
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/common/key"
"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/exchanges/stream"
"github.com/thrasher-corp/gocryptotrader/exchanges/subscription"
testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange"
testsubs "github.com/thrasher-corp/gocryptotrader/internal/testing/subscriptions"
"github.com/thrasher-corp/gocryptotrader/portfolio/withdraw"
"github.com/thrasher-corp/gocryptotrader/types"
)
// Please supply your own APIKEYS here for due diligence testing
const (
apiKey = ""
apiSecret = ""
canManipulateRealOrders = false
)
var g *Gateio
func TestMain(m *testing.M) {
g = new(Gateio)
if err := testexch.Setup(g); err != nil {
log.Fatal(err)
}
if apiKey != "" && apiSecret != "" {
g.API.AuthenticatedSupport = true
g.API.AuthenticatedWebsocketSupport = true
g.SetCredentials(apiKey, apiSecret, "", "", "", "")
}
os.Exit(m.Run())
}
func TestUpdateTradablePairs(t *testing.T) {
t.Parallel()
testexch.UpdatePairsOnce(t, g)
}
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: getPair(t, asset.Options),
AssetType: asset.Options,
}
_, err = g.CancelAllOrders(context.Background(), orderCancellation)
if err != nil {
t.Error(err)
}
orderCancellation.AssetType = asset.Spot
orderCancellation.Pair = getPair(t, asset.Spot)
_, 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 = getPair(t, asset.Margin)
_, 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 = getPair(t, asset.CrossMargin)
_, 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 = getPair(t, asset.Futures)
_, 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 = getPair(t, asset.DeliveryFutures)
_, 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", getPair(t, asset.Spot), asset.Spot)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.Options), asset.Options)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.Margin), asset.Margin)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.CrossMargin), asset.CrossMargin)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.Futures), asset.Futures)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
_, err = g.GetOrderInfo(context.Background(), "917591554", getPair(t, asset.DeliveryFutures), asset.DeliveryFutures)
if err != nil {
t.Errorf("GetOrderInfo() %v", err)
}
}
func TestUpdateTicker(t *testing.T) {
t.Parallel()
for _, a := range g.GetAssetTypes(false) {
_, err := g.UpdateTicker(context.Background(), getPair(t, a), a)
assert.NoError(t, err, "UpdateTicker should not error for %s", a)
}
}
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(), getPair(t, asset.Spot).String(), "0.1", 10, false)
if err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
settle, err := g.getSettlementFromCurrency(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err = g.GetFuturesOrderbook(context.Background(), settle, getPair(t, asset.Futures).String(), "", 10, false); err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
settle, err = g.getSettlementFromCurrency(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Fatal(err)
}
if _, err = g.GetDeliveryOrderbook(context.Background(), settle, "0.1", getPair(t, asset.DeliveryFutures), 10, false); err != nil {
t.Errorf("%s GetOrderbook() error %v", g.Name, err)
}
if _, err = g.GetOptionsOrderbook(context.Background(), getPair(t, asset.Options), "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(), getPair(t, asset.Spot), 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(), getPair(t, asset.Spot), 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: getPair(t, asset.Spot),
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: getPair(t, asset.Spot),
}); 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: getPair(t, asset.Spot),
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(), getPair(t, asset.Spot), 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: getPair(t, asset.Spot),
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(), "", getPair(t, asset.Spot), 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", getPair(t, asset.Spot), 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",
getPair(t, asset.Spot).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: getPair(t, asset.Spot),
}); 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(), getPair(t, asset.Margin)); 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err = g.GetSingleContract(context.Background(), settle, getPair(t, asset.Futures).String()); err != nil {
t.Errorf("%s GetSingleContract() error %s", g.Name, err)
}
}
func TestGetFuturesOrderbook(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesOrderbook(context.Background(), settle, getPair(t, asset.Futures).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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesTradingHistory(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesCandlesticks(context.Background(), settle, getPair(t, asset.Futures).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(getPair(t, asset.Futures), true)
if err != nil {
t.Error(err)
}
if _, err := g.PremiumIndexKLine(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFuturesTickers(context.Background(), settle, getPair(t, asset.Futures)); err != nil {
t.Errorf("%s GetFuturesTickers() error %v", g.Name, err)
}
}
func TestGetFutureFundingRates(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetFutureFundingRates(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Error(err)
}
_, err = g.GetFutureStats(context.Background(), settle, getPair(t, asset.Futures), time.Time{}, 0, 0)
if 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(getPair(t, asset.Futures), true)
if err != nil {
t.Error(err)
}
if _, err := g.GetLiquidationHistory(context.Background(), settle, getPair(t, asset.Futures), 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, true); 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateFuturesPositionMargin(context.Background(), settle, 0.01, getPair(t, asset.Futures)); 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateFuturesPositionLeverage(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateFuturesPositionRiskLimit(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.PlaceDeliveryOrder(context.Background(), &OrderCreateParams{
Contract: getPair(t, asset.DeliveryFutures),
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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.GetDeliveryOrders(context.Background(), getPair(t, asset.DeliveryFutures), "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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CancelMultipleDeliveryOrders(context.Background(), getPair(t, asset.DeliveryFutures), "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, "", getPair(t, asset.DeliveryFutures), 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, getPair(t, asset.DeliveryFutures), 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, getPair(t, asset.DeliveryFutures), 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, getPair(t, asset.DeliveryFutures), 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: getPair(t, asset.DeliveryFutures),
},
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, getPair(t, asset.DeliveryFutures), 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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CancelAllDeliveryPriceTriggeredOrder(context.Background(), settle, getPair(t, asset.DeliveryFutures)); 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err = g.RetrivePositionDetailInDualMode(context.Background(), settle, getPair(t, asset.Futures)); 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err = g.UpdatePositionMarginInDualMode(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err = g.UpdatePositionLeverageInDualMode(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err = g.UpdatePositionRiskLimitInDualMode(context.Background(), settle, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.PlaceFuturesOrder(context.Background(), &OrderCreateParams{
Contract: getPair(t, asset.Futures),
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(), getPair(t, asset.Futures), "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(getPair(t, asset.Futures), true)
if err != nil {
t.Fatal(err)
}
if _, err := g.PlaceBatchFuturesOrders(context.Background(), settleBTC, []OrderCreateParams{
{
Contract: getPair(t, asset.Futures),
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, "", "", getPair(t, asset.Futures), 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, getPair(t, asset.Futures), 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, getPair(t, asset.Futures), 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(getPair(t, asset.Futures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CreatePriceTriggeredFuturesOrder(context.Background(), settle, &FuturesPriceTriggeredOrderParam{
Initial: FuturesInitial{
Price: 1234.,
Size: 2,
Contract: getPair(t, asset.Futures),
},
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: getPair(t, asset.Futures),
},
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(getPair(t, asset.Futures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.CancelAllFuturesOpenOrders(context.Background(), settle, getPair(t, asset.Futures)); 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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetSingleDeliveryContracts(context.Background(), settle, getPair(t, asset.DeliveryFutures)); 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", getPair(t, asset.DeliveryFutures), 0, false); err != nil {
t.Errorf("%s GetDeliveryOrderbook() error %v", g.Name, err)
}
}
func TestGetDeliveryTradingHistory(t *testing.T) {
t.Parallel()
settle, err := g.getSettlementFromCurrency(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetDeliveryTradingHistory(context.Background(), settle, "", getPair(t, asset.DeliveryFutures), 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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetDeliveryFuturesCandlesticks(context.Background(), settle, getPair(t, asset.DeliveryFutures), 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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Skip(err)
}
if _, err := g.GetDeliveryFutureTickers(context.Background(), settle, getPair(t, asset.DeliveryFutures)); 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, getPair(t, asset.DeliveryFutures)); 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(getPair(t, asset.DeliveryFutures), false)
if err != nil {
t.Fatal(err)
}
if _, err := g.UpdateDeliveryPositionMargin(context.Background(), settle, 0.001, getPair(t, asset.DeliveryFutures)); 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", getPair(t, asset.DeliveryFutures), 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", getPair(t, asset.DeliveryFutures), 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(), getPair(t, asset.Options)); 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(), getPair(t, asset.Options))
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: getPair(t, asset.Options).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(), getPair(t, asset.Options), "", ""); 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(), getPair(t, asset.Options), "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(), getPair(t, asset.Options), 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(), getPair(t, asset.Options), "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 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(), getPair(t, asset.Spot), asset.Spot)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
_, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.Margin), asset.Margin)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
_, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.CrossMargin), asset.CrossMargin)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
_, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.Futures), asset.Futures)
if err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
if _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures); err != nil {
t.Errorf("%s UpdateOrderbook() error %v", g.Name, err)
}
if _, err = g.UpdateOrderbook(context.Background(), getPair(t, asset.Options), 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(), getPair(t, asset.Spot), asset.Spot)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), getPair(t, asset.Margin), asset.Margin)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), getPair(t, asset.CrossMargin), asset.CrossMargin)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), getPair(t, asset.Futures), asset.Futures)
if err != nil {
t.Error(err)
}
_, err = g.GetRecentTrades(context.Background(), getPair(t, asset.Options), 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: getPair(t, asset.CrossMargin),
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: getPair(t, asset.Spot),
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: getPair(t, asset.Options),
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: getPair(t, asset.DeliveryFutures),
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: getPair(t, asset.Futures),
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: getPair(t, asset.Margin),
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: getPair(t, asset.Spot),
AssetType: asset.Spot,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: getPair(t, asset.Spot),
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: getPair(t, asset.Futures),
AssetType: asset.Futures,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: getPair(t, asset.Futures),
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: getPair(t, asset.DeliveryFutures),
AssetType: asset.DeliveryFutures,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: getPair(t, asset.DeliveryFutures),
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: getPair(t, asset.Options),
AssetType: asset.Options,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: getPair(t, asset.Options),
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: getPair(t, asset.Margin),
AssetType: asset.Margin,
}, {
OrderID: "2",
WalletAddress: core.BitcoinDonationAddress,
AccountID: "1",
Pair: getPair(t, asset.Margin),
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{getPair(t, asset.Futures)},
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{getPair(t, asset.DeliveryFutures)},
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{getPair(t, asset.Options)},
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(), getPair(t, asset.Spot), asset.Spot, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Margin), asset.Margin, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.CrossMargin), asset.CrossMargin, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Futures), asset.Futures, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.DeliveryFutures), asset.DeliveryFutures, kline.OneDay, startTime, time.Now()); err != nil {
t.Errorf("%s GetHistoricCandles() error: %v", g.Name, err)
}
if _, err := g.GetHistoricCandles(context.Background(), getPair(t, asset.Options), 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(), getPair(t, asset.Options), 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(),
getPair(t, asset.Spot), asset.Spot, kline.OneMin, startTime, time.Now())
if err != nil {
t.Fatal(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(),
getPair(t, asset.Margin), asset.Margin, kline.OneMin, startTime, time.Now())
if err != nil {
t.Fatal(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(),
getPair(t, asset.DeliveryFutures), asset.DeliveryFutures, kline.OneMin, time.Now().Add(-time.Hour*5), time.Now())
if err != nil {
t.Error(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(), getPair(t, asset.Futures), asset.Futures, kline.OneMin, startTime, time.Now())
if err != nil {
t.Error(err)
}
_, err = g.GetHistoricCandlesExtended(context.Background(),
getPair(t, asset.CrossMargin), asset.CrossMargin, kline.OneMin, startTime, time.Now())
if err != nil {
t.Error(err)
}
if _, err = g.GetHistoricCandlesExtended(context.Background(), getPair(t, asset.Options), 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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []byte(wsOrderbookSnapshotPushDataJSON))
if err != nil {
t.Errorf("%s websocket orderbook snapshot push data error: %v", g.Name, err)
}
if err = g.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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.WsHandleSpotData(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []byte(optionsContractCandlesticksPushDataJSON)); err != nil {
t.Errorf("%s websocket options contracts candlestick push data error: %v", g.Name, err)
}
if err := g.WsHandleOptionsData(context.Background(), []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(context.Background(), []byte(optionsOrderbookTickerPushDataJSON))
if err != nil {
t.Errorf("%s websocket options orderbook ticker push data error: %v", g.Name, err)
}
if err = g.WsHandleOptionsData(context.Background(), []byte(optionsOrderbookSnapshotPushDataJSON)); err != nil {
t.Errorf("%s websocket options orderbook snapshot push data error: %v", g.Name, err)
}
if err = g.WsHandleOptionsData(context.Background(), []byte(optionsOrderbookUpdatePushDataJSON)); err != nil {
t.Errorf("%s websocket options orderbook update push data error: %v", g.Name, err)
}
if err = g.WsHandleOptionsData(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []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(context.Background(), []byte(futuresOrderbookPushData), asset.Futures)
if err != nil {
t.Error(err)
}
err = g.WsHandleFuturesData(context.Background(), []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(context.Background(), []byte(futuresCandlesticksPushData), asset.Futures)
if err != nil {
t.Error(err)
}
}
func TestGenerateSubscriptionsSpot(t *testing.T) {
t.Parallel()
g := new(Gateio) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
require.NoError(t, testexch.Setup(g), "Test instance Setup must not error")
g.Websocket.SetCanUseAuthenticatedEndpoints(true)
g.Features.Subscriptions = append(g.Features.Subscriptions, &subscription.Subscription{
Enabled: true, Channel: spotOrderbookChannel, Asset: asset.Spot, Interval: kline.ThousandMilliseconds, Levels: 5,
})
subs, err := g.generateSubscriptionsSpot()
require.NoError(t, err, "generateSubscriptions must not error")
exp := subscription.List{}
for _, s := range g.Features.Subscriptions {
for _, a := range g.GetAssetTypes(true) {
if s.Asset != asset.All && s.Asset != a {
continue
}
pairs, err := g.GetEnabledPairs(a)
require.NoErrorf(t, err, "GetEnabledPairs %s must not error", a)
pairs = common.SortStrings(pairs).Format(currency.PairFormat{Uppercase: true, Delimiter: "_"})
s := s.Clone() //nolint:govet // Intentional lexical scope shadow
s.Asset = a
if singleSymbolChannel(channelName(s)) {
for i := range pairs {
s := s.Clone() //nolint:govet // Intentional lexical scope shadow
switch s.Channel {
case subscription.CandlesChannel:
s.QualifiedChannel = "5m," + pairs[i].String()
case subscription.OrderbookChannel:
s.QualifiedChannel = pairs[i].String() + ",100ms"
case spotOrderbookChannel:
s.QualifiedChannel = pairs[i].String() + ",5,1000ms"
}
s.Pairs = pairs[i : i+1]
exp = append(exp, s)
}
} else {
s.Pairs = pairs
s.QualifiedChannel = pairs.Join()
exp = append(exp, s)
}
}
}
testsubs.EqualLists(t, exp, subs)
}
func TestSubscribe(t *testing.T) {
t.Parallel()
subs, err := g.Features.Subscriptions.ExpandTemplates(g)
require.NoError(t, err, "ExpandTemplates must not error")
g.Features.Subscriptions = subscription.List{}
err = g.Subscribe(context.Background(), &DummyConnection{}, subs)
require.NoError(t, err, "Subscribe must not error")
}
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(currency.USDT); err != nil {
t.Error(err)
}
if _, err := g.GenerateFuturesDefaultSubscriptions(currency.BTC); 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 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 types.Time
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 types.Time `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 types.Time `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 TestParseTimeUnmarshal(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 types.Time
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 types.Time `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 types.Time `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 types.Time
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 TestUpdateOrderExecutionLimits(t *testing.T) {
t.Parallel()
testexch.UpdatePairsOnce(t, g)
err := g.UpdateOrderExecutionLimits(context.Background(), 1336)
if !errors.Is(err, asset.ErrNotSupported) {
t.Fatalf("received %v, expected %v", err, asset.ErrNotSupported)
}
err = g.UpdateOrderExecutionLimits(context.Background(), asset.Options)
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatalf("received %v, expected %v", err, common.ErrNotYetImplemented)
}
err = g.UpdateOrderExecutionLimits(context.Background(), asset.Spot)
if err != nil {
t.Fatal(err)
}
avail, err := g.GetAvailablePairs(asset.Spot)
if err != nil {
t.Fatal(err)
}
for i := range avail {
mm, err := g.GetOrderExecutionLimits(asset.Spot, avail[i])
if err != nil {
t.Fatal(err)
}
if mm == (order.MinMaxLevel{}) {
t.Fatal("expected a value")
}
if mm.MinimumBaseAmount <= 0 {
t.Fatalf("MinimumBaseAmount expected 0 but received %v for %v", mm.MinimumBaseAmount, avail[i])
}
// 1INCH_TRY no minimum quote or base values are returned.
if mm.QuoteStepIncrementSize <= 0 {
t.Fatalf("QuoteStepIncrementSize expected 0 but received %v for %v", mm.QuoteStepIncrementSize, avail[i])
}
if mm.AmountStepIncrementSize <= 0 {
t.Fatalf("AmountStepIncrementSize expected 0 but received %v for %v", mm.AmountStepIncrementSize, avail[i])
}
}
}
func TestForceFileStandard(t *testing.T) {
t.Parallel()
err := sharedtestvalues.ForceFileStandard(t, sharedtestvalues.EmptyStringPotentialPattern)
if err != nil {
t.Error(err)
}
if t.Failed() {
t.Fatal("Please use types.Number type instead of `float64` and remove `,string` as strings can be empty in unmarshal process. Then call the Float64() method.")
}
}
func TestGetFuturesContractDetails(t *testing.T) {
t.Parallel()
_, err := g.GetFuturesContractDetails(context.Background(), asset.Spot)
if !errors.Is(err, futures.ErrNotFuturesAsset) {
t.Error(err)
}
_, err = g.GetFuturesContractDetails(context.Background(), asset.PerpetualContract)
if !errors.Is(err, asset.ErrNotSupported) {
t.Error(err)
}
_, err = g.GetFuturesContractDetails(context.Background(), asset.DeliveryFutures)
if !errors.Is(err, nil) {
t.Error(err)
}
_, err = g.GetFuturesContractDetails(context.Background(), asset.Futures)
if !errors.Is(err, nil) {
t.Error(err)
}
}
func TestGetLatestFundingRates(t *testing.T) {
t.Parallel()
_, err := g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{
Asset: asset.USDTMarginedFutures,
Pair: currency.NewPair(currency.BTC, currency.USDT),
IncludePredictedRate: true,
})
if !errors.Is(err, asset.ErrNotSupported) {
t.Error(err)
}
_, err = g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.BTC, currency.USD),
})
if err != nil {
t.Error(err)
}
_, err = g.GetLatestFundingRates(context.Background(), &fundingrate.LatestRateRequest{
Asset: asset.Futures,
})
if err != nil {
t.Error(err)
}
}
func TestGetHistoricalFundingRates(t *testing.T) {
t.Parallel()
_, err := g.GetHistoricalFundingRates(context.Background(), nil)
if !errors.Is(err, common.ErrNilPointer) {
t.Fatalf("received: %v, expected: %v", err, common.ErrNilPointer)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{})
if !errors.Is(err, asset.ErrNotSupported) {
t.Fatalf("received: %v, expected: %v", err, asset.ErrNotSupported)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
})
if !errors.Is(err, currency.ErrCurrencyPairEmpty) {
t.Fatalf("received: %v, expected: %v", err, currency.ErrCurrencyPairEmpty)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
})
if !errors.Is(err, fundingrate.ErrPaymentCurrencyCannotBeEmpty) {
t.Fatalf("received: %v, expected: %v", err, fundingrate.ErrPaymentCurrencyCannotBeEmpty)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
IncludePayments: true,
IncludePredictedRate: true,
})
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatalf("received: %v, expected: %v", err, common.ErrNotYetImplemented)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
IncludePredictedRate: true,
})
if !errors.Is(err, common.ErrNotYetImplemented) {
t.Fatalf("received: %v, expected: %v", err, common.ErrNotYetImplemented)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
StartDate: time.Now().Add(time.Hour * 16),
EndDate: time.Now(),
})
if !errors.Is(err, common.ErrStartAfterEnd) {
t.Fatalf("received: %v, expected: %v", err, common.ErrStartAfterEnd)
}
_, err = g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
StartDate: time.Now().Add(-time.Hour * 8008),
EndDate: time.Now(),
})
if !errors.Is(err, fundingrate.ErrFundingRateOutsideLimits) {
t.Fatalf("received: %v, expected: %v", err, fundingrate.ErrFundingRateOutsideLimits)
}
history, err := g.GetHistoricalFundingRates(context.Background(), &fundingrate.HistoricalRatesRequest{
Asset: asset.Futures,
Pair: currency.NewPair(currency.ENJ, currency.USDT),
PaymentCurrency: currency.USDT,
})
if !errors.Is(err, nil) {
t.Fatalf("received: %v, expected: %v", err, nil)
}
assert.NotEmpty(t, history, "should return values")
}
func TestGetOpenInterest(t *testing.T) {
t.Parallel()
_, err := g.GetOpenInterest(context.Background(), key.PairAsset{
Base: currency.ETH.Item,
Quote: currency.USDT.Item,
Asset: asset.USDTMarginedFutures,
})
assert.ErrorIs(t, err, asset.ErrNotSupported, "GetOpenInterest should error correctly")
var resp []futures.OpenInterest
for _, a := range []asset.Item{asset.Futures, asset.DeliveryFutures} {
p := getPair(t, a)
resp, err = g.GetOpenInterest(context.Background(), key.PairAsset{
Base: p.Base.Item,
Quote: p.Quote.Item,
Asset: a,
})
assert.NoErrorf(t, err, "GetOpenInterest should not error for %s asset", a)
assert.Lenf(t, resp, 1, "GetOpenInterest should return 1 item for %s asset", a)
}
resp, err = g.GetOpenInterest(context.Background())
assert.NoError(t, err, "GetOpenInterest should not error")
assert.NotEmpty(t, resp, "GetOpenInterest should return some items")
}
var pairMap = map[asset.Item]currency.Pair{
asset.Spot: currency.NewPairWithDelimiter("BTC", "USDT", "_"),
}
var pairsGuard sync.RWMutex
func getPair(tb testing.TB, a asset.Item) currency.Pair {
tb.Helper()
pairsGuard.RLock()
p, ok := pairMap[a]
pairsGuard.RUnlock()
if ok {
return p
}
pairsGuard.Lock()
defer pairsGuard.Unlock()
p, ok = pairMap[a] // Protect Race if we blocked on Lock and another RW populated
if ok {
return p
}
testexch.UpdatePairsOnce(tb, g)
enabledPairs, err := g.GetEnabledPairs(a)
assert.NoErrorf(tb, err, "%s GetEnabledPairs should not error", a)
if !assert.NotEmpty(tb, enabledPairs, "%s GetEnabledPairs should not be empty", a) {
tb.Fatalf("No pair available for asset %s", a)
return currency.EMPTYPAIR
}
pairMap[a] = enabledPairs[0]
return pairMap[a]
}
func TestGetClientOrderIDFromText(t *testing.T) {
t.Parallel()
assert.Zero(t, getClientOrderIDFromText("api"), "should not return anything")
assert.Equal(t, "t-123", getClientOrderIDFromText("t-123"), "should return t-123")
}
func TestGetTypeFromTimeInForce(t *testing.T) {
t.Parallel()
typeResp, postOnly := getTypeFromTimeInForce("gtc")
assert.Equal(t, order.Limit, typeResp, "should be a limit order")
assert.False(t, postOnly, "should return false")
typeResp, postOnly = getTypeFromTimeInForce("ioc")
assert.Equal(t, order.Market, typeResp, "should be market order")
assert.False(t, postOnly, "should return false")
typeResp, postOnly = getTypeFromTimeInForce("poc")
assert.Equal(t, order.Limit, typeResp, "should be limit order")
assert.True(t, postOnly, "should return true")
typeResp, postOnly = getTypeFromTimeInForce("fok")
assert.Equal(t, order.Market, typeResp, "should be market order")
assert.False(t, postOnly, "should return false")
}
func TestGetSideAndAmountFromSize(t *testing.T) {
t.Parallel()
side, amount, remaining := getSideAndAmountFromSize(1, 1)
assert.Equal(t, order.Long, side, "should be a buy order")
assert.Equal(t, 1.0, amount, "should be 1.0")
assert.Equal(t, 1.0, remaining, "should be 1.0")
side, amount, remaining = getSideAndAmountFromSize(-1, -1)
assert.Equal(t, order.Short, side, "should be a sell order")
assert.Equal(t, 1.0, amount, "should be 1.0")
assert.Equal(t, 1.0, remaining, "should be 1.0")
}
func TestGetFutureOrderSize(t *testing.T) {
t.Parallel()
_, err := getFutureOrderSize(&order.Submit{Side: order.CouldNotCloseShort, Amount: 1})
assert.ErrorIs(t, err, errInvalidOrderSide)
ret, err := getFutureOrderSize(&order.Submit{Side: order.Buy, Amount: 1})
require.NoError(t, err)
assert.Equal(t, 1.0, ret)
ret, err = getFutureOrderSize(&order.Submit{Side: order.Sell, Amount: 1})
require.NoError(t, err)
assert.Equal(t, -1.0, ret)
}
func TestGetTimeInForce(t *testing.T) {
t.Parallel()
_, err := getTimeInForce(&order.Submit{Type: order.Market, PostOnly: true})
assert.ErrorIs(t, err, errPostOnlyOrderTypeUnsupported)
ret, err := getTimeInForce(&order.Submit{Type: order.Market})
require.NoError(t, err)
assert.Equal(t, "ioc", ret)
ret, err = getTimeInForce(&order.Submit{Type: order.Limit, PostOnly: true})
require.NoError(t, err)
assert.Equal(t, "poc", ret)
ret, err = getTimeInForce(&order.Submit{Type: order.Limit})
require.NoError(t, err)
assert.Equal(t, "gtc", ret)
ret, err = getTimeInForce(&order.Submit{Type: order.Market, FillOrKill: true})
require.NoError(t, err)
assert.Equal(t, "fok", ret)
}
func TestProcessFuturesOrdersPushData(t *testing.T) {
t.Parallel()
testCases := []struct {
incoming string
status order.Status
}{
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"","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":"open","text":"-","tif":"gtc","tkfr":0.0005,"user":"110xxxxx"}]}`, order.Open},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"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"}]}`, order.Filled},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"cancelled","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"}]}`, order.Cancelled},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"liquidated","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"}]}`, order.Liquidated},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"ioc","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"}]}`, order.Cancelled},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"auto_deleveraged","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"}]}`, order.AutoDeleverage},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"reduce_only","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"}]}`, order.Cancelled},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"position_closed","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"}]}`, order.Closed},
{`{"channel":"futures.orders","event":"update","time":1541505434,"time_ms":1541505434123,"result":[{"contract":"BTC_USD","create_time":1628736847,"create_time_ms":1628736847325,"fill_price":40000.4,"finish_as":"stp","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"}]}`, order.STP},
}
for _, tc := range testCases {
t.Run("", func(t *testing.T) {
t.Parallel()
processed, err := g.processFuturesOrdersPushData([]byte(tc.incoming), asset.Futures)
require.NoError(t, err)
require.NotNil(t, processed)
for i := range processed {
assert.Equal(t, tc.status.String(), processed[i].Status.String())
}
})
}
}
func TestGetCurrencyTradeURL(t *testing.T) {
t.Parallel()
testexch.UpdatePairsOnce(t, g)
for _, a := range g.GetAssetTypes(false) {
pairs, err := g.CurrencyPairs.GetPairs(a, false)
require.NoError(t, err, "cannot get pairs for %s", a)
require.NotEmpty(t, pairs, "no pairs for %s", a)
resp, err := g.GetCurrencyTradeURL(context.Background(), a, pairs[0])
if a == asset.Options {
require.ErrorIs(t, err, asset.ErrNotSupported)
} else {
require.NoError(t, err)
assert.NotEmpty(t, resp)
}
}
}
func TestGetUnifiedAccount(t *testing.T) {
t.Parallel()
sharedtestvalues.SkipTestIfCredentialsUnset(t, g)
// Requires unified account to be enabled for this to function.
payload, err := g.GetUnifiedAccount(context.Background(), currency.EMPTYCODE)
require.NoError(t, err)
require.NotEmpty(t, payload)
}
func TestGenerateWebsocketMessageID(t *testing.T) {
t.Parallel()
require.NotEmpty(t, g.GenerateWebsocketMessageID(false))
}
type DummyConnection struct{ stream.Connection }
func (d *DummyConnection) GenerateMessageID(bool) int64 { return 1337 }
func (d *DummyConnection) SendMessageReturnResponse(context.Context, request.EndpointLimit, any, any) ([]byte, error) {
return []byte(`{"time":1726121320,"time_ms":1726121320745,"id":1,"conn_id":"f903779a148987ca","trace_id":"d8ee37cd14347e4ed298d44e69aedaa7","channel":"spot.tickers","event":"subscribe","payload":["BRETT_USDT"],"result":{"status":"success"},"requestId":"d8ee37cd14347e4ed298d44e69aedaa7"}`), nil
}
func TestHandleSubscriptions(t *testing.T) {
t.Parallel()
subs := subscription.List{{Channel: subscription.OrderbookChannel}}
err := g.handleSubscription(context.Background(), &DummyConnection{}, subscribeEvent, subs, func(context.Context, stream.Connection, string, subscription.List) ([]WsInput, error) {
return []WsInput{{}}, nil
})
require.NoError(t, err)
err = g.handleSubscription(context.Background(), &DummyConnection{}, unsubscribeEvent, subs, func(context.Context, stream.Connection, string, subscription.List) ([]WsInput, error) {
return []WsInput{{}}, nil
})
require.NoError(t, err)
}