forked from baron/baron-sso
39 lines
1022 B
TypeScript
39 lines
1022 B
TypeScript
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
import { cn, generateSecurePassword } from "./utils";
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
vi.unstubAllGlobals();
|
|
});
|
|
|
|
describe("cn utility", () => {
|
|
it("merges class names correctly", () => {
|
|
expect(cn("a", "b")).toBe("a b");
|
|
expect(cn("a", { b: true, c: false })).toBe("a b");
|
|
});
|
|
|
|
it("handles tailwind class conflicts", () => {
|
|
expect(cn("px-2 py-2", "px-4")).toBe("py-2 px-4");
|
|
});
|
|
});
|
|
|
|
describe("generateSecurePassword", () => {
|
|
it("uses crypto random values when available", () => {
|
|
vi.stubGlobal("crypto", {
|
|
getRandomValues: vi.fn((values: Uint32Array) => {
|
|
values.set([0, 1, 2, 3]);
|
|
return values;
|
|
}),
|
|
});
|
|
|
|
expect(generateSecurePassword(4)).toBe("abcd");
|
|
});
|
|
|
|
it("falls back to Math.random when crypto is unavailable", () => {
|
|
vi.stubGlobal("crypto", undefined);
|
|
vi.spyOn(Math, "random").mockReturnValue(0);
|
|
|
|
expect(generateSecurePassword(3)).toBe("aaa");
|
|
});
|
|
});
|