ethjs-provider-http
Version:
A simple Http provider that follows the web3 spec.
305 lines (254 loc) • 9.84 kB
JavaScript
;
var HttpProvider = require('../index.js'); // eslint-disable-line
var TestRPC = require('ethereumjs-testrpc'); // eslint-disable-line
var Eth = require('ethjs-query'); // eslint-disable-line
var EthQuery = require('eth-query');
var Web3 = require('web3');
var assert = require('chai').assert; // eslint-disable-line
var SandboxedModule = require('sandboxed-module');
var server = TestRPC.server();
server.listen(5002);
function FakeXHR2() {
var self = this;
self.responseText = '{}';
self.readyState = 4;
self.onreadystatechange = null;
self.async = true;
self.headers = {
'Content-Type': 'text/plain'
};
}
FakeXHR2.prototype.open = function (method, host) {
// eslint-disable-line
var self = this;
assert.equal(method, 'POST');
assert.notEqual(host, null);
self.async = true;
};
FakeXHR2.prototype.setRequestHeader = function (name, value) {
// eslint-disable-line
var self = this;
self.headers[name] = value;
};
FakeXHR2.prototype.send = function (payload) {
// eslint-disable-line
var self = this;
var payloadParsed = JSON.parse(payload);
if (payloadParsed.forceTimeout === true) {
setTimeout(function () {
self.ontimeout();
}, 2000);
} else if (payloadParsed.invalidSend === true) {
throw new Error('invalid data!!!');
} else if (payloadParsed.invalidJSON === true) {
self.responseText = 'dsfsfd{sdf}';
self.onreadystatechange();
} else {
assert.equal(typeof self.onreadystatechange, 'function');
self.onreadystatechange();
}
};
SandboxedModule.registerBuiltInSourceTransformer('istanbul');
var FakeHttpProvider = SandboxedModule.require('../index.js', {
requires: {
xhr2: FakeXHR2
},
singleOnly: true
});
describe('HttpProvider', function () {
describe('constructor', function () {
it('should throw under invalid conditions', function () {
assert.throws(function () {
return HttpProvider('');
}, Error); // eslint-disable-line
assert.throws(function () {
return new HttpProvider({}, 3932);
}, Error); // eslint-disable-line
});
it('should construct normally under valid conditions', function () {
var provider = new HttpProvider('http://localhost:8545');
assert.equal(provider.host, 'http://localhost:8545');
assert.equal(provider.timeout, 0);
});
it('should construct normally under valid conditions', function () {
var provider = new HttpProvider('http://localhost:8545', 10);
assert.equal(provider.host, 'http://localhost:8545');
assert.equal(provider.timeout, 10);
});
it('should construct normally under valid conditions', function () {
var provider = new HttpProvider('http://localhost:5002', 10);
assert.equal(provider.host, 'http://localhost:5002');
assert.equal(provider.timeout, 10);
});
it('should throw error with no new', function () {
function invalidProvider() {
HttpProvider('http://localhost:8545', 10); // eslint-disable-line
}
assert.throws(invalidProvider, Error);
});
it('should throw error with no provider', function () {
function invalidProvider() {
new HttpProvider(); // eslint-disable-line
}
assert.throws(invalidProvider, Error);
});
});
describe('test against ethjs-query', function () {
var eth = new Eth(new HttpProvider('http://localhost:5002')); // eslint-disable-line
it('should get accounts', function (done) {
eth.accounts(function (accountsError, accountsResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountsResult, 'object');
assert.equal(Array.isArray(accountsResult), true);
done();
});
});
it('should get balances', function (done) {
eth.accounts(function (accountsError, accountsResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountsResult, 'object');
assert.equal(Array.isArray(accountsResult), true);
eth.getBalance(accountsResult[0], function (balanceError, balanceResult) {
assert.equal(balanceError, null);
assert.equal(typeof balanceResult, 'object');
assert.equal(balanceResult.toNumber(10) > 0, true);
done();
});
});
});
it('should get coinbase and balance', function (done) {
eth.coinbase(function (accountsError, accountResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountResult, 'string');
eth.getBalance(accountResult, function (balanceError, balanceResult) {
assert.equal(balanceError, null);
assert.equal(typeof balanceResult, 'object');
assert.equal(balanceResult.toNumber(10) > 0, true);
done();
});
});
});
});
describe('test against eth-query', function () {
var query = new EthQuery(new HttpProvider('http://localhost:5002')); // eslint-disable-line
it('should get accounts', function (done) {
query.accounts(function (accountsError, accountsResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountsResult, 'object');
assert.equal(Array.isArray(accountsResult), true);
done();
});
});
it('should get balances', function (done) {
query.accounts(function (accountsError, accountsResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountsResult, 'object');
assert.equal(Array.isArray(accountsResult), true);
query.getBalance(accountsResult[0], function (balanceError, balanceResult) {
assert.equal(balanceError, null);
assert.equal(typeof balanceResult, 'string');
done();
});
});
});
it('should get coinbase and balance', function (done) {
query.coinbase(function (accountsError, accountResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountResult, 'string');
query.getBalance(accountResult, function (balanceError, balanceResult) {
assert.equal(balanceError, null);
assert.equal(typeof balanceResult, 'string');
done();
});
});
});
});
describe('test against web3', function () {
var web3 = new Web3(new HttpProvider('http://localhost:5002')); // eslint-disable-line
it('should get accounts', function (done) {
web3.eth.getAccounts(function (accountsError, accountsResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountsResult, 'object');
assert.equal(Array.isArray(accountsResult), true);
done();
});
});
it('should get balances', function (done) {
web3.eth.getAccounts(function (accountsError, accountsResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountsResult, 'object');
assert.equal(Array.isArray(accountsResult), true);
web3.eth.getBalance(accountsResult[0], function (balanceError, balanceResult) {
assert.equal(balanceError, null);
assert.equal(typeof balanceResult, 'object');
assert.equal(balanceResult.toNumber(10) > 0, true);
done();
});
});
});
it('should get coinbase and balance', function (done) {
web3.eth.getCoinbase(function (accountsError, accountResult) {
assert.equal(accountsError, null);
assert.equal(typeof accountResult, 'string');
web3.eth.getBalance(accountResult, function (balanceError, balanceResult) {
assert.equal(balanceError, null);
assert.equal(typeof balanceResult, 'object');
assert.equal(balanceResult.toNumber(10) > 0, true);
done();
});
});
});
it('should close the server', function () {
server.close();
});
});
describe('web3 FakeProvider', function () {
describe('sendAsync timeout', function () {
it('should send basic async request and timeout', function (done) {
var provider = new FakeHttpProvider('http://localhost:5002', 2);
provider.sendAsync({ forceTimeout: true }, function (err, result) {
assert.equal(typeof err, 'string');
assert.equal(typeof result, 'object');
done();
});
});
});
describe('invalid payload', function () {
it('should throw an error as its not proper json', function (done) {
var provider = new FakeHttpProvider('http://localhost:5002');
provider.sendAsync('sdfsds{}{df()', function (err, result) {
assert.equal(typeof err, 'string');
assert.equal(typeof result, 'object');
done();
});
});
it('should throw an error as its not proper json', function (done) {
var provider = new FakeHttpProvider('http://localhost:5002');
provider.sendAsync({ invalidSend: true }, function (err, result) {
assert.equal(typeof err, 'string');
assert.equal(typeof result, 'object');
done();
});
});
});
describe('sendAsync timeout', function () {
it('should send basic async request and timeout', function (done) {
var provider = new FakeHttpProvider('http://localhost:5002', 2);
provider.sendAsync({ invalidJSON: true }, function (err, result) {
assert.equal(typeof err, 'object');
assert.equal(typeof result, 'string');
done();
});
});
});
describe('sendAsync', function () {
it('should send basic async request', function (done) {
var provider = new FakeHttpProvider('http://localhost:5002');
provider.sendAsync({}, function (err, result) {
assert.equal(typeof result, 'object');
done();
});
});
});
});
});