local-bus
Version:
A generic bus for topic-based publication of events
197 lines (177 loc) • 6.48 kB
JavaScript
;
var expect = require('chai').expect;
var sinon = require('sinon');
var TopicSubscribers = require('../src/lib/topic-subscribers');
var _ = require('lodash');
var q = require('q');
function makeSubscriptions(subscriptions, topicSubscribers){
_.forEach(subscriptions, function(subscribers, topic){
_.forEach(subscribers, function(subscriber){
topicSubscribers.add(topic, subscriber);
});
});
}
describe('TopicSubscribers', function(){
context('With simple keyword subscriptions', function(){
beforeEach(function(done){
var gwatch = sinon.stub();
var mwatch = sinon.stub();
var nwatch = sinon.stub();
var twatch = sinon.stub();
var subscriptions = {};
subscriptions['stock.nyse.google'] = [gwatch, nwatch];
subscriptions['stock.nyse.microsoft'] = [mwatch, nwatch];
subscriptions['stock.tokyo.google'] = [gwatch, twatch];
subscriptions['stock.tokyo.microsoft'] = [mwatch, twatch];
this.subscriptions = subscriptions;
var topicSubscribers = {};
topicSubscribers['stock.nyse.google'] = [gwatch, nwatch];
topicSubscribers['stock.nyse.microsoft'] = [mwatch, nwatch];
topicSubscribers['stock.tokyo.google'] = [gwatch, twatch];
topicSubscribers['stock.tokyo.microsoft'] = [mwatch, twatch];
this.subscribers = new TopicSubscribers();
makeSubscriptions(subscriptions, this.subscribers);
done();
});
it('TopicSubscribers.choose returns the proper subscribers for each topic', function(done){
var test = this;
_.reduce(test.topicSubscribers, function(a, subscribers, topic){
return a.then(function(){
return q.ninvoke(test.subscribers, 'choose', topic)
.then(function(found){
expect(found).to.have.length(subscribers.length);
var containsAll = _.every(subscribers, _.partial(_.contains, found));
expect(containsAll).to.be.true;
});
});
}, q())
.then(function(){return done();})
.fail(function(err){
return done(err);
}).done();
});
});
context('With single word wild card (*) subscriptions', function(){
beforeEach(function(done){
var gwatch = sinon.stub();
var mwatch = sinon.stub();
var nwatch = sinon.stub();
var twatch = sinon.stub();
var subscriptions = {};
subscriptions['stock.*.google'] = [gwatch];
subscriptions['stock.*.microsoft'] = [mwatch];
subscriptions['stock.nyse.*'] = [nwatch];
subscriptions['stock.tokyo.*'] = [twatch];
this.subscriptions = subscriptions;
var topicSubscribers = {};
topicSubscribers['stock.nyse.google'] = [gwatch, nwatch];
topicSubscribers['stock.nyse.microsoft'] = [mwatch, nwatch];
topicSubscribers['stock.tokyo.google'] = [gwatch, twatch];
topicSubscribers['stock.tokyo.microsoft'] = [mwatch, twatch];
this.subscribers = new TopicSubscribers();
makeSubscriptions(subscriptions, this.subscribers);
done();
});
it('TopicSubscribers.choose returns the proper subscribers for each topic', function(done){
var test = this;
_.reduce(test.topicSubscribers, function(a, subscribers, topic){
return a.then(function(){
return q.ninvoke(test.subscribers, 'choose', topic)
.then(function(found){
expect(found).to.have.length(subscribers.length);
var containsAll = _.every(subscribers, _.partial(_.contains, found));
expect(containsAll).to.be.true;
});
});
}, q())
.then(function(){return done();})
.fail(function(err){
return done(err);
}).done();
});
});
context('With multi word wild card (#) subscriptions', function(){
beforeEach(function(done){
var gwatch = sinon.stub();
var mwatch = sinon.stub();
var nwatch = sinon.stub();
var twatch = sinon.stub();
var awatch = sinon.stub();
var subscriptions = {};
subscriptions['#.google'] = [gwatch];
subscriptions['#.microsoft'] = [mwatch];
subscriptions['#.nyse.*'] = [nwatch];
subscriptions['#.tokyo.*'] = [twatch];
subscriptions['stock.#'] = [awatch];
this.subscriptions = subscriptions;
var topicSubscribers = {};
topicSubscribers['stock.nyse.google'] = [gwatch, nwatch, awatch];
topicSubscribers['stock.nyse.microsoft'] = [mwatch, nwatch, awatch];
topicSubscribers['stock.tokyo.google'] = [gwatch, twatch, awatch];
topicSubscribers['stock.tokyo.microsoft'] = [mwatch, twatch, awatch];
topicSubscribers['trades.tokyo.microsoft'] = [];
this.subscribers = new TopicSubscribers();
makeSubscriptions(subscriptions, this.subscribers);
done();
});
it('TopicSubscribers.choose returns the proper subscribers for each topic', function(done){
var test = this;
_.reduce(test.topicSubscribers, function(a, subscribers, topic){
return a.then(function(){
return q.ninvoke(test.subscribers, 'choose', topic)
.then(function(found){
expect(found).to.have.length(subscribers.length);
var containsAll = _.every(subscribers, _.partial(_.contains, found));
expect(containsAll).to.be.true;
});
});
}, q())
.then(function(){return done();})
.fail(function(err){
return done(err);
}).done();
});
});
context('Without wild cards', function(){
beforeEach(function(done){
this.subscribers = new TopicSubscribers();
done();
});
it('TopicSubscribers.choose returns the proper subscribers for parent pattern', function(done){
var test = this;
var nwatch = sinon.stub();
var gwatch = sinon.stub();
test.subscribers.add('stock.nyse', nwatch);
test.subscribers.add('stock.nyse.google', gwatch);
q.ninvoke(test.subscribers, 'choose', 'stock.nyse')
.then(function(found){
expect(found).to.have.length(1);
var containsAll = _.every([nwatch], _.partial(_.contains, found));
expect(containsAll).to.be.true;
})
.then(function(){return done();})
.fail(function(err){
return done(err);
})
.done();
});
it('TopicSubscribers.choose returns the proper subscribers for extended pattern', function(done){
var test = this;
var nwatch = sinon.stub();
var gwatch = sinon.stub();
test.subscribers.add('stock.nyse', nwatch);
test.subscribers.add('stock.nyse.google', gwatch);
q.ninvoke(test.subscribers, 'choose', 'stock.nyse.google')
.then(function(found){
expect(found).to.have.length(1);
var containsAll = _.every([gwatch], _.partial(_.contains, found));
expect(containsAll).to.be.true;
})
.then(function(){return done();})
.fail(function(err){
return done(err);
})
.done();
});
});
});