You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-07-31 15:24:23 +03:00
Test cleanMemberState
This commit is contained in:
@ -416,6 +416,9 @@ export class MockCallMatrixClient extends TypedEventEmitter<EmittedEvents, Emitt
|
|||||||
public getRooms = jest.fn<Room[], []>().mockReturnValue([]);
|
public getRooms = jest.fn<Room[], []>().mockReturnValue([]);
|
||||||
public getRoom = jest.fn();
|
public getRoom = jest.fn();
|
||||||
|
|
||||||
|
public supportsExperimentalThreads(): boolean { return true; }
|
||||||
|
public async decryptEventIfNeeded(): Promise<void> {}
|
||||||
|
|
||||||
public typed(): MatrixClient { return this as unknown as MatrixClient; }
|
public typed(): MatrixClient { return this as unknown as MatrixClient; }
|
||||||
|
|
||||||
public emitRoomState(event: MatrixEvent, state: RoomState): void {
|
public emitRoomState(event: MatrixEvent, state: RoomState): void {
|
||||||
|
@ -25,7 +25,7 @@ import {
|
|||||||
} from '../../../src';
|
} from '../../../src';
|
||||||
import { RoomStateEvent } from "../../../src/models/room-state";
|
import { RoomStateEvent } from "../../../src/models/room-state";
|
||||||
import { GroupCall, GroupCallEvent, GroupCallState } from "../../../src/webrtc/groupCall";
|
import { GroupCall, GroupCallEvent, GroupCallState } from "../../../src/webrtc/groupCall";
|
||||||
import { MatrixClient } from "../../../src/client";
|
import { IMyDevice, MatrixClient } from "../../../src/client";
|
||||||
import {
|
import {
|
||||||
installWebRTCMocks,
|
installWebRTCMocks,
|
||||||
MockCallFeed,
|
MockCallFeed,
|
||||||
@ -260,12 +260,15 @@ describe('Group Call', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("includes local device in participants when entered via another session", async () => {
|
it("includes local device in participants when entered via another session", async () => {
|
||||||
groupCall.enteredViaAnotherSession = true;
|
const hasLocalParticipant = () => groupCall.participants.get(
|
||||||
|
|
||||||
const hasLocalParticipant = groupCall.participants.get(
|
|
||||||
room.getMember(mockClient.getUserId()!)!,
|
room.getMember(mockClient.getUserId()!)!,
|
||||||
)?.has(mockClient.getDeviceId()!);
|
)?.has(mockClient.getDeviceId()!) ?? false;
|
||||||
expect(hasLocalParticipant).toBe(true);
|
|
||||||
|
expect(groupCall.enteredViaAnotherSession).toBe(false);
|
||||||
|
expect(hasLocalParticipant()).toBe(false);
|
||||||
|
|
||||||
|
groupCall.enteredViaAnotherSession = true;
|
||||||
|
expect(hasLocalParticipant()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("starts with mic unmuted in regular calls", async () => {
|
it("starts with mic unmuted in regular calls", async () => {
|
||||||
@ -1271,4 +1274,155 @@ describe('Group Call', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("cleaning member state", () => {
|
||||||
|
const bobWeb: IMyDevice = {
|
||||||
|
device_id: "bobweb",
|
||||||
|
last_seen_ts: 0,
|
||||||
|
};
|
||||||
|
const bobDesktop: IMyDevice = {
|
||||||
|
device_id: "bobdesktop",
|
||||||
|
last_seen_ts: 0,
|
||||||
|
};
|
||||||
|
const bobDesktopOffline: IMyDevice = {
|
||||||
|
device_id: "bobdesktopoffline",
|
||||||
|
last_seen_ts: 1000 * 60 * 60 * -2, // 2 hours ago
|
||||||
|
};
|
||||||
|
const bobDesktopNeverOnline: IMyDevice = {
|
||||||
|
device_id: "bobdesktopneveronline",
|
||||||
|
};
|
||||||
|
|
||||||
|
const mkContent = (devices: IMyDevice[]) => ({
|
||||||
|
"m.calls": [{
|
||||||
|
"m.call_id": groupCall.groupCallId,
|
||||||
|
"m.devices": devices.map(d => ({
|
||||||
|
device_id: d.device_id, session_id: "1", feeds: [], expires_ts: 1000 * 60 * 10,
|
||||||
|
})),
|
||||||
|
}],
|
||||||
|
});
|
||||||
|
|
||||||
|
const expectDevices = (devices: IMyDevice[]) => expect(
|
||||||
|
room.currentState.getStateEvents(EventType.GroupCallMemberPrefix, FAKE_USER_ID_2)?.getContent(),
|
||||||
|
).toEqual({
|
||||||
|
"m.calls": [{
|
||||||
|
"m.call_id": groupCall.groupCallId,
|
||||||
|
"m.devices": devices.map(d => ({
|
||||||
|
device_id: d.device_id, session_id: "1", feeds: [], expires_ts: expect.any(Number),
|
||||||
|
})),
|
||||||
|
}],
|
||||||
|
});
|
||||||
|
|
||||||
|
let mockClient: MatrixClient;
|
||||||
|
let room: Room;
|
||||||
|
let groupCall: GroupCall;
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
jest.useFakeTimers();
|
||||||
|
jest.setSystemTime(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => jest.useRealTimers());
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
const typedMockClient = new MockCallMatrixClient(
|
||||||
|
FAKE_USER_ID_2, bobWeb.device_id, FAKE_SESSION_ID_2,
|
||||||
|
);
|
||||||
|
jest.spyOn(typedMockClient, "sendStateEvent").mockImplementation(
|
||||||
|
async (roomId, eventType, content, stateKey) => {
|
||||||
|
const eventId = `$${Math.random()}`;
|
||||||
|
if (roomId === room.roomId) {
|
||||||
|
room.addLiveEvents([new MatrixEvent({
|
||||||
|
event_id: eventId,
|
||||||
|
type: eventType,
|
||||||
|
room_id: roomId,
|
||||||
|
sender: FAKE_USER_ID_2,
|
||||||
|
content,
|
||||||
|
state_key: stateKey,
|
||||||
|
})]);
|
||||||
|
}
|
||||||
|
return { event_id: eventId };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
mockClient = typedMockClient as unknown as MatrixClient;
|
||||||
|
|
||||||
|
room = new Room(FAKE_ROOM_ID, mockClient, FAKE_USER_ID_2);
|
||||||
|
room.getMember = jest.fn().mockImplementation((userId) => ({ userId }));
|
||||||
|
|
||||||
|
groupCall = new GroupCall(
|
||||||
|
mockClient,
|
||||||
|
room,
|
||||||
|
GroupCallType.Video,
|
||||||
|
false,
|
||||||
|
GroupCallIntent.Prompt,
|
||||||
|
FAKE_CONF_ID,
|
||||||
|
);
|
||||||
|
await groupCall.create();
|
||||||
|
|
||||||
|
mockClient.getDevices = async () => ({
|
||||||
|
devices: [
|
||||||
|
bobWeb,
|
||||||
|
bobDesktop,
|
||||||
|
bobDesktopOffline,
|
||||||
|
bobDesktopNeverOnline,
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => groupCall.leave());
|
||||||
|
|
||||||
|
it("doesn't clean up valid devices", async () => {
|
||||||
|
await groupCall.enter();
|
||||||
|
await mockClient.sendStateEvent(
|
||||||
|
room.roomId,
|
||||||
|
EventType.GroupCallMemberPrefix,
|
||||||
|
mkContent([bobWeb, bobDesktop]),
|
||||||
|
FAKE_USER_ID_2,
|
||||||
|
);
|
||||||
|
|
||||||
|
await groupCall.cleanMemberState();
|
||||||
|
expectDevices([bobWeb, bobDesktop]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("cleans up our own device if we're disconnected", async () => {
|
||||||
|
await mockClient.sendStateEvent(
|
||||||
|
room.roomId,
|
||||||
|
EventType.GroupCallMemberPrefix,
|
||||||
|
mkContent([bobWeb, bobDesktop]),
|
||||||
|
FAKE_USER_ID_2,
|
||||||
|
);
|
||||||
|
|
||||||
|
await groupCall.cleanMemberState();
|
||||||
|
expectDevices([bobDesktop]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("doesn't clean up the local device if entered via another session", async () => {
|
||||||
|
groupCall.enteredViaAnotherSession = true;
|
||||||
|
await mockClient.sendStateEvent(
|
||||||
|
room.roomId,
|
||||||
|
EventType.GroupCallMemberPrefix,
|
||||||
|
mkContent([bobWeb]),
|
||||||
|
FAKE_USER_ID_2,
|
||||||
|
);
|
||||||
|
|
||||||
|
await groupCall.cleanMemberState();
|
||||||
|
expectDevices([bobWeb]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("cleans up devices that have never been online", async () => {
|
||||||
|
await mockClient.sendStateEvent(
|
||||||
|
room.roomId,
|
||||||
|
EventType.GroupCallMemberPrefix,
|
||||||
|
mkContent([bobDesktop, bobDesktopNeverOnline]),
|
||||||
|
FAKE_USER_ID_2,
|
||||||
|
);
|
||||||
|
|
||||||
|
await groupCall.cleanMemberState();
|
||||||
|
expectDevices([bobDesktop]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("no-ops if there are no state events", async () => {
|
||||||
|
await groupCall.cleanMemberState();
|
||||||
|
expect(room.currentState.getStateEvents(EventType.GroupCallMemberPrefix, FAKE_USER_ID_2)).toBe(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user