dpaw-brocket-relay
Version:
Interapp communication via websockets
203 lines (172 loc) • 5.95 kB
JavaScript
;
var expect = require('expect');
var Relay = require('../src/relay');
var u = require('dpaw-brocket-utility');
let log = u.log;
var assert = require("assert");
var ok = assert.ok;
var eq = assert.equal;
var Suite = describe('Relay', function() {
describe('module', function () {
it('should have a relay', () => expect(Relay).toExist());
it('should have a super-type', () => expect(Relay.$type).toBe('RelayModule'));
it('should have an emit method', () => expect(Relay.emit).toExist());
});
describe('#init(opts)', () => {
var relay;
beforeEach( function initialiseRelay() {
relay = Object.create(Relay);
relay.init();
});
// afterEach( () => relay.destroy());
it('should have options', () => expect(relay.opts).toExist());
it('should have a default recvMode', () => expect(relay.recvMode()).toExist());
it('should have a default sendMode', () => expect(relay.sendMode()).toExist());
it('should have a default conchMode', () => expect(relay.conchMode()).toExist());
it('should have a default pulse', () => expect(relay.opts.pulse).toExist());
it('should have a default tag', () => expect(relay.tag).toExist());
it('should have a default channel', () => expect(relay.tag).toExist());
it('should error without a url');
});
describe('wrapping, receiving, and dispatching', () => {
var relay;
before(function setOptions() {
let opts = {
recvMode: 2,
sendMode: 2,
conchMode: 2,
baseAddr: 'wss://brocket.dpaw.wa.gov.au'
};
relay = Object.create(Relay);
relay.init(opts);
});
it('should wrap an app message', () => {
let msg = {tag: 'test', payload: {a: 1}};
let wrapped = relay.wrap(msg);
eq(wrapped.payload, msg);
});
it('should wrap an syn message', () => {
let msg = {tag: 'test', syn: true, payload: {a: 1}};
let wrapped = relay.wrap(msg);
eq(wrapped.payload, msg);
});
it('should unwrap an app message', () => {
let msg = {tag: 'wrapped', payload: {tag: 'unwrapped', payload: {a: 1}}};
let unwrapped = relay.unwrap(msg);
eq(unwrapped, msg.payload);
});
it('should serialise the whole message', () => {
let msg = {tag: 'wrapped', payload: {tag: 'unwrapped', payload: {a: 1}}};
let txt = relay.serialise(msg);
let expected = "{\"tag\":\"wrapped\",\"payload\":{\"tag\":\"unwrapped\",\"payload\":{\"a\":1}}}";
eq(txt, expected);
});
it('should deserialise the whole message', () => {
let txt = "{\"tag\":\"wrapped\",\"payload\":{\"tag\":\"unwrapped\",\"payload\":{\"a\":1}}}";
let expected = {tag: 'wrapped', payload: {tag: 'unwrapped', payload: {a: 1}}};
let msg = relay.deserialise(txt);
assert.deepEqual(msg, expected);
});
});
describe('#connect()', () => {
var relay;
var WebSocket;
// before(function setOptions() {
// let opts = {
// recvMode: 2,
// sendMode: 2,
// conchMode: 2,
// baseAddr: 'wss://brocket.dpaw.wa.gov.au'
// };
// relay = Object.create(Relay);
// relay.init(opts);
// });
it('should emit pub/open on open', (done) => {
let opts = {
recvMode: 2,
sendMode: 2,
conchMode: 2,
baseAddr: 'wss://brocket.dpaw.wa.gov.au'
};
let relay = Object.create(Relay);
relay.init(opts);
relay.channel('gav');
let spy = expect.createSpy();
relay.on('pub/open', evt => {console.log('Test got pub/open'); done();});
relay.connect();
relay.destroy();
});
});
describe('#destroy', (done) => {
var relay;
beforeEach('make a relay', () => {
let opts = {
recvMode: 2,
sendMode: 2,
conchMode: 2,
baseAddr: 'wss://brocket.dpaw.wa.gov.au'
};
relay = Object.create(Relay);
relay.init(opts);
});
afterEach('destroy a relay', () => relay.destroy() );
it('should have a destroy method', () => ok(relay.destroy));
it('should close the sockets', function(done) {
this.timeout(5000); // Slow test
relay.on('pub/close', evt => done());
relay.connect();
relay.destroy();
});
});
describe('acknowledgements', () => {
it('should add a syn tag', () => {
let msg = Relay.module.maybe_syn(true, {});
ok(msg.syn);
});
it('should respect other keys', () => {
let msg = Relay.module.wrap('test', {});
let msg2 = Relay.module.maybe_syn(true, msg);
eq(msg.cuid, msg2.cuid);
eq(msg.time, msg2.time);
});
it('should add and entry to the ack register', () => {
let reg = new Map();
let msg = {cuid: 'abc', syn: true};
Relay.module.registerSyn(reg, msg);
ok(reg.has('abc'));
});
it('should broadcast acknowledgements', (done) => {
let reg = new Map([['abc', [ () => done() ]]]);
let msg = {ack: 'abc'};
Relay.module.acknowledge(reg, msg);
});
it('should delete the ack key if asked', () => {
let reg = new Map([ ['abc', []] ]);
let msg = {ack: 'abc'};
Relay.module.acknowledge(reg, msg);
ok(!reg.has(msg.ack));
});
it('should *not* delete the ack key if not asked', () => {
let reg = new Map([ ['abc', []] ]);
let msg = {ack: 'abc'};
Relay.module.acknowledge(reg, msg, false);
ok(reg.has(msg.ack));
});
});
// describe('streams', () => {
// var relay;
// before(function setOptions() {
// let opts = {
// recvMode: 2,
// sendMode: 2,
// conchMode: 2,
// baseAddr: 'wss://brocket.dpaw.wa.gov.au'
// };
// relay = Object.create(Relay);
// relay.init(opts);
// // relay.connect();
// });
// // it('should have a property called message$', () => ok(relay.message$));
// })
});
module.exports = Suite;