diff --git a/package.json b/package.json index f8e6003..a1b4aa4 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "main": "src/janus.js", "scripts": { - "test": "mocha -R spec --delay test/*Spec.js" + "test": "mocha -R spec --ui bdd --full-trace test/*Spec.js" }, "author": "", "license": "ISC", diff --git a/src/client/index.js b/src/client/index.js index 5076db0..7ee76fa 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -39,7 +39,7 @@ class Client { this.logger = options.logger || logger || console; this.requestTimeout = options.requestTimeout || 6000; this.protocol = 'janus-protocol'; - this.webSocket = null; + this.webSocket = options.webSocket || null; this.connectionState = ConnectionState.DISCONNECTED; this.emitter = new EventEmitter(); this.transactions = {}; @@ -61,7 +61,11 @@ class Client { } connect() { - this.webSocket = new WebSocket(this.url, this.protocol); + + if(this.webSocket === null) { + this.webSocket = new WebSocket(this.url, this.protocol); + } + this.webSocket.on(WebSocketEvent.open, ()=>{ this.webSocketOpen(); }); diff --git a/src/mock/ws.js b/src/mock/ws.js new file mode 100644 index 0000000..897294c --- /dev/null +++ b/src/mock/ws.js @@ -0,0 +1,44 @@ +'use strict'; + +var EventEmitter = require('events').EventEmitter; +var logger = require('debug-logger')('wsMock'); + +class WebSocketMock { + + constructor() { + this.emitter = new EventEmitter(); + process.nextTick(()=>{ + this.triggerOpen(); + }); + } + + close() { + logger.info('Close'); + setTimeout(()=>{ + this.emitter.emit('close'); + }, 500); + } + + on(event, listener) { + this.emitter.on(event, listener); + } + + send(message, cb) { + setTimeout(()=>{ + cb(); + this.triggerMessage(message); + }, 500); + } + + triggerOpen() { + setTimeout(()=>{ + this.emitter.emit('open'); + }, 500); + } + + triggerMessage(message) { + this.emitter.emit('message', message); + } +} + +module.exports.WebSocketMock = WebSocketMock; diff --git a/test/clientSpec.js b/test/clientSpec.js index 2c2d570..2efd143 100644 --- a/test/clientSpec.js +++ b/test/clientSpec.js @@ -1,23 +1,73 @@ 'use strict'; -var Janus = require('../src/janus').Janus; -var WebSocketServer = require('ws').Server; -var WebServer = require('http').createServer; -var Plugins = require('../src/constants').Plugins; - -var server = WebServer(); -var webSocketServer = new WebSocketServer({ - server: server -}); +var Transaction = require('../src/transaction').Transaction; +var Client = require('../src/client').Client; +var WebSocketMock = require('../src/mock/ws').WebSocketMock; +var assert = require('chai').assert; + +describe('Client', function() { + + it('should connect the client', function(done){ -server.listen(6000, function(){ + var webSocket = new WebSocketMock(); + var client = new Client({ + webSocket: webSocket + }); + client.on('connected',()=>{ + done(); + }); + client.connect(); + }); - describe('Client', function(){ + it('should send and receive an object', function(done){ - it('should connect', function(done){ + var obj = { + foo: 'bar' + }; + var webSocket = new WebSocketMock(); + var client = new Client({ + webSocket: webSocket + }); + client.on('connected',()=>{ + client.sendObject(obj); + }); + client.on('object', (receivedObj)=>{ + assert.deepEqual(obj, receivedObj); done(); }); + client.connect(); }); - run(); + it('should create a transaction', function(done){ + + var webSocket = new WebSocketMock(); + var client = new Client({ + webSocket: webSocket + }); + var transaction = client.transact({ + request: 'foo' + }); + assert.instanceOf(transaction, Transaction); + done(); + }); + + it('should create a request', function(done){ + + var webSocket = new WebSocketMock(); + var client = new Client({ + webSocket: webSocket + }); + + client.on('connected',()=>{ + client.request({ + request: 'foo' + }).then((res)=>{ + assert(res.getRequest(), res.getResponse()); + done(); + }).catch((err)=>{ + done(err); + }); + }); + client.connect(); + }); });