UNPKG

linagora-rse

Version:
193 lines (167 loc) 6.72 kB
'use strict'; var mockery = require('mockery'); var sinon = require('sinon'); var expect = require('chai').expect; describe('The Core DB Mongo module', function() { describe('buildConnectionString method', function() { var buildConnectionString = null; beforeEach(function() { buildConnectionString = this.helpers.requireBackend('core/db/mongo').buildConnectionString; }); it('should return a string mongodb://hostname:port/dbname', function() { expect(buildConnectionString('localhost', 'port', 'base', null, null, {})).to.equal('mongodb://localhost:port/base'); }); it('should return a string mongodb://username:password@hostname:port/dbname', function() { expect(buildConnectionString('localhost', 'port', 'base', 'user', 'pass', {})).to.equal('mongodb://user:pass@localhost:port/base'); }); }); describe('connection status listener & emitter', function() { it('should register a listener on connected and disconnected events', function() { this.mongoose = this.helpers.requireFixture('mongoose').mongoose(); var events = []; this.mongoose.connection.on = function(evt) { events.push(evt); }; mockery.registerMock('mongoose', this.mongoose); this.mongo = this.helpers.requireBackend('core').db.mongo; expect(events).to.contain('connected'); expect(events).to.contain('disconnected'); }); it('should expose a isConnected() method', function() { this.mongoose = this.helpers.requireFixture('mongoose').mongoose(); mockery.registerMock('mongoose', this.mongoose); this.mongo = this.helpers.requireBackend('core').db.mongo; expect(this.mongo).to.respondTo('isConnected'); }); it('should publish a mongodb:connectionAvailable event when receiving a connected event', function(done) { this.mongoose = this.helpers.requireFixture('mongoose').mongoose(); var events = {}; this.mongoose.connection.on = function(evt, callback) { events[evt] = callback; }; mockery.registerMock('mongoose', this.mongoose); var configmock = function() { return { get: function(callback) { return callback(new Error('Not useful')); } }; }; mockery.registerMock('../../../core/esn-config', configmock); mockery.registerMock('./global', {}); this.mongo = this.helpers.requireBackend('core').db.mongo; this.mongo = this.helpers.requireBackend('core').db.redis; this.pubsub = this.helpers.requireBackend('core').pubsub.local; this.pubsub.topic('mongodb:connectionAvailable').subscribe(function() { done(); }); events.connected(); }); describe('The reconnect event', function() { var events; var mongoose; var forceReconnect; var reconnectAttemptCounter = 0; beforeEach(function() { mongoose = this.helpers.requireFixture('mongoose').mongoose(); mongoose.connect = sinon.spy(); events = {}; mongoose.connection.on = function(evt, callback) { events[evt] = callback; }; mockery.registerMock('mongoose', mongoose); var configMock = function() { return { db: { forceReconnectOnDisconnect: forceReconnect, attemptsLimit: 100 } }; }; var core = { config: configMock, logger: this.helpers.requireFixture('logger-noop')(), pubsub: { local: { topic: function() { return { publish: function() { } }; } } } }; mockery.registerMock('../../../core', core); }); it('should reconnect when disconnected and configured to reconnect', function() { var clock = sinon.useFakeTimers(); var reconnectTimeout = 1; forceReconnect = true; reconnectAttemptCounter = reconnectAttemptCounter + 1; this.helpers.requireBackend('core').db.mongo; events.disconnected(); clock.tick(reconnectTimeout * 1000); expect(mongoose.connect).to.have.been.calledOnce; clock.restore(); }); it('should not reconnect when disconnected and configured to reconnect', function() { forceReconnect = false; this.helpers.requireBackend('core').db.mongo; events.disconnected(); expect(mongoose.connect).to.not.have.been.called; }); }); describe('isConnected() method', function() { it('should be false', function() { this.mongoose = this.helpers.requireFixture('mongoose').mongoose(); mockery.registerMock('mongoose', this.mongoose); this.mongo = this.helpers.requireBackend('core').db.mongo; expect(this.mongo.isConnected()).to.be.false; }); it('should be true after a connected event', function() { this.mongoose = this.helpers.requireFixture('mongoose').mongoose(); var events = {}; this.mongoose.connection.on = function(evt, callback) { events[evt] = callback; }; mockery.registerMock('mongoose', this.mongoose); var configmock = function() { return { get: function(callback) { return callback(new Error('Not useful')); } }; }; mockery.registerMock('../../../core/esn-config', configmock); mockery.registerMock('./global', {}); this.helpers.requireBackend('core').db.redis; this.mongo = this.helpers.requireBackend('core').db.mongo; events.connected(); expect(this.mongo.isConnected()).to.be.true; }); it('should be false after a connected and then a disconnected event', function() { this.mongoose = this.helpers.requireFixture('mongoose').mongoose(); var events = {}; this.mongoose.connection.on = function(evt, callback) { events[evt] = callback; }; mockery.registerMock('mongoose', this.mongoose); var configmock = function() { return { get: function(callback) { return callback(new Error('Not useful')); } }; }; mockery.registerMock('../../../core/esn-config', configmock); mockery.registerMock('./global', {}); this.helpers.requireBackend('core').db.redis; this.mongo = this.helpers.requireBackend('core').db.mongo; events.connected(); events.disconnected(); expect(this.mongo.isConnected()).to.be.false; }); }); }); });