945780def8
feat: optimize dashboard/search UX and simplify extension architecture Redesign Dashboard with compact tool grid and recently used tools Improve TopBar search UX with Cmd/Ctrl+K shortcut and better history navigation Reorganize project structure into src/ Migrate i18n from react-i18next to chrome.i18n Remove runtime language switch and settings page Remove HTML/Markdown conversion tools Clean up unused code, dead animations, redundant comments, and imports Improve component consistency with shadcn/ui patterns Replace hardcoded strings/colors with i18n tokens and theme tokens Add comprehensive project documentation and coding standards Fix CI artifact upload workflow and multiple TypeScript/test issues Includes various refactors, UI polish, i18n cleanup, CI improvements, and maintenance updates across the codebase.
58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
import { describe, expect, it, vi, beforeAll } from 'vitest';
|
|
import { copyTextToClipboard, copyImageToClipboard } from '@/utils/clipboard';
|
|
|
|
// Mock ClipboardItem for test environment
|
|
class MockClipboardItem {
|
|
constructor(public items: Record<string, Blob>) {}
|
|
}
|
|
|
|
beforeAll(() => {
|
|
(globalThis as any).ClipboardItem = MockClipboardItem;
|
|
});
|
|
|
|
describe('clipboard', () => {
|
|
describe('copyTextToClipboard', () => {
|
|
it('复制成功时应返回 true', async () => {
|
|
const writeText = vi.fn().mockResolvedValue(undefined);
|
|
Object.assign(navigator, { clipboard: { writeText } });
|
|
|
|
const result = await copyTextToClipboard('test text');
|
|
|
|
expect(result).toBe(true);
|
|
expect(writeText).toHaveBeenCalledWith('test text');
|
|
});
|
|
|
|
it('复制失败时应返回 false', async () => {
|
|
const writeText = vi.fn().mockRejectedValue(new Error('Permission denied'));
|
|
Object.assign(navigator, { clipboard: { writeText } });
|
|
|
|
const result = await copyTextToClipboard('test text');
|
|
|
|
expect(result).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('copyImageToClipboard', () => {
|
|
it('复制成功时应返回 true', async () => {
|
|
const write = vi.fn().mockResolvedValue(undefined);
|
|
Object.assign(navigator, { clipboard: { write } });
|
|
|
|
const blob = new Blob(['png data'], { type: 'image/png' });
|
|
const result = await copyImageToClipboard(blob);
|
|
|
|
expect(result).toBe(true);
|
|
expect(write).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('复制失败时应返回 false', async () => {
|
|
const write = vi.fn().mockRejectedValue(new Error('Permission denied'));
|
|
Object.assign(navigator, { clipboard: { write } });
|
|
|
|
const blob = new Blob(['png data'], { type: 'image/png' });
|
|
const result = await copyImageToClipboard(blob);
|
|
|
|
expect(result).toBe(false);
|
|
});
|
|
});
|
|
});
|