hive-js-dev
Version:
Steem.js the JavaScript API for Steem blockchain
327 lines (295 loc) • 8.73 kB
JavaScript
require('babel-polyfill');
import assert from 'assert';
import should from 'should';
import testPost from './test-post.json';
import steem from '../src';
import api from '../src/api';
describe('steem.api:', function () {
this.timeout(30 * 1000);
describe('setOptions', () => {
it('works', () => {
let url = steem.config.get('uri');
if(! url) url = steem.config.get('websocket');
steem.api.setOptions({ url: url, useAppbaseApi: true });
});
});
describe('getFollowers', () => {
describe('getting ned\'s followers', () => {
it('works', async () => {
const result = await steem.api.getFollowersAsync('ned', 0, 'blog', 5);
assert(result, 'getFollowersAsync resoved to null?');
result.should.have.lengthOf(5);
});
it('the startFollower parameter has an impact on the result', async () => {
// Get the first 5
const result1 = await steem.api.getFollowersAsync('ned', 0, 'blog', 5)
result1.should.have.lengthOf(5);
const result2 = await steem.api.getFollowersAsync('ned', result1[result1.length - 1].follower, 'blog', 5)
result2.should.have.lengthOf(5);
result1.should.not.be.eql(result2);
});
it('clears listeners', async () => {
steem.api.listeners('message').should.have.lengthOf(0);
});
});
});
describe('getContent', () => {
describe('getting a random post', () => {
it('works', async () => {
const result = await steem.api.getContentAsync('yamadapc', 'test-1-2-3-4-5-6-7-9');
result.should.have.properties(testPost);
});
it('clears listeners', async () => {
steem.api.listeners('message').should.have.lengthOf(0);
});
});
});
describe('streamBlockNumber', () => {
it('streams steem transactions', (done) => {
let i = 0;
const release = steem.api.streamBlockNumber((err, block) => {
should.exist(block);
block.should.be.instanceOf(Number);
i++;
if (i === 2) {
release();
done();
}
});
});
});
describe('streamBlock', () => {
it('streams steem blocks', (done) => {
let i = 0;
const release = steem.api.streamBlock((err, block) => {
try {
should.exist(block);
block.should.have.properties([
'previous',
'transactions',
'timestamp',
]);
} catch (err2) {
release();
done(err2);
return;
}
i++;
if (i === 2) {
release();
done();
}
});
});
});
describe('streamTransactions', () => {
it('streams steem transactions', (done) => {
let i = 0;
const release = steem.api.streamTransactions((err, transaction) => {
try {
should.exist(transaction);
transaction.should.have.properties([
'ref_block_num',
'operations',
'extensions',
]);
} catch (err2) {
release();
done(err2);
return;
}
i++;
if (i === 2) {
release();
done();
}
});
});
});
describe('streamOperations', () => {
it('streams steem operations', (done) => {
let i = 0;
const release = steem.api.streamOperations((err, operation) => {
try {
should.exist(operation);
} catch (err2) {
release();
done(err2);
return;
}
i++;
if (i === 2) {
release();
done();
}
});
});
});
describe('useApiOptions', () => {
it('works ok with the prod instances', async() => {
steem.api.setOptions({ useAppbaseApi: true, url: steem.config.get('uri') });
const result = await steem.api.getContentAsync('yamadapc', 'test-1-2-3-4-5-6-7-9');
steem.api.setOptions({ useAppbaseApi: false, url: steem.config.get('uri') });
result.should.have.properties(testPost);
});
});
describe('with retry', () => {
let steemApi;
beforeEach(() => {
steemApi = new api.Steem({});
});
it('works by default', async function() {
let attempts = 0;
steemApi.setOptions({
url: 'https://api.steemit.com',
fetchMethod: (uri, req) => new Promise((res, rej) => {
const data = JSON.parse(req.body);
res({
ok: true,
json: () => Promise.resolve({
jsonrpc: '2.0',
id: data.id,
result: ['ned'],
}),
});
attempts++;
}),
});
const result = await steemApi.getFollowersAsync('ned', 0, 'blog', 5)
assert.equal(attempts, 1);
assert.deepEqual(result, ['ned']);
});
it('does not retry by default', async() => {
let attempts = 0;
steemApi.setOptions({
url: 'https://api.steemit.com',
fetchMethod: (uri, req) => new Promise((res, rej) => {
rej(new Error('Bad request'));
attempts++;
}),
});
let result;
let errored = false;
try {
result = await steemApi.getFollowersAsync('ned', 0, 'blog', 5)
} catch (e) {
errored = true;
}
assert.equal(attempts, 1);
assert.equal(errored, true);
});
it('works with retry passed as a boolean', async() => {
let attempts = 0;
steemApi.setOptions({
url: 'https://api.steemit.com',
fetchMethod: (uri, req) => new Promise((res, rej) => {
const data = JSON.parse(req.body);
res({
ok: true,
json: () => Promise.resolve({
jsonrpc: '2.0',
id: data.id,
result: ['ned'],
}),
});
attempts++;
}),
});
const result = await steemApi.getFollowersAsync('ned', 0, 'blog', 5)
assert.equal(attempts, 1);
assert.deepEqual(result, ['ned']);
});
it('retries with retry passed as a boolean', async() => {
let attempts = 0;
steemApi.setOptions({
url: 'https://api.steemit.com',
retry: true,
fetchMethod: (uri, req) => new Promise((res, rej) => {
if (attempts < 1) {
rej(new Error('Bad request'));
} else {
const data = JSON.parse(req.body);
res({
ok: true,
json: () => Promise.resolve({
jsonrpc: '2.0',
id: data.id,
result: ['ned'],
}),
});
}
attempts++;
}),
});
let result;
let errored = false;
try {
result = await steemApi.getFollowersAsync('ned', 0, 'blog', 5);
} catch (e) {
errored = true;
}
assert.equal(attempts, 2);
assert.equal(errored, false);
assert.deepEqual(result, ['ned']);
});
it('works with retry passed as an object', async() => {
steemApi.setOptions({
url: 'https://api.steemit.com',
retry: {
retries: 3,
minTimeout: 1, // 1ms
},
fetchMethod: (uri, req) => new Promise((res, rej) => {
const data = JSON.parse(req.body);
res({
ok: 'true',
json: () => Promise.resolve({
jsonrpc: '2.0',
id: data.id,
result: ['ned'],
}),
});
}),
});
const result = await steemApi.getFollowersAsync('ned', 0, 'blog', 5);
assert.deepEqual(result, ['ned']);
});
it('retries with retry passed as an object', async() => {
let attempts = 0;
steemApi.setOptions({
url: 'https://api.steemit.com',
retry: {
retries: 3,
minTimeout: 1,
},
fetchMethod: (uri, req) => new Promise((res, rej) => {
if (attempts < 1) {
rej(new Error('Bad request'));
} else {
const data = JSON.parse(req.body);
res({
ok: true,
json: () => Promise.resolve({
jsonrpc: '2.0',
id: data.id,
result: ['ned'],
}),
});
}
attempts++;
}),
});
let result;
let errored = false;
try {
result = await steemApi.getFollowersAsync('ned', 0, 'blog', 5);
} catch (e) {
errored = true;
}
assert.equal(attempts, 2);
assert.equal(errored, false);
assert.deepEqual(result, ['ned']);
});
it('does not retry non-retriable operations');
});
});