From b0f9bb67237d55b58b570578c7d600a34052f149 Mon Sep 17 00:00:00 2001 From: Molham Hamwi Date: Tue, 12 May 2026 07:13:06 +0200 Subject: [PATCH] feat: add query margin mode endpoint --- .../services/trade.service.spec.ts | 52 +++++++++++++++++++ src/bingx-client/services/trade.service.ts | 7 +++ .../bingx-query-margin-mode-endpoint.ts | 45 ++++++++++++++++ src/bingx/endpoints/index.ts | 1 + 4 files changed, 105 insertions(+) create mode 100644 src/bingx-client/services/trade.service.spec.ts create mode 100644 src/bingx/endpoints/bingx-query-margin-mode-endpoint.ts diff --git a/src/bingx-client/services/trade.service.spec.ts b/src/bingx-client/services/trade.service.spec.ts new file mode 100644 index 0000000..63f8125 --- /dev/null +++ b/src/bingx-client/services/trade.service.spec.ts @@ -0,0 +1,52 @@ +import { AccountInterface } from 'bingx-api/bingx/account/account.interface'; +import { BingxQueryMarginModeEndpoint } from 'bingx-api/bingx/endpoints/bingx-query-margin-mode-endpoint'; +import { TradeService } from 'bingx-api/bingx-client/services/trade.service'; + +const account: AccountInterface = { + getApiKey: jest.fn().mockReturnValue('api-key'), + sign: jest.fn(), +}; + +describe('BingxQueryMarginModeEndpoint', () => { + beforeEach(() => { + jest.spyOn(Date, 'now').mockReturnValue(1700000000000); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('describes the query margin mode endpoint', () => { + const endpoint = new BingxQueryMarginModeEndpoint('BTC-USDT', account); + + expect(endpoint.method()).toBe('get'); + expect(endpoint.path()).toBe('/openApi/swap/v2/trade/marginType'); + expect(endpoint.parameters().asRecord()).toEqual({ + symbol: 'BTC-USDT', + timestamp: '1700000000000', + }); + }); +}); + +describe('TradeService.queryMarginMode', () => { + it('executes a query margin mode endpoint', async () => { + const response = { + code: 0, + msg: '', + data: { symbol: 'BTC-USDT', marginType: 'CROSSED' }, + }; + const requestExecutor = { + execute: jest.fn().mockResolvedValue(response), + }; + const service = new TradeService(requestExecutor); + + await expect(service.queryMarginMode('BTC-USDT', account)).resolves.toBe( + response, + ); + + expect(requestExecutor.execute).toHaveBeenCalledTimes(1); + expect(requestExecutor.execute).toHaveBeenCalledWith( + expect.any(BingxQueryMarginModeEndpoint), + ); + }); +}); diff --git a/src/bingx-client/services/trade.service.ts b/src/bingx-client/services/trade.service.ts index 65fa5bd..cc6fbe4 100644 --- a/src/bingx-client/services/trade.service.ts +++ b/src/bingx-client/services/trade.service.ts @@ -9,6 +9,7 @@ import { MarginType, } from 'bingx-api/bingx/endpoints/bingx-switch-margin-mode-endpoint'; import { BingxSwitchLeverageEndpoint } from 'bingx-api/bingx/endpoints/bingx-switch-leverage-endpoint'; +import { BingxQueryMarginModeEndpoint } from 'bingx-api/bingx/endpoints/bingx-query-margin-mode-endpoint'; import { OrderPositionSideEnum } from 'bingx-api/bingx'; import { BingxUserHistoryOrdersEndpoint } from 'bingx-api/bingx/endpoints/bingx-user-history-orders-endpoint'; import { BingxCancelOrderEndpoint } from 'bingx-api/bingx/endpoints/bingx-cancel-order-endpoint'; @@ -84,6 +85,12 @@ export class TradeService { ); } + public queryMarginMode(symbol: string, account: AccountInterface) { + return this.requestExecutor.execute( + new BingxQueryMarginModeEndpoint(symbol, account), + ); + } + public switchLeverage( symbol: string, leverage: number, diff --git a/src/bingx/endpoints/bingx-query-margin-mode-endpoint.ts b/src/bingx/endpoints/bingx-query-margin-mode-endpoint.ts new file mode 100644 index 0000000..a4eda08 --- /dev/null +++ b/src/bingx/endpoints/bingx-query-margin-mode-endpoint.ts @@ -0,0 +1,45 @@ +import { + AccountInterface, + DefaultSignatureParameters, + Endpoint, + EndpointInterface, + SignatureParametersInterface, +} from 'bingx-api/bingx'; +import { MarginType } from 'bingx-api/bingx/endpoints/bingx-switch-margin-mode-endpoint'; + +export interface QueryMarginModeResponse { + code: number; + msg: string; + data: { + symbol: string; + marginType: MarginType; + }; +} + +export class BingxQueryMarginModeEndpoint + extends Endpoint + implements EndpointInterface +{ + public constructor( + private readonly symbol: string, + account: AccountInterface, + ) { + super(account); + } + + method(): 'get' | 'post' | 'put' | 'patch' | 'delete' { + return 'get'; + } + + parameters(): SignatureParametersInterface { + return new DefaultSignatureParameters({ + symbol: this.symbol, + }); + } + + path(): string { + return '/openApi/swap/v2/trade/marginType'; + } + + readonly t!: QueryMarginModeResponse; +} diff --git a/src/bingx/endpoints/index.ts b/src/bingx/endpoints/index.ts index 6866f8b..bd5d140 100644 --- a/src/bingx/endpoints/index.ts +++ b/src/bingx/endpoints/index.ts @@ -13,3 +13,4 @@ export * from './endpoint'; export * from './bingx-user-history-orders-endpoint'; export * from './bingx-user-history-orders-response'; export * from './bingx-cancel-order-endpoint'; +export * from './bingx-query-margin-mode-endpoint';