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();
});
});
});