diff --git a/packages/playback/src/lib/utils/interceptors-storage.ts b/packages/playback/src/lib/utils/interceptors-storage.ts index 249eb4b..a6d8500 100644 --- a/packages/playback/src/lib/utils/interceptors-storage.ts +++ b/packages/playback/src/lib/utils/interceptors-storage.ts @@ -17,7 +17,7 @@ export class InterceptorsStorage implements IInterceptorsStorage { } public getInterceptorsSet(interceptorType: K): Set { - return new Set(this.storage_.get(interceptorType) ?? []); + return new Set((this.storage_.get(interceptorType) as Set) ?? []); } public removeInterceptor( diff --git a/packages/playback/test/utils/interceptors-storage.test.ts b/packages/playback/test/utils/interceptors-storage.test.ts new file mode 100644 index 0000000..5e2a589 --- /dev/null +++ b/packages/playback/test/utils/interceptors-storage.test.ts @@ -0,0 +1,91 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { InterceptorsStorage } from '../../src/lib/utils/interceptors-storage'; +import { InterceptorType } from '../../src/lib/consts/interceptor-type'; + +describe('InterceptorsStorage', () => { + let storage: InterceptorsStorage; + + beforeEach(() => { + storage = new InterceptorsStorage(); + }); + + it('should store the interceptor in the storage when added', () => { + const interceptor = async (request: Request): Promise => request; + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).has(interceptor)).toBe(true); + }); + + it('should not store duplicate interceptors for a type', () => { + const interceptor = async (request: Request): Promise => request; + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor); + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(1); + }); + + it('should return the correct set of interceptors for a given type when retrieved', () => { + const interceptor1 = async (request: Request): Promise => request; + const interceptor2 = async (request: Request): Promise => request; + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor1); + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor2); + + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest)).toEqual(new Set([interceptor1, interceptor2])); + }); + + it('should remove the interceptor from the storage when deleted', () => { + const interceptor1 = async (request: Request): Promise => request; + const interceptor2 = async (request: Request): Promise => request; + + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor1); + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor2); + storage.removeInterceptor(InterceptorType.NetworkRequest, interceptor1); + + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).has(interceptor1)).toBe(false); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).has(interceptor2)).toBe(true); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(1); + storage.removeInterceptor(InterceptorType.NetworkRequest, interceptor2); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).has(interceptor2)).toBe(false); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(0); + }); + + // Removing all interceptors for a type clears the set for that type + it('should clear the set when removing all interceptors for a type', () => { + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(0); + expect(storage.getInterceptorsSet(InterceptorType.HlsPlaylistParse).size).toBe(0); + + const interceptor1 = async (request: Request): Promise => request; + const interceptor2 = async (request: Request): Promise => request; + const interceptor3 = async (playlist: Uint8Array): Promise => playlist; + + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor1); + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor2); + storage.addInterceptor(InterceptorType.HlsPlaylistParse, interceptor3); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(2); + expect(storage.getInterceptorsSet(InterceptorType.HlsPlaylistParse).size).toBe(1); + + storage.removeAllInterceptorsForType(InterceptorType.NetworkRequest); + + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(0); + expect(storage.getInterceptorsSet(InterceptorType.HlsPlaylistParse).size).toBe(1); + }); + + // Removing all interceptors clears the entire storage + it('should clear the entire storage when all interceptors are removed', () => { + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(0); + expect(storage.getInterceptorsSet(InterceptorType.HlsPlaylistParse).size).toBe(0); + + const interceptor1 = async (request: Request): Promise => request; + const interceptor2 = async (request: Request): Promise => request; + const interceptor3 = async (playlist: Uint8Array): Promise => playlist; + + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor1); + storage.addInterceptor(InterceptorType.NetworkRequest, interceptor2); + storage.addInterceptor(InterceptorType.HlsPlaylistParse, interceptor3); + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(2); + expect(storage.getInterceptorsSet(InterceptorType.HlsPlaylistParse).size).toBe(1); + + storage.removeAllInterceptors(); + + expect(storage.getInterceptorsSet(InterceptorType.NetworkRequest).size).toBe(0); + expect(storage.getInterceptorsSet(InterceptorType.HlsPlaylistParse).size).toBe(0); + }); +});