Files
openclaw/src/agents/session-slug.test.ts
Jacob Tomlinson ae703ab0e7 infra: harden identifier entropy and delay jitter (#57744)
* infra: harden identifier entropy and delay jitter

* test: make randomness hardening deterministic in CI
2026-03-30 16:57:30 +01:00

52 lines
1.7 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
const randomMocks = vi.hoisted(() => ({
generateSecureInt: vi.fn(),
}));
let createSessionSlug: typeof import("./session-slug.js").createSessionSlug;
beforeEach(async () => {
vi.resetModules();
randomMocks.generateSecureInt.mockReset();
vi.doMock("../infra/secure-random.js", () => ({
generateSecureInt: randomMocks.generateSecureInt,
}));
({ createSessionSlug } = await import("./session-slug.js"));
});
describe("session slug", () => {
afterEach(() => {
vi.doUnmock("../infra/secure-random.js");
vi.restoreAllMocks();
});
it("generates a two-word slug by default", () => {
randomMocks.generateSecureInt.mockReturnValue(0);
const slug = createSessionSlug();
expect(slug).toBe("amber-atlas");
});
it("adds a numeric suffix when the base slug is taken", () => {
randomMocks.generateSecureInt.mockReturnValue(0);
const slug = createSessionSlug((id) => id === "amber-atlas");
expect(slug).toBe("amber-atlas-2");
});
it("falls back to three words when collisions persist", () => {
randomMocks.generateSecureInt.mockReturnValue(0);
const slug = createSessionSlug((id) => /^amber-atlas(-\d+)?$/.test(id));
expect(slug).toBe("amber-atlas-atlas");
});
it("uses secure fallback suffix entropy when word collisions persist", () => {
randomMocks.generateSecureInt.mockReturnValue(0);
const nowSpy = vi.spyOn(Date, "now").mockReturnValue(1_717_171_717_171);
const slug = createSessionSlug(
(id) => /^amber-atlas(?:-\d+)?$/.test(id) || /^amber-atlas-atlas(?:-\d+)?$/.test(id),
);
expect(slug).toBe("amber-atlas-atlas-aaa");
nowSpy.mockRestore();
});
});