mirror of
https://github.com/github/codeql-action.git
synced 2025-12-27 09:40:17 +08:00
256 lines
6.9 KiB
TypeScript
256 lines
6.9 KiB
TypeScript
import { vi, it, expect, afterEach } from 'vitest'
|
|
import { Interceptor } from './Interceptor'
|
|
import { BatchInterceptor } from './BatchInterceptor'
|
|
|
|
afterEach(() => {
|
|
vi.resetAllMocks()
|
|
})
|
|
|
|
it('applies child interceptors', () => {
|
|
class PrimaryInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('primary'))
|
|
}
|
|
}
|
|
|
|
class SecondaryInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('secondary'))
|
|
}
|
|
}
|
|
|
|
const instances = {
|
|
primary: new PrimaryInterceptor(),
|
|
secondary: new SecondaryInterceptor(),
|
|
}
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch-apply',
|
|
interceptors: [instances.primary, instances.secondary],
|
|
})
|
|
|
|
const primaryApplySpy = vi.spyOn(instances.primary, 'apply')
|
|
const secondaryApplySpy = vi.spyOn(instances.secondary, 'apply')
|
|
|
|
interceptor.apply()
|
|
|
|
expect(primaryApplySpy).toHaveBeenCalledTimes(1)
|
|
expect(secondaryApplySpy).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
it('proxies event listeners to the interceptors', () => {
|
|
class PrimaryInterceptor extends Interceptor<{ hello: [string] }> {
|
|
constructor() {
|
|
super(Symbol('primary'))
|
|
}
|
|
}
|
|
|
|
class SecondaryInterceptor extends Interceptor<{
|
|
goodbye: [string]
|
|
}> {
|
|
constructor() {
|
|
super(Symbol('secondary'))
|
|
}
|
|
}
|
|
|
|
const instances = {
|
|
primary: new PrimaryInterceptor(),
|
|
secondary: new SecondaryInterceptor(),
|
|
}
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch-proxy',
|
|
interceptors: [instances.primary, instances.secondary],
|
|
})
|
|
|
|
const helloListener = vi.fn()
|
|
interceptor.on('hello', helloListener)
|
|
|
|
const goodbyeListener = vi.fn()
|
|
interceptor.on('goodbye', goodbyeListener)
|
|
|
|
// Emulate the child interceptor emitting events.
|
|
instances.primary['emitter'].emit('hello', 'John')
|
|
instances.secondary['emitter'].emit('goodbye', 'Kate')
|
|
|
|
// Must call the batch interceptor listener.
|
|
expect(helloListener).toHaveBeenCalledTimes(1)
|
|
expect(helloListener).toHaveBeenCalledWith('John')
|
|
expect(goodbyeListener).toHaveBeenCalledTimes(1)
|
|
expect(goodbyeListener).toHaveBeenCalledWith('Kate')
|
|
})
|
|
|
|
it('disposes of child interceptors', async () => {
|
|
class PrimaryInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('primary'))
|
|
}
|
|
}
|
|
|
|
class SecondaryInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('secondary'))
|
|
}
|
|
}
|
|
|
|
const instances = {
|
|
primary: new PrimaryInterceptor(),
|
|
secondary: new SecondaryInterceptor(),
|
|
}
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch-dispose',
|
|
interceptors: [instances.primary, instances.secondary],
|
|
})
|
|
|
|
const primaryDisposeSpy = vi.spyOn(instances.primary, 'dispose')
|
|
const secondaryDisposeSpy = vi.spyOn(instances.secondary, 'dispose')
|
|
|
|
interceptor.apply()
|
|
interceptor.dispose()
|
|
|
|
expect(primaryDisposeSpy).toHaveBeenCalledTimes(1)
|
|
expect(secondaryDisposeSpy).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
it('forwards listeners added via "on()"', () => {
|
|
class FirstInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('first'))
|
|
}
|
|
}
|
|
class SecondaryInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('second'))
|
|
}
|
|
}
|
|
|
|
const firstInterceptor = new FirstInterceptor()
|
|
const secondInterceptor = new SecondaryInterceptor()
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch',
|
|
interceptors: [firstInterceptor, secondInterceptor],
|
|
})
|
|
|
|
const listener = vi.fn()
|
|
interceptor.on('foo', listener)
|
|
|
|
expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(1)
|
|
expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(1)
|
|
expect(interceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
})
|
|
|
|
it('forwards listeners removal via "off()"', () => {
|
|
type Events = {
|
|
foo: []
|
|
}
|
|
|
|
class FirstInterceptor extends Interceptor<Events> {
|
|
constructor() {
|
|
super(Symbol('first'))
|
|
}
|
|
}
|
|
class SecondaryInterceptor extends Interceptor<Events> {
|
|
constructor() {
|
|
super(Symbol('second'))
|
|
}
|
|
}
|
|
|
|
const firstInterceptor = new FirstInterceptor()
|
|
const secondInterceptor = new SecondaryInterceptor()
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch',
|
|
interceptors: [firstInterceptor, secondInterceptor],
|
|
})
|
|
|
|
const listener = vi.fn()
|
|
interceptor.on('foo', listener)
|
|
interceptor.off('foo', listener)
|
|
|
|
expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
})
|
|
|
|
it('forwards removal of all listeners by name via ".removeAllListeners()"', () => {
|
|
type Events = {
|
|
foo: []
|
|
bar: []
|
|
}
|
|
|
|
class FirstInterceptor extends Interceptor<Events> {
|
|
constructor() {
|
|
super(Symbol('first'))
|
|
}
|
|
}
|
|
class SecondaryInterceptor extends Interceptor<Events> {
|
|
constructor() {
|
|
super(Symbol('second'))
|
|
}
|
|
}
|
|
|
|
const firstInterceptor = new FirstInterceptor()
|
|
const secondInterceptor = new SecondaryInterceptor()
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch',
|
|
interceptors: [firstInterceptor, secondInterceptor],
|
|
})
|
|
|
|
const listener = vi.fn()
|
|
interceptor.on('foo', listener)
|
|
interceptor.on('foo', listener)
|
|
interceptor.on('bar', listener)
|
|
|
|
expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(2)
|
|
expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(2)
|
|
expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(1)
|
|
expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(1)
|
|
|
|
interceptor.removeAllListeners('foo')
|
|
|
|
expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(1)
|
|
expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(1)
|
|
})
|
|
|
|
it('forwards removal of all listeners via ".removeAllListeners()"', () => {
|
|
class FirstInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('first'))
|
|
}
|
|
}
|
|
class SecondaryInterceptor extends Interceptor<any> {
|
|
constructor() {
|
|
super(Symbol('second'))
|
|
}
|
|
}
|
|
|
|
const firstInterceptor = new FirstInterceptor()
|
|
const secondInterceptor = new SecondaryInterceptor()
|
|
|
|
const interceptor = new BatchInterceptor({
|
|
name: 'batch',
|
|
interceptors: [firstInterceptor, secondInterceptor],
|
|
})
|
|
|
|
const listener = vi.fn()
|
|
interceptor.on('foo', listener)
|
|
interceptor.on('foo', listener)
|
|
interceptor.on('bar', listener)
|
|
|
|
expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(2)
|
|
expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(2)
|
|
expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(1)
|
|
expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(1)
|
|
|
|
interceptor.removeAllListeners()
|
|
|
|
expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(0)
|
|
expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(0)
|
|
expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(0)
|
|
})
|