Files
Genarrative/src/services/clipboard.test.ts
T
kdletters b03c910f49 接入宿主壳原生剪贴板复制路径
H5 复制服务在 native_app 中优先调用 clipboard.writeText

保留浏览器 Clipboard API 与 legacy selection copy 回退路径

补充 HostBridge 剪贴板测试和宿主壳能力文档
2026-06-17 23:40:57 +08:00

67 lines
2.0 KiB
TypeScript

/* @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();
});
});