172 lines
4.5 KiB
TypeScript
172 lines
4.5 KiB
TypeScript
|
/*
|
||
|
Copyright 2023 New Vector Ltd
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
import { Mocked, mocked } from "jest-mock";
|
||
|
import { RoomState } from "matrix-js-sdk/src/models/room-state";
|
||
|
import { PosthogAnalytics } from "../../src/analytics/PosthogAnalytics";
|
||
|
import { checkForParallelCalls } from "../../src/room/checkForParallelCalls";
|
||
|
|
||
|
const withFakeTimers = (continuation: () => void) => {
|
||
|
jest.useFakeTimers();
|
||
|
try {
|
||
|
continuation();
|
||
|
} finally {
|
||
|
jest.useRealTimers();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const withMockedPosthog = (
|
||
|
continuation: (posthog: Mocked<PosthogAnalytics>) => void
|
||
|
) => {
|
||
|
const posthog = mocked({
|
||
|
trackEvent: jest.fn(),
|
||
|
} as unknown as PosthogAnalytics);
|
||
|
const instanceSpy = jest
|
||
|
.spyOn(PosthogAnalytics, "instance", "get")
|
||
|
.mockReturnValue(posthog);
|
||
|
try {
|
||
|
continuation(posthog);
|
||
|
} finally {
|
||
|
instanceSpy.mockRestore();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const mockRoomState = (
|
||
|
groupCallMemberContents: Record<string, unknown>[]
|
||
|
): RoomState => {
|
||
|
const stateEvents = groupCallMemberContents.map((content) => ({
|
||
|
getContent: () => content,
|
||
|
}));
|
||
|
return { getStateEvents: () => stateEvents } as unknown as RoomState;
|
||
|
};
|
||
|
|
||
|
test("checkForParallelCalls does nothing if all participants are in the same call", () => {
|
||
|
withFakeTimers(() => {
|
||
|
withMockedPosthog((posthog) => {
|
||
|
const roomState = mockRoomState([
|
||
|
{
|
||
|
"m.calls": [
|
||
|
{
|
||
|
"m.call_id": "1",
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Call",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() + 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
"m.call_id": null, // invalid
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Android",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() + 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
null, // invalid
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
"m.calls": [
|
||
|
{
|
||
|
"m.call_id": "1",
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Desktop",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() + 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]);
|
||
|
|
||
|
checkForParallelCalls(roomState);
|
||
|
expect(posthog.trackEvent).not.toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
test("checkForParallelCalls sends diagnostics to PostHog if there is a split-brain", () => {
|
||
|
withFakeTimers(() => {
|
||
|
withMockedPosthog((posthog) => {
|
||
|
const roomState = mockRoomState([
|
||
|
{
|
||
|
"m.calls": [
|
||
|
{
|
||
|
"m.call_id": "1",
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Call",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() + 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
"m.call_id": "2",
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Android",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() + 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
"m.calls": [
|
||
|
{
|
||
|
"m.call_id": "1",
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Desktop",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() + 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
"m.call_id": "2",
|
||
|
"m.devices": [
|
||
|
{
|
||
|
device_id: "Element Call",
|
||
|
session_id: "a",
|
||
|
expires_ts: Date.now() - 1000,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]);
|
||
|
|
||
|
checkForParallelCalls(roomState);
|
||
|
expect(posthog.trackEvent).toHaveBeenCalledWith({
|
||
|
eventName: "ParallelCalls",
|
||
|
participantsPerCall: {
|
||
|
"1": 2,
|
||
|
"2": 1,
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|