58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
import ImageViewer from '@/components/file-preview/ImageViewer';
|
|
|
|
vi.mock('react-i18next', () => ({
|
|
useTranslation: () => ({
|
|
t: (_key: string, options?: string | { defaultValue?: string; error?: string }) => {
|
|
if (typeof options === 'string') return options;
|
|
if (options?.defaultValue && options.error) {
|
|
return options.defaultValue.replace('{{error}}', options.error);
|
|
}
|
|
return options?.defaultValue ?? '';
|
|
},
|
|
}),
|
|
}));
|
|
|
|
const readBinaryFile = vi.fn();
|
|
|
|
vi.mock('@/lib/api-client', () => ({
|
|
readBinaryFile: (...args: unknown[]) => readBinaryFile(...args),
|
|
}));
|
|
|
|
describe('ImageViewer', () => {
|
|
it('loads image bytes via IPC and renders a blob URL preview', async () => {
|
|
const pngBytes = Uint8Array.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
readBinaryFile.mockResolvedValueOnce({
|
|
ok: true,
|
|
data: pngBytes,
|
|
mimeType: 'image/png',
|
|
size: pngBytes.length,
|
|
readOnly: true,
|
|
});
|
|
|
|
render(<ImageViewer filePath="/tmp/demo.png" fileName="demo.png" />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByTestId('image-preview')).toBeVisible();
|
|
});
|
|
|
|
const img = screen.getByTestId('image-preview') as HTMLImageElement;
|
|
expect(img.src).toMatch(/^blob:/);
|
|
expect(readBinaryFile).toHaveBeenCalledWith('/tmp/demo.png', { maxBytes: 50 * 1024 * 1024 });
|
|
});
|
|
|
|
it('shows an error when binary read fails', async () => {
|
|
readBinaryFile.mockResolvedValueOnce({
|
|
ok: false,
|
|
error: 'notFound',
|
|
});
|
|
|
|
render(<ImageViewer filePath="/tmp/missing.png" fileName="missing.png" />);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText('Image failed to load: notFound')).toBeVisible();
|
|
});
|
|
});
|
|
});
|