Skip to content

Commit

Permalink
Merge cf90316 into b94961c
Browse files Browse the repository at this point in the history
  • Loading branch information
John Dietz committed Mar 29, 2016
2 parents b94961c + cf90316 commit 831194e
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 51 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ var config = {
}
],
exchange: 'i.write.2.this1'
}
},
statsInterval: 10
};

//init buster bunny
Expand Down Expand Up @@ -128,6 +129,8 @@ The current list of events (the property names) are ...

0. ```WARNING_RAISED``` when a warning (like when a threshold is reached) has been reached
* Parameters: `warningMessage`
0. ```STATS``` when config.stats is provided busterbunny statistics are emitted at the specified interval of seconds
* Parameters: `stats`
0. ```READY``` when buster bunny has successfully established or re-established a connection and channels are available
* No Parameters
0. ```CONNECTING``` when buster bunny is establishing connections
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "busterbunny",
"version": "0.6.1",
"version": "0.7.0",
"description": "Opinionated EventBus Library for amqplib",
"license": "MIT",
"main": "src/busterbunny.js",
Expand Down
14 changes: 13 additions & 1 deletion src/busterbunny.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ module.exports = (function() {

self.EVENTS = Object.freeze({
WARNING_RAISED: 'warning-raised',
STATS: 'stats',
READY: 'ready',
CONNECTING: 'connecting',
RECONNECTING: 'reconnecting',
Expand All @@ -49,6 +50,17 @@ module.exports = (function() {
EVENT_NACKED: 'event-nacked'
});

if(config.statsInterval) {
function emitStats() {
var eventListeners = EventEmitter.listenerCount(self,self.EVENTS.STATS);
if (eventListeners) {
self.emit(self.EVENTS.STATS, JSON.parse(JSON.stringify(_stats)));
}
setTimeout(emitStats, (config.statsInterval * 1000));
}
emitStats();
}

// Url format: amqp://{username}:{password}@{hostname}:{port}/{vhost}?heartbeat={heartbeat}
var _url = format(
'amqp://{0}:{1}@{2}:{3}/{4}?heartbeat={5}'
Expand Down Expand Up @@ -79,7 +91,7 @@ module.exports = (function() {
};

/**
* The callback the defines what to do after an event has been raised on the bus
* The callback defines what to do after an event has been raised on the bus
* @callback BusterBunny~afterRaised
* @param err - if truthy, then an error occurred, otherwise success can be assumed
*/
Expand Down
59 changes: 31 additions & 28 deletions test/unit/busterbunny-amqp-connect-tests.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,33 @@
var mockery = require('mockery');
var assert = require('assert');
var sinon = require('sinon');

describe('busterbunny.js - amqp connect callback', function() {
var mockery = require('mockery');
var assert = require('assert');
var sinon = require('sinon');

before(function() {
mockery.enable({
useCleanCache: true
});
});

beforeEach(function(){
mockery.registerMock('buffer', {});
mockery.registerMock('os', {hostname: function(){return 'mock-host'}});
mockery.registerMock('ip', {address: function(){return '127.0.0.1'}});

mockery.registerAllowable('../../src/busterbunny.js');
mockery.registerAllowable('./mock-amqp.js');
mockery.registerAllowable('util');
mockery.registerAllowable('string-format');
mockery.registerAllowable('events');
mockery.registerAllowable('merge');
});

afterEach(function() {
mockery.deregisterAll();
mockery.resetCache();
});

var fakeConfig = {
cluster: {
host: 'host.host.it',
Expand All @@ -22,14 +48,7 @@ describe('busterbunny.js - amqp connect callback', function() {
exchange: 'i.write.2.this1'
};

before(function() {
mockery.enable({useCleanCache: true});
});

afterEach(function() {
mockery.deregisterAll();
mockery.resetCache();
});

it('should emit a RECONNECTING event when _amqp.connect calls back with an error', function(done) {
var AmqpMock = require('./mock-amqp.js');
Expand Down Expand Up @@ -128,17 +147,12 @@ describe('busterbunny.js - amqp connect callback', function() {
var amqpMock = {};

amqpMock.connect = function(url, options, onConnect) {
assert.strictEqual(options['clientProperties']['ip'], '1.2.3.4');
assert.strictEqual(options['clientProperties']['ip'], '127.0.0.1');
done();
};

mockery.registerMock('amqplib/callback_api', amqpMock);

var ipMock = {
address: function(){return '1.2.3.4'}
};
mockery.registerMock('ip', ipMock);

var BusterBunny = require('../../src/busterbunny.js');
var bb = new BusterBunny(fakeConfig);
});
Expand All @@ -147,23 +161,12 @@ describe('busterbunny.js - amqp connect callback', function() {
var amqpMock = {};

amqpMock.connect = function(url, options, onConnect) {
assert.strictEqual(options['clientProperties']['hostname'], 'testHost');
assert.strictEqual(options['clientProperties']['hostname'], 'mock-host');
done();
};

mockery.registerMock('amqplib/callback_api', amqpMock);

var osMock = {
hostname: function(){return 'testHost'}
};
mockery.registerMock('os', osMock);

var ipMock = {
address: function(){return '1.2.3.4'}
};
mockery.registerMock('ip', ipMock);


var BusterBunny = require('../../src/busterbunny.js');
var bb = new BusterBunny(fakeConfig);
});
Expand Down
36 changes: 34 additions & 2 deletions test/unit/busterbunny-raiseEvents-input-validation-tests.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,38 @@
var mockery = require('mockery');
var assert = require('assert');
var expect = require('chai').expect;
var AmqpMock = require('./mock-amqp.js');

describe('busterbunny.js - raiseEvents input validation', function() {
var assert = require('assert');
var expect = require('chai').expect;

var amqpMock;

before(function() {
mockery.enable({
useCleanCache: true
});
});

beforeEach(function(){
amqpMock = new AmqpMock();

mockery.registerAllowable('../../src/busterbunny.js');
mockery.registerAllowable('./mock-amqp.js');
mockery.registerMock('amqplib/callback_api', amqpMock);

mockery.registerAllowable('util');
mockery.registerAllowable('string-format');
mockery.registerAllowable('events');
mockery.registerAllowable('merge');

mockery.registerMock('buffer', {});
mockery.registerMock('os', {hostname: function(){return 'mock-host'}});
mockery.registerMock('ip', {address: function(){return '127.0.0.1'}});
});

afterEach(function() {
mockery.deregisterAll();
});

var fakeConfig = {
cluster: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,34 @@
var assert = require('assert');
var expect = require('chai').expect;
var mockery = require('mockery');
var AmqpMock = require('./mock-amqp.js');

describe('busterbunny.js - raiseEvents invocation of the afterRaised callback', function() {
var assert = require('assert');
var expect = require('chai').expect;
var mockery = require('mockery');

var amqpMock;

before(function() {
mockery.enable({
useCleanCache: true,
warnOnUnregistered: false
useCleanCache: true
});
});

beforeEach(function(){
amqpMock = new AmqpMock();

mockery.registerAllowable('../../src/busterbunny.js');
mockery.registerAllowable('./mock-amqp.js');

mockery.registerAllowable('util');
mockery.registerAllowable('string-format');
mockery.registerAllowable('events');
mockery.registerAllowable('merge');

mockery.registerMock('buffer', {});
mockery.registerMock('os', {hostname: function(){return 'mock-host'}});
mockery.registerMock('ip', {address: function(){return '127.0.0.1'}});
});

afterEach(function() {
mockery.deregisterAll();
});
Expand Down
62 changes: 49 additions & 13 deletions test/unit/busterbunny-tests.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
var mockery = require('mockery');
var assert = require('assert');
var chai = require('chai');
var expect = chai.expect;

describe("busterbunny.js", function() {
var mockery = require('mockery');
var assert = require('assert');

before(function() {
mockery.enable({
useCleanCache: true
});
});

beforeEach(function(){
mockery.registerAllowable('../../src/busterbunny.js');
mockery.registerAllowable('./mock-amqp.js');
mockery.registerAllowable('string-format');
});

afterEach(function() {
mockery.deregisterAll();
});

var fakeConfig = {
cluster: {
Expand All @@ -22,17 +41,6 @@ describe("busterbunny.js", function() {
exchange: 'i.write.2.this1'
};

before(function() {
mockery.enable({
useCleanCache: true,
warnOnUnregistered: false
});
});

afterEach(function() {
mockery.deregisterAll();
});

it('should update the messagesRejectedWithRetry stat when message is rejected with requeue', function(done) {
var AmqpMock = require('./mock-amqp.js');
var amqpMock = new AmqpMock();
Expand Down Expand Up @@ -699,4 +707,32 @@ describe("busterbunny.js", function() {
bb.subscribe(function() {});
bb.subscribe(function() {});
});

it('should emit heartbeat with stats if config.heartbeatInterval is provided', function(done) {
var AmqpMock = require('./mock-amqp.js');
var amqpMock = new AmqpMock();
amqpMock.connect = function() {};
mockery.registerMock('amqplib/callback_api', amqpMock);

fakeConfig.statsInterval = 1;

var BusterBunny = require('../../src/busterbunny.js');
var bb = new BusterBunny(fakeConfig);

var expectedStats = {
queuedEventsToRaise: 0,
subscribers: 0,
reconnects: 0,
messagesAcknowledged: 0,
messagesRejected: 0,
messagesRejectedWithRetry: 0
}

bb.on(bb.EVENTS.STATS, function(stats) {
expect(stats).to.eql(expectedStats);
done();
});

});

});

0 comments on commit 831194e

Please sign in to comment.