mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-06 08:08:38 +01:00
feat(multi-pdf): enhance PDF multi-tool functionality to allow drag n drop of PDF and images
fix(ocr): pin font CDN to rawcdn.githack.com with commit SHAs
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
import { describe, it, expect, vi } from 'vitest';
|
||||
|
||||
vi.mock('heic2any', () => ({
|
||||
default: vi.fn(),
|
||||
}));
|
||||
|
||||
import { partitionIncomingFiles } from '../js/utils/multi-tool-file-input';
|
||||
|
||||
function makeFile(name: string, type: string): File {
|
||||
return new File([new Uint8Array([1, 2, 3])], name, { type });
|
||||
}
|
||||
|
||||
describe('partitionIncomingFiles', () => {
|
||||
it('routes PDFs by MIME type', () => {
|
||||
const result = partitionIncomingFiles([
|
||||
makeFile('a.pdf', 'application/pdf'),
|
||||
makeFile('b.pdf', 'application/pdf'),
|
||||
]);
|
||||
expect(result.pdfFiles).toHaveLength(2);
|
||||
expect(result.imageFiles).toHaveLength(0);
|
||||
expect(result.skipped).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('routes PDFs by extension when MIME is missing', () => {
|
||||
const result = partitionIncomingFiles([makeFile('doc.pdf', '')]);
|
||||
expect(result.pdfFiles).toHaveLength(1);
|
||||
expect(result.imageFiles).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('routes PDFs with uppercase extension', () => {
|
||||
const result = partitionIncomingFiles([makeFile('SCAN.PDF', '')]);
|
||||
expect(result.pdfFiles).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('routes images by MIME type', () => {
|
||||
const result = partitionIncomingFiles([
|
||||
makeFile('a.png', 'image/png'),
|
||||
makeFile('b.jpg', 'image/jpeg'),
|
||||
makeFile('c.webp', 'image/webp'),
|
||||
]);
|
||||
expect(result.imageFiles).toHaveLength(3);
|
||||
expect(result.pdfFiles).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('routes images by extension when MIME is missing (HEIC, BMP, TIFF)', () => {
|
||||
const result = partitionIncomingFiles([
|
||||
makeFile('photo.heic', ''),
|
||||
makeFile('scan.bmp', ''),
|
||||
makeFile('page.tiff', ''),
|
||||
]);
|
||||
expect(result.imageFiles).toHaveLength(3);
|
||||
expect(result.skipped).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('splits a mixed batch into PDFs, images, and skipped', () => {
|
||||
const result = partitionIncomingFiles([
|
||||
makeFile('doc.pdf', 'application/pdf'),
|
||||
makeFile('photo.png', 'image/png'),
|
||||
makeFile('readme.txt', 'text/plain'),
|
||||
makeFile('archive.zip', 'application/zip'),
|
||||
]);
|
||||
expect(result.pdfFiles).toHaveLength(1);
|
||||
expect(result.imageFiles).toHaveLength(1);
|
||||
expect(result.skipped).toEqual(['readme.txt', 'archive.zip']);
|
||||
});
|
||||
|
||||
it('preserves original File order within each bucket', () => {
|
||||
const a = makeFile('a.pdf', 'application/pdf');
|
||||
const b = makeFile('b.png', 'image/png');
|
||||
const c = makeFile('c.pdf', 'application/pdf');
|
||||
const d = makeFile('d.jpg', 'image/jpeg');
|
||||
|
||||
const result = partitionIncomingFiles([a, b, c, d]);
|
||||
expect(result.pdfFiles).toEqual([a, c]);
|
||||
expect(result.imageFiles).toEqual([b, d]);
|
||||
});
|
||||
|
||||
it('returns empty buckets for empty input', () => {
|
||||
const result = partitionIncomingFiles([]);
|
||||
expect(result.pdfFiles).toHaveLength(0);
|
||||
expect(result.imageFiles).toHaveLength(0);
|
||||
expect(result.skipped).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('skips files with neither matching MIME nor extension', () => {
|
||||
const result = partitionIncomingFiles([
|
||||
makeFile('script.js', 'application/javascript'),
|
||||
makeFile('data.csv', 'text/csv'),
|
||||
]);
|
||||
expect(result.skipped).toHaveLength(2);
|
||||
expect(result.pdfFiles).toHaveLength(0);
|
||||
expect(result.imageFiles).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user