import { beforeEach, describe, expect, it, vi } from "vitest"; type StorageShape = Record; describe("background clipboard", () => { let storage: StorageShape; let clipboardWriteText: ReturnType; beforeEach(async () => { vi.resetModules(); vi.useFakeTimers(); storage = {}; clipboardWriteText = vi.fn(async () => undefined); const chromeMock = { tabs: { query: vi.fn(async () => []), }, scripting: { executeScript: vi.fn(async () => []), }, alarms: { clear: vi.fn(), create: vi.fn(), onAlarm: { addListener: vi.fn() }, }, idle: { setDetectionInterval: vi.fn(), onStateChanged: { addListener: vi.fn() }, }, storage: { local: { get: vi.fn(async (key?: string | string[]) => { if (!key) return storage; if (typeof key === "string") { return { [key]: storage[key] }; } return key.reduce>((result, entry) => { result[entry] = storage[entry]; return result; }, {}); }), set: vi.fn(async (next: Record) => { Object.assign(storage, next); }), remove: vi.fn(async () => undefined), }, }, } as unknown as typeof chrome; (globalThis as { chrome?: typeof chrome }).chrome = chromeMock; vi.stubGlobal("navigator", { clipboard: { writeText: clipboardWriteText, }, }); const vault = await import("./vault"); await vault.ensureSettingsLoaded(); }); it("copyToClipboard writes text to the clipboard", async () => { const { copyToClipboard } = await import("./clipboard"); await copyToClipboard("secret", "Password"); expect(clipboardWriteText).toHaveBeenCalledWith("secret"); }); it("copyToClipboard clears the clipboard after clipboardClearSeconds", async () => { const vault = await import("./vault"); const { copyToClipboard } = await import("./clipboard"); await vault.updateSettings({ clipboardClearSeconds: 1 }); await copyToClipboard("secret", "Password"); await vi.advanceTimersByTimeAsync(1000); expect(clipboardWriteText).toHaveBeenNthCalledWith(2, ""); }); it("copyToClipboard respects custom clipboardClearSeconds", async () => { const vault = await import("./vault"); const { copyToClipboard } = await import("./clipboard"); await vault.updateSettings({ clipboardClearSeconds: 10 }); await copyToClipboard("secret", "Password"); await vi.advanceTimersByTimeAsync(9999); expect(clipboardWriteText).toHaveBeenCalledTimes(1); await vi.advanceTimersByTimeAsync(2); expect(clipboardWriteText).toHaveBeenNthCalledWith(2, ""); }); it("copyToClipboard defaults to 30 seconds when clipboardClearSeconds is absent", async () => { const { copyToClipboard } = await import("./clipboard"); await copyToClipboard("secret", "Password"); await vi.advanceTimersByTimeAsync(29999); expect(clipboardWriteText).toHaveBeenCalledTimes(1); await vi.advanceTimersByTimeAsync(2); expect(clipboardWriteText).toHaveBeenNthCalledWith(2, ""); }); });