2021-09-17 16:07:27 +03:00
|
|
|
const DomainEvents = require('../');
|
2023-01-04 16:30:35 +03:00
|
|
|
const assert = require('assert');
|
|
|
|
const sinon = require('sinon');
|
|
|
|
const logging = require('@tryghost/logging');
|
2021-09-17 16:07:27 +03:00
|
|
|
|
|
|
|
class TestEvent {
|
|
|
|
/**
|
|
|
|
* @param {string} message
|
|
|
|
*/
|
|
|
|
constructor(message) {
|
|
|
|
this.timestamp = new Date();
|
|
|
|
this.data = {
|
|
|
|
message
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-04 16:30:35 +03:00
|
|
|
const sleep = ms => new Promise((resolve) => {
|
|
|
|
setTimeout(resolve, ms);
|
|
|
|
});
|
|
|
|
|
2021-09-17 16:07:27 +03:00
|
|
|
describe('DomainEvents', function () {
|
2023-01-04 16:30:35 +03:00
|
|
|
afterEach(function () {
|
|
|
|
sinon.restore();
|
|
|
|
DomainEvents.ee.removeAllListeners();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Will call multiple subscribers with the event when it is dispatched', async function () {
|
2021-09-17 16:07:27 +03:00
|
|
|
const event = new TestEvent('Hello, world!');
|
|
|
|
|
2023-01-04 16:30:35 +03:00
|
|
|
let events = [];
|
2021-09-17 16:07:27 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {TestEvent} receivedEvent
|
|
|
|
*/
|
|
|
|
function handler1(receivedEvent) {
|
2023-01-04 16:30:35 +03:00
|
|
|
// Do not add assertions here, they are caught by DomainEvents
|
|
|
|
events.push(receivedEvent);
|
2021-09-17 16:07:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {TestEvent} receivedEvent
|
|
|
|
*/
|
|
|
|
function handler2(receivedEvent) {
|
2023-01-04 16:30:35 +03:00
|
|
|
// Do not add assertions here, they are caught by DomainEvents
|
|
|
|
events.push(receivedEvent);
|
2021-09-17 16:07:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
DomainEvents.subscribe(TestEvent, handler1);
|
|
|
|
DomainEvents.subscribe(TestEvent, handler2);
|
|
|
|
|
|
|
|
DomainEvents.dispatch(event);
|
2023-01-04 16:30:35 +03:00
|
|
|
await DomainEvents.allSettled();
|
|
|
|
|
|
|
|
assert.equal(events.length, 2);
|
|
|
|
assert.equal(events[0], event);
|
|
|
|
assert.equal(events[1], event);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Catches async errors in handlers', async function () {
|
|
|
|
const event = new TestEvent('Hello, world!');
|
|
|
|
|
|
|
|
const stub = sinon.stub(logging, 'error').returns();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {TestEvent} receivedEvent
|
|
|
|
*/
|
|
|
|
async function handler1() {
|
|
|
|
await sleep(10);
|
|
|
|
throw new Error('Test error');
|
|
|
|
}
|
|
|
|
|
|
|
|
DomainEvents.subscribe(TestEvent, handler1);
|
|
|
|
|
|
|
|
DomainEvents.dispatch(event);
|
|
|
|
await DomainEvents.allSettled();
|
|
|
|
assert.equal(stub.calledTwice, true);
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('allSettled', function () {
|
|
|
|
it('Resolves when there are no events', async function () {
|
|
|
|
await DomainEvents.allSettled();
|
|
|
|
assert(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Waits for all listeners', async function () {
|
|
|
|
let counter = 0;
|
|
|
|
DomainEvents.subscribe(TestEvent, async () => {
|
|
|
|
await sleep(20);
|
|
|
|
counter += 1;
|
|
|
|
});
|
|
|
|
DomainEvents.subscribe(TestEvent, async () => {
|
|
|
|
await sleep(40);
|
|
|
|
counter += 1;
|
|
|
|
});
|
|
|
|
|
|
|
|
DomainEvents.dispatch(new TestEvent('Hello, world!'));
|
|
|
|
await DomainEvents.allSettled();
|
|
|
|
assert.equal(counter, 2);
|
|
|
|
});
|
2021-09-17 16:07:27 +03:00
|
|
|
});
|
|
|
|
});
|