mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* 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
248 lines
8.8 KiB
Go
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
|
|
}
|