bot18
Version:
A high-frequency cryptocurrency trading bot by Zenbot creator @carlos8f
442 lines (382 loc) • 12.2 kB
JavaScript
const assert = require('assert');
const nock = require('nock');
const Gdax = require('../index.js');
const publicClient = new Gdax.PublicClient();
const EXCHANGE_API_URL = 'https://api.gdax.com';
suite('PublicClient', () => {
afterEach(() => nock.cleanAll());
test('.constructor()', () => {
let client = new Gdax.PublicClient();
assert.equal(client.apiURI, EXCHANGE_API_URL);
assert.equal(client.API_LIMIT, 100);
assert.equal(client.productID, 'BTC-USD'); // deprecated
assert.equal(client.timeout, 10000);
client = new Gdax.PublicClient('https://api-public.sandbox.gdax.com');
assert.equal(client.apiURI, 'https://api-public.sandbox.gdax.com');
});
// Delete this test when the deprecation is final
test('.constructor() (with deprecated signature accepting a product ID)', () => {
let client = new Gdax.PublicClient('LTC-USD');
assert.equal(client.apiURI, EXCHANGE_API_URL);
assert.equal(client.productID, 'LTC-USD');
});
suite('.request()', () => {
test('handles errors', () => {
nock(EXCHANGE_API_URL)
.get('/some/path')
.times(2)
.reply(400, { message: 'some error' });
const cbtest = new Promise((resolve, reject) => {
publicClient.request('get', ['some', 'path'], {}, err => {
if (err) {
assert.equal(err.message, 'HTTP 400 Error: some error');
assert.equal(err.response.statusCode, 400);
assert.equal(err.data.message, 'some error');
resolve();
} else {
reject();
}
});
});
const promisetest = publicClient
.request('get', ['some', 'path'])
.then(() => assert.fail('should have thrown an error'))
.catch(err => {
assert.equal(err.message, 'HTTP 400 Error: some error');
assert.equal(err.response.statusCode, 400);
assert(err.data.message, 'some error');
});
return Promise.all([cbtest, promisetest]);
});
});
test('.getProductOrderBook()', () => {
nock(EXCHANGE_API_URL)
.get('/products/LTC-USD/book?level=3')
.times(2)
.reply(200, {
asks: [],
bids: [],
});
const cbtest = new Promise((resolve, reject) => {
publicClient.getProductOrderBook(
'LTC-USD',
{ level: 3 },
(err, resp, data) => {
if (err) {
reject(err);
}
assert(data);
resolve();
}
);
});
const promisetest = publicClient
.getProductOrderBook('LTC-USD', { level: 3 })
.then(data => assert(data));
return Promise.all([cbtest, promisetest]);
});
// Delete this test when the deprecation is final
test('.getProductOrderBook() (with deprecated signature implying default product ID)', () => {
nock(EXCHANGE_API_URL)
.get('/products/BTC-USD/book?level=2')
.reply(200, {
asks: [],
bids: [],
});
return publicClient
.getProductOrderBook({ level: 2 })
.then(data => assert(data));
});
test('.getProductTrades()', () => {
const expectedResponse = [
{
time: '2014-11-07T22:19:28.578544Z',
trade_id: 74,
price: '10.00000000',
size: '0.01000000',
side: 'buy',
},
{
time: '2014-11-07T01:08:43.642366Z',
trade_id: 73,
price: '100.00000000',
size: '0.01000000',
side: 'sell',
},
];
nock(EXCHANGE_API_URL)
.get('/products/LTC-USD/trades')
.times(2)
.reply(200, expectedResponse);
const cbtest = new Promise((resolve, reject) => {
publicClient.getProductTrades('LTC-USD', (err, resp, data) => {
if (err) {
reject(err);
}
assert.deepEqual(data, expectedResponse);
resolve();
});
});
const promisetest = publicClient
.getProductTrades('LTC-USD')
.then(data => assert.deepEqual(data, expectedResponse));
return Promise.all([cbtest, promisetest]);
});
// Delete this test when the deprecation is final
test('.getProductTrades() (with deprecated signature implying default product ID)', () => {
const expectedResponse = [
{
time: '2014-11-07T22:19:28.578544Z',
trade_id: 74,
price: '10.00000000',
size: '0.01000000',
side: 'buy',
},
];
nock(EXCHANGE_API_URL)
.get('/products/BTC-USD/trades')
.reply(200, expectedResponse);
return publicClient
.getProductTrades()
.then(data => assert.deepEqual(data, expectedResponse));
});
test('.getProductTicker()', () => {
nock(EXCHANGE_API_URL)
.get('/products/ETH-USD/ticker')
.times(2)
.reply(200, {
trade_id: 'test-id',
price: '9.00',
size: '5',
});
const cbtest = new Promise((resolve, reject) => {
publicClient.getProductTicker('ETH-USD', (err, resp, data) => {
if (err) {
reject(err);
}
assert.equal(data.trade_id, 'test-id');
assert(data.price, '9.00');
assert(data.size, '5');
resolve();
});
});
const promisetest = publicClient.getProductTicker('ETH-USD').then(data => {
assert.equal(data.trade_id, 'test-id');
assert.equal(data.price, '9.00');
assert.equal(data.size, '5');
});
return Promise.all([cbtest, promisetest]);
});
// Delete this test when the deprecation is final
test('.getProductTicker() (with deprecated signature implying default product ID)', () => {
nock(EXCHANGE_API_URL)
.get('/products/BTC-USD/ticker')
.reply(200, {
trade_id: 'test-id',
price: '90.00',
size: '2',
});
return publicClient.getProductTicker().then(data => {
assert.equal(data.trade_id, 'test-id');
assert.equal(data.price, '90.00');
assert.equal(data.size, '2');
});
});
suite('.getProductTradeStream()', () => {
const from = 8408014;
const to = 8409426;
test('streams trades', done => {
nock.load('./tests/mocks/pubclient_stream_trades.json');
let last = from;
let current;
publicClient
.getProductTradeStream('BTC-USD', from, to)
.on('data', data => {
current = data.trade_id;
assert.equal(typeof current, 'number');
assert.equal(
current,
last + 1,
current + ' is next in series, last: ' + last
);
last = current;
})
.on('end', () => {
assert((current = to - 1));
done();
})
.on('error', err => {
assert.fail(err);
});
});
// Delete this test when the deprecation is final
test('streams trades (with deprecated signature implying default product ID)', done => {
nock.load('./tests/mocks/pubclient_stream_trades.json');
let last = from;
let current;
publicClient
.getProductTradeStream(from, to)
.on('data', data => {
current = data.trade_id;
assert.equal(typeof current, 'number');
assert.equal(
current,
last + 1,
current + ' is next in series, last: ' + last
);
last = current;
})
.on('end', () => {
assert((current = to - 1));
done();
})
.on('error', err => {
assert.fail(err);
});
});
test('.getProductTradeStream() with function', done => {
nock.load('./tests/mocks/pubclient_stream_trades_function.json');
let last = from;
let current;
publicClient
.getProductTradeStream(
'BTC-USD',
from,
trade => Date.parse(trade.time) >= 1463068800000
)
.on('data', data => {
current = data.trade_id;
assert.equal(typeof current, 'number');
assert.equal(
current,
last + 1,
current + ' is next in series, last: ' + last
);
last = current;
})
.on('end', () => {
assert.equal(last, 8409426, last);
done();
});
});
test('.getProductTradeStream() with current date function', done => {
nock.load('./tests/mocks/pubclient_stream_trades_function.json');
let last = from;
let current;
publicClient
.getProductTradeStream(
'BTC-USD',
from,
trade => Date.parse(trade.time) >= Date.now()
)
.on('data', data => {
current = data.trade_id;
assert.equal(typeof current, 'number');
assert.equal(
current,
last + 1,
current + ' is next in series, last: ' + last
);
last = current;
})
.on('end', () => {
assert.equal(last, 8409514, last);
done();
});
});
});
test('.getProductHistoricRates()', () => {
nock(EXCHANGE_API_URL)
.get('/products/ETH-USD/candles')
.times(2)
.reply(200, [
[1514273340, 759.75, 759.97, 759.75, 759.97, 8.03891157],
[1514273280, 758.99, 759.74, 758.99, 759.74, 17.36616621],
[1514273220, 758.99, 759, 759, 759, 10.6524787],
]);
const cbtest = new Promise((resolve, reject) => {
publicClient.getProductHistoricRates('ETH-USD', (err, resp, data) => {
if (err) {
reject(err);
}
assert.equal(data[0][0], 1514273340);
assert.equal(data[0][1], 759.75);
assert.equal(data[2][0], 1514273220);
resolve();
});
});
const promisetest = publicClient
.getProductHistoricRates('ETH-USD')
.then(data => {
assert.equal(data[0][0], 1514273340);
assert.equal(data[0][1], 759.75);
assert.equal(data[2][0], 1514273220);
});
return Promise.all([cbtest, promisetest]);
});
// Delete this test when the deprecation is final
test('.getProductHistoricRates() (with deprecated signature implying default product ID)', () => {
nock(EXCHANGE_API_URL)
.get('/products/BTC-USD/candles')
.reply(200, [
[1514273220, 15399.99, 15400, 15399, 15399, 0.369797],
[1514273160, 15399.99, 15400, 15400, 15400, 0.673643],
[1514273100, 15399.99, 15400, 15400, 15400, 0.849436],
]);
return publicClient.getProductHistoricRates().then(data => {
assert.equal(data[0][0], 1514273220);
assert.equal(data[0][1], 15399.99);
assert.equal(data[2][0], 1514273100);
});
});
test('.getProduct24HrStats()', () => {
nock(EXCHANGE_API_URL)
.get('/products/ETH-USD/stats')
.times(2)
.reply(200, {
open: '720',
high: '770',
low: '710',
volume: '110000',
last: '760',
volume_30day: '9800000',
});
const cbtest = new Promise((resolve, reject) => {
publicClient.getProduct24HrStats('ETH-USD', (err, resp, data) => {
if (err) {
reject(err);
}
assert.equal(data.open, 720);
assert.equal(data.high, 770);
assert.equal(data.volume, 110000);
resolve();
});
});
const promisetest = publicClient
.getProduct24HrStats('ETH-USD')
.then(data => {
assert.equal(data.open, 720);
assert.equal(data.high, 770);
assert.equal(data.volume, 110000);
});
return Promise.all([cbtest, promisetest]);
});
// Delete this test when the deprecation is final
test('.getProduct24HrStats() (with deprecated signature implying default product ID)', () => {
nock(EXCHANGE_API_URL)
.get('/products/BTC-USD/stats')
.reply(200, {
open: '14000',
high: '15700',
low: '13800',
volume: '17400',
last: '15300',
volume_30day: '1100000',
});
return publicClient.getProduct24HrStats().then(data => {
assert.equal(data.open, 14000);
assert.equal(data.high, 15700);
assert.equal(data.volume, 17400);
});
});
});