2021-07-21 15:23:42 +08:00
|
|
|
import { IAnonymousEvent, IRoomEvent, PosthogAnalytics } from '../src/PosthogAnalytics';
|
2021-07-21 14:40:39 +08:00
|
|
|
import SdkConfig from '../src/SdkConfig';
|
|
|
|
const crypto = require('crypto');
|
|
|
|
|
|
|
|
class FakePosthog {
|
|
|
|
public capture;
|
|
|
|
public init;
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this.capture = jest.fn();
|
|
|
|
this.init = jest.fn();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-21 15:23:42 +08:00
|
|
|
export interface ITestEvent extends IAnonymousEvent {
|
2021-07-21 14:40:39 +08:00
|
|
|
key: "jest_test_event",
|
|
|
|
properties: {
|
|
|
|
foo: string
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-21 15:23:42 +08:00
|
|
|
export interface ITestRoomEvent extends IRoomEvent {
|
|
|
|
key: "jest_test_room_event",
|
|
|
|
properties: {
|
|
|
|
foo: string
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-21 14:40:39 +08: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 15:23:42 +08:00
|
|
|
analytics.trackAnonymousEvent<ITestEvent>("jest_test_event", {
|
2021-07-21 14:40:39 +08:00
|
|
|
foo: "bar",
|
|
|
|
});
|
|
|
|
expect(fakePosthog.capture.mock.calls[0][0]).toBe("jest_test_event");
|
|
|
|
expect(fakePosthog.capture.mock.calls[0][1]).toEqual({ foo: "bar" });
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Should pass trackRoomEvent to posthog", () => {
|
|
|
|
analytics.init(false);
|
|
|
|
const roomId = "42";
|
2021-07-21 15:23:42 +08:00
|
|
|
return analytics.trackRoomEvent<IRoomEvent>("jest_test_event", roomId, {
|
2021-07-21 14:40:39 +08: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 14:42:55 +08:00
|
|
|
|
2021-07-21 15:23:42 +08:00
|
|
|
it("Should silently not track if not inititalised", () => {
|
|
|
|
analytics.trackAnonymousEvent<ITestEvent>("jest_test_event", {
|
2021-07-21 14:42:55 +08:00
|
|
|
foo: "bar",
|
|
|
|
});
|
|
|
|
|
|
|
|
expect(fakePosthog.capture.mock.calls.length).toBe(0);
|
|
|
|
});
|
2021-07-21 15:23:42 +08:00
|
|
|
|
|
|
|
it("Should not track non-anonymous messages if onlyTrackAnonymousEvents is true", () => {
|
|
|
|
analytics.trackAnonymousEvent<ITestEvent>("jest_test_event", {
|
|
|
|
foo: "bar",
|
|
|
|
});
|
|
|
|
});
|
2021-07-21 14:40:39 +08:00
|
|
|
});
|