Files
gocryptotrader/exchanges/gateio/gateio_websocket_request_spot_test.go
Gareth Kirwan b4e45e9a1b Websocket: Restructure files and types (#1859)
* Websocket: Rename stream package

* Websocket: Rename Websocket to Manager

* Websocket: Replace explicit errs with common.NilGuard

* Websocket: Move websocket_types.go to types.go

* Websocket: Minor field comment and alignment in types

* Webosocket: Rename WebsocketConnection to Connection

* Alphapoint: Make gorilla ws import explicit

Just to avoid confusion with our own packages.

* Websocket: Move stream_match to match

* Websocket: Move websocket_connection to connection

* Websocket: Move websocket.go to manager.go

* Websocket: Break out all subscription methods into subscriptions.go

* Websocket: Move connection type into its file

* Websocket: Remove PositionUpdated

Type is not used anywhere

* Kraken: Use local constant for pong

Was the only use of websocket.Pong and doesn't really feel right to
represent kraken's api resp in one of our packages

* Websocket: Move connection sub-types to connection package

* Websocket: Move manager types into manager

* Websocket: Move ConnectionWrapper into manager

* Websocket: Move websocket_test to manager_test

* Websocket: Privatise connectionWrapper

* Websocket: Remaining types into types.go

These really belong somewhere else mostly, but this will do for now

* Websocket: Tidy up connection method vars

* Gofumpt: Moving package imports around

* Websocket: Rename errDuplicateConnectionSetup

* Websocket: Fix duplicate import of gws

* Websocket: Fix gofumpt -extra

* Websocket: Standardise import of gws across other pkgs

* Kraken: Remove unused sub conf consts

These were replaced by the generic Levels and Depth fields on all subs

* Websocket: Privitise ConnectioWrapper fields

* Websocket: inline single use var WebsocketNotAuthenticatedUsingRest

* Websocket: Move documentation to template

* Bithumb: Assertify TestWsHandleData
2025-04-10 16:25:02 +10:00

248 lines
8.8 KiB
Go

package gateio
import (
"context"
"strings"
"testing"
"github.com/stretchr/testify/require"
"github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/config"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
"github.com/thrasher-corp/gocryptotrader/exchanges/order"
"github.com/thrasher-corp/gocryptotrader/exchanges/sharedtestvalues"
testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange"
)
func TestWebsocketLogin(t *testing.T) {
t.Parallel()
err := g.websocketLogin(context.Background(), nil, "")
require.ErrorIs(t, err, common.ErrNilPointer)
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
c, err := g.Websocket.GetConnection(asset.Spot)
require.NoError(t, err)
err = g.websocketLogin(context.Background(), c, "")
require.ErrorIs(t, err, errChannelEmpty)
err = g.websocketLogin(context.Background(), c, "spot.login")
require.NoError(t, err)
}
func TestWebsocketSpotSubmitOrder(t *testing.T) {
t.Parallel()
_, err := g.WebsocketSpotSubmitOrder(context.Background(), &WebsocketOrder{})
require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
out := &WebsocketOrder{CurrencyPair: "BTC_USDT"}
_, err = g.WebsocketSpotSubmitOrder(context.Background(), out)
require.ErrorIs(t, err, order.ErrSideIsInvalid)
out.Side = strings.ToLower(order.Buy.String())
_, err = g.WebsocketSpotSubmitOrder(context.Background(), out)
require.ErrorIs(t, err, errInvalidAmount)
out.Amount = "0.0003"
out.Type = "limit"
_, err = g.WebsocketSpotSubmitOrder(context.Background(), out)
require.ErrorIs(t, err, errInvalidPrice)
out.Price = "20000"
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
got, err := g.WebsocketSpotSubmitOrder(context.Background(), out)
require.NoError(t, err)
require.NotEmpty(t, got)
}
func TestWebsocketSpotSubmitOrders(t *testing.T) {
t.Parallel()
_, err := g.WebsocketSpotSubmitOrders(context.Background(), nil)
require.ErrorIs(t, err, errOrdersEmpty)
_, err = g.WebsocketSpotSubmitOrders(context.Background(), make([]WebsocketOrder, 1))
require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
out := WebsocketOrder{CurrencyPair: "BTC_USDT"}
_, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out})
require.ErrorIs(t, err, order.ErrSideIsInvalid)
out.Side = strings.ToLower(order.Buy.String())
_, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out})
require.ErrorIs(t, err, errInvalidAmount)
out.Amount = "0.0003"
out.Type = "limit"
_, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out})
require.ErrorIs(t, err, errInvalidPrice)
out.Price = "20000"
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
// test single order
got, err := g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out})
require.NoError(t, err)
require.NotEmpty(t, got)
// test batch orders
got, err = g.WebsocketSpotSubmitOrders(context.Background(), []WebsocketOrder{out, out})
require.NoError(t, err)
require.NotEmpty(t, got)
}
func TestWebsocketSpotCancelOrder(t *testing.T) {
t.Parallel()
_, err := g.WebsocketSpotCancelOrder(context.Background(), "", currency.EMPTYPAIR, "")
require.ErrorIs(t, err, order.ErrOrderIDNotSet)
_, err = g.WebsocketSpotCancelOrder(context.Background(), "1337", currency.EMPTYPAIR, "")
require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
btcusdt, err := currency.NewPairFromString("BTC_USDT")
require.NoError(t, err)
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
got, err := g.WebsocketSpotCancelOrder(context.Background(), "644913098758", btcusdt, "")
require.NoError(t, err)
require.NotEmpty(t, got)
}
func TestWebsocketSpotCancelAllOrdersByIDs(t *testing.T) {
t.Parallel()
_, err := g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{})
require.ErrorIs(t, err, errNoOrdersToCancel)
out := WebsocketOrderBatchRequest{}
_, err = g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{out})
require.ErrorIs(t, err, order.ErrOrderIDNotSet)
out.OrderID = "1337"
_, err = g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{out})
require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
out.Pair, err = currency.NewPairFromString("BTC_USDT")
require.NoError(t, err)
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
out.OrderID = "644913101755"
got, err := g.WebsocketSpotCancelAllOrdersByIDs(context.Background(), []WebsocketOrderBatchRequest{out})
require.NoError(t, err)
require.NotEmpty(t, got)
}
func TestWebsocketSpotCancelAllOrdersByPair(t *testing.T) {
t.Parallel()
pair, err := currency.NewPairFromString("LTC_USDT")
require.NoError(t, err)
_, err = g.WebsocketSpotCancelAllOrdersByPair(context.Background(), pair, 0, "")
require.ErrorIs(t, err, order.ErrSideIsInvalid)
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
got, err := g.WebsocketSpotCancelAllOrdersByPair(context.Background(), currency.EMPTYPAIR, order.Buy, "")
require.NoError(t, err)
require.NotEmpty(t, got)
}
func TestWebsocketSpotAmendOrder(t *testing.T) {
t.Parallel()
_, err := g.WebsocketSpotAmendOrder(context.Background(), nil)
require.ErrorIs(t, err, common.ErrNilPointer)
amend := &WebsocketAmendOrder{}
_, err = g.WebsocketSpotAmendOrder(context.Background(), amend)
require.ErrorIs(t, err, order.ErrOrderIDNotSet)
amend.OrderID = "1337"
_, err = g.WebsocketSpotAmendOrder(context.Background(), amend)
require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
amend.Pair, err = currency.NewPairFromString("BTC_USDT")
require.NoError(t, err)
_, err = g.WebsocketSpotAmendOrder(context.Background(), amend)
require.ErrorIs(t, err, errInvalidAmount)
amend.Amount = "0.0004"
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
amend.OrderID = "645029162673"
got, err := g.WebsocketSpotAmendOrder(context.Background(), amend)
require.NoError(t, err)
require.NotEmpty(t, got)
}
func TestWebsocketSpotGetOrderStatus(t *testing.T) {
t.Parallel()
_, err := g.WebsocketSpotGetOrderStatus(context.Background(), "", currency.EMPTYPAIR, "")
require.ErrorIs(t, err, order.ErrOrderIDNotSet)
_, err = g.WebsocketSpotGetOrderStatus(context.Background(), "1337", currency.EMPTYPAIR, "")
require.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
sharedtestvalues.SkipTestIfCredentialsUnset(t, g, canManipulateRealOrders)
testexch.UpdatePairsOnce(t, g)
g := getWebsocketInstance(t, g) //nolint:govet // Intentional shadow to avoid future copy/paste mistakes
pair, err := currency.NewPairFromString("BTC_USDT")
require.NoError(t, err)
got, err := g.WebsocketSpotGetOrderStatus(context.Background(), "644999650452", pair, "")
require.NoError(t, err)
require.NotEmpty(t, got)
}
// getWebsocketInstance returns a websocket instance copy for testing.
// This restricts the pairs to a single pair per asset type to reduce test time.
func getWebsocketInstance(t *testing.T, g *Gateio) *Gateio {
t.Helper()
cpy := new(Gateio)
cpy.SetDefaults()
gConf, err := config.GetConfig().GetExchangeConfig("GateIO")
require.NoError(t, err)
gConf.API.AuthenticatedSupport = true
gConf.API.AuthenticatedWebsocketSupport = true
gConf.API.Credentials.Key = apiKey
gConf.API.Credentials.Secret = apiSecret
require.NoError(t, cpy.Setup(gConf), "Test instance Setup must not error")
cpy.CurrencyPairs.Load(&g.CurrencyPairs)
for _, a := range cpy.GetAssetTypes(true) {
if a != asset.Spot {
require.NoError(t, cpy.CurrencyPairs.SetAssetEnabled(a, false))
continue
}
avail, err := cpy.GetAvailablePairs(a)
require.NoError(t, err)
if len(avail) > 1 {
avail = avail[:1]
}
require.NoError(t, cpy.SetPairs(avail, a, true))
}
require.NoError(t, cpy.Websocket.Connect())
return cpy
}