diff --git a/components/__tests__/DecodeResultPaper.test.tsx b/components/__tests__/DecodeResultPaper.test.tsx index 7dbc74f..a999307 100644 --- a/components/__tests__/DecodeResultPaper.test.tsx +++ b/components/__tests__/DecodeResultPaper.test.tsx @@ -40,7 +40,7 @@ describe('DecodeResultPaper 组件', () => { it('应渲染下载按钮', () => { render(); - expect(screen.getByRole('button', { name: 'download' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'base64Converter:download' })).toBeInTheDocument(); }); it('应渲染 children 内容', () => { @@ -64,7 +64,7 @@ describe('DecodeResultPaper 组件', () => { it('点击下载按钮时应调用 onDownload', () => { render(); - fireEvent.click(screen.getByRole('button', { name: 'download' })); + fireEvent.click(screen.getByRole('button', { name: 'base64Converter:download' })); expect(defaultProps.onDownload).toHaveBeenCalledTimes(1); }); }); @@ -72,12 +72,12 @@ describe('DecodeResultPaper 组件', () => { describe('按钮状态', () => { it('文件名为空时下载按钮应禁用', () => { render(); - expect(screen.getByRole('button', { name: 'download' })).toBeDisabled(); + expect(screen.getByRole('button', { name: 'base64Converter:download' })).toBeDisabled(); }); it('文件名不为空时下载按钮应启用', () => { render(); - expect(screen.getByRole('button', { name: 'download' })).toBeEnabled(); + expect(screen.getByRole('button', { name: 'base64Converter:download' })).toBeEnabled(); }); }); }); diff --git a/pages/Base64Converter/__tests__/FileMode.test.tsx b/pages/Base64Converter/__tests__/FileMode.test.tsx index 3e9f91a..4af2760 100644 --- a/pages/Base64Converter/__tests__/FileMode.test.tsx +++ b/pages/Base64Converter/__tests__/FileMode.test.tsx @@ -28,8 +28,8 @@ describe('FileMode', () => { it('应该渲染文件上传区域', async () => { render(); await waitForStorageReady(); - expect(screen.getByText('clickOrDropToFile')).toBeInTheDocument(); - expect(screen.getByText('maxFileSize')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:clickOrDropToFile')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:maxFileSize')).toBeInTheDocument(); }); it('应该处理有效的文件选择', async () => { @@ -44,7 +44,7 @@ describe('FileMode', () => { await waitFor(() => { expect(screen.getByText('test.txt')).toBeInTheDocument(); - expect(screen.getByText('base64Output')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:base64Output')).toBeInTheDocument(); }); }); @@ -60,7 +60,7 @@ describe('FileMode', () => { fireEvent.change(hiddenInput, { target: { files: [file] } }); await waitFor(() => { - expect(screen.getByRole('alert')).toHaveTextContent('fileSizeExceeded'); + expect(screen.getByRole('alert')).toHaveTextContent('base64Converter:fileSizeExceeded'); }); }); @@ -76,11 +76,11 @@ describe('FileMode', () => { expect(screen.getByText('test.txt')).toBeInTheDocument(); }); - fireEvent.click(screen.getByText('clear')); + fireEvent.click(screen.getByText('base64Converter:clear')); await waitFor(() => { expect(screen.queryByText('test.txt')).not.toBeInTheDocument(); - expect(screen.getByText('clickOrDropToFile')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:clickOrDropToFile')).toBeInTheDocument(); }); }); @@ -108,8 +108,8 @@ describe('FileMode', () => { fireEvent.change(hiddenInput, { target: { files: [file] } }); await waitFor(() => { - expect(screen.getByText(/originalSize/)).toBeInTheDocument(); - expect(screen.getByText(/encodedSize/)).toBeInTheDocument(); + expect(screen.getByText(/base64Converter:originalSize/)).toBeInTheDocument(); + expect(screen.getByText(/base64Converter:encodedSize/)).toBeInTheDocument(); }); }); @@ -129,23 +129,25 @@ describe('FileMode', () => { it('应该渲染 encode/decode 切换按钮', () => { render(); - expect(screen.getByText('encode')).toBeInTheDocument(); - expect(screen.getByText('decode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:encode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:decode')).toBeInTheDocument(); }); it('切到 decode 应该显示 Base64 输入框', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); - expect(await screen.findByPlaceholderText('decodeBase64Placeholder')).toBeInTheDocument(); + fireEvent.click(screen.getByText('base64Converter:decode')); + expect( + await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'), + ).toBeInTheDocument(); }); it('解码 PDF Base64 后应该显示 application/pdf 与默认文件名 decoded.pdf', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: 'JVBERi0K' } }); act(() => { @@ -153,7 +155,7 @@ describe('FileMode', () => { }); await waitFor(() => { - expect(screen.getByText('decodedFileOutput')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:decodedFileOutput')).toBeInTheDocument(); expect(screen.getByText(/application\/pdf/)).toBeInTheDocument(); expect(screen.getByDisplayValue('decoded.pdf')).toBeInTheDocument(); }); @@ -162,9 +164,9 @@ describe('FileMode', () => { it('解码后的文件名应该可编辑', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: 'JVBERi0K' } }); act(() => { @@ -179,24 +181,24 @@ describe('FileMode', () => { it('解码后应该显示下载按钮', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: 'JVBERi0K' } }); act(() => { vi.advanceTimersByTime(250); }); - expect(await screen.findByText('download')).toBeInTheDocument(); + expect(await screen.findByText('base64Converter:download')).toBeInTheDocument(); }); it('解码非法 Base64 应该显示 invalidBase64 错误', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: '!!!not base64' } }); act(() => { @@ -204,16 +206,16 @@ describe('FileMode', () => { }); await waitFor(() => { - expect(screen.getByText('invalidBase64')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:invalidBase64')).toBeInTheDocument(); }); }); it('切换方向时应该清空解码状态', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: 'JVBERi0K' } }); act(() => { @@ -221,10 +223,10 @@ describe('FileMode', () => { }); await waitFor(() => { - expect(screen.getByText('decodedFileOutput')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:decodedFileOutput')).toBeInTheDocument(); }); - fireEvent.click(screen.getByText('encode')); + fireEvent.click(screen.getByText('base64Converter:encode')); await waitFor(() => { expect(screen.queryByText('decodedFileOutput')).not.toBeInTheDocument(); diff --git a/pages/Base64Converter/__tests__/ImageMode.test.tsx b/pages/Base64Converter/__tests__/ImageMode.test.tsx index e8ccfc7..440dbe7 100644 --- a/pages/Base64Converter/__tests__/ImageMode.test.tsx +++ b/pages/Base64Converter/__tests__/ImageMode.test.tsx @@ -26,8 +26,8 @@ describe('ImageMode', () => { it('应该渲染图像上传区域', async () => { render(); await waitForStorageReady(); - expect(screen.getByText('clickOrDropToImage')).toBeInTheDocument(); - expect(screen.getByText('supportedFormats')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:clickOrDropToImage')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:supportedFormats')).toBeInTheDocument(); }); it('应该接受有效的图像文件', async () => { @@ -40,7 +40,7 @@ describe('ImageMode', () => { await waitFor(() => { expect(screen.getByText('test.png')).toBeInTheDocument(); - expect(screen.getByText('base64Output')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:base64Output')).toBeInTheDocument(); }); }); @@ -53,7 +53,7 @@ describe('ImageMode', () => { fireEvent.change(hiddenInput, { target: { files: [file] } }); await waitFor(() => { - expect(screen.getByRole('alert')).toHaveTextContent('unsupportedImageType'); + expect(screen.getByRole('alert')).toHaveTextContent('base64Converter:unsupportedImageType'); }); }); @@ -68,7 +68,7 @@ describe('ImageMode', () => { fireEvent.change(hiddenInput, { target: { files: [file] } }); await waitFor(() => { - expect(screen.getByRole('alert')).toHaveTextContent('fileSizeExceeded'); + expect(screen.getByRole('alert')).toHaveTextContent('base64Converter:fileSizeExceeded'); }); }); @@ -98,11 +98,11 @@ describe('ImageMode', () => { expect(screen.getByText('test.png')).toBeInTheDocument(); }); - fireEvent.click(screen.getByText('clear')); + fireEvent.click(screen.getByText('base64Converter:clear')); await waitFor(() => { expect(screen.queryByText('test.png')).not.toBeInTheDocument(); - expect(screen.getByText('clickOrDropToImage')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:clickOrDropToImage')).toBeInTheDocument(); }); }); @@ -124,16 +124,16 @@ describe('ImageMode', () => { it('应该渲染 encode/decode 切换按钮', async () => { render(); await waitForStorageReady(); - expect(screen.getByText('encode')).toBeInTheDocument(); - expect(screen.getByText('decode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:encode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:decode')).toBeInTheDocument(); }); it('解码 PNG Base64 后应该显示图像预览', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: 'iVBORw0KGgo=' } }); act(() => { @@ -141,7 +141,7 @@ describe('ImageMode', () => { }); await waitFor(() => { - expect(screen.getByText('decodedImageOutput')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:decodedImageOutput')).toBeInTheDocument(); const img = screen.getByAltText('decoded preview'); expect(img).toBeInTheDocument(); expect(img.tagName.toLowerCase()).toBe('img'); @@ -151,9 +151,9 @@ describe('ImageMode', () => { it('解码后默认文件名应该为 decoded.png', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: 'iVBORw0KGgo=' } }); act(() => { @@ -166,9 +166,9 @@ describe('ImageMode', () => { it('解码非法 Base64 应该显示 invalidBase64 错误', async () => { render(); await waitForStorageReady(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = await screen.findByPlaceholderText('decodeBase64Placeholder'); + const input = await screen.findByPlaceholderText('base64Converter:decodeBase64Placeholder'); fireEvent.change(input, { target: { value: '!!!not base64' } }); act(() => { @@ -176,7 +176,7 @@ describe('ImageMode', () => { }); await waitFor(() => { - expect(screen.getByText('invalidBase64')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:invalidBase64')).toBeInTheDocument(); }); }); }); diff --git a/pages/Base64Converter/__tests__/TextMode.test.tsx b/pages/Base64Converter/__tests__/TextMode.test.tsx index cae191a..c5d86d3 100644 --- a/pages/Base64Converter/__tests__/TextMode.test.tsx +++ b/pages/Base64Converter/__tests__/TextMode.test.tsx @@ -18,18 +18,18 @@ describe('TextMode', () => { it('应该渲染编码/解码切换按钮', () => { render(); - expect(screen.getByText('encode')).toBeInTheDocument(); - expect(screen.getByText('decode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:encode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:decode')).toBeInTheDocument(); }); it('应该渲染输入框和转换按钮', () => { render(); - expect(screen.getByPlaceholderText('textInputPlaceholder')).toBeInTheDocument(); + expect(screen.getByPlaceholderText('base64Converter:textInputPlaceholder')).toBeInTheDocument(); }); it('应该将文本编码为 Base64', async () => { render(); - const input = screen.getByPlaceholderText('textInputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:textInputPlaceholder'); fireEvent.change(input, { target: { value: 'Hello' } }); act(() => { @@ -37,7 +37,7 @@ describe('TextMode', () => { }); await waitFor(() => { - expect(screen.getByText('base64Output')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:base64Output')).toBeInTheDocument(); }); expect(screen.getByTestId('copy-button')).toHaveTextContent('SGVsbG8='); }); @@ -46,9 +46,9 @@ describe('TextMode', () => { render(); // 切换到解码模式 - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = screen.getByPlaceholderText('base64InputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:base64InputPlaceholder'); fireEvent.change(input, { target: { value: 'SGVsbG8=' } }); act(() => { @@ -56,7 +56,7 @@ describe('TextMode', () => { }); await waitFor(() => { - expect(screen.getByText('textOutput')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:textOutput')).toBeInTheDocument(); }); expect(screen.getByTestId('copy-button')).toHaveTextContent('Hello'); }); @@ -65,9 +65,9 @@ describe('TextMode', () => { render(); // 切换到解码模式 - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = screen.getByPlaceholderText('base64InputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:base64InputPlaceholder'); fireEvent.change(input, { target: { value: 'invalid!!!' } }); act(() => { @@ -75,7 +75,7 @@ describe('TextMode', () => { }); await waitFor(() => { - expect(screen.getByText('invalidBase64')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:invalidBase64')).toBeInTheDocument(); }); }); @@ -83,7 +83,7 @@ describe('TextMode', () => { render(); // 先编码 - const input = screen.getByPlaceholderText('textInputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:textInputPlaceholder'); fireEvent.change(input, { target: { value: 'Hello' } }); act(() => { @@ -95,7 +95,7 @@ describe('TextMode', () => { }); // 切换方向 - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); // 输出应该被清除 await waitFor(() => { @@ -106,7 +106,7 @@ describe('TextMode', () => { it('点击清除按钮应该清空所有内容', async () => { render(); - const input = screen.getByPlaceholderText('textInputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:textInputPlaceholder'); fireEvent.change(input, { target: { value: 'Hello' } }); act(() => { @@ -128,48 +128,48 @@ describe('TextMode', () => { it('解码模式下粘贴图片 data URI 时应该显示切换图像模式的提示', () => { render(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = screen.getByPlaceholderText('base64InputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:base64InputPlaceholder'); fireEvent.change(input, { target: { value: 'data:image/png;base64,iVBORw0KGgo=' }, }); - expect(screen.getByText('imageDataUriHint')).toBeInTheDocument(); - expect(screen.getByText('switchToImageMode')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:imageDataUriHint')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:switchToImageMode')).toBeInTheDocument(); }); it('粘贴非图片 data URI 时不应该显示图像模式提示', () => { render(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = screen.getByPlaceholderText('base64InputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:base64InputPlaceholder'); fireEvent.change(input, { target: { value: 'SGVsbG8=' } }); - expect(screen.queryByText('imageDataUriHint')).not.toBeInTheDocument(); + expect(screen.queryByText('base64Converter:imageDataUriHint')).not.toBeInTheDocument(); }); it('点击切换图像模式按钮应该调用 onSwitchToImageMode 回调', () => { const onSwitch = vi.fn(); render(); - fireEvent.click(screen.getByText('decode')); - const input = screen.getByPlaceholderText('base64InputPlaceholder'); + fireEvent.click(screen.getByText('base64Converter:decode')); + const input = screen.getByPlaceholderText('base64Converter:base64InputPlaceholder'); fireEvent.change(input, { target: { value: 'data:image/png;base64,iVBORw0KGgo=' }, }); - fireEvent.click(screen.getByText('switchToImageMode')); + fireEvent.click(screen.getByText('base64Converter:switchToImageMode')); expect(onSwitch).toHaveBeenCalledTimes(1); }); it('解码模式下对二进制数据应该显示更清晰的错误', async () => { render(); - fireEvent.click(screen.getByText('decode')); + fireEvent.click(screen.getByText('base64Converter:decode')); - const input = screen.getByPlaceholderText('base64InputPlaceholder'); + const input = screen.getByPlaceholderText('base64Converter:base64InputPlaceholder'); fireEvent.change(input, { target: { value: 'iVBORw0KGgo=' } }); act(() => { @@ -177,7 +177,7 @@ describe('TextMode', () => { }); await waitFor(() => { - expect(screen.getByText('binaryDataDetected')).toBeInTheDocument(); + expect(screen.getByText('base64Converter:binaryDataDetected')).toBeInTheDocument(); }); }); }); diff --git a/pages/Base64Converter/__tests__/index.test.tsx b/pages/Base64Converter/__tests__/index.test.tsx index 41395c2..2a79764 100644 --- a/pages/Base64Converter/__tests__/index.test.tsx +++ b/pages/Base64Converter/__tests__/index.test.tsx @@ -73,11 +73,4 @@ describe('Base64ConverterPage', () => { }); expect(screen.queryByTestId('text-mode')).not.toBeInTheDocument(); }); - - it('应该渲染页面标题', async () => { - render(); - await waitForStorageInit(); - expect(screen.getByText('base64Converter:pageTitle')).toBeInTheDocument(); - expect(screen.getByText('base64Converter:pageSubtitle')).toBeInTheDocument(); - }); }); diff --git a/pages/QrCode/__tests__/index.test.tsx b/pages/QrCode/__tests__/index.test.tsx index 465b762..ff0145f 100644 --- a/pages/QrCode/__tests__/index.test.tsx +++ b/pages/QrCode/__tests__/index.test.tsx @@ -68,12 +68,6 @@ describe('QrCodePage', () => { expect(screen.getByText('qrCode:qrToUrl')).toBeInTheDocument(); }); - it('应该渲染页面标题', () => { - render(); - expect(screen.getByText('qrCode:pageTitle')).toBeInTheDocument(); - expect(screen.getByText('qrCode:pageSubtitle')).toBeInTheDocument(); - }); - it('切换到解析模式应该渲染 ImageUploader', () => { render(); fireEvent.click(screen.getByText('qrCode:qrToUrl'));