import { describe, expect, it, vi, beforeEach } from "vitest";
// CLI → Studio telemetry identity seeding (Layer 1). Verifies the server only
// hands the browser a distinct id when CLI telemetry is enabled, and passes
// through the anonymous machine id (no PII) otherwise.
const shouldTrack = vi.fn();
const readConfig = vi.fn();
vi.mock("../telemetry/client.js", () => ({
shouldTrack: (...args: unknown[]) => shouldTrack(...args),
}));
vi.mock("../telemetry/config.js", () => ({
readConfig: (...args: unknown[]) => readConfig(...args),
}));
const { resolveCliTelemetryDistinctId, buildCliIdentityScript, buildStudioHeadScripts } =
await import("./telemetryIdentity.js");
describe("resolveCliTelemetryDistinctId", () => {
beforeEach(() => {
shouldTrack.mockReset();
readConfig.mockReset();
});
it("returns the CLI anonymousId when telemetry is enabled", () => {
shouldTrack.mockReturnValue(true);
readConfig.mockReturnValue({ anonymousId: "machine-uuid" });
expect(resolveCliTelemetryDistinctId()).toBe("machine-uuid");
});
it("returns null when telemetry is disabled (opt-out / dev / CI)", () => {
shouldTrack.mockReturnValue(false);
readConfig.mockReturnValue({ anonymousId: "machine-uuid" });
expect(resolveCliTelemetryDistinctId()).toBeNull();
// Must not even read config when suppressed.
expect(readConfig).not.toHaveBeenCalled();
});
it("returns null when there is no anonymousId", () => {
shouldTrack.mockReturnValue(true);
readConfig.mockReturnValue({ anonymousId: "" });
expect(resolveCliTelemetryDistinctId()).toBeNull();
});
it("never throws — returns null if config reading fails", () => {
shouldTrack.mockReturnValue(true);
readConfig.mockImplementation(() => {
throw new Error("disk error");
});
expect(resolveCliTelemetryDistinctId()).toBeNull();
});
});
describe("buildCliIdentityScript", () => {
beforeEach(() => {
shouldTrack.mockReset();
readConfig.mockReset();
});
it("emits a script that sets window.__HF_CLI_DISTINCT_ID when telemetry is on", () => {
shouldTrack.mockReturnValue(true);
readConfig.mockReturnValue({ anonymousId: "machine-uuid" });
expect(buildCliIdentityScript()).toBe(
'',
);
});
it("emits an empty string when telemetry is disabled (nothing to seed)", () => {
shouldTrack.mockReturnValue(false);
expect(buildCliIdentityScript()).toBe("");
});
it("JSON-encodes the id so it can't break out of the script literal", () => {
shouldTrack.mockReturnValue(true);
readConfig.mockReturnValue({ anonymousId: "";
it("places the CLI identity script before the env script so the global is set first", () => {
shouldTrack.mockReturnValue(true);
readConfig.mockReturnValue({ anonymousId: "machine-uuid" });
const head = buildStudioHeadScripts(ENV_SCRIPT);
expect(head.indexOf("__HF_CLI_DISTINCT_ID")).toBeGreaterThanOrEqual(0);
expect(head.indexOf("__HF_CLI_DISTINCT_ID")).toBeLessThan(head.indexOf("__HF_STUDIO_ENV__"));
});
it("returns just the env script when identity is suppressed (telemetry off)", () => {
shouldTrack.mockReturnValue(false);
expect(buildStudioHeadScripts(ENV_SCRIPT)).toBe(ENV_SCRIPT);
});
});