From 07ec505407725b241fd45b1508d74fdd32c58034 Mon Sep 17 00:00:00 2001 From: tiagosiebler Date: Tue, 10 May 2022 13:32:37 +0100 Subject: [PATCH] inverse futures write tests --- src/util/enum.ts | 5 + test/inverse-futures/private.read.test.ts | 158 ++++++++-------- test/inverse-futures/private.write.test.ts | 199 +++++++++++++++++++++ 3 files changed, 279 insertions(+), 83 deletions(-) create mode 100644 test/inverse-futures/private.write.test.ts diff --git a/src/util/enum.ts b/src/util/enum.ts index a0072e2..152f3d4 100644 --- a/src/util/enum.ts +++ b/src/util/enum.ts @@ -1,12 +1,17 @@ export const API_ERROR_CODE = { ORDER_NOT_FOUND_OR_TOO_LATE: 20001, + POSITION_STATUS_NOT_NORMAL: 30013, CANNOT_SET_TRADING_STOP_FOR_ZERO_POS: 30024, /** Seen when placing an order */ INSUFFICIENT_BALANCE_FOR_ORDER_COST: 30031, + POSITION_IDX_NOT_MATCH_POSITION_MODE: 30041, /** Seen if a conditional order is too large */ INSUFFICIENT_BALANCE: 30042, /** E.g. trying to change position margin while on cross */ POSITION_IS_CROSS_MARGIN: 30056, + POSITION_MODE_NOT_MODIFIED: 30083, + ISOLATED_NOT_MODIFIED: 30084, RISK_LIMIT_NOT_EXISTS: 30090, + LEVERAGE_NOT_MODIFIED: 34036, SAME_SLTP_MODE: 37002, } as const; diff --git a/test/inverse-futures/private.read.test.ts b/test/inverse-futures/private.read.test.ts index 78feceb..af52130 100644 --- a/test/inverse-futures/private.read.test.ts +++ b/test/inverse-futures/private.read.test.ts @@ -1,11 +1,7 @@ import { InverseFuturesClient } from '../../src/inverse-futures-client'; -import { - notAuthenticatedError, - successResponseList, - successResponseObject, -} from '../response.util'; +import { successResponseList, successResponseObject } from '../response.util'; -describe('Public Inverse Futures REST API Endpoints', () => { +describe('Public Inverse-Futures REST API GET Endpoints', () => { const useLivenet = true; const API_KEY = process.env.API_KEY_COM; const API_SECRET = process.env.API_SECRET_COM; @@ -17,97 +13,93 @@ describe('Public Inverse Futures REST API Endpoints', () => { // Warning: if some of these start to fail with 10001 params error, it's probably that this future expired and a newer one exists with a different symbol! const symbol = 'BTCUSDU22'; - describe('Inverse-Futures only private GET endpoints', () => { - it('getApiKeyInfo()', async () => { - expect(await api.getApiKeyInfo()).toMatchObject(successResponseObject()); - }); + it('getApiKeyInfo()', async () => { + expect(await api.getApiKeyInfo()).toMatchObject(successResponseObject()); + }); - it('getWalletBalance()', async () => { - expect(await api.getWalletBalance()).toMatchObject( - successResponseObject() - ); - }); + it('getWalletBalance()', async () => { + expect(await api.getWalletBalance()).toMatchObject(successResponseObject()); + }); - it('getWalletFundRecords()', async () => { - expect(await api.getWalletFundRecords()).toMatchObject( - successResponseObject() - ); - }); + it('getWalletFundRecords()', async () => { + expect(await api.getWalletFundRecords()).toMatchObject( + successResponseObject() + ); + }); - it('getWithdrawRecords()', async () => { - expect(await api.getWithdrawRecords()).toMatchObject( - successResponseObject() - ); - }); + it('getWithdrawRecords()', async () => { + expect(await api.getWithdrawRecords()).toMatchObject( + successResponseObject() + ); + }); - it('getAssetExchangeRecords()', async () => { - expect(await api.getAssetExchangeRecords()).toMatchObject( - successResponseList() - ); - }); + it('getAssetExchangeRecords()', async () => { + expect(await api.getAssetExchangeRecords()).toMatchObject( + successResponseList() + ); + }); - it('getActiveOrderList()', async () => { - expect(await api.getActiveOrderList({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('getActiveOrderList()', async () => { + expect(await api.getActiveOrderList({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('queryActiveOrder()', async () => { - expect(await api.queryActiveOrder({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('queryActiveOrder()', async () => { + expect(await api.queryActiveOrder({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('getConditionalOrder()', async () => { - expect(await api.getConditionalOrder({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('getConditionalOrder()', async () => { + expect(await api.getConditionalOrder({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('queryConditionalOrder()', async () => { - expect(await api.queryConditionalOrder({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('queryConditionalOrder()', async () => { + expect(await api.queryConditionalOrder({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('getPosition()', async () => { - expect(await api.getPosition()).toMatchObject(successResponseObject()); - }); + it('getPosition()', async () => { + expect(await api.getPosition()).toMatchObject(successResponseObject()); + }); - it('getTradeRecords()', async () => { - expect(await api.getTradeRecords({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('getTradeRecords()', async () => { + expect(await api.getTradeRecords({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('getClosedPnl()', async () => { - expect(await api.getClosedPnl({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('getClosedPnl()', async () => { + expect(await api.getClosedPnl({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('getRiskLimitList()', async () => { - expect(await api.getRiskLimitList()).toMatchObject( - successResponseList('ok') - ); - }); + it('getRiskLimitList()', async () => { + expect(await api.getRiskLimitList()).toMatchObject( + successResponseList('ok') + ); + }); - it('getMyLastFundingFee()', async () => { - expect(await api.getMyLastFundingFee({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('getMyLastFundingFee()', async () => { + expect(await api.getMyLastFundingFee({ symbol: symbol })).toMatchObject( + successResponseObject() + ); + }); - it('getPredictedFunding()', async () => { - expect(await api.getPredictedFunding({ symbol: 'BTCUSD' })).toMatchObject( - successResponseObject() - ); - }); + it('getPredictedFunding()', async () => { + expect(await api.getPredictedFunding({ symbol: 'BTCUSD' })).toMatchObject( + successResponseObject() + ); + }); - it('getLcpInfo()', async () => { - expect(await api.getLcpInfo({ symbol: symbol })).toMatchObject( - successResponseObject() - ); - }); + it('getLcpInfo()', async () => { + expect(await api.getLcpInfo({ symbol: symbol })).toMatchObject( + successResponseObject() + ); }); }); diff --git a/test/inverse-futures/private.write.test.ts b/test/inverse-futures/private.write.test.ts new file mode 100644 index 0000000..f79707c --- /dev/null +++ b/test/inverse-futures/private.write.test.ts @@ -0,0 +1,199 @@ +import { InverseFuturesClient } from '../../src'; +import { API_ERROR_CODE } from '../../src/util/enum'; +import { successResponseObject } from '../response.util'; + +describe('Private Inverse-Futures REST API POST Endpoints', () => { + const useLivenet = true; + const API_KEY = process.env.API_KEY_COM; + const API_SECRET = process.env.API_SECRET_COM; + + it('should have api credentials to test with', () => { + expect(API_KEY).toStrictEqual(expect.any(String)); + expect(API_SECRET).toStrictEqual(expect.any(String)); + }); + + const api = new InverseFuturesClient(API_KEY, API_SECRET, useLivenet, { + disable_time_sync: true, + }); + + // Warning: if some of these start to fail with 10001 params error, it's probably that this future expired and a newer one exists with a different symbol! + const symbol = 'BTCUSDU22'; + + // These tests are primarily check auth is working by expecting balance or order not found style errors + + it('placeActiveOrder()', async () => { + expect( + await api.placeActiveOrder({ + side: 'Buy', + symbol, + order_type: 'Limit', + price: 30000, + qty: 1, + time_in_force: 'GoodTillCancel', + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.POSITION_IDX_NOT_MATCH_POSITION_MODE, + ret_msg: 'position idx not match position mode', + }); + }); + + it('cancelActiveOrder()', async () => { + expect( + await api.cancelActiveOrder({ + symbol, + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.ORDER_NOT_FOUND_OR_TOO_LATE, + ret_msg: 'order not exists or too late to cancel', + }); + }); + + it('cancelAllActiveOrders()', async () => { + expect( + await api.cancelAllActiveOrders({ + symbol, + }) + ).toMatchObject(successResponseObject()); + }); + + it('replaceActiveOrder()', async () => { + expect( + await api.replaceActiveOrder({ + symbol, + order_id: '123123123', + p_r_qty: '1', + p_r_price: '30000', + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.ORDER_NOT_FOUND_OR_TOO_LATE, + ret_msg: 'order not exists or too late to replace', + }); + }); + + it('placeConditionalOrder()', async () => { + expect( + await api.placeConditionalOrder({ + order_type: 'Limit', + side: 'Buy', + symbol, + qty: '1', + price: '8100', + base_price: '8300', + stop_px: '8150', + time_in_force: 'GoodTillCancel', + order_link_id: 'cus_order_id_1', + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.POSITION_IDX_NOT_MATCH_POSITION_MODE, + ret_msg: 'position idx not match position mode', + }); + }); + + it('cancelConditionalOrder()', async () => { + expect( + await api.cancelConditionalOrder({ + symbol, + order_link_id: 'lkasmdflasd', + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.ORDER_NOT_FOUND_OR_TOO_LATE, + ret_msg: 'order not exists or too late to cancel', + }); + }); + + it('cancelAllConditionalOrders()', async () => { + expect( + await api.cancelAllConditionalOrders({ + symbol, + }) + ).toMatchObject(successResponseObject()); + }); + + it('replaceConditionalOrder()', async () => { + expect( + await api.replaceConditionalOrder({ + symbol, + p_r_price: '50000', + p_r_qty: 1, + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.ORDER_NOT_FOUND_OR_TOO_LATE, + ret_msg: 'order not exists or too late to replace', + }); + }); + + it('changePositionMargin()', async () => { + expect( + await api.changePositionMargin({ + symbol, + margin: '10', + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.POSITION_IDX_NOT_MATCH_POSITION_MODE, + ret_msg: 'position idx not match position mode', + }); + }); + + it('setTradingStop()', async () => { + expect( + await api.setTradingStop({ + symbol, + take_profit: 50000, + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.POSITION_STATUS_NOT_NORMAL, + ret_msg: 'position status is not normal', + }); + }); + + it('setUserLeverage()', async () => { + expect( + await api.setUserLeverage({ + symbol, + buy_leverage: 5, + sell_leverage: 5, + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.LEVERAGE_NOT_MODIFIED, + ret_msg: 'leverage not modified', + }); + }); + + it('setPositionMode()', async () => { + expect( + await api.setPositionMode({ + symbol, + mode: 3, + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.POSITION_MODE_NOT_MODIFIED, + ret_msg: 'position mode not modified', + }); + }); + + it('setMarginType()', async () => { + expect( + await api.setMarginType({ + symbol, + is_isolated: false, + buy_leverage: 5, + sell_leverage: 5, + }) + ).toMatchObject({ + ret_code: API_ERROR_CODE.ISOLATED_NOT_MODIFIED, + ret_msg: 'Isolated not modified', + }); + }); + + it('setRiskLimit()', async () => { + expect( + await api.setRiskLimit({ + symbol, + risk_id: 'myriskid', + }) + ).toMatchObject({ + ret_code: -1, + ret_msg: `Currently not support symbol[${symbol}]`, + }); + }); +});