From 6a1f7dd057e4f279570eb91bb1c76521472ea7d4 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 1 Oct 2025 15:23:24 +0200 Subject: [PATCH] ConnectionState: test livekit connection states --- src/state/Connection.test.ts | 65 +++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/src/state/Connection.test.ts b/src/state/Connection.test.ts index 9fe415c1..15c5d88e 100644 --- a/src/state/Connection.test.ts +++ b/src/state/Connection.test.ts @@ -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 { type CallMembership, type LivekitFocus } from "matrix-js-sdk/lib/matrixrtc"; 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 EventEmitter from "events"; import { type ConnectionOpts, type FocusConnectionState, RemoteConnection } from "./Connection.ts"; import { ObservableScope } from "./ObservableScope.ts"; @@ -24,6 +25,7 @@ describe("Start connection states", () => { let fakeLivekitRoom: MockedObject; + let fakeRoomEventEmiter: EventEmitter; let fakeMembershipsFocusMap$: BehaviorSubject<{ membership: CallMembership; focus: LivekitFocus }[]>; const livekitFocus : LivekitFocus = { @@ -52,22 +54,23 @@ describe("Start connection states", () => { } as unknown as OpenIDClientParts); fakeMembershipsFocusMap$ = new BehaviorSubject<{ membership: CallMembership; focus: LivekitFocus }[]>([]); + fakeRoomEventEmiter = new EventEmitter(); + fakeLivekitRoom = vi.mocked({ connect: vi.fn(), disconnect: vi.fn(), remoteParticipants: new Map(), - on: vi.fn(), - off: vi.fn(), - addListener: vi.fn(), - removeListener: vi.fn(), - removeAllListeners: vi.fn(), + state: ConnectionState.Disconnected, + on: fakeRoomEventEmiter.on.bind(fakeRoomEventEmiter), + off: fakeRoomEventEmiter.off.bind(fakeRoomEventEmiter), + addListener: fakeRoomEventEmiter.addListener.bind(fakeRoomEventEmiter), + removeListener: fakeRoomEventEmiter.removeListener.bind(fakeRoomEventEmiter), + removeAllListeners: fakeRoomEventEmiter.removeAllListeners.bind(fakeRoomEventEmiter), } as unknown as LivekitRoom); } - async function setupRemoteConnection(): RemoteConnection { - - setupTest() + function setupRemoteConnection(): RemoteConnection { const opts: ConnectionOpts = { client: client, @@ -291,6 +294,7 @@ describe("Start connection states", () => { it("connection states happy path", async () => { vi.useFakeTimers(); + setupTest() 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); + } + + }); + + })