Add @types/jest and update test mocks for noise suppression components

This commit is contained in:
fkwp
2026-04-09 18:10:10 +02:00
parent d52916d7aa
commit 161c6f79ad
5 changed files with 329 additions and 74 deletions

View File

@@ -6,12 +6,7 @@ Please see LICENSE in the repository root for full details.
*/
import { beforeEach, describe, expect, it, vi } from "vitest";
import {
DeepFilterNoiseFilterProcessor,
__setEnabledSpy as mockSetEnabled,
__setSuppressionLevelSpy as mockSetSuppressionLevel,
__destroySpy as mockDestroy,
} from "deepfilternet3-noise-filter";
import { DeepFilterNoiseFilterProcessor } from "deepfilternet3-noise-filter";
import { NoiseSuppressionTransformer } from "./NoiseSuppressionTransformer";
@@ -23,41 +18,48 @@ type DeepFilterNoiseFilterProcessorContext = {
destroy?: unknown;
};
vi.mock("deepfilternet3-noise-filter", () => {
const setEnabled = vi.fn();
const setSuppressionLevel = vi.fn();
const destroy = vi.fn();
type NoiseFilterProcessorMock = ReturnType<typeof vi.fn> & {
mockSetEnabled: ReturnType<typeof vi.fn>;
mockSetSuppressionLevel: ReturnType<typeof vi.fn>;
mockDestroy: ReturnType<typeof vi.fn>;
};
function DeepFilterNoiseFilterProcessor(
this: DeepFilterNoiseFilterProcessorContext,
options: DeepFilterNoiseFilterProcessorOptions,
): void {
Object.assign(this, options);
this.setEnabled = setEnabled;
this.setSuppressionLevel = setSuppressionLevel;
this.destroy = destroy;
}
vi.mock("deepfilternet3-noise-filter", () => {
const mockSetEnabled = vi.fn();
const mockSetSuppressionLevel = vi.fn();
const mockDestroy = vi.fn();
const mockDeepFilterNoiseFilterProcessor = vi
.fn()
.mockImplementation(function DeepFilterNoiseFilterProcessor(
this: DeepFilterNoiseFilterProcessorContext,
options: DeepFilterNoiseFilterProcessorOptions,
): void {
Object.assign(this, options);
this.setEnabled = mockSetEnabled;
this.setSuppressionLevel = mockSetSuppressionLevel;
this.destroy = mockDestroy;
});
Object.assign(mockDeepFilterNoiseFilterProcessor, {
mockSetEnabled,
mockSetSuppressionLevel,
mockDestroy,
});
return {
__esModule: true,
DeepFilterNoiseFilterProcessor: vi
.fn()
.mockImplementation(DeepFilterNoiseFilterProcessor),
__setEnabledSpy: setEnabled,
__setSuppressionLevelSpy: setSuppressionLevel,
__destroySpy: destroy,
DeepFilterNoiseFilterProcessor: mockDeepFilterNoiseFilterProcessor,
};
});
const mockDeepFilterNoiseFilterProcessor = vi.mocked(
DeepFilterNoiseFilterProcessor,
);
const mockDeepFilterNoiseFilterProcessor = DeepFilterNoiseFilterProcessor as unknown as NoiseFilterProcessorMock;
describe("NoiseSuppressionTransformer", () => {
beforeEach((): void => {
mockSetEnabled.mockClear();
mockSetSuppressionLevel.mockClear();
mockDestroy.mockClear();
mockDeepFilterNoiseFilterProcessor.mockSetEnabled.mockClear();
mockDeepFilterNoiseFilterProcessor.mockSetSuppressionLevel.mockClear();
mockDeepFilterNoiseFilterProcessor.mockDestroy.mockClear();
mockDeepFilterNoiseFilterProcessor.mockClear();
});
@@ -98,8 +100,8 @@ describe("NoiseSuppressionTransformer", () => {
transformer.setSuppressionLevel(1.5);
transformer.setSuppressionLevel(-0.2);
expect(mockSetSuppressionLevel).toHaveBeenNthCalledWith(1, 100);
expect(mockSetSuppressionLevel).toHaveBeenNthCalledWith(2, 0);
expect(mockDeepFilterNoiseFilterProcessor.mockSetSuppressionLevel).toHaveBeenNthCalledWith(1, 100);
expect(mockDeepFilterNoiseFilterProcessor.mockSetSuppressionLevel).toHaveBeenNthCalledWith(2, 0);
});
it("forwards enabled state changes to the underlying processor", (): void => {
@@ -109,8 +111,8 @@ describe("NoiseSuppressionTransformer", () => {
transformer.setEnabled(false);
transformer.setEnabled(true);
expect(mockSetEnabled).toHaveBeenNthCalledWith(1, false);
expect(mockSetEnabled).toHaveBeenNthCalledWith(2, true);
expect(mockDeepFilterNoiseFilterProcessor.mockSetEnabled).toHaveBeenNthCalledWith(1, false);
expect(mockDeepFilterNoiseFilterProcessor.mockSetEnabled).toHaveBeenNthCalledWith(2, true);
});
it("destroys the processor and resets internal state", (): void => {
@@ -119,7 +121,7 @@ describe("NoiseSuppressionTransformer", () => {
transformer.destroy();
expect(mockDestroy).toHaveBeenCalledTimes(1);
expect(mockDeepFilterNoiseFilterProcessor.mockDestroy).toHaveBeenCalledTimes(1);
expect(transformer.getProcessor()).toBeNull();
});
});

View File

@@ -7,11 +7,7 @@ Please see LICENSE in the repository root for full details.
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { BehaviorSubject } from "rxjs";
import {
__setEnabledSpy as mockSetEnabled,
__setSuppressionLevelSpy as mockSetSuppressionLevel,
__destroySpy as mockDestroy,
} from "deepfilternet3-noise-filter";
import { DeepFilterNoiseFilterProcessor } from "deepfilternet3-noise-filter";
import { ObservableScope } from "../state/ObservableScope";
import type { LocalAudioTrack } from "livekit-client";
@@ -31,6 +27,12 @@ type DeepFilterNoiseFilterProcessorContext = {
destroy?: unknown;
};
type NoiseFilterProcessorMock = ReturnType<typeof vi.fn> & {
mockSetEnabled: ReturnType<typeof vi.fn>;
mockSetSuppressionLevel: ReturnType<typeof vi.fn>;
mockDestroy: ReturnType<typeof vi.fn>;
};
const localStorageMock = {
getItem: vi.fn(() => null),
setItem: vi.fn(() => {}),
@@ -45,31 +47,36 @@ Object.defineProperty(globalThis, "localStorage", {
});
vi.mock("deepfilternet3-noise-filter", () => {
const setEnabled = vi.fn();
const setSuppressionLevel = vi.fn();
const destroy = vi.fn();
const mockSetEnabled = vi.fn();
const mockSetSuppressionLevel = vi.fn();
const mockDestroy = vi.fn();
function DeepFilterNoiseFilterProcessor(
this: DeepFilterNoiseFilterProcessorContext,
options: DeepFilterNoiseFilterProcessorOptions,
): void {
Object.assign(this, options);
this.setEnabled = setEnabled;
this.setSuppressionLevel = setSuppressionLevel;
this.destroy = destroy;
}
const mockDeepFilterNoiseFilterProcessor = vi
.fn()
.mockImplementation(function DeepFilterNoiseFilterProcessor(
this: DeepFilterNoiseFilterProcessorContext,
options: DeepFilterNoiseFilterProcessorOptions,
): void {
Object.assign(this, options);
this.setEnabled = mockSetEnabled;
this.setSuppressionLevel = mockSetSuppressionLevel;
this.destroy = mockDestroy;
});
Object.assign(mockDeepFilterNoiseFilterProcessor, {
mockSetEnabled,
mockSetSuppressionLevel,
mockDestroy,
});
return {
__esModule: true,
DeepFilterNoiseFilterProcessor: vi
.fn()
.mockImplementation(DeepFilterNoiseFilterProcessor),
__setEnabledSpy: setEnabled,
__setSuppressionLevelSpy: setSuppressionLevel,
__destroySpy: destroy,
DeepFilterNoiseFilterProcessor: mockDeepFilterNoiseFilterProcessor,
};
});
const mockDeepFilterNoiseFilterProcessor = DeepFilterNoiseFilterProcessor as unknown as NoiseFilterProcessorMock;
let audioTrackNoiseSuppressionSync: AudioTrackNoiseSuppressionSync;
let noiseSuppressionEnabled: Setting<boolean>;
let noiseSuppressionLevel: Setting<number>;
@@ -87,13 +94,13 @@ class MockLocalAudioTrack {
describe("audioTrackNoiseSuppressionSync", () => {
let scope: ObservableScope;
let audioTrack$: Behavior<LocalAudioTrack | null>;
let audioTrack$: BehaviorSubject<LocalAudioTrack | null>;
let track: MockLocalAudioTrack;
beforeEach(async (): Promise<void> => {
mockSetEnabled.mockClear();
mockSetSuppressionLevel.mockClear();
mockDestroy.mockClear();
mockDeepFilterNoiseFilterProcessor.mockSetEnabled.mockClear();
mockDeepFilterNoiseFilterProcessor.mockSetSuppressionLevel.mockClear();
mockDeepFilterNoiseFilterProcessor.mockDestroy.mockClear();
track = new MockLocalAudioTrack();
audioTrack$ = new BehaviorSubject<LocalAudioTrack | null>(
track as unknown as LocalAudioTrack,
@@ -119,8 +126,8 @@ describe("audioTrackNoiseSuppressionSync", () => {
expect(track.setProcessor).toHaveBeenCalledTimes(1);
expect(track.getProcessor()).not.toBeUndefined();
expect(mockSetEnabled).toHaveBeenCalledWith(false);
expect(mockSetSuppressionLevel).toHaveBeenCalledWith(75);
expect(mockDeepFilterNoiseFilterProcessor.mockSetEnabled).toHaveBeenCalledWith(false);
expect(mockDeepFilterNoiseFilterProcessor.mockSetSuppressionLevel).toHaveBeenCalledWith(75);
});
it("reapplies processor when audio track becomes available", async (): Promise<void> => {
@@ -143,6 +150,6 @@ describe("audioTrackNoiseSuppressionSync", () => {
scope.end();
await Promise.resolve();
expect(mockDestroy).toHaveBeenCalledTimes(1);
expect(mockDeepFilterNoiseFilterProcessor.mockDestroy).toHaveBeenCalledTimes(1);
});
});

View File

@@ -6,6 +6,7 @@ Please see LICENSE in the repository root for full details.
*/
import { test, expect, vi } from "vitest";
import "@testing-library/jest-dom/vitest";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { type ChangeEvent, type ReactNode, useState } from "react";
@@ -158,23 +159,23 @@ vi.mock("../MediaDevicesContext", () => ({
} => ({
audioInput: {
selectedId: "mic1",
available$: new BehaviorSubject([
available$: new BehaviorSubject<readonly { deviceId: string; label: string }[]>([
{ deviceId: "mic1", label: "Microphone 1" },
]),
] as const),
selected$: new BehaviorSubject({ id: "mic1", label: "Microphone 1" }),
},
audioOutput: {
selectedId: "speaker1",
available$: new BehaviorSubject([
available$: new BehaviorSubject<readonly { deviceId: string; label: string }[]>([
{ deviceId: "speaker1", label: "Speaker 1" },
]),
] as const),
selected$: new BehaviorSubject({ id: "speaker1", label: "Speaker 1" }),
},
videoInput: {
selectedId: "cam1",
available$: new BehaviorSubject([
available$: new BehaviorSubject<readonly { deviceId: string; label: string }[]>([
{ deviceId: "cam1", label: "Camera 1" },
]),
] as const),
selected$: new BehaviorSubject({ id: "cam1", label: "Camera 1" }),
},
requestDeviceNames: vi.fn(),