Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ export class Emitter<
*/
fake(events?: (keyof EventsList | Constructor<any>)[]): EventsBuffer<EventsList> {
this.restore()
this.#eventsBuffer = new EventsBuffer<EventsList>()
this.#eventsBuffer = new EventsBuffer<EventsList>(() => this.restore())

if (!events) {
debug('faking all events')
Expand Down
14 changes: 14 additions & 0 deletions src/events_buffer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ export class EventsBuffer<EventsList extends Record<string | symbol | number, an
*/
#events: BufferedEventsList<EventsList>[] = []

/**
* Function to call when disposing the buffer to restore
* the emitter to its original state
*/
#restoreFn: () => void

constructor(restoreFn: () => void) {
this.#restoreFn = restoreFn
}

/**
* Track emitted event
*
Expand Down Expand Up @@ -226,4 +236,8 @@ export class EventsBuffer<EventsList extends Record<string | symbol | number, an
flush(): void {
this.#events = []
}

[Symbol.dispose](): void {
this.#restoreFn()
}
}
21 changes: 21 additions & 0 deletions tests/emitter/emit.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -433,4 +433,25 @@ test.group('Emitter | fake', () => {
assert.deepEqual(stack, [{ name: 'new:user', data: { id: 1 } }])
assert.deepEqual(events.all(), [{ event: 'resend:email', data: { email: 'foo@bar.com' } }])
})

test('restore fakes using Symbol.dispose', async ({ assert }) => {
const stack: any[] = []

const app = new Application(BASE_URL, { environment: 'web' })
const emitter = new Emitter<{ 'new:user': { id: number } }>(app)

emitter.on('new:user', (data) => {
stack.push(data)
})

{
using events = emitter.fake(['new:user'])
await emitter.emit('new:user', { id: 1 })
assert.deepEqual(stack, [])
assert.deepEqual(events.all(), [{ event: 'new:user', data: { id: 1 } }])
}

await emitter.emit('new:user', { id: 2 })
assert.deepEqual(stack, [{ id: 2 }])
})
})
42 changes: 21 additions & 21 deletions tests/events_buffer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ test.group('Events buffer', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })

assert.deepEqual(events.all(), [{ event: 'new:user', data: { id: 1 } }])
Expand All @@ -33,7 +33,7 @@ test.group('Events buffer', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })
events.add('new:user', { id: 1 })
events.add('new:user', { id: 2 })
Expand All @@ -46,7 +46,7 @@ test.group('Events buffer', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
assert.doesNotThrow(() => events.assertNoneEmitted())
events.add('new:user', { id: 1 })
assert.throws(
Expand All @@ -61,7 +61,7 @@ test.group('Events buffer | find', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })

const event = events.find('new:user')
Expand All @@ -78,7 +78,7 @@ test.group('Events buffer | find', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })
events.add('new:user', { id: 2 })
events.add('new:user', { id: 3 })
Expand All @@ -100,7 +100,7 @@ test.group('Events buffer | find', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {}
const userRegisteredEvent = new UserRegistered()
Expand All @@ -119,7 +119,7 @@ test.group('Events buffer | find', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {
constructor(public id: number) {}
Expand All @@ -146,7 +146,7 @@ test.group('Events buffer | exist', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })

assert.isTrue(events.exists('new:user'))
Expand All @@ -156,7 +156,7 @@ test.group('Events buffer | exist', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })
events.add('new:user', { id: 2 })
events.add('new:user', { id: 3 })
Expand All @@ -172,7 +172,7 @@ test.group('Events buffer | exist', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {}
const userRegisteredEvent = new UserRegistered()
Expand All @@ -188,7 +188,7 @@ test.group('Events buffer | exist', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {
constructor(public id: number) {}
Expand All @@ -215,7 +215,7 @@ test.group('Events buffer | assertEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })

assert.doesNotThrow(() => events.assertEmitted('new:user'))
Expand All @@ -229,7 +229,7 @@ test.group('Events buffer | assertEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })
events.add('new:user', { id: 2 })
events.add('new:user', { id: 3 })
Expand All @@ -250,7 +250,7 @@ test.group('Events buffer | assertEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {}
class ResendEmail {}
Expand All @@ -269,7 +269,7 @@ test.group('Events buffer | assertEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class ResendEmail {}
class UserRegistered {
Expand Down Expand Up @@ -300,7 +300,7 @@ test.group('Events buffer | assertNotEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })

assert.throws(
Expand All @@ -314,7 +314,7 @@ test.group('Events buffer | assertNotEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })
events.add('new:user', { id: 2 })
events.add('new:user', { id: 3 })
Expand All @@ -331,7 +331,7 @@ test.group('Events buffer | assertNotEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {}
class ResendEmail {}
Expand All @@ -350,7 +350,7 @@ test.group('Events buffer | assertNotEmitted', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class ResendEmail {}
class UserRegistered {
Expand Down Expand Up @@ -383,7 +383,7 @@ test.group('Events buffer | assertEmittedCount', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})
events.add('new:user', { id: 1 })

assert.doesNotThrow(() => events.assertEmittedCount('new:user', 1))
Expand All @@ -397,7 +397,7 @@ test.group('Events buffer | assertEmittedCount', () => {
const events = new EventsBuffer<{
'new:user': { id: number }
'resend:email': { email: string }
}>()
}>(() => {})

class UserRegistered {}
const userRegisteredEvent = new UserRegistered()
Expand Down
Loading