838137c83b
This is another KPI for PostHog.
171 lines
4.5 KiB
TypeScript
171 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,
|
|
},
|
|
});
|
|
});
|
|
});
|
|
});
|