mirror of
https://github.com/vector-im/element-call.git
synced 2026-07-18 18:59:23 +00:00
Add @types/jest and update test mocks for noise suppression components
This commit is contained in:
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user