Skip to content

Commit

Permalink
Add TestEmitter.listenedTo() method
Browse files Browse the repository at this point in the history
This allow consuming code to check if all published events are listened to so no events are missed.
  • Loading branch information
unional committed Nov 18, 2017
1 parent baeaaf3 commit 576607a
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/TestEmitter.listeningTo.spec.ts
Original file line number Diff line number Diff line change
@@ -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)
})
21 changes: 21 additions & 0 deletions src/TestEmitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,27 @@ export class TestEmitter extends Emitter {
allListenersCalled(): boolean {
return !Object.keys(this.calledListeners).some(t => !this.calledListeners[t])
}
listenedTo(events: (TypedEvent<any, any> | string)[] | { [k: string]: TypedEvent<any, any> }) {
if (Array.isArray(events))
return this.listenedToEventArray(events)
else
return this.listenedToEventMap(events)
}

private listenedToEventArray(events: (TypedEvent<any, any> | 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<any, any> }) {
const keys = Object.keys(events)
return this.listenedToEventArray(keys.map(k => events[k]))
}

protected addErrorEventListener<Payload, Meta>(listener: (payload: Payload, meta: Meta, error: boolean) => void): EventSubscription {
return this.emitter.addListener(errorEvent.type, listener)
Expand Down

0 comments on commit 576607a

Please sign in to comment.