mirror of
https://github.com/vector-im/element-call.git
synced 2026-01-27 03:05:53 +00:00
* Support for analytics configuration via URL parameters in widget mode Adds: - posthogApiHost - posthogApiKey - rageshakeSubmitUrl - sentryDsn - sentryEnvironment Deprecate analyticsId and use posthogUserId instead * Partial test coverage * Simplify tests * More tests * Lint * Split embedded only parameters into own section for clarity * Update docs/url-params.md * Update docs/url-params.md * Update vite.config.js
163 lines
4.6 KiB
TypeScript
163 lines
4.6 KiB
TypeScript
/*
|
|
Copyright 2022-2024 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
import {
|
|
afterAll,
|
|
afterEach,
|
|
beforeAll,
|
|
beforeEach,
|
|
describe,
|
|
expect,
|
|
it,
|
|
vi,
|
|
} from "vitest";
|
|
|
|
import { mockConfig } from "./utils/test";
|
|
|
|
const sentryInitSpy = vi.fn();
|
|
|
|
// Place the mock after the spy is defined
|
|
vi.mock("@sentry/react", () => ({
|
|
init: sentryInitSpy,
|
|
reactRouterV7BrowserTracingIntegration: vi.fn(),
|
|
}));
|
|
|
|
describe("Initializer", async () => {
|
|
// we import here to make sure that Sentry is mocked first
|
|
const { Initializer } = await import("./initializer.tsx");
|
|
describe("initBeforeReact()", () => {
|
|
it("sets font family from URL param", async () => {
|
|
window.location.hash = "#?font=DejaVu Sans";
|
|
await Initializer.initBeforeReact();
|
|
expect(
|
|
getComputedStyle(document.documentElement).getPropertyValue(
|
|
"--font-family",
|
|
),
|
|
).toBe('"DejaVu Sans"');
|
|
});
|
|
|
|
it("sets font scale from URL param", async () => {
|
|
window.location.hash = "#?fontScale=1.2";
|
|
await Initializer.initBeforeReact();
|
|
expect(
|
|
getComputedStyle(document.documentElement).getPropertyValue(
|
|
"--font-scale",
|
|
),
|
|
).toBe("1.2");
|
|
});
|
|
});
|
|
|
|
describe("init()", () => {
|
|
describe("sentry setup", () => {
|
|
describe("embedded package", () => {
|
|
beforeAll(() => {
|
|
vi.stubEnv("VITE_PACKAGE", "embedded");
|
|
});
|
|
|
|
beforeEach(() => {
|
|
mockConfig({});
|
|
window.location.hash = "#";
|
|
Initializer.reset();
|
|
});
|
|
|
|
afterEach(() => {
|
|
sentryInitSpy.mockClear();
|
|
});
|
|
|
|
afterAll(() => {
|
|
vi.unstubAllEnvs();
|
|
});
|
|
|
|
it("does not call Sentry.init() without config value", async () => {
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("ignores config value and does not create instance", async () => {
|
|
mockConfig({
|
|
sentry: {
|
|
DSN: "https://config.example.com.localhost",
|
|
environment: "config",
|
|
},
|
|
});
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("uses sentryDsn param if set", async () => {
|
|
window.location.hash = `#?sentryDsn=${encodeURIComponent("https://dsn.example.com.localhost")}`;
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
dsn: "https://dsn.example.com.localhost",
|
|
environment: undefined,
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("uses sentryDsn and sentryEnvironment params if set", async () => {
|
|
window.location.hash = `#?sentryDsn=${encodeURIComponent("https://dsn.example.com.localhost")}&sentryEnvironment=fooEnvironment`;
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
dsn: "https://dsn.example.com.localhost",
|
|
environment: "fooEnvironment",
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("full package", () => {
|
|
beforeAll(() => {
|
|
vi.stubEnv("VITE_PACKAGE", "full");
|
|
});
|
|
|
|
beforeEach(() => {
|
|
mockConfig({});
|
|
window.location.hash = "#";
|
|
Initializer.reset();
|
|
});
|
|
|
|
afterEach(() => {
|
|
sentryInitSpy.mockClear();
|
|
});
|
|
|
|
afterAll(() => {
|
|
vi.unstubAllEnvs();
|
|
});
|
|
|
|
it("does not create instance without config value or URL param", async () => {
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("ignores URL params and does not create instance", async () => {
|
|
window.location.hash = `#?sentryDsn=${encodeURIComponent("https://dsn.example.com.localhost")}&sentryEnvironment=fooEnvironment`;
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("creates instance with config value", async () => {
|
|
mockConfig({
|
|
sentry: {
|
|
DSN: "https://dsn.example.com.localhost",
|
|
environment: "fooEnvironment",
|
|
},
|
|
});
|
|
await Initializer.init();
|
|
expect(sentryInitSpy).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
dsn: "https://dsn.example.com.localhost",
|
|
environment: "fooEnvironment",
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|