Files
SnapOtter/tests/unit/web/utils.test.ts
T

50 lines
1.7 KiB
TypeScript

// @vitest-environment jsdom
import { afterEach, describe, expect, it, vi } from "vitest";
import { copyToClipboard, generateId } from "../../../apps/web/src/lib/utils";
describe("generateId", () => {
it("returns a valid UUID v4 string", () => {
const id = generateId();
expect(id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/);
});
it("returns unique values on successive calls", () => {
const ids = new Set(Array.from({ length: 100 }, () => generateId()));
expect(ids.size).toBe(100);
});
});
describe("copyToClipboard", () => {
const originalClipboard = navigator.clipboard;
const originalExecCommand = document.execCommand;
afterEach(() => {
Object.assign(navigator, { clipboard: originalClipboard });
document.execCommand = originalExecCommand;
vi.restoreAllMocks();
});
it("returns true when clipboard API succeeds", async () => {
Object.assign(navigator, {
clipboard: { writeText: vi.fn().mockResolvedValue(undefined) },
});
expect(await copyToClipboard("hello")).toBe(true);
expect(navigator.clipboard.writeText).toHaveBeenCalledWith("hello");
});
it("falls back to execCommand when clipboard API fails", async () => {
Object.assign(navigator, { clipboard: undefined });
document.execCommand = vi.fn().mockReturnValue(true);
expect(await copyToClipboard("hello")).toBe(true);
expect(document.execCommand).toHaveBeenCalledWith("copy");
});
it("returns false when both approaches fail", async () => {
Object.assign(navigator, { clipboard: undefined });
document.execCommand = vi.fn().mockImplementation(() => {
throw new Error("not supported");
});
expect(await copyToClipboard("hello")).toBe(false);
});
});