ConnectionState: test livekit connection states
This commit is contained in:
@@ -8,8 +8,9 @@ Please see LICENSE in the repository root for full details.
|
|||||||
import { afterEach, vi, it, describe, type MockedObject, expect } from "vitest";
|
import { afterEach, vi, it, describe, type MockedObject, expect } from "vitest";
|
||||||
import { type CallMembership, type LivekitFocus } from "matrix-js-sdk/lib/matrixrtc";
|
import { type CallMembership, type LivekitFocus } from "matrix-js-sdk/lib/matrixrtc";
|
||||||
import { BehaviorSubject } from "rxjs";
|
import { BehaviorSubject } from "rxjs";
|
||||||
import { type Room as LivekitRoom } from "livekit-client";
|
import { type Room as LivekitRoom, RoomEvent, type RoomEventCallbacks, ConnectionState } from "livekit-client";
|
||||||
import fetchMock from "fetch-mock";
|
import fetchMock from "fetch-mock";
|
||||||
|
import EventEmitter from "events";
|
||||||
|
|
||||||
import { type ConnectionOpts, type FocusConnectionState, RemoteConnection } from "./Connection.ts";
|
import { type ConnectionOpts, type FocusConnectionState, RemoteConnection } from "./Connection.ts";
|
||||||
import { ObservableScope } from "./ObservableScope.ts";
|
import { ObservableScope } from "./ObservableScope.ts";
|
||||||
@@ -24,6 +25,7 @@ describe("Start connection states", () => {
|
|||||||
|
|
||||||
let fakeLivekitRoom: MockedObject<LivekitRoom>;
|
let fakeLivekitRoom: MockedObject<LivekitRoom>;
|
||||||
|
|
||||||
|
let fakeRoomEventEmiter: EventEmitter<RoomEventCallbacks>;
|
||||||
let fakeMembershipsFocusMap$: BehaviorSubject<{ membership: CallMembership; focus: LivekitFocus }[]>;
|
let fakeMembershipsFocusMap$: BehaviorSubject<{ membership: CallMembership; focus: LivekitFocus }[]>;
|
||||||
|
|
||||||
const livekitFocus : LivekitFocus = {
|
const livekitFocus : LivekitFocus = {
|
||||||
@@ -52,22 +54,23 @@ describe("Start connection states", () => {
|
|||||||
} as unknown as OpenIDClientParts);
|
} as unknown as OpenIDClientParts);
|
||||||
fakeMembershipsFocusMap$ = new BehaviorSubject<{ membership: CallMembership; focus: LivekitFocus }[]>([]);
|
fakeMembershipsFocusMap$ = new BehaviorSubject<{ membership: CallMembership; focus: LivekitFocus }[]>([]);
|
||||||
|
|
||||||
|
fakeRoomEventEmiter = new EventEmitter<RoomEventCallbacks>();
|
||||||
|
|
||||||
fakeLivekitRoom = vi.mocked<LivekitRoom>({
|
fakeLivekitRoom = vi.mocked<LivekitRoom>({
|
||||||
connect: vi.fn(),
|
connect: vi.fn(),
|
||||||
disconnect: vi.fn(),
|
disconnect: vi.fn(),
|
||||||
remoteParticipants: new Map(),
|
remoteParticipants: new Map(),
|
||||||
on: vi.fn(),
|
state: ConnectionState.Disconnected,
|
||||||
off: vi.fn(),
|
on: fakeRoomEventEmiter.on.bind(fakeRoomEventEmiter),
|
||||||
addListener: vi.fn(),
|
off: fakeRoomEventEmiter.off.bind(fakeRoomEventEmiter),
|
||||||
removeListener: vi.fn(),
|
addListener: fakeRoomEventEmiter.addListener.bind(fakeRoomEventEmiter),
|
||||||
removeAllListeners: vi.fn(),
|
removeListener: fakeRoomEventEmiter.removeListener.bind(fakeRoomEventEmiter),
|
||||||
|
removeAllListeners: fakeRoomEventEmiter.removeAllListeners.bind(fakeRoomEventEmiter),
|
||||||
} as unknown as LivekitRoom);
|
} as unknown as LivekitRoom);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setupRemoteConnection(): RemoteConnection {
|
function setupRemoteConnection(): RemoteConnection {
|
||||||
|
|
||||||
setupTest()
|
|
||||||
|
|
||||||
const opts: ConnectionOpts = {
|
const opts: ConnectionOpts = {
|
||||||
client: client,
|
client: client,
|
||||||
@@ -291,6 +294,7 @@ describe("Start connection states", () => {
|
|||||||
|
|
||||||
it("connection states happy path", async () => {
|
it("connection states happy path", async () => {
|
||||||
vi.useFakeTimers();
|
vi.useFakeTimers();
|
||||||
|
setupTest()
|
||||||
|
|
||||||
const connection = setupRemoteConnection();
|
const connection = setupRemoteConnection();
|
||||||
|
|
||||||
@@ -313,4 +317,47 @@ describe("Start connection states", () => {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should relay livekit events once connected", async () => {
|
||||||
|
vi.useFakeTimers();
|
||||||
|
setupTest()
|
||||||
|
|
||||||
|
const connection = setupRemoteConnection();
|
||||||
|
|
||||||
|
await connection.start();
|
||||||
|
await vi.runAllTimersAsync();
|
||||||
|
|
||||||
|
const capturedState: FocusConnectionState[] = [];
|
||||||
|
connection.focusedConnectionState$.subscribe((value) => {
|
||||||
|
capturedState.push(value);
|
||||||
|
});
|
||||||
|
|
||||||
|
const states = [
|
||||||
|
ConnectionState.Disconnected,
|
||||||
|
ConnectionState.Connecting,
|
||||||
|
ConnectionState.Connected,
|
||||||
|
ConnectionState.SignalReconnecting,
|
||||||
|
ConnectionState.Connecting,
|
||||||
|
ConnectionState.Connected,
|
||||||
|
ConnectionState.Reconnecting,
|
||||||
|
]
|
||||||
|
for (const state of states) {
|
||||||
|
fakeRoomEventEmiter.emit(RoomEvent.ConnectionStateChanged, state);
|
||||||
|
await vi.runAllTimersAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
await vi.runAllTimersAsync();
|
||||||
|
|
||||||
|
for (const state of states) {
|
||||||
|
const s = capturedState.shift();
|
||||||
|
expect(s?.state).toEqual("ConnectedToLkRoom");
|
||||||
|
expect(s?.connectionState).toEqual(state);
|
||||||
|
|
||||||
|
// should always have the focus info
|
||||||
|
expect(s?.focus.livekit_alias).toEqual(livekitFocus.livekit_alias);
|
||||||
|
expect(s?.focus.livekit_service_url).toEqual(livekitFocus.livekit_service_url);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user