Skip to content

Commit ddf8fe5

Browse files
add unit tests for RippleAPIBroadcast
1 parent 7626ea5 commit ddf8fe5

File tree

3 files changed

+114
-26
lines changed

3 files changed

+114
-26
lines changed

test/broadcast-api-test.js

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/* eslint-disable max-nested-callbacks */
2+
'use strict';
3+
const _ = require('lodash');
4+
const assert = require('assert-diff');
5+
const setupAPI = require('./setup-api');
6+
const responses = require('./fixtures').responses;
7+
const ledgerClosed = require('./fixtures/rippled/ledger-close');
8+
const RippleAPI = require('ripple-api').RippleAPI;
9+
const schemaValidator = RippleAPI._PRIVATE.schemaValidator;
10+
11+
function checkResult(expected, schemaName, response) {
12+
if (expected.txJSON) {
13+
assert(response.txJSON);
14+
assert.deepEqual(JSON.parse(response.txJSON), JSON.parse(expected.txJSON));
15+
}
16+
assert.deepEqual(_.omit(response, 'txJSON'), _.omit(expected, 'txJSON'));
17+
if (schemaName) {
18+
schemaValidator.schemaValidate(schemaName, response);
19+
}
20+
return response;
21+
}
22+
23+
describe('RippleAPIBroadcast', function() {
24+
beforeEach(setupAPI.setupBroadcast);
25+
afterEach(setupAPI.teardown);
26+
27+
it('base', function() {
28+
const expected = {request_server_info: 1};
29+
this.mocks.forEach(mock => mock.expect(_.assign({}, expected)));
30+
assert(this.api.isConnected());
31+
return this.api.getServerInfo().then(
32+
_.partial(checkResult, responses.getServerInfo, 'getServerInfo'));
33+
});
34+
35+
it('ledger', function(done) {
36+
let gotLedger = 0;
37+
this.api.on('ledger', () => {
38+
gotLedger++;
39+
});
40+
const ledgerNext = _.assign({}, ledgerClosed);
41+
ledgerNext.ledger_index++;
42+
this.mocks.forEach(mock => mock.socket.send(JSON.stringify(ledgerNext)));
43+
44+
setTimeout(() => {
45+
console.log('-- ledgerVersion', this.api.ledgerVersion);
46+
assert.strictEqual(gotLedger, 1);
47+
done();
48+
}, 50);
49+
50+
});
51+
52+
it('error propagation', function(done) {
53+
this.api.once('error', (type, info) => {
54+
assert.strictEqual(type, 'type');
55+
assert.strictEqual(info, 'info');
56+
done();
57+
});
58+
this.mocks[1].socket.send(
59+
JSON.stringify({error: 'type', error_message: 'info'}));
60+
});
61+
62+
});

test/mock-rippled.js

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ module.exports = function(port) {
7171
};
7272

7373
mock.on('connection', function(conn) {
74+
this.socket = conn;
7475
conn.on('message', function(requestJSON) {
7576
const request = JSON.parse(requestJSON);
7677
mock.emit('request_' + request.command, request, conn);

test/setup-api.js

+51-26
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,77 @@
11
'use strict';
22
const net = require('net');
33
const RippleAPI = require('ripple-api').RippleAPI;
4+
const RippleAPIBroadcast = require('ripple-api').RippleAPIBroadcast;
45
const ledgerClosed = require('./fixtures/rippled/ledger-close');
56
const createMockRippled = require('./mock-rippled');
67

78
// using a free port instead of a constant port enables parallelization
8-
function getFreePort(callback) {
9-
const server = net.createServer();
10-
let port;
11-
server.on('listening', function() {
12-
port = server.address().port;
13-
server.close();
9+
function getFreePort() {
10+
return new Promise((resolve, reject) => {
11+
const server = net.createServer();
12+
let port;
13+
server.on('listening', function() {
14+
port = server.address().port;
15+
server.close();
16+
});
17+
server.on('close', function() {
18+
resolve(port);
19+
});
20+
server.on('error', function(error) {
21+
reject(error);
22+
});
23+
server.listen(0);
1424
});
15-
server.on('close', function() {
16-
callback(null, port);
25+
}
26+
27+
function setupMockRippledConnection(testcase, port) {
28+
return new Promise((resolve, reject) => {
29+
testcase.mockRippled = createMockRippled(port);
30+
testcase.api = new RippleAPI({server: 'ws://localhost:' + port});
31+
testcase.api.connect().then(() => {
32+
testcase.api.once('ledger', () => resolve());
33+
testcase.api.connection._ws.emit('message', JSON.stringify(ledgerClosed));
34+
}).catch(reject);
1735
});
18-
server.on('error', function(error) {
19-
callback(error);
36+
}
37+
38+
function setupMockRippledConnectionForBroadcast(testcase, ports) {
39+
return new Promise((resolve, reject) => {
40+
const servers = ports.map(port => 'ws://localhost:' + port);
41+
testcase.mocks = ports.map(port => createMockRippled(port));
42+
testcase.api = new RippleAPIBroadcast(servers);
43+
testcase.api.connect().then(() => {
44+
testcase.api.once('ledger', () => resolve());
45+
testcase.mocks[0].socket.send(JSON.stringify(ledgerClosed));
46+
}).catch(reject);
2047
});
21-
server.listen(0);
2248
}
2349

24-
function setupMockRippledConnection(testcase, port, done) {
25-
testcase.mockRippled = createMockRippled(port);
26-
testcase.api = new RippleAPI({server: 'ws://localhost:' + port});
27-
testcase.api.connect().then(() => {
28-
testcase.api.once('ledger', () => done());
29-
testcase.api.connection._ws.emit('message', JSON.stringify(ledgerClosed));
30-
}).catch(done);
50+
function setup() {
51+
return getFreePort().then(port => {
52+
return setupMockRippledConnection(this, port);
53+
});
3154
}
3255

33-
function setup(done) {
34-
getFreePort((error, port) => {
35-
if (error) {
36-
throw new Error('Unable to obtain a free port: ' + error);
37-
}
38-
setupMockRippledConnection(this, port, done);
56+
function setupBroadcast() {
57+
return Promise.all([getFreePort(), getFreePort()]).then(ports => {
58+
return setupMockRippledConnectionForBroadcast(this, ports);
3959
});
4060
}
4161

4262
function teardown(done) {
4363
this.api.disconnect().then(() => {
44-
this.mockRippled.close();
64+
if (this.mockRippled !== undefined) {
65+
this.mockRippled.close();
66+
} else {
67+
this.mocks.forEach(mock => mock.close());
68+
}
4569
setImmediate(done);
4670
}).catch(done);
4771
}
4872

4973
module.exports = {
5074
setup: setup,
51-
teardown: teardown
75+
teardown: teardown,
76+
setupBroadcast: setupBroadcast
5277
};

0 commit comments

Comments
 (0)