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.
145 lines
4.0 KiB
TypeScript
145 lines
4.0 KiB
TypeScript
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
import {
|
|
createAllContextMenus,
|
|
parseContextMenuClick,
|
|
CONTEXT_MENU_CONFIGS,
|
|
MAX_PAYLOAD_LENGTH,
|
|
} from '@/utils/contextMenu';
|
|
import { MessageAction } from '@/utils/messages';
|
|
|
|
describe('background 菜单注册与分流', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('菜单注册', () => {
|
|
it('应该调用 createAllContextMenus 创建所有菜单项', () => {
|
|
createAllContextMenus();
|
|
|
|
expect(chrome.contextMenus.create).toHaveBeenCalledTimes(CONTEXT_MENU_CONFIGS.length);
|
|
});
|
|
|
|
it('应该创建父级菜单 Testing Tools', () => {
|
|
createAllContextMenus();
|
|
|
|
expect(chrome.contextMenus.create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
id: 'testing-tools-parent',
|
|
title: 'Testing Tools',
|
|
}),
|
|
);
|
|
});
|
|
|
|
it('应该创建 JWT 解析子菜单', () => {
|
|
createAllContextMenus();
|
|
|
|
expect(chrome.contextMenus.create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
id: 'jwt',
|
|
title: '🔑 解析 JWT',
|
|
parentId: 'testing-tools-parent',
|
|
}),
|
|
);
|
|
});
|
|
|
|
it('应该创建网页链接转二维码子菜单', () => {
|
|
createAllContextMenus();
|
|
|
|
expect(chrome.contextMenus.create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
id: 'qrCode-page',
|
|
title: '🔗 网页链接转二维码',
|
|
contexts: ['page'],
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('菜单点击解析', () => {
|
|
const createMockOnClickData = (
|
|
overrides: Partial<chrome.contextMenus.OnClickData> = {},
|
|
): chrome.contextMenus.OnClickData => ({
|
|
menuItemId: 'test',
|
|
editable: false,
|
|
pageUrl: 'https://example.com',
|
|
...overrides,
|
|
});
|
|
|
|
it('当有 selectionText 时应返回对应的 featureKey 和 payload', () => {
|
|
const info = createMockOnClickData({
|
|
menuItemId: 'jwt',
|
|
selectionText: 'test-token',
|
|
});
|
|
|
|
const result = parseContextMenuClick('jwt', info);
|
|
|
|
expect(result).toEqual({
|
|
success: true,
|
|
data: { featureKey: 'jwt', payload: 'test-token' },
|
|
});
|
|
});
|
|
|
|
it('当没有 selectionText 和 srcUrl 时应返回错误', () => {
|
|
const info = createMockOnClickData({
|
|
menuItemId: 'unknown',
|
|
pageUrl: undefined,
|
|
});
|
|
|
|
const result = parseContextMenuClick('unknown', info);
|
|
|
|
expect(result).toEqual({
|
|
success: false,
|
|
error: '无法获取有效数据',
|
|
});
|
|
});
|
|
|
|
it('当文本超过最大长度限制时应截断', () => {
|
|
const longText = 'a'.repeat(MAX_PAYLOAD_LENGTH + 1000);
|
|
const info = createMockOnClickData({
|
|
menuItemId: 'textStatistics',
|
|
selectionText: longText,
|
|
});
|
|
|
|
const result = parseContextMenuClick('textStatistics', info);
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.data?.payload.length).toBe(MAX_PAYLOAD_LENGTH);
|
|
});
|
|
|
|
it('当文本未超过最大长度限制时应保持原样', () => {
|
|
const shortText = 'short text';
|
|
const info = createMockOnClickData({
|
|
menuItemId: 'textStatistics',
|
|
selectionText: shortText,
|
|
});
|
|
|
|
const result = parseContextMenuClick('textStatistics', info);
|
|
|
|
expect(result).toEqual({
|
|
success: true,
|
|
data: { featureKey: 'textStatistics', payload: 'short text' },
|
|
});
|
|
});
|
|
|
|
it('应该正确处理页面 URL 菜单点击', () => {
|
|
const info = createMockOnClickData({
|
|
menuItemId: 'storageCleaner',
|
|
pageUrl: 'https://example.com/page',
|
|
});
|
|
|
|
const result = parseContextMenuClick('storageCleaner', info);
|
|
|
|
expect(result).toEqual({
|
|
success: true,
|
|
data: { featureKey: 'storageCleaner', payload: 'https://example.com/page' },
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('消息类型定义', () => {
|
|
it('CONTEXT_MENU_CLICKED 消息类型应正确定义', () => {
|
|
expect(MessageAction.CONTEXT_MENU_CLICKED).toBe('contextMenuClicked');
|
|
});
|
|
});
|
|
});
|