basant307/AI_Governance_Project
048
1import { vi, it, expect, afterEach } from 'vitest'2import { Interceptor } from './Interceptor'3import { BatchInterceptor } from './BatchInterceptor'4 5afterEach(() => {6 vi.resetAllMocks()7})8 9it('applies child interceptors', () => {10 class PrimaryInterceptor extends Interceptor<any> {11 constructor() {12 super(Symbol('primary'))13 }14 }15 16 class SecondaryInterceptor extends Interceptor<any> {17 constructor() {18 super(Symbol('secondary'))19 }20 }21 22 const instances = {23 primary: new PrimaryInterceptor(),24 secondary: new SecondaryInterceptor(),25 }26 27 const interceptor = new BatchInterceptor({28 name: 'batch-apply',29 interceptors: [instances.primary, instances.secondary],30 })31 32 const primaryApplySpy = vi.spyOn(instances.primary, 'apply')33 const secondaryApplySpy = vi.spyOn(instances.secondary, 'apply')34 35 interceptor.apply()36 37 expect(primaryApplySpy).toHaveBeenCalledTimes(1)38 expect(secondaryApplySpy).toHaveBeenCalledTimes(1)39})40 41it('proxies event listeners to the interceptors', () => {42 class PrimaryInterceptor extends Interceptor<{ hello: [string] }> {43 constructor() {44 super(Symbol('primary'))45 }46 }47 48 class SecondaryInterceptor extends Interceptor<{49 goodbye: [string]50 }> {51 constructor() {52 super(Symbol('secondary'))53 }54 }55 56 const instances = {57 primary: new PrimaryInterceptor(),58 secondary: new SecondaryInterceptor(),59 }60 61 const interceptor = new BatchInterceptor({62 name: 'batch-proxy',63 interceptors: [instances.primary, instances.secondary],64 })65 66 const helloListener = vi.fn()67 interceptor.on('hello', helloListener)68 69 const goodbyeListener = vi.fn()70 interceptor.on('goodbye', goodbyeListener)71 72 // Emulate the child interceptor emitting events.73 instances.primary['emitter'].emit('hello', 'John')74 instances.secondary['emitter'].emit('goodbye', 'Kate')75 76 // Must call the batch interceptor listener.77 expect(helloListener).toHaveBeenCalledTimes(1)78 expect(helloListener).toHaveBeenCalledWith('John')79 expect(goodbyeListener).toHaveBeenCalledTimes(1)80 expect(goodbyeListener).toHaveBeenCalledWith('Kate')81})82 83it('disposes of child interceptors', async () => {84 class PrimaryInterceptor extends Interceptor<any> {85 constructor() {86 super(Symbol('primary'))87 }88 }89 90 class SecondaryInterceptor extends Interceptor<any> {91 constructor() {92 super(Symbol('secondary'))93 }94 }95 96 const instances = {97 primary: new PrimaryInterceptor(),98 secondary: new SecondaryInterceptor(),99 }100 101 const interceptor = new BatchInterceptor({102 name: 'batch-dispose',103 interceptors: [instances.primary, instances.secondary],104 })105 106 const primaryDisposeSpy = vi.spyOn(instances.primary, 'dispose')107 const secondaryDisposeSpy = vi.spyOn(instances.secondary, 'dispose')108 109 interceptor.apply()110 interceptor.dispose()111 112 expect(primaryDisposeSpy).toHaveBeenCalledTimes(1)113 expect(secondaryDisposeSpy).toHaveBeenCalledTimes(1)114})115 116it('forwards listeners added via "on()"', () => {117 class FirstInterceptor extends Interceptor<any> {118 constructor() {119 super(Symbol('first'))120 }121 }122 class SecondaryInterceptor extends Interceptor<any> {123 constructor() {124 super(Symbol('second'))125 }126 }127 128 const firstInterceptor = new FirstInterceptor()129 const secondInterceptor = new SecondaryInterceptor()130 131 const interceptor = new BatchInterceptor({132 name: 'batch',133 interceptors: [firstInterceptor, secondInterceptor],134 })135 136 const listener = vi.fn()137 interceptor.on('foo', listener)138 139 expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(1)140 expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(1)141 expect(interceptor['emitter'].listenerCount('foo')).toBe(0)142})143 144it('forwards listeners removal via "off()"', () => {145 type Events = {146 foo: []147 }148 149 class FirstInterceptor extends Interceptor<Events> {150 constructor() {151 super(Symbol('first'))152 }153 }154 class SecondaryInterceptor extends Interceptor<Events> {155 constructor() {156 super(Symbol('second'))157 }158 }159 160 const firstInterceptor = new FirstInterceptor()161 const secondInterceptor = new SecondaryInterceptor()162 163 const interceptor = new BatchInterceptor({164 name: 'batch',165 interceptors: [firstInterceptor, secondInterceptor],166 })167 168 const listener = vi.fn()169 interceptor.on('foo', listener)170 interceptor.off('foo', listener)171 172 expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(0)173 expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(0)174})175 176it('forwards removal of all listeners by name via ".removeAllListeners()"', () => {177 type Events = {178 foo: []179 bar: []180 }181 182 class FirstInterceptor extends Interceptor<Events> {183 constructor() {184 super(Symbol('first'))185 }186 }187 class SecondaryInterceptor extends Interceptor<Events> {188 constructor() {189 super(Symbol('second'))190 }191 }192 193 const firstInterceptor = new FirstInterceptor()194 const secondInterceptor = new SecondaryInterceptor()195 196 const interceptor = new BatchInterceptor({197 name: 'batch',198 interceptors: [firstInterceptor, secondInterceptor],199 })200 201 const listener = vi.fn()202 interceptor.on('foo', listener)203 interceptor.on('foo', listener)204 interceptor.on('bar', listener)205 206 expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(2)207 expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(2)208 expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(1)209 expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(1)210 211 interceptor.removeAllListeners('foo')212 213 expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(0)214 expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(0)215 expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(1)216 expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(1)217})218 219it('forwards removal of all listeners via ".removeAllListeners()"', () => {220 class FirstInterceptor extends Interceptor<any> {221 constructor() {222 super(Symbol('first'))223 }224 }225 class SecondaryInterceptor extends Interceptor<any> {226 constructor() {227 super(Symbol('second'))228 }229 }230 231 const firstInterceptor = new FirstInterceptor()232 const secondInterceptor = new SecondaryInterceptor()233 234 const interceptor = new BatchInterceptor({235 name: 'batch',236 interceptors: [firstInterceptor, secondInterceptor],237 })238 239 const listener = vi.fn()240 interceptor.on('foo', listener)241 interceptor.on('foo', listener)242 interceptor.on('bar', listener)243 244 expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(2)245 expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(2)246 expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(1)247 expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(1)248 249 interceptor.removeAllListeners()250 251 expect(firstInterceptor['emitter'].listenerCount('foo')).toBe(0)252 expect(secondInterceptor['emitter'].listenerCount('foo')).toBe(0)253 expect(firstInterceptor['emitter'].listenerCount('bar')).toBe(0)254 expect(secondInterceptor['emitter'].listenerCount('bar')).toBe(0)255})256 