diff --git a/src/entrypoints/__tests__/background.test.ts b/src/entrypoints/__tests__/background.test.ts
index 21d5d32..7029ba1 100644
--- a/src/entrypoints/__tests__/background.test.ts
+++ b/src/entrypoints/__tests__/background.test.ts
@@ -36,7 +36,7 @@ describe('background 菜单注册与分流', () => {
expect(chrome.contextMenus.create).toHaveBeenCalledWith(
expect.objectContaining({
id: 'jwt',
- title: '🔑 解析 JWT',
+ title: '解析 JWT',
parentId: 'testing-tools-parent',
}),
);
@@ -48,7 +48,7 @@ describe('background 菜单注册与分流', () => {
expect(chrome.contextMenus.create).toHaveBeenCalledWith(
expect.objectContaining({
id: 'qrCode-page',
- title: '🔗 网页链接转二维码',
+ title: '网页链接转二维码',
contexts: ['page'],
}),
);
diff --git a/src/pages/Base64Converter/components/DecodeResultPaper.tsx b/src/pages/Base64Converter/components/DecodeResultPaper.tsx
index c3987e0..5d9657c 100644
--- a/src/pages/Base64Converter/components/DecodeResultPaper.tsx
+++ b/src/pages/Base64Converter/components/DecodeResultPaper.tsx
@@ -10,6 +10,7 @@
import { Download } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
import { formatBytes } from '@/utils/format';
import { useI18n } from '@/utils/chromeI18n';
@@ -61,9 +62,9 @@ export default function DecodeResultPaper({
{/* 文件名输入 */}
-
onFileNameChange(e.target.value)} />
diff --git a/src/pages/JsonTools/__tests__/index.test.tsx b/src/pages/JsonTools/__tests__/index.test.tsx
index 78ef06b..73e98ab 100644
--- a/src/pages/JsonTools/__tests__/index.test.tsx
+++ b/src/pages/JsonTools/__tests__/index.test.tsx
@@ -3,9 +3,9 @@ import { describe, it, expect } from 'vitest';
import Index from '../index';
describe('JsonTools 页面', () => {
- it('应该渲染页面标题', () => {
+ it('应该渲染模式切换按钮', () => {
render();
- // 基本渲染测试
- expect(screen.getByRole('button')).toBeInTheDocument();
+ // 基本渲染测试:页面含多个模式切换按钮,应至少渲染一个
+ expect(screen.getAllByRole('button').length).toBeGreaterThan(0);
});
});
diff --git a/src/pages/QrCode/__tests__/index.test.tsx b/src/pages/QrCode/__tests__/index.test.tsx
index dc415bb..00cefed 100644
--- a/src/pages/QrCode/__tests__/index.test.tsx
+++ b/src/pages/QrCode/__tests__/index.test.tsx
@@ -26,11 +26,11 @@ vi.mock('@/config/features', async (importOriginal) => {
};
});
-vi.mock('@/components/QrCodePreview', () => ({
+vi.mock('../components/QrCodePreview', () => ({
default: () => QrCodePreview
,
}));
-vi.mock('@/components/ImageUploader', () => ({
+vi.mock('../components/ImageUploader', () => ({
default: () => ImageUploader
,
}));
diff --git a/src/pages/QrCode/components/ImageUploader.tsx b/src/pages/QrCode/components/ImageUploader.tsx
index fb801b1..1810834 100644
--- a/src/pages/QrCode/components/ImageUploader.tsx
+++ b/src/pages/QrCode/components/ImageUploader.tsx
@@ -113,7 +113,7 @@ const ImageUploader = ({
? 'border-green-600 bg-green-50'
: selectedFile
? 'border-green-600 bg-green-50/50'
- : 'border-input bg-muted hover:border-green-600 hover:bg-green-500/10/50'
+ : 'border-input bg-muted hover:border-green-600 hover:bg-green-500/10'
}`}
onDragOver={handleDragOver}
onDragLeave={handleDragLeave}
diff --git a/src/pages/StorageCleaner/__tests__/index.test.tsx b/src/pages/StorageCleaner/__tests__/index.test.tsx
index b10e7e1..bf5f345 100644
--- a/src/pages/StorageCleaner/__tests__/index.test.tsx
+++ b/src/pages/StorageCleaner/__tests__/index.test.tsx
@@ -25,7 +25,8 @@ vi.mock('@/utils/storageCleaner', () => ({
describe('StorageCleaner 页面', () => {
it('应该渲染初始化加载状态', () => {
+ // storageCleaner:initializing 的中文文案为「正在读取站点数据...」
render();
- expect(screen.getByText(/initializing/i)).toBeInTheDocument();
+ expect(screen.getByText(/正在读取站点数据/)).toBeInTheDocument();
});
});
diff --git a/src/pages/StorageCleaner/components/StorageCleanerConfirm.tsx b/src/pages/StorageCleaner/components/StorageCleanerConfirm.tsx
index 88a1349..b3397cc 100644
--- a/src/pages/StorageCleaner/components/StorageCleanerConfirm.tsx
+++ b/src/pages/StorageCleaner/components/StorageCleanerConfirm.tsx
@@ -39,17 +39,20 @@ export function StorageCleanerConfirm({
'w-[90%] max-w-[340px] p-6 gap-0 rounded-2xl overflow-hidden shadow-xl border border-border bg-card text-card-foreground',
)}
>
+ {/* 头部标题区域 */}
{t('storageCleaner:confirmTitle')}
+ {/* 内容主体:限制最大宽度,防止内部元素在大分辨率下被横向拉得太松散 */}
{t('storageCleaner:confirmDesc')}
+ {/* 待清理项目徽章群 */}
{selectedOptions.map((label) => (
+ {/* 风险警告横幅 */}
diff --git a/src/pages/Timestamp/__tests__/index.test.tsx b/src/pages/Timestamp/__tests__/index.test.tsx
index c46df35..689b495 100644
--- a/src/pages/Timestamp/__tests__/index.test.tsx
+++ b/src/pages/Timestamp/__tests__/index.test.tsx
@@ -3,9 +3,9 @@ import { describe, it, expect } from 'vitest';
import Index from '../index';
describe('Timestamp 页面', () => {
- it('应该渲染页面标题', () => {
+ it('应该渲染模式切换按钮', () => {
render();
- // 基本渲染测试
- expect(screen.getByRole('button')).toBeInTheDocument();
+ // 基本渲染测试:页面含多个模式切换按钮,应至少渲染一个
+ expect(screen.getAllByRole('button').length).toBeGreaterThan(0);
});
});
diff --git a/src/utils/__tests__/contextMenu.test.ts b/src/utils/__tests__/contextMenu.test.ts
index 071619b..752cee1 100644
--- a/src/utils/__tests__/contextMenu.test.ts
+++ b/src/utils/__tests__/contextMenu.test.ts
@@ -50,7 +50,7 @@ describe('contextMenu', () => {
);
expect(imageMenus).toHaveLength(1);
expect(imageMenus[0].id).toBe('qrCode-image');
- expect(imageMenus[0].title).toBe('🖼️ 解析图片二维码');
+ expect(imageMenus[0].title).toBe('解析图片二维码');
});
});
@@ -73,7 +73,7 @@ describe('contextMenu', () => {
expect(chrome.contextMenus.create).toHaveBeenCalledWith({
id: 'jwt',
- title: '🔑 解析 JWT',
+ title: '解析 JWT',
contexts: ['selection'],
parentId: 'testing-tools-parent',
});
diff --git a/src/utils/base64Converter.ts b/src/utils/base64Converter.ts
index 494f3b5..ce95bc5 100644
--- a/src/utils/base64Converter.ts
+++ b/src/utils/base64Converter.ts
@@ -2,8 +2,6 @@
* Base64 转换器工具函数
*/
-import { formatBytes } from './format';
-
/** 最大文件大小限制(10 MB) */
export const MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -212,17 +210,6 @@ export function extractMimeTypeFromDataUri(dataUri: string): string {
return match ? match[1] : 'application/octet-stream';
}
-/**
- * 格式化文件大小显示
- *
- * @deprecated 直接使用 {@link formatBytes} 代替
- * @param bytes 字节数
- * @returns 格式化后的字符串
- */
-export function formatFileSize(bytes: number): string {
- return formatBytes(bytes);
-}
-
/**
* Base64 解码为二进制后的产物
*/
diff --git a/vitest.setup.ts b/vitest.setup.ts
index 7aa20ec..efd1d23 100644
--- a/vitest.setup.ts
+++ b/vitest.setup.ts
@@ -125,6 +125,20 @@ const webExtensionMock = {
sendMessage: vi.fn().mockResolvedValue(undefined),
create: vi.fn().mockResolvedValue({}),
reload: vi.fn().mockResolvedValue(undefined),
+ onActivated: {
+ addListener: vi.fn(),
+ removeListener: vi.fn(),
+ },
+ onUpdated: {
+ addListener: vi.fn(),
+ removeListener: vi.fn(),
+ },
+ },
+ windows: {
+ onFocusChanged: {
+ addListener: vi.fn(),
+ removeListener: vi.fn(),
+ },
},
runtime: {
id: 'test-extension-id',