/* @vitest-environment jsdom */ import { afterEach, describe, expect, test, vi } from 'vitest'; import { copyTextToClipboard } from './clipboard'; import * as hostBridge from './host-bridge/hostBridge'; const originalClipboard = navigator.clipboard; afterEach(() => { vi.restoreAllMocks(); window.history.replaceState(null, '', '/'); Object.defineProperty(navigator, 'clipboard', { configurable: true, value: originalClipboard, }); }); describe('copyTextToClipboard', () => { test('原生 App 优先通过 HostBridge 写入剪贴板', async () => { const writeHostClipboardText = vi .spyOn(hostBridge, 'writeHostClipboardText') .mockResolvedValue(true); const writeText = vi.fn(); Object.defineProperty(navigator, 'clipboard', { configurable: true, value: { writeText }, }); await expect(copyTextToClipboard(' PZ-00000001 ')).resolves.toBe(true); expect(writeHostClipboardText).toHaveBeenCalledWith({ text: 'PZ-00000001', }); expect(writeText).not.toHaveBeenCalled(); }); test('HostBridge 未处理时回退到浏览器 Clipboard API', async () => { vi.spyOn(hostBridge, 'writeHostClipboardText').mockResolvedValue(false); const writeText = vi.fn(async () => undefined); Object.defineProperty(navigator, 'clipboard', { configurable: true, value: { writeText }, }); await expect(copyTextToClipboard(' PZ-00000002 ')).resolves.toBe(true); expect(writeText).toHaveBeenCalledWith('PZ-00000002'); }); test('空文本不触发宿主或浏览器复制', async () => { const writeHostClipboardText = vi .spyOn(hostBridge, 'writeHostClipboardText') .mockResolvedValue(true); const writeText = vi.fn(); Object.defineProperty(navigator, 'clipboard', { configurable: true, value: { writeText }, }); await expect(copyTextToClipboard(' ')).resolves.toBe(false); expect(writeHostClipboardText).not.toHaveBeenCalled(); expect(writeText).not.toHaveBeenCalled(); }); });