b03c910f49
H5 复制服务在 native_app 中优先调用 clipboard.writeText 保留浏览器 Clipboard API 与 legacy selection copy 回退路径 补充 HostBridge 剪贴板测试和宿主壳能力文档
67 lines
2.0 KiB
TypeScript
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();
|
|
});
|
|
});
|