event-emitters
Version:
153 lines • 6.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var _1 = require(".");
describe('EventEmitterWithCurrent', function () {
/* eslint-disable @typescript-eslint/explicit-function-return-type */
var defaultVal = 'first';
var createEventEmitter = function () { return new _1.EventEmitterWithCurrent(defaultVal); };
var emitter = createEventEmitter();
beforeEach(function () {
emitter = createEventEmitter();
});
it('sends current status when listener first subscribes', function () {
var current = '';
emitter.subscribe(function (newVal) {
current = newVal;
});
expect(current).toEqual(defaultVal);
});
it('updates subscribed listener with statuses as they change', function () {
var current = '';
emitter.subscribe(function (newVal) {
current = newVal;
});
var secondVal = 'second';
emitter.emit(secondVal);
expect(current).toEqual(secondVal);
});
it('supports multiple listeners', function () {
var current1 = '';
var current2 = '';
emitter.subscribe(function (newVal) {
current1 = newVal;
});
emitter.subscribe(function (newVal) {
current2 = newVal;
});
expect(current1).toEqual(defaultVal);
expect(current2).toEqual(defaultVal);
var secondVal = 'second';
emitter.emit(secondVal);
expect(current1).toEqual(secondVal);
expect(current2).toEqual(secondVal);
});
it('stops updating a listener after `unsubscribe` is called', function () {
var current1 = '';
var current2 = '';
var secondListener = function (newVal) {
current2 = newVal;
};
emitter.subscribe(function (newVal) {
current1 = newVal;
});
emitter.subscribe(secondListener);
expect(current1).toEqual(defaultVal);
expect(current2).toEqual(defaultVal);
var secondVal = 'second';
emitter.emit(secondVal);
expect(current1).toEqual(secondVal);
expect(current2).toEqual(secondVal);
emitter.unsubscribe(secondListener);
var thirdVal = 'third';
emitter.emit(thirdVal);
expect(current1).toEqual(thirdVal);
expect(current2).toEqual(secondVal);
});
it('throws an error when trying to subscribe the same listener twice', function () {
// eslint-disable-next-line @typescript-eslint/no-empty-function
var listener = function () { };
emitter.subscribe(listener);
expect(function () {
emitter.subscribe(listener);
}).toThrow();
});
it('throws an error when trying to unsubscribe a listener that is not listening', function () {
// eslint-disable-next-line @typescript-eslint/no-empty-function
var listener1 = function () { };
// eslint-disable-next-line @typescript-eslint/no-empty-function
var listener2 = function () { };
emitter.subscribe(listener1);
expect(function () {
emitter.unsubscribe(listener2);
}).toThrow();
});
});
describe('QueueingEventEmitter', function () {
var createEventEmitter = function () { return new _1.QueueingEventEmitter(); };
var emitter = createEventEmitter();
beforeEach(function () {
emitter = createEventEmitter();
});
it('queues messages when there are no subscribers and emits them to first subscriber', function () {
var subscriber = jest.fn();
emitter.emit('one');
emitter.emit('two');
emitter.subscribe(subscriber);
expect(subscriber.mock.calls).toEqual([['one'], ['two']]);
});
it('stops queueing messages when there is a subscriber', function () {
var subscriber = jest.fn();
emitter.emit('one');
emitter.emit('two');
emitter.subscribe(subscriber);
expect(subscriber.mock.calls).toEqual([['one'], ['two']]);
emitter.emit('three');
expect(subscriber.mock.calls).toEqual([['one'], ['two'], ['three']]);
});
it('resumes queueing message when it loses all subscribers', function () {
var subscriber1 = jest.fn();
var subscriber2 = jest.fn();
emitter.emit('one');
emitter.emit('two');
emitter.subscribe(subscriber1);
emitter.subscribe(subscriber2);
expect(subscriber1.mock.calls).toEqual([['one'], ['two']]);
expect(subscriber2).toHaveBeenCalledTimes(0);
emitter.emit('three');
expect(subscriber1.mock.calls).toEqual([['one'], ['two'], ['three']]);
expect(subscriber2.mock.calls).toEqual([['three']]);
emitter.unsubscribe(subscriber1);
emitter.emit('four');
expect(subscriber1).toHaveBeenCalledTimes(3);
expect(subscriber2.mock.calls).toEqual([['three'], ['four']]);
emitter.unsubscribe(subscriber2);
emitter.emit('five');
emitter.emit('six');
var subscriber3 = jest.fn();
emitter.subscribe(subscriber3);
expect(subscriber3.mock.calls).toEqual([['five'], ['six']]);
emitter.emit('seven');
expect(subscriber3.mock.calls).toEqual([['five'], ['six'], ['seven']]);
});
it('re-throws the final error when the subscriber throws during queue drain', function () {
var subscriber1 = jest
.fn()
.mockImplementationOnce(function () {
throw new Error('1');
})
.mockImplementationOnce(function () {
throw new Error('2');
});
emitter.emit('one');
emitter.emit('two');
emitter.emit('three');
expect(function () {
emitter.subscribe(subscriber1);
}).toThrow('2');
// make sure the queue is drained
var subscriber2 = jest.fn();
emitter.subscribe(subscriber2);
expect(subscriber2).toHaveBeenCalledTimes(0);
});
});
//# sourceMappingURL=index.spec.js.map