@parity/api
Version:
The Parity Promise-based API library for interfacing with Ethereum over RPC
795 lines (719 loc) • 19.5 kB
JavaScript
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
/* eslint-disable no-unused-expressions */
const BigNumber = require('bignumber.js');
const { TEST_WS_URL, mockWs } = require('../../test/mockRpc');
const { isBigNumber } = require('../../test/types');
const { WsSecure } = require('../provider');
const Pubsub = require('./pubsub');
describe('pubsub/Pubsub', () => {
let scope;
let instance;
const address = '0x63Cf90D3f0410092FC0fca41846f596223979195';
describe('accountsInfo', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: {
'0x63cf90d3f0410092fc0fca41846f596223979195': {
name: 'name',
uuid: 'uuid',
meta: '{"data":"data"}'
}
},
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('retrieves the available account info', done => {
instance.parity.accountsInfo((error, result) => {
expect(error).to.be.null;
expect(result).to.deep.equal({
'0x63Cf90D3f0410092FC0fca41846f596223979195': {
name: 'name',
uuid: 'uuid',
meta: {
data: 'data'
}
}
});
done();
});
});
});
describe('Unsubscribe', () => {
beforeEach(() => {
scope = mockWs([
{ method: 'parity_subscribe', reply: 2 },
{ method: 'parity_unsubscribe', reply: true }
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('Promise gets resolved on success.', done => {
instance.parity.accountsInfo().then(s => {
instance.parity.unsubscribe(s).then(b => {
expect(b).to.be.true;
done();
});
});
});
});
describe('chainStatus', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: {
blockGap: [0x123, 0x456]
},
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('retrieves the chain status', done => {
instance.parity.chainStatus((error, result) => {
expect(error).to.be.null;
expect(result).to.deep.equal({
blockGap: [new BigNumber(0x123), new BigNumber(0x456)]
});
done();
});
});
});
describe('gasFloorTarget', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123456',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the gasfloor, formatted', done => {
instance.parity.gasFloorTarget((error, result) => {
expect(error).to.be.null;
expect(isBigNumber(result)).to.be.true;
expect(result.eq(0x123456)).to.be.true;
done();
});
});
});
describe('transactionsLimit', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: 1024,
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the tx limit, formatted', done => {
instance.parity.transactionsLimit((error, result) => {
expect(error).to.be.null;
expect(isBigNumber(result)).to.be.true;
expect(result.eq(1024)).to.be.true;
done();
});
});
});
describe('minGasPrice', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123456',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the min gasprice, formatted', done => {
instance.parity.minGasPrice((error, result) => {
expect(error).to.be.null;
expect(isBigNumber(result)).to.be.true;
expect(result.eq(0x123456)).to.be.true;
done();
});
});
});
describe('netPeers', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: { active: 123, connected: 456, max: 789, peers: [] },
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the peer structure, formatted', done => {
instance.parity.netPeers((error, peers) => {
expect(error).to.be.null;
expect(peers.active.eq(123)).to.be.true;
expect(peers.connected.eq(456)).to.be.true;
expect(peers.max.eq(789)).to.be.true;
done();
});
});
});
describe('netPort', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: 33030,
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the connected port, formatted', done => {
instance.parity.netPort((error, count) => {
expect(error).to.be.null;
expect(isBigNumber(count)).to.be.true;
expect(count.eq(33030)).to.be.true;
done();
});
});
});
describe('accounts', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: [address.toLowerCase()],
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns a list of accounts, formatted', done => {
instance.eth.accounts((error, accounts) => {
expect(error).to.be.null;
expect(accounts).to.deep.equal([address]);
done();
});
});
});
describe('newHeads', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'eth_subscribe',
reply: 2,
subscription: {
method: 'eth_subscription',
params: {
result: '0x123456',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns newHeads for eth_subscribe', done => {
instance.eth.newHeads((error, block) => {
expect(error).to.be.null;
expect(block).not.to.be.null;
done();
});
});
});
describe('blockNumber', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123456',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the current blockNumber, formatted', done => {
instance.eth.blockNumber((error, blockNumber) => {
expect(error).to.be.null;
expect(isBigNumber(blockNumber)).to.be.true;
expect(blockNumber.toString(16)).to.equal('123456');
done();
});
});
});
describe('call', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: [],
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('formats the input options & blockNumber', done => {
instance.eth.call(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_call',
[{ data: '0x12345678' }, 'earliest']
]);
done();
},
{ data: '12345678' },
'earliest'
);
});
it('provides a latest blockNumber when not specified', done => {
instance.eth.call(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_call',
[{ data: '0x12345678' }, 'latest']
]);
done();
},
{ data: '12345678' }
);
});
});
describe('coinbase', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: address.toLowerCase(),
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the coinbase, formatted', done => {
instance.eth.coinbase((error, account) => {
expect(error).to.be.null;
expect(account).to.deep.equal(address);
done();
});
});
});
describe('estimateGas', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('converts the options correctly', done => {
instance.eth.estimateGas(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_estimateGas',
[{ gas: '0x5208' }]
]);
done();
},
{ gas: 21000 }
);
});
it('returns the gas used, formatted', done => {
instance.eth.estimateGas((error, gas) => {
expect(error).to.be.null;
expect(isBigNumber(gas)).to.be.true;
expect(gas.toString(16)).to.deep.equal('123');
done();
});
});
});
describe('gasPrice', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('returns the gas price, formatted', done => {
instance.eth.gasPrice((error, price) => {
expect(error).to.be.null;
expect(isBigNumber(price)).to.be.true;
expect(price.toString(16)).to.deep.equal('123');
done();
});
});
});
describe('getBalance', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('passes in the address (default blockNumber)', done => {
instance.eth.getBalance(error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBalance',
[address.toLowerCase(), 'latest']
]);
done();
}, address);
});
it('passes in the address & blockNumber', done => {
instance.eth.getBalance(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBalance',
[address.toLowerCase(), '0x456']
]);
done();
},
address,
0x456
);
});
it('returns the balance', done => {
instance.eth.getBalance((error, balance) => {
expect(error).to.be.null;
expect(isBigNumber(balance)).to.be.true;
expect(balance.toString(16)).to.deep.equal('123');
done();
}, address);
});
});
describe('getBlockByHash', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: { miner: address.toLowerCase() },
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('formats the input hash as a hash, default full', done => {
instance.eth.getBlockByHash(error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBlockByHash',
['0x1234', false]
]);
done();
}, '1234');
});
it('formats the input hash as a hash, full true', done => {
instance.eth.getBlockByHash(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBlockByHash',
['0x1234', true]
]);
done();
},
'1234',
true
);
});
it('formats the output into block', done => {
instance.eth.getBlockByHash((error, block) => {
expect(error).to.be.null;
expect(block.miner).to.equal(address);
done();
}, '1234');
});
});
describe('getBlockByNumber', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: { miner: address.toLowerCase() },
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('assumes blockNumber latest & full false', done => {
instance.eth.getBlockByNumber(error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBlockByNumber',
['latest', false]
]);
done();
});
});
it('uses input blockNumber & full false', done => {
instance.eth.getBlockByNumber(error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBlockByNumber',
['0x1234', false]
]);
done();
}, '0x1234');
});
it('formats the input blockNumber, full true', done => {
instance.eth.getBlockByNumber(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getBlockByNumber',
['0x1234', true]
]);
done();
},
0x1234,
true
);
});
it('formats the output into block', done => {
instance.eth.getBlockByNumber((error, block) => {
expect(error).to.be.null;
expect(block.miner).to.equal(address);
done();
}, 0x1234);
});
});
describe('getTransactionCount', () => {
beforeEach(() => {
scope = mockWs([
{
method: 'parity_subscribe',
reply: 2,
subscription: {
method: 'parity_subscription',
params: {
result: '0x123',
subscription: 2
}
}
}
]);
instance = new Pubsub(new WsSecure(TEST_WS_URL));
});
afterEach(() => {
scope.stop();
});
it('passes in the address (default blockNumber)', done => {
instance.eth.getTransactionCount(error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getTransactionCount',
[address.toLowerCase(), 'latest']
]);
done();
}, address);
});
it('passes in the address & blockNumber', done => {
instance.eth.getTransactionCount(
error => {
expect(error).to.be.null;
expect(scope.body.parity_subscribe.params).to.deep.equal([
'eth_getTransactionCount',
[address.toLowerCase(), '0x456']
]);
done();
},
address,
0x456
);
});
it('returns the count, formatted', done => {
instance.eth.getTransactionCount(
(error, count) => {
expect(error).to.be.null;
expect(isBigNumber(count)).to.be.true;
expect(count.toString(16)).to.equal('123');
done();
},
address,
0x456
);
});
});
});