mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 23:16:45 +00:00
* Added TimeInForce type and updated related files * Linter issue fix and minor coinbasepro type update * Bitrex consts update * added unit test and minor changes in bittrex * Unit tests update * Fix minor linter issues * Update TestStringToTimeInForce unit test * Exchange test template change * A different approach * fix conflict with gateio timeInForce * minor exchange template update * Minor fix to test_files template * Update order tests * Complete updating the order unit tests * Updating exchange wrapper and test template files * update kucoin and deribit wrapper to match the time in force change * minor comment update * fix time-in-force related test errors * linter issue fix * ADD_NEW_EXCHANGE documentation update * time in force constants, functions and unit tests update * shift tif policies to TimeInForce * Update time-in-force, related functions, and unit tests * fix linter issue and time-in-force processing * added a good till crossing tif value * order type fix and fix related tim-in-force entries * update time-in-force unmarshaling and unit test * consistency guideline added * fix time-in-force error in gateio * linter issue fix * update based on review comments * add unit test and fix missing issues * minor fix and added benchmark unit test * change GTT to GTC for limit * fix linter issue * added time-in-force value to place order param * fix minor issues based on review comment and move tif code to separate files * update on exchanges linked to time-in-force * resolve missing review comments * minor linter issues fix * added time-in-force handler and update timeInForce parametered endpoint * minor fixes based on review * nits fix * update based on review * linter fix * rm getTimeInForce func and minor change to time-in-force * minor change * update based on review comments * wrappers and time-in-force calling approach * minor change * update gateio string to timeInForce conversion and unit test * update exchange template * update wrapper template file * policy comments, and template files update * rename all exchange types name to Exchange * update on template files and template generation * templates and generation code and other updates * linter issue fix * added subscriptions and websocket templates * update ADD_NEW_EXCHANGE.md with recent binance functions and implementations * rename template files and update unit tests * minor template and unit test fix * rename templates and fix on unit tests * update on template files and documentation * removed unnecessary tag fix and update templates * fix Add_NEW_EXCHANGE.md doc file * formatting, comments, and error checks update on template files * rename exchange receivers to e and ex for consistency * rename unit test exchange receiver and minor updates * linter issues fix * fix deribit issue and minor style update * fix test issues caused by receiver change * raname local variables exchange declaration variables * update templates comments * update templates and related comments * renamed ex to e * update template comments * toggle WS to false to improve coverage * template comments update * added test coverage to Ws enabled and minor changes --------- Co-authored-by: Samuel Reid <43227667+cranktakular@users.noreply.github.com>
205 lines
5.8 KiB
Go
205 lines
5.8 KiB
Go
package gateio
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/thrasher-corp/gocryptotrader/currency"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/kline"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/orderbook"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/subscription"
|
|
testexch "github.com/thrasher-corp/gocryptotrader/internal/testing/exchange"
|
|
)
|
|
|
|
func TestProcessOrderbookUpdate(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
m := newWsOBUpdateManager(0)
|
|
err := m.ProcessOrderbookUpdate(t.Context(), e, 1337, &orderbook.Update{})
|
|
assert.ErrorIs(t, err, currency.ErrCurrencyPairEmpty)
|
|
|
|
pair := currency.NewPair(currency.BABY, currency.BABYDOGE)
|
|
err = e.Websocket.Orderbook.LoadSnapshot(&orderbook.Book{
|
|
Exchange: e.Name,
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
Bids: []orderbook.Level{{Price: 1, Amount: 1}},
|
|
Asks: []orderbook.Level{{Price: 1, Amount: 1}},
|
|
LastUpdated: time.Now(),
|
|
LastPushed: time.Now(),
|
|
LastUpdateID: 1336,
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = m.ProcessOrderbookUpdate(t.Context(), e, 1337, &orderbook.Update{
|
|
UpdateID: 1338,
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
AllowEmpty: true,
|
|
UpdateTime: time.Now(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
// Test orderbook snapshot is behind update
|
|
err = m.ProcessOrderbookUpdate(t.Context(), e, 1340, &orderbook.Update{
|
|
UpdateID: 1341,
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
AllowEmpty: true,
|
|
UpdateTime: time.Now(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
cache := m.LoadCache(pair, asset.USDTMarginedFutures)
|
|
|
|
cache.mtx.Lock()
|
|
assert.Len(t, cache.updates, 1)
|
|
assert.True(t, cache.updating)
|
|
cache.mtx.Unlock()
|
|
|
|
// Test orderbook snapshot is behind update
|
|
err = m.ProcessOrderbookUpdate(t.Context(), e, 1342, &orderbook.Update{
|
|
UpdateID: 1343,
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
AllowEmpty: true,
|
|
UpdateTime: time.Now(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
cache.mtx.Lock()
|
|
assert.Len(t, cache.updates, 2)
|
|
assert.True(t, cache.updating)
|
|
cache.mtx.Unlock()
|
|
|
|
time.Sleep(time.Millisecond * 2) // Allow sync delay to pass
|
|
|
|
cache.mtx.Lock()
|
|
assert.Empty(t, cache.updates)
|
|
assert.False(t, cache.updating)
|
|
cache.mtx.Unlock()
|
|
}
|
|
|
|
func TestLoadCache(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
m := newWsOBUpdateManager(0)
|
|
pair := currency.NewPair(currency.BABY, currency.BABYDOGE)
|
|
cache := m.LoadCache(pair, asset.USDTMarginedFutures)
|
|
assert.NotNil(t, cache)
|
|
assert.Len(t, m.lookup, 1)
|
|
|
|
// Test cache is reused
|
|
cache2 := m.LoadCache(pair, asset.USDTMarginedFutures)
|
|
assert.Equal(t, cache, cache2)
|
|
}
|
|
|
|
func TestSyncOrderbook(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
e := new(Exchange)
|
|
require.NoError(t, testexch.Setup(e), "Setup must not error")
|
|
require.NoError(t, e.UpdateTradablePairs(t.Context(), false))
|
|
|
|
// Add dummy subscription so that it can be matched and a limit/level can be extracted for initial orderbook sync spot.
|
|
err := e.Websocket.AddSubscriptions(nil, &subscription.Subscription{Channel: subscription.OrderbookChannel, Interval: kline.HundredMilliseconds})
|
|
require.NoError(t, err)
|
|
|
|
m := newWsOBUpdateManager(defaultWSSnapshotSyncDelay)
|
|
|
|
for _, a := range []asset.Item{asset.Spot, asset.USDTMarginedFutures} {
|
|
pair := currency.NewPair(currency.ETH, currency.USDT)
|
|
err := e.CurrencyPairs.EnablePair(a, pair)
|
|
require.NoError(t, err)
|
|
cache := m.LoadCache(pair, a)
|
|
|
|
cache.updates = []pendingUpdate{{update: &orderbook.Update{Pair: pair, Asset: a}}}
|
|
cache.updating = true
|
|
err = cache.SyncOrderbook(t.Context(), e, pair, a)
|
|
require.NoError(t, err)
|
|
require.False(t, cache.updating)
|
|
require.Empty(t, cache.updates)
|
|
|
|
expectedLimit := 20
|
|
if a == asset.Spot {
|
|
expectedLimit = 100
|
|
}
|
|
|
|
b, err := e.Websocket.Orderbook.GetOrderbook(pair, a)
|
|
require.NoError(t, err)
|
|
require.Len(t, b.Bids, expectedLimit)
|
|
require.Len(t, b.Asks, expectedLimit)
|
|
}
|
|
}
|
|
|
|
func TestApplyPendingUpdates(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
e := new(Exchange)
|
|
require.NoError(t, testexch.Setup(e), "Setup must not error")
|
|
require.NoError(t, e.UpdateTradablePairs(t.Context(), false))
|
|
|
|
m := newWsOBUpdateManager(defaultWSSnapshotSyncDelay)
|
|
pair := currency.NewPair(currency.LTC, currency.USDT)
|
|
err := e.Websocket.Orderbook.LoadSnapshot(&orderbook.Book{
|
|
Exchange: e.Name,
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
Bids: []orderbook.Level{{Price: 1, Amount: 1}},
|
|
Asks: []orderbook.Level{{Price: 1, Amount: 1}},
|
|
LastUpdated: time.Now(),
|
|
LastPushed: time.Now(),
|
|
LastUpdateID: 1335,
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
cache := m.LoadCache(pair, asset.USDTMarginedFutures)
|
|
|
|
update := &orderbook.Update{
|
|
UpdateID: 1339,
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
AllowEmpty: true,
|
|
UpdateTime: time.Now(),
|
|
}
|
|
|
|
cache.updates = []pendingUpdate{{update: update, firstUpdateID: 1337}}
|
|
err = cache.applyPendingUpdates(e, asset.USDTMarginedFutures)
|
|
require.ErrorIs(t, err, errOrderbookSnapshotOutdated)
|
|
|
|
cache.updates[0].firstUpdateID = 1336
|
|
err = cache.applyPendingUpdates(e, asset.USDTMarginedFutures)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestApplyOrderbookUpdate(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
e := new(Exchange)
|
|
require.NoError(t, testexch.Setup(e), "Setup must not error")
|
|
require.NoError(t, e.UpdateTradablePairs(t.Context(), false))
|
|
|
|
pair := currency.NewBTCUSDT()
|
|
|
|
update := &orderbook.Update{
|
|
Pair: pair,
|
|
Asset: asset.USDTMarginedFutures,
|
|
AllowEmpty: true,
|
|
UpdateTime: time.Now(),
|
|
}
|
|
|
|
err := applyOrderbookUpdate(e, update)
|
|
require.ErrorIs(t, err, orderbook.ErrDepthNotFound)
|
|
|
|
update.Asset = asset.Spot
|
|
err = applyOrderbookUpdate(e, update)
|
|
require.ErrorIs(t, err, orderbook.ErrDepthNotFound)
|
|
|
|
update.Pair = currency.NewPair(currency.BABY, currency.BABYDOGE)
|
|
err = applyOrderbookUpdate(e, update)
|
|
require.NoError(t, err)
|
|
}
|