element-web/test/PosthogAnalytics-test.ts

122 lines
3.7 KiB
TypeScript
Raw Normal View History

2021-07-21 10:23:42 +03:00
import { IAnonymousEvent, IRoomEvent, PosthogAnalytics } from '../src/PosthogAnalytics';
2021-07-21 09:40:39 +03:00
import SdkConfig from '../src/SdkConfig';
const crypto = require('crypto');
class FakePosthog {
public capture;
public init;
2021-07-21 10:38:58 +03:00
public identify;
2021-07-21 09:40:39 +03:00
constructor() {
this.capture = jest.fn();
this.init = jest.fn();
2021-07-21 10:38:58 +03:00
this.identify = jest.fn();
2021-07-21 09:40:39 +03:00
}
}
2021-07-21 10:23:42 +03:00
export interface ITestEvent extends IAnonymousEvent {
2021-07-21 09:40:39 +03:00
key: "jest_test_event",
properties: {
foo: string
}
}
2021-07-21 10:23:42 +03:00
export interface ITestRoomEvent extends IRoomEvent {
key: "jest_test_room_event",
properties: {
foo: string
}
}
2021-07-21 09:40:39 +03:00
describe("PosthogAnalytics", () => {
let analytics: PosthogAnalytics;
let fakePosthog: FakePosthog;
beforeEach(() => {
fakePosthog = new FakePosthog();
analytics = new PosthogAnalytics(fakePosthog);
window.crypto = {
subtle: crypto.webcrypto.subtle,
};
});
afterEach(() => {
navigator.doNotTrack = null;
window.crypto = null;
});
it("Should not initialise if DNT is enabled", () => {
navigator.doNotTrack = "1";
analytics.init(false);
expect(analytics.isInitialised()).toBe(false);
});
it("Should not initialise if config is not set", () => {
jest.spyOn(SdkConfig, "get").mockReturnValue({});
analytics.init(false);
expect(analytics.isInitialised()).toBe(false);
});
it("Should initialise if config is set", () => {
jest.spyOn(SdkConfig, "get").mockReturnValue({
posthog: {
projectApiKey: "foo",
apiHost: "bar",
},
});
analytics.init(false);
expect(analytics.isInitialised()).toBe(true);
});
it("Should pass track() to posthog", () => {
analytics.init(false);
2021-07-21 10:23:42 +03:00
analytics.trackAnonymousEvent<ITestEvent>("jest_test_event", {
2021-07-21 09:40:39 +03:00
foo: "bar",
});
expect(fakePosthog.capture.mock.calls[0][0]).toBe("jest_test_event");
expect(fakePosthog.capture.mock.calls[0][1]).toEqual({ foo: "bar" });
});
2021-07-21 10:38:58 +03:00
it("Should pass trackRoomEvent to posthog", async () => {
2021-07-21 09:40:39 +03:00
analytics.init(false);
const roomId = "42";
2021-07-21 10:23:42 +03:00
return analytics.trackRoomEvent<IRoomEvent>("jest_test_event", roomId, {
2021-07-21 09:40:39 +03:00
foo: "bar",
}).then(() => {
expect(fakePosthog.capture.mock.calls[0][0]).toBe("jest_test_event");
expect(fakePosthog.capture.mock.calls[0][1]).toEqual({
foo: "bar",
hashedRoomId: "73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049",
});
});
});
2021-07-21 10:23:42 +03:00
it("Should silently not track if not inititalised", () => {
analytics.trackAnonymousEvent<ITestEvent>("jest_test_event", {
foo: "bar",
});
expect(fakePosthog.capture.mock.calls.length).toBe(0);
});
2021-07-21 10:23:42 +03:00
it("Should not track non-anonymous messages if onlyTrackAnonymousEvents is true", () => {
analytics.trackAnonymousEvent<ITestEvent>("jest_test_event", {
foo: "bar",
});
});
2021-07-21 10:38:58 +03:00
it("Should identify the user to posthog if onlyTrackAnonymousEvents is false", async () => {
analytics.init(false);
await analytics.identifyUser("foo");
expect(fakePosthog.identify.mock.calls[0][0])
.toBe("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae");
});
it("Should not identify the user to posthog if onlyTrackAnonymousEvents is true", async () => {
analytics.init(true);
return analytics.identifyUser("foo").then(() => {
expect(fakePosthog.identify.mock.calls.length).toBe(0);
});
});
2021-07-21 09:40:39 +03:00
});