diff --git a/src/room/__snapshots__/InCallView.test.tsx.snap b/src/room/__snapshots__/InCallView.test.tsx.snap index 955c061e..99f19443 100644 --- a/src/room/__snapshots__/InCallView.test.tsx.snap +++ b/src/room/__snapshots__/InCallView.test.tsx.snap @@ -17,7 +17,7 @@ exports[`InCallView > rendering > renders 1`] = ` > renders and matches snapshot 1`] = ` > testAudioContext);` */ -export const testAudioContext = { +export const testAudioContext: Partial & { + gain: ReturnType< + typeof vi.mocked<{ + connect: (node: AudioNode) => AudioNode; + gain: { setValueAtTime: ReturnType; value: number }; + }> + >; + pan: ReturnType< + typeof vi.mocked<{ + connect: (node: AudioNode) => AudioNode; + pan: { setValueAtTime: ReturnType; value: number }; + }> + >; + setSinkId: ReturnType; + decodeAudioData: ReturnType; + createBufferSource: ReturnType; + createGain: ReturnType; + createStereoPanner: ReturnType; + close: ReturnType; +} = { gain: gainNode, pan: panNode, setSinkId: vi.fn().mockResolvedValue(undefined), diff --git a/src/utils/test.ts b/src/utils/test.ts index af372bfb..695dd046 100644 --- a/src/utils/test.ts +++ b/src/utils/test.ts @@ -15,6 +15,7 @@ import { vitest, } from "vitest"; import { + EventType, MatrixEvent, type Room as MatrixRoom, type Room, @@ -255,6 +256,7 @@ export function mockRtcMembership( const event = new MatrixEvent({ sender: userId, event_id: `$-ev-${randomUUID()}:example.org`, + type: EventType.GroupCallMemberPrefix, content: data, }); @@ -466,7 +468,9 @@ export class MockRTCSession extends TypedEventEmitter< counters: {}, }; - public leaveRoomSession = vitest.fn().mockResolvedValue(undefined); + public leaveRoomSession: ReturnType = vitest + .fn() + .mockResolvedValue(undefined); public constructor( public readonly room: Room, @@ -496,7 +500,7 @@ export class MockRTCSession extends TypedEventEmitter< return this; } - public updateCallIntent = vitest + public updateCallIntent: ReturnType = vitest .fn() .mockImplementation(async () => Promise.resolve()); diff --git a/vitest.config.ts b/vitest.config.ts index c89957c6..7f449f45 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -13,12 +13,13 @@ export default defineConfig((configEnv) => classNameStrategy: "non-scoped", }, }, - setupFiles: ["src/vitest.setup.ts"], + setupFiles: ["vitest.setup.ts"], include: ["src/**/*.test.ts", "src/**/*.test.tsx"], coverage: { reporter: ["html", "json"], - include: ["src/"], + include: ["src/**/*.{ts,tsx,js,jsx}"], exclude: [ + "src/**/*.md", "src/**/*.{d,test,stories}.{ts,tsx}", "src/utils/test.ts", "src/utils/test-viewmodel.ts", diff --git a/vitest.setup.ts b/vitest.setup.ts new file mode 100644 index 00000000..cff3a234 --- /dev/null +++ b/vitest.setup.ts @@ -0,0 +1,51 @@ +const storage: Record = {}; +const localStoragePolyfill = { + getItem(key: string) { + return Object.prototype.hasOwnProperty.call(storage, key) + ? storage[key] + : null; + }, + setItem(key: string, value: string) { + storage[key] = String(value); + }, + removeItem(key: string) { + delete storage[key]; + }, + clear() { + for (const key in storage) { + delete storage[key]; + } + }, + key(index: number) { + const keys = Object.keys(storage); + return keys[index] ?? null; + }, + get length() { + return Object.keys(storage).length; + }, +} as unknown as Storage; + +if ( + typeof globalThis.localStorage === "undefined" || + typeof globalThis.localStorage.clear !== "function" +) { + Object.defineProperty(globalThis, "localStorage", { + value: localStoragePolyfill, + writable: true, + configurable: true, + }); +} + +if ( + typeof window !== "undefined" && + (typeof window.localStorage === "undefined" || + typeof window.localStorage.clear !== "function") +) { + Object.defineProperty(window, "localStorage", { + value: localStoragePolyfill, + writable: true, + configurable: true, + }); +} + +import "./src/vitest.setup.ts";