From 5399f1401236ccc2f357b4dc46d5cc8c09e07700 Mon Sep 17 00:00:00 2001 From: "Timo K." Date: Tue, 25 Aug 2026 22:43:15 +0200 Subject: [PATCH] add tests --- .../localMember/LocalMember.test.ts | 61 +++++++++++++++++++ src/state/SessionBehaviors.test.ts | 60 ++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 src/state/SessionBehaviors.test.ts diff --git a/src/state/CallViewModel/localMember/LocalMember.test.ts b/src/state/CallViewModel/localMember/LocalMember.test.ts index 16ffe1493..fb93a62b8 100644 --- a/src/state/CallViewModel/localMember/LocalMember.test.ts +++ b/src/state/CallViewModel/localMember/LocalMember.test.ts @@ -136,6 +136,67 @@ describe("LocalMembership", () => { }), ); }); + + it("passes keyRotationParticipantLimit from config to joinRTCSession", () => { + const focusFromOlderMembership = { + type: "livekit", + livekit_service_url: "http://my-oldest-member-service-url.com", + livekit_alias: "my-oldest-member-service-alias", + }; + + mockConfig({ + livekit: { livekit_service_url: "http://my-default-service-url.com" }, + matrix_rtc_session: { + delayed_leave_event_delay_ms: 0, + network_error_retry_ms: 0, + key_rotation_participant_limit: 50, + }, + }); + + const mockedSession = vi.mocked({ + room: { + roomId: "roomId", + client: { + getDomain: vi.fn().mockReturnValue("example.org"), + getOpenIdToken: vi.fn().mockResolvedValue({ + access_token: "ACCCESS_TOKEN", + token_type: "Bearer", + matrix_server_name: "localhost", + expires_in: 10000, + }), + }, + }, + memberships: [], + getFocusInUse: vi.fn().mockReturnValue(focusFromOlderMembership), + getOldestMembership: vi.fn().mockReturnValue({ + getPreferredFoci: vi.fn().mockReturnValue([focusFromOlderMembership]), + }), + joinRTCSession: vi.fn(), + }) as unknown as MatrixRTCSession; + + enterRTCSession( + mockedSession, + ownMemberMock, + { + livekit_alias: "roomId", + livekit_service_url: "http://my-livekit-service-url.com", + type: "livekit", + }, + { + encryptMedia: true, + matrixRTCMode: MATRIX_RTC_MODE, + }, + ); + + expect(mockedSession.joinRTCSession).toHaveBeenLastCalledWith( + expect.any(Object), + expect.any(Array), + undefined, + expect.objectContaining({ + keyRotationParticipantLimit: 50, + }), + ); + }); }); const defaultCreateLocalMemberValues = { diff --git a/src/state/SessionBehaviors.test.ts b/src/state/SessionBehaviors.test.ts new file mode 100644 index 000000000..9f05159c5 --- /dev/null +++ b/src/state/SessionBehaviors.test.ts @@ -0,0 +1,60 @@ +/* +Copyright 2025 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 { describe, expect, it, vi } from "vitest"; +import { MatrixRTCSessionEvent } from "matrix-js-sdk/lib/matrixrtc"; +import { EventEmitter } from "events"; + +import { createKeyRotationSuppressed$ } from "./SessionBehaviors"; +import { ObservableScope } from "./ObservableScope"; + +describe("SessionBehaviors", () => { + describe("createKeyRotationSuppressed$", () => { + it("emits initial value from isKeyRotationSuppressed", () => { + const scope = new ObservableScope(); + + const mockSession = { + on: vi.fn(), + off: vi.fn(), + isKeyRotationSuppressed: false, + }; + + const keyRotationSuppressed$ = createKeyRotationSuppressed$( + scope, + mockSession as any, + ); + + expect(keyRotationSuppressed$.value).toBe(false); + scope.end(); + }); + + it("updates when KeyRotationSuppressedChanged event is emitted", () => { + const scope = new ObservableScope(); + const emitter = new EventEmitter(); + + const mockSession = Object.assign(emitter, { + isKeyRotationSuppressed: false, + }); + + const keyRotationSuppressed$ = createKeyRotationSuppressed$( + scope, + mockSession as any, + ); + + expect(keyRotationSuppressed$.value).toBe(false); + + emitter.emit(MatrixRTCSessionEvent.KeyRotationSuppressedChanged, true); + + expect(keyRotationSuppressed$.value).toBe(true); + + emitter.emit(MatrixRTCSessionEvent.KeyRotationSuppressedChanged, false); + + expect(keyRotationSuppressed$.value).toBe(false); + scope.end(); + }); + }); +});