mirror of
https://github.com/vector-im/element-call.git
synced 2026-10-16 23:45:50 +00:00
Create Publisher.test.ts
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
Copyright 2026 Element Creations Ltd.
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
Please see LICENSE in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { EventEmitter } from "events";
|
||||
import { ConnectionState, type Room as LivekitRoom } from "livekit-client";
|
||||
import { logger } from "matrix-js-sdk/lib/logger";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { Publisher } from "./Publisher";
|
||||
|
||||
describe("Publisher", () => {
|
||||
describe("setAudioOutputDevice", () => {
|
||||
it("switches the room's output while the room is still connecting", async () => {
|
||||
const { room, switchActiveDevice } = fakeRoom(ConnectionState.Connecting);
|
||||
const publisher = new Publisher(room, new Map(), logger);
|
||||
|
||||
await publisher.setAudioOutputDevice("speaker");
|
||||
expect(switchActiveDevice).toHaveBeenCalledWith("audiooutput", "speaker");
|
||||
});
|
||||
|
||||
it("leaves a room alone that already plays on the device", async () => {
|
||||
const { room, switchActiveDevice } = fakeRoom(
|
||||
ConnectionState.Connected,
|
||||
"speaker",
|
||||
);
|
||||
const publisher = new Publisher(room, new Map(), logger);
|
||||
|
||||
await publisher.setAudioOutputDevice("speaker");
|
||||
expect(switchActiveDevice).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("rejects where the room cannot switch", async () => {
|
||||
const { room, switchActiveDevice } = fakeRoom(ConnectionState.Connected);
|
||||
switchActiveDevice.mockRejectedValue(new Error("no setSinkId"));
|
||||
const publisher = new Publisher(room, new Map(), logger);
|
||||
|
||||
await expect(publisher.setAudioOutputDevice("speaker")).rejects.toThrow(
|
||||
"no setSinkId",
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/** The slice of a LiveKit room the publisher touches at construction and for the output device. */
|
||||
function fakeRoom(
|
||||
state: ConnectionState,
|
||||
activeOutput?: string,
|
||||
): { room: LivekitRoom; switchActiveDevice: ReturnType<typeof vi.fn> } {
|
||||
const switchActiveDevice = vi.fn(async () => Promise.resolve(true));
|
||||
const room = {
|
||||
state,
|
||||
options: {},
|
||||
setE2EEEnabled: () => undefined,
|
||||
localParticipant: new EventEmitter(),
|
||||
getActiveDevice: () => activeOutput,
|
||||
switchActiveDevice,
|
||||
} as unknown as LivekitRoom;
|
||||
return { room, switchActiveDevice };
|
||||
}
|
||||
Reference in New Issue
Block a user