feat(#3): implement initial public API tests
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
# bybit-api
|
# bybit-api
|
||||||
|
[](https://circleci.com/gh/tiagosiebler/bybit-api)
|
||||||
[][1] [][1] [][1]
|
[][1] [][1] [][1]
|
||||||
[][1]
|
[][1]
|
||||||
[](https://www.codefactor.io/repository/github/tiagosiebler/bybit-api)
|
[](https://www.codefactor.io/repository/github/tiagosiebler/bybit-api)
|
||||||
|
|||||||
27
jest.config.js
Normal file
27
jest.config.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// jest.config.js
|
||||||
|
module.exports = {
|
||||||
|
rootDir: './',
|
||||||
|
globals: {
|
||||||
|
__DEV__: true,
|
||||||
|
__PROD__: false
|
||||||
|
},
|
||||||
|
testEnvironment: 'node',
|
||||||
|
preset: "ts-jest",
|
||||||
|
verbose: true, // report individual test
|
||||||
|
bail: false, // enable to stop test when an error occur,
|
||||||
|
moduleDirectories: ['node_modules', 'src', 'test'],
|
||||||
|
testMatch: ['**/test/**/*.test.ts?(x)'],
|
||||||
|
testPathIgnorePatterns: ['node_modules/', 'dist/', '.json'],
|
||||||
|
collectCoverageFrom: [
|
||||||
|
'src/**/*.ts'
|
||||||
|
],
|
||||||
|
coverageThreshold: {
|
||||||
|
// coverage strategy
|
||||||
|
global: {
|
||||||
|
branches: 80,
|
||||||
|
functions: 80,
|
||||||
|
lines: 50,
|
||||||
|
statements: -10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
3795
package-lock.json
generated
3795
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,8 @@
|
|||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "jest",
|
||||||
|
"test:watch": "jest --watch",
|
||||||
"clean": "rm -rf lib dist",
|
"clean": "rm -rf lib dist",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"build:clean": "npm run clean && npm run build",
|
"build:clean": "npm run clean && npm run build",
|
||||||
@@ -28,9 +29,12 @@
|
|||||||
"ws": "^7.4.0"
|
"ws": "^7.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/jest": "^26.0.23",
|
||||||
"@types/node": "^14.14.7",
|
"@types/node": "^14.14.7",
|
||||||
"eslint": "^7.10.0",
|
"eslint": "^7.10.0",
|
||||||
|
"jest": "^27.0.4",
|
||||||
"source-map-loader": "^2.0.0",
|
"source-map-loader": "^2.0.0",
|
||||||
|
"ts-jest": "^27.0.3",
|
||||||
"ts-loader": "^8.0.11",
|
"ts-loader": "^8.0.11",
|
||||||
"typescript": "^4.0.5",
|
"typescript": "^4.0.5",
|
||||||
"webpack": "^5.4.0",
|
"webpack": "^5.4.0",
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ export class InverseClient extends SharedEndpoints {
|
|||||||
restClientOptions: RestClientOptions = {},
|
restClientOptions: RestClientOptions = {},
|
||||||
requestOptions: AxiosRequestConfig = {}
|
requestOptions: AxiosRequestConfig = {}
|
||||||
) {
|
) {
|
||||||
super()
|
super();
|
||||||
|
|
||||||
this.requestWrapper = new RequestWrapper(
|
this.requestWrapper = new RequestWrapper(
|
||||||
key,
|
key,
|
||||||
secret,
|
secret,
|
||||||
@@ -53,9 +54,9 @@ export class InverseClient extends SharedEndpoints {
|
|||||||
*/
|
*/
|
||||||
getLatestInformation(params?: {
|
getLatestInformation(params?: {
|
||||||
symbol?: string;
|
symbol?: string;
|
||||||
}): GenericAPIResponse {
|
}): GenericAPIResponse {
|
||||||
return this.getTickers(params);
|
return this.getTickers(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated use getTrades() instead
|
* @deprecated use getTrades() instead
|
||||||
|
|||||||
70
test/inverse/public.test.ts
Normal file
70
test/inverse/public.test.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import { InverseClient } from "../../src/inverse-client";
|
||||||
|
import { successResponseList, successResponseObject } from "../response.util";
|
||||||
|
|
||||||
|
describe('Public Inverse REST API Endpoints', () => {
|
||||||
|
const useLivenet = true;
|
||||||
|
const api = new InverseClient(undefined, undefined, useLivenet);
|
||||||
|
|
||||||
|
const symbol = 'BTCUSD';
|
||||||
|
const interval = '15';
|
||||||
|
const timestampOneHourAgo = (new Date().getTime() / 1000) - (1000 * 60 * 60);
|
||||||
|
const from = Number(timestampOneHourAgo.toFixed(0));
|
||||||
|
|
||||||
|
describe('Inverse only endpoints', () => {
|
||||||
|
it('should throw for unauthenticated private calls', async () => {
|
||||||
|
expect(() => api.getPosition()).rejects.toMatchObject(new Error('Private endpoints require api and private keys set'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getKline()', async () => {
|
||||||
|
expect(
|
||||||
|
await api.getKline({ symbol, interval, from })
|
||||||
|
).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getTrades()', async () => {
|
||||||
|
expect(await api.getTrades({ symbol })).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getIndexPriceKline()', async () => {
|
||||||
|
expect(await api.getIndexPriceKline({ symbol, interval, from })).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getPremiumIndexKline()', async () => {
|
||||||
|
expect(await api.getPremiumIndexKline({ symbol, interval, from })).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getLastFundingRate()', async () => {
|
||||||
|
expect(await api.getLastFundingRate({ symbol })).toMatchObject(successResponseObject());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Shared endpoints', () => {
|
||||||
|
it('should throw for unauthenticated private calls', async () => {
|
||||||
|
expect(() => api.getApiKeyInfo()).rejects.toMatchObject(new Error('Private endpoints require api and private keys set'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getOrderBook()', async () => {
|
||||||
|
expect(await api.getOrderBook({ symbol })).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getTickers()', async () => {
|
||||||
|
expect(await api.getTickers()).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getSymbols()', async () => {
|
||||||
|
expect(await api.getSymbols()).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getLiquidations()', async () => {
|
||||||
|
expect(await api.getLiquidations({ symbol })).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getServerTime()', async () => {
|
||||||
|
expect(await api.getServerTime()).toMatchObject(successResponseObject());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('getApiAnnouncements()', async () => {
|
||||||
|
expect(await api.getApiAnnouncements()).toMatchObject(successResponseList());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
22
test/response.util.ts
Normal file
22
test/response.util.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
export function successResponseList() {
|
||||||
|
return {
|
||||||
|
"ext_code": "",
|
||||||
|
"ext_info": "",
|
||||||
|
"result": expect.any(Array),
|
||||||
|
"ret_code": 0,
|
||||||
|
"ret_msg": "OK",
|
||||||
|
"time_now": expect.any(String),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function successResponseObject() {
|
||||||
|
return {
|
||||||
|
"ext_code": "",
|
||||||
|
"ext_info": "",
|
||||||
|
"result": expect.any(Object),
|
||||||
|
"ret_code": 0,
|
||||||
|
"ret_msg": "OK",
|
||||||
|
"time_now": expect.any(String),
|
||||||
|
};
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user