app-bus
Version:
An asynchronous application event bus for javascript designed to work with the pub/sub paradigm.
614 lines (598 loc) • 27.1 kB
JavaScript
;
import chai from 'chai';
import AppBusFactory from '../src/app-bus';
const expect = chai.expect;
describe('Mocha and Chai', function () {
it('should work fine.', function () {
expect(true).to.equal(true);
});
});
describe('AppBus', function () {
const testEventName = 'Test';
describe('Basic Functionality:', function () {
const appBus = AppBusFactory.new();
let receivedPayload = false;
let publications = 0;
const testSubscriber = function (payload) {
publications += 1;
receivedPayload = payload;
};
it('Can subscribe,', function () {
appBus.subscribe(testSubscriber).to(testEventName);
});
it('publish without a payload,', function () {
appBus.publish(testEventName).now();
expect(publications).to.equal(1);
});
it('publish with a payload,', function () {
appBus.publish(testEventName).with(true).now();
expect(publications).to.equal(2);
expect(receivedPayload).to.equal(true);
});
it('un-subscribe,', function () {
appBus.unSubscribe(testSubscriber).from(testEventName);
});
it('and then ignore publications.', function () {
appBus.publish(testEventName, false);
});
});
describe('Basic Queued Functionality:', function () {
const appBus = AppBusFactory.new();
let payloadReceivedCounter = 0;
let publicationReceivedCounter = 0;
const testSubscriber = function (payload) {
publicationReceivedCounter += 1;
if (payload !== undefined) {
payloadReceivedCounter += payload;
}
};
it('Can queue several publications with a payload,', function () {
appBus.publish(testEventName).with(3).queue.all();
appBus.publish(testEventName).with(3).queue.all();
appBus.publish(testEventName).with(3).queue.all();
});
it('Can queue several more publications without a payload,', function () {
appBus.publish(testEventName).queue.all();
appBus.publish(testEventName).queue.all();
appBus.publish(testEventName).queue.all();
});
it('subscribe, and have those publications sent.', function () {
appBus.subscribe(testSubscriber).to(testEventName);
expect(payloadReceivedCounter).to.equal(9);
expect(publicationReceivedCounter).to.equal(6);
});
it('Can queue several more publications with a payload,', function () {
payloadReceivedCounter = 0;
publicationReceivedCounter = 0;
appBus.publish(testEventName).with(3).queue.all();
appBus.publish(testEventName).with(3).queue.all();
appBus.publish(testEventName).with(3).queue.all();
});
it('Can queue several more publications without a payload,', function () {
appBus.publish(testEventName).with(3).queue.all();
appBus.publish(testEventName).with(3).queue.all();
appBus.publish(testEventName).with(3).queue.all();
});
it('and each one will have been processed because the subscription existed.', function () {
expect(payloadReceivedCounter).to.equal(18);
expect(publicationReceivedCounter).to.equal(6);
});
});
describe('Other Queued Functionality:', function () {
const appBus = AppBusFactory.new();
let payloadReceivedCounter = 0;
let publicationReceivedCounter = 0;
const testSubscriber = function (payload) {
publicationReceivedCounter += 1;
payloadReceivedCounter += payload;
};
it('Can queue with a payload only the latest out of several publications,', function () {
appBus.publish(testEventName).with(3).queue.latest();
appBus.publish(testEventName).with(3).queue.latest();
appBus.publish(testEventName).with(3).queue.latest();
});
it('subscribe, and have only one publication sent.', function () {
appBus.subscribe(testSubscriber).to(testEventName);
expect(payloadReceivedCounter).to.equal(3);
});
it('Can un-subscribe and then queue without a payload only the latest out of several publications,', function () {
appBus.unSubscribe(testSubscriber).from(testEventName);
publicationReceivedCounter = 0;
appBus.publish(testEventName).queue.latest();
appBus.publish(testEventName).queue.latest();
appBus.publish(testEventName).queue.latest();
});
it('subscribe, and have only one publication sent.', function () {
appBus.subscribe(testSubscriber).to(testEventName);
expect(publicationReceivedCounter).to.equal(1);
});
it('Can queue with a payload only the latest out of several more publications,', function () {
payloadReceivedCounter = 0;
appBus.publish(testEventName).with(3).queue.latest();
appBus.publish(testEventName).with(3).queue.latest();
appBus.publish(testEventName).with(3).queue.latest();
});
it('Can queue again with a different event alongside other events', function () {
appBus.publish('ignored').with(3).queue.latest();
});
it('but each one will have been processed because a subscription exists.', function () {
expect(payloadReceivedCounter).to.equal(9);
});
it('Can queue without a payload only the latest out of several more publications,', function () {
publicationReceivedCounter = 0;
appBus.publish(testEventName).queue.latest();
appBus.publish(testEventName).queue.latest();
appBus.publish(testEventName).queue.latest();
});
it('but each one will have been processed because a subscription exists.', function () {
expect(publicationReceivedCounter).to.equal(3);
});
});
describe('Posting Functionality:', function () {
const appBus = AppBusFactory.new();
let payload1Received = false;
let payload2Received = false;
let payload3Received = false;
let event1Received = false;
let event2Received = false;
let event3Received = false;
const testEventName1 = 'TestEvent1';
const testEventName2 = 'TestEvent2';
const testEventName3 = 'TestEvent3';
const testSubscriber1 = function (payload) {
payload1Received = payload;
event1Received = true;
};
const testSubscriber2 = function (payload) {
payload2Received = payload;
event2Received = true;
};
const testSubscriber3 = function (payload) {
payload3Received = payload;
event3Received = true;
};
it('Can post multiple events with payloads,', function () {
appBus.publish(testEventName1).with(true).post();
appBus.publish(testEventName2).with(true).post();
appBus.publish(testEventName3).with(true).post();
});
it('subscribe to the first and receive only that payload,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
expect(payload1Received).to.equal(true);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(false);
});
it('subscribe to the second and receive only that payload,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.subscribe(testSubscriber2).to(testEventName2);
expect(payload1Received).to.equal(false);
expect(payload2Received).to.equal(true);
expect(payload3Received).to.equal(false);
});
it('subscribe to the third and receive only that payload,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.subscribe(testSubscriber3).to(testEventName3);
expect(payload1Received).to.equal(false);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(true);
});
it('un-subscribe one of them, re-subscribe, and receive only that payload,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.unSubscribe(testSubscriber1).from(testEventName1);
appBus.subscribe(testSubscriber1).to(testEventName1);
expect(payload1Received).to.equal(true);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(false);
});
it('post again and receive only that payload,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.publish(testEventName1).with(true).post();
expect(payload1Received).to.equal(true);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(false);
});
it('make duplicate subscriptions and expect no effects.', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
expect(payload1Received).to.equal(false);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(false);
});
it('Can post multiple events without payloads,', function () {
appBus.clear.subscriptions.all();
appBus.clear.posts.all();
appBus.publish(testEventName1).post();
appBus.publish(testEventName2).post();
appBus.publish(testEventName3).post();
});
it('subscribe to the first and receive only that event,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
expect(event1Received).to.equal(true);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(false);
});
it('subscribe to the second and receive only that event,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber2).to(testEventName2);
expect(event1Received).to.equal(false);
expect(event2Received).to.equal(true);
expect(event3Received).to.equal(false);
});
it('subscribe to the third and receive only that event,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber3).to(testEventName3);
expect(event1Received).to.equal(false);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(true);
});
it('un-subscribe one of them, re-subscribe, and receive only that event,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.unSubscribe(testSubscriber1).from(testEventName1);
appBus.subscribe(testSubscriber1).to(testEventName1);
expect(event1Received).to.equal(true);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(false);
});
it('post again and receive only that event.', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.publish(testEventName1).with(true).post();
expect(event1Received).to.equal(true);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(false);
});
});
describe('Clear Subscriptions Functionality:', function () {
const appBus = AppBusFactory.new();
let event1Received = false;
let event2Received = false;
let event3Received = false;
const testEventName1 = 'TestEvent1';
const testEventName2 = 'TestEvent2';
const testEventName3 = 'TestEvent3';
const testSubscriber1 = function () {
event1Received = true;
};
const testSubscriber2 = function () {
event2Received = true;
};
const testSubscriber3 = function () {
event3Received = true;
};
it('Can subscribe to several events,', function () {
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('clear several subscriptions,', function () {
appBus.clear.subscriptions.byEventName(testEventName1);
appBus.clear.subscriptions.byEventName(testEventName3);
});
it('publish them all,', function () {
appBus.publish(testEventName1).now();
appBus.publish(testEventName2).now();
appBus.publish(testEventName3).now();
});
it('expect no publications for the removed subscriptions,', function () {
expect(event1Received).to.equal(false);
expect(event3Received).to.equal(false);
});
it('expect a publication for remaining publication,', function () {
expect(event2Received).to.equal(true);
});
it('re-subscribe the previously removed subscriptions,', function () {
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('remove all the subscriptions,', function () {
appBus.clear.subscriptions.all();
});
it('publish them all again,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.publish(testEventName1).now();
appBus.publish(testEventName2).now();
appBus.publish(testEventName3).now();
});
it('and expect no effect.', function () {
expect(event1Received).to.equal(false);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(false);
});
});
describe('Clear Posts Functionality:', function () {
const appBus = AppBusFactory.new();
let payload1Received = false;
let payload2Received = false;
let payload3Received = false;
let event1Received = false;
let event2Received = false;
let event3Received = false;
const testEventName1 = 'TestEvent1';
const testEventName2 = 'TestEvent2';
const testEventName3 = 'TestEvent3';
const testSubscriber1 = function (payload) {
payload1Received = payload;
event1Received = true;
};
const testSubscriber2 = function (payload) {
payload2Received = payload;
event2Received = true;
};
const testSubscriber3 = function (payload) {
payload3Received = payload;
event3Received = true;
};
it('Can make posted publications with payloads,', function () {
appBus.publish(testEventName1).with(true).post();
appBus.publish(testEventName2).with(true).post();
appBus.publish(testEventName3).with(true).post();
});
it('subscribe to them all,', function () {
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('expect the payloads to be received', function () {
expect(payload1Received).to.equal(true);
expect(payload2Received).to.equal(true);
expect(payload3Received).to.equal(true);
});
it('clear all the posted publications and subscriptions,', function () {
appBus.clear.posts.all();
appBus.clear.subscriptions.all();
});
it('subscribe again to them all,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('and expect no effect.', function () {
expect(payload1Received).to.equal(false);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(false);
appBus.clear.subscriptions.all();
});
it('Can make posted publications without payloads,', function () {
appBus.publish(testEventName1).post();
appBus.publish(testEventName2).post();
appBus.publish(testEventName3).post();
});
it('subscribe to them all,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('expect the events to be received', function () {
expect(event1Received).to.equal(true);
expect(event2Received).to.equal(true);
expect(event3Received).to.equal(true);
});
it('clear all the posted publications and subscriptions,', function () {
appBus.clear.posts.all();
appBus.clear.subscriptions.all();
});
it('subscribe again to them all,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('and expect no effect.', function () {
expect(event1Received).to.equal(false);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(false);
appBus.clear.posts.all();
appBus.clear.subscriptions.all();
});
it('Can post publications without payloads,', function () {
appBus.publish(testEventName1).post();
appBus.publish(testEventName2).post();
appBus.publish(testEventName3).post();
});
it('remove some of them', function () {
appBus.clear.posts.byEventName(testEventName1);
appBus.clear.posts.byEventName(testEventName3);
});
it('subscribe to them all,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('expect the removed posted publications to not publish', function () {
expect(event1Received).to.equal(false);
expect(event3Received).to.equal(false);
});
it('expect the remaining posted publication to publish', function () {
expect(event2Received).to.equal(true);
});
});
describe('Clear Queue Functionality:', function () {
const appBus = AppBusFactory.new();
let payload1Received = false;
let payload2Received = false;
let payload3Received = false;
let event1Received = false;
let event2Received = false;
let event3Received = false;
const testEventName1 = 'TestEvent1';
const testEventName2 = 'TestEvent2';
const testEventName3 = 'TestEvent3';
const testSubscriber1 = function (payload) {
payload1Received = payload;
event1Received = true;
};
const testSubscriber2 = function (payload) {
payload2Received = payload;
event2Received = true;
};
const testSubscriber3 = function (payload) {
payload3Received = payload;
event3Received = true;
};
it('Can queue publications with payloads,', function () {
appBus.publish(testEventName1).with(true).queue.all();
appBus.publish(testEventName2).with(true).queue.all();
appBus.publish(testEventName3).with(true).queue.all();
});
it('subscribe to them all,', function () {
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('expect the payloads to be received', function () {
expect(payload1Received).to.equal(true);
expect(payload2Received).to.equal(true);
expect(payload3Received).to.equal(true);
});
it('clear all the queued publications and subscriptions,', function () {
appBus.clear.queue.all();
appBus.clear.subscriptions.all();
});
it('subscribe to them all,', function () {
payload1Received = false;
payload2Received = false;
payload3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('and expect no effect.', function () {
expect(payload1Received).to.equal(false);
expect(payload2Received).to.equal(false);
expect(payload3Received).to.equal(false);
appBus.clear.subscriptions.all();
});
it('Can queue publications without payloads,', function () {
appBus.publish(testEventName1).queue.all();
appBus.publish(testEventName2).queue.all();
appBus.publish(testEventName3).queue.all();
});
it('subscribe to them all,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('expect the events to be received', function () {
expect(event1Received).to.equal(true);
expect(event2Received).to.equal(true);
expect(event3Received).to.equal(true);
});
it('clear all the queued publications and subscriptions,', function () {
appBus.clear.queue.all();
appBus.clear.subscriptions.all();
});
it('subscribe to them all,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('and expect no effect.', function () {
expect(event1Received).to.equal(false);
expect(event2Received).to.equal(false);
expect(event3Received).to.equal(false);
appBus.clear.posts.all();
appBus.clear.subscriptions.all();
});
it('Can queue publications without payloads,', function () {
appBus.publish(testEventName1).queue.all();
appBus.publish(testEventName2).queue.all();
appBus.publish(testEventName3).queue.all();
});
it('remove some of them', function () {
appBus.clear.queue.byEventName(testEventName1);
appBus.clear.queue.byEventName(testEventName3);
});
it('subscribe to them all,', function () {
event1Received = false;
event2Received = false;
event3Received = false;
appBus.subscribe(testSubscriber1).to(testEventName1);
appBus.subscribe(testSubscriber2).to(testEventName2);
appBus.subscribe(testSubscriber3).to(testEventName3);
});
it('expect the removed queued publications to not publish', function () {
expect(event1Received).to.equal(false);
expect(event3Received).to.equal(false);
});
it('expect the remaining queued publication to publish', function () {
expect(event2Received).to.equal(true);
});
});
describe('Edge Cases:', function () {
const appBus = AppBusFactory.new();
let counter = 0;
const testSubscriber = function (payload) {
counter += payload;
};
it('Ignores duplicate subscriptions.', function () {
appBus.subscribe(testSubscriber).to(testEventName);
appBus.subscribe(testSubscriber).to(testEventName);
appBus.subscribe(testSubscriber).to(testEventName);
appBus.publish(testEventName).with(3).now();
expect(counter).to.equal(3);
});
});
describe('Module:', function () {
it('Can import the factory,', function () {
expect(AppBusFactory).to.have.property('new');
});
it('and use it to create an instance.', function () {
const appBus = AppBusFactory.new();
expect(appBus).to.have.property('publish');
expect(appBus).to.have.property('subscribe');
});
it('Can require the factory', function () {
const appBusFactory = require('../src/app-bus');
expect(appBusFactory).to.have.property('new');
});
it('and use it to create an instance.', function () {
const appBus = AppBusFactory.new();
expect(appBus).to.have.property('publish');
expect(appBus).to.have.property('subscribe');
});
});
});