UNPKG

acelga-bus

Version:

An extensible typescript message bus with support for middlewares

160 lines 6.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const index_1 = require("@src/index"); const utils_1 = require("./utils"); describe('Bus', () => { let bus; let add2; let half; let sub2; let mul5; let sub1; let add3; let end; beforeAll(() => { bus = new index_1.Bus(); add2 = utils_1.CustomEventOperationMiddleware(2, utils_1.Operation.Add); half = utils_1.CustomEventOperationMiddleware(2, utils_1.Operation.Divide); sub2 = utils_1.CustomEventOperationMiddleware(2, utils_1.Operation.Substract); mul5 = utils_1.CustomEventOperationMiddleware(5, utils_1.Operation.Multiply); sub1 = utils_1.CustomEventOperationMiddleware(1, utils_1.Operation.Substract); add3 = utils_1.CustomEventOperationMiddleware(3, utils_1.Operation.Add); end = utils_1.CustomEventOperationMiddleware(1, utils_1.Operation.Void); }); it('should exist', () => { expect(bus instanceof index_1.Bus).toBeTruthy(); }); it('should send and receive messages', (done) => { const event = new utils_1.EmptyEvent(); bus.on(utils_1.EmptyEvent, (e) => { expect(e).toEqual(event); done(); }); bus.publish(event); }); it('should send and receive messages to all subscrivers', (done) => { const event = new utils_1.EmptyEvent(); const fn1 = jest.fn((e) => expect(e).toBeInstanceOf(utils_1.EmptyEvent)); const fn2 = jest.fn((e) => expect(e).toBeInstanceOf(utils_1.EmptyEvent)); const fn3 = jest.fn((e) => expect(e).toBeInstanceOf(utils_1.EmptyEvent)); bus.on(utils_1.EmptyEvent, fn1); bus.on(utils_1.EmptyEvent, fn2); bus.on(utils_1.EmptyEvent, fn3); bus.publish(event); setTimeout(() => { expect(fn1.mock.calls.length).toBe(1); expect(fn2.mock.calls.length).toBe(1); expect(fn3.mock.calls.length).toBe(1); done(); }, 0); }); it('should send and receive messages to the correct destination (inherited classes)', (done) => { const event = new utils_1.EmptyEvent(); class Event2 extends utils_1.EmptyEvent { } const event2 = new Event2(); bus.on(Event2, (e) => { expect(e).toBeInstanceOf(Event2); done(); }); bus.publish(event); bus.publish(event2); }); it('should send and receive messages to the correct destination (independen classes)', (done) => { const event = new utils_1.EmptyEvent(); class Event2 { } const event2 = new Event2(); bus.on(Event2, (e) => { expect(e).toBeInstanceOf(Event2); done(); }); bus.publish(event); bus.publish(event2); }); it('should send and receive messages to the correct destination (no callbacks)', (done) => { const customBus = new index_1.Bus(); const event = new utils_1.EmptyEvent(); class Event2 { } class Event3 { } const event2 = new Event2(); const event3 = new Event3(); const fn = jest.fn(); customBus.on(Event3, fn); setTimeout(() => { expect(fn.mock.calls.length).toBe(0); done(); }, 5); customBus.publish(event); customBus.publish(event2); }); describe('Middlewares', () => { it('should apply the middlewares only one time', (done) => { const customBus = new index_1.Bus(); const event = new utils_1.CustomEventNumber(1); customBus.pushMiddleware(add2); customBus.on(utils_1.CustomEventNumber, (eventResult) => { expect(eventResult.data).toBe(3); done(); }); customBus.publish(event); }); it('Middlewares should be executed in the correct order', (done) => { const customBus = new index_1.Bus(); const event = new utils_1.CustomEventNumber(2); customBus.unshiftMiddleware(half); customBus.pushMiddleware(sub2); customBus.pushMiddleware(mul5); customBus.unshiftMiddleware(sub1); customBus.pushMiddleware(add3); customBus.on(utils_1.CustomEventNumber, (eventResult) => { expect(eventResult.data).toBe(10.5); done(); }); customBus.publish(event); }); it('Middlewares should stop the execution if they return void', (done) => { const customBus = new index_1.Bus(); const event = new utils_1.CustomEventNumber(2); customBus.unshiftMiddleware(half); customBus.pushMiddleware(mul5); customBus.unshiftMiddleware(end); customBus.unshiftMiddleware(sub1); customBus.pushMiddleware(add3); const fn = jest.fn(); customBus.on(utils_1.CustomEventNumber, fn); customBus.publish(event); setTimeout(() => { expect(fn.mock.calls.length).toBe(0); done(); }, 5); }); }); describe('Publisher', () => { it('should allow to have different sets of middlewares in every publisher', (done) => { const customBus = new index_1.Bus(); const pubA = customBus.createPublisher(); const pubB = customBus.createPublisher(); const event = new utils_1.CustomEventNumber(4); customBus.unshiftMiddleware(half); pubA.pushMiddleware(sub2); pubA.pushMiddleware(half); pubB.unshiftMiddleware(add2); pubB.pushMiddleware(mul5); const handler = jest.fn((eventResult) => Promise.resolve()); customBus.on(utils_1.CustomEventNumber, handler); customBus.publish(event); pubA.publish(event); pubB.publish(event); setTimeout(() => { expect(handler.mock.calls.filter(call => call[0].data === 2).length).toBe(1); expect(handler.mock.calls.filter(call => call[0].data === 1).length).toBe(1); expect(handler.mock.calls.filter(call => call[0].data === 30).length).toBe(1); done(); }, 5); }); }); }); //# sourceMappingURL=bus.spec.js.map