From 576607a322214198d982564849119e8b00cd9b9f Mon Sep 17 00:00:00 2001 From: unional Date: Sat, 18 Nov 2017 01:35:20 -0800 Subject: [PATCH] Add TestEmitter.listenedTo() method This allow consuming code to check if all published events are listened to so no events are missed. --- src/TestEmitter.listeningTo.spec.ts | 27 +++++++++++++++++++++++++++ src/TestEmitter.ts | 21 +++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/TestEmitter.listeningTo.spec.ts diff --git a/src/TestEmitter.listeningTo.spec.ts b/src/TestEmitter.listeningTo.spec.ts new file mode 100644 index 0000000..6de5cbb --- /dev/null +++ b/src/TestEmitter.listeningTo.spec.ts @@ -0,0 +1,27 @@ +import { test } from 'ava'; +import { TestEmitter, createEvent } from './index'; + +test('no event returns true', t => { + const emitter = new TestEmitter() + t.is(emitter.listenedTo([]), true) + t.is(emitter.listenedTo({}), true) +}) + +test('not listened to event returns false', t => { + const emitter = new TestEmitter() + const c = createEvent('count') + t.is(emitter.listenedTo([c]), false) + t.is(emitter.listenedTo({ c }), false) + t.is(emitter.listenedTo([c.type]), false) +}) + +test('check a listened to event returns true', t => { + const emitter = new TestEmitter() + const c = createEvent('count') + const d = createEvent('dount') + emitter.on(c, () => { return }) + emitter.on(d, () => { return }) + t.is(emitter.listenedTo([c]), true) + t.is(emitter.listenedTo({ c }), true) + t.is(emitter.listenedTo([c.type]), true) +}) diff --git a/src/TestEmitter.ts b/src/TestEmitter.ts index fac2707..4d8e5c7 100644 --- a/src/TestEmitter.ts +++ b/src/TestEmitter.ts @@ -31,6 +31,27 @@ export class TestEmitter extends Emitter { allListenersCalled(): boolean { return !Object.keys(this.calledListeners).some(t => !this.calledListeners[t]) } + listenedTo(events: (TypedEvent | string)[] | { [k: string]: TypedEvent }) { + if (Array.isArray(events)) + return this.listenedToEventArray(events) + else + return this.listenedToEventMap(events) + } + + private listenedToEventArray(events: (TypedEvent | string)[]) { + const keys = Object.keys(this.calledListeners) + if (events.length === 0) return true + if (events.length >= keys.length) return false + return events.every(event => { + const type = typeof event === 'string' ? event : event.type + return keys.some(k => k === type) + }) + } + + private listenedToEventMap(events: { [k: string]: TypedEvent }) { + const keys = Object.keys(events) + return this.listenedToEventArray(keys.map(k => events[k])) + } protected addErrorEventListener(listener: (payload: Payload, meta: Meta, error: boolean) => void): EventSubscription { return this.emitter.addListener(errorEvent.type, listener)