UNPKG

dpaw-brocket-relay

Version:

Interapp communication via websockets

203 lines (172 loc) 5.95 kB
'use strict'; 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;