Removed new state pdfDocs
- update reverse-pages function - updated test-case
This commit is contained in:
@@ -25,9 +25,9 @@ async function handleSinglePdfUpload(toolId, file) {
|
|||||||
showLoader('Loading PDF...');
|
showLoader('Loading PDF...');
|
||||||
try {
|
try {
|
||||||
const pdfBytes = await readFileAsArrayBuffer(file);
|
const pdfBytes = await readFileAsArrayBuffer(file);
|
||||||
const pdfDoc = await PDFLibDocument.load(pdfBytes as ArrayBuffer, { ignoreEncryption: true });
|
state.pdfDoc = await PDFLibDocument.load(pdfBytes as ArrayBuffer, {
|
||||||
state.pdfDocs = [pdfDoc];
|
ignoreEncryption: true
|
||||||
state.pdfDoc = pdfDoc;
|
});
|
||||||
hideLoader();
|
hideLoader();
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -324,7 +324,6 @@ async function handleSinglePdfUpload(toolId, file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleMultiFileUpload(toolId) {
|
async function handleMultiFileUpload(toolId) {
|
||||||
console.log(toolId);
|
|
||||||
if (toolId === 'merge' || toolId === 'alternate-merge' || toolId === 'reverse-pages') {
|
if (toolId === 'merge' || toolId === 'alternate-merge' || toolId === 'reverse-pages') {
|
||||||
const pdfFilesUnloaded: File[] = [];
|
const pdfFilesUnloaded: File[] = [];
|
||||||
|
|
||||||
@@ -347,7 +346,7 @@ async function handleMultiFileUpload(toolId) {
|
|||||||
};
|
};
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
state.pdfDocs = pdfFilesLoaded.map(p => p.pdfDoc);
|
|
||||||
const foundEncryptedPDFs = pdfFilesLoaded.filter(
|
const foundEncryptedPDFs = pdfFilesLoaded.filter(
|
||||||
(pdf) => pdf.pdfDoc.isEncrypted
|
(pdf) => pdf.pdfDoc.isEncrypted
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { PDFDocument as PDFLibDocument } from 'pdf-lib';
|
|||||||
import JSZip from 'jszip';
|
import JSZip from 'jszip';
|
||||||
|
|
||||||
export async function reversePages() {
|
export async function reversePages() {
|
||||||
const pdfDocs = Array.isArray(state.pdfDocs) ? state.pdfDocs : state.pdfDoc ? [state.pdfDoc] : [];
|
const pdfDocs = state.files.filter((file: File) => file.type === 'application/pdf');
|
||||||
if (!pdfDocs.length) {
|
if (!pdfDocs.length) {
|
||||||
showAlert('Error', 'PDF not loaded.');
|
showAlert('Error', 'PDF not loaded.');
|
||||||
return;
|
return;
|
||||||
@@ -15,7 +15,9 @@ export async function reversePages() {
|
|||||||
try {
|
try {
|
||||||
const zip = new JSZip();
|
const zip = new JSZip();
|
||||||
for (let j = 0; j < pdfDocs.length; j++) {
|
for (let j = 0; j < pdfDocs.length; j++) {
|
||||||
const pdfDoc = pdfDocs[j];
|
const file = pdfDocs[j];
|
||||||
|
const arrayBuffer = await file.arrayBuffer();
|
||||||
|
const pdfDoc = await PDFLibDocument.load(arrayBuffer);
|
||||||
const newPdf = await PDFLibDocument.create();
|
const newPdf = await PDFLibDocument.create();
|
||||||
const pageCount = pdfDoc.getPageCount();
|
const pageCount = pdfDoc.getPageCount();
|
||||||
const reversedIndices = Array.from(
|
const reversedIndices = Array.from(
|
||||||
@@ -27,7 +29,8 @@ export async function reversePages() {
|
|||||||
copiedPages.forEach((page: any) => newPdf.addPage(page));
|
copiedPages.forEach((page: any) => newPdf.addPage(page));
|
||||||
|
|
||||||
const newPdfBytes = await newPdf.save();
|
const newPdfBytes = await newPdf.save();
|
||||||
const fileName = pdfDocs.length > 1 ? `reversed_${j + 1}.pdf` : 'reversed.pdf';
|
const originalName = file.name.replace(/\.pdf$/i, '');
|
||||||
|
const fileName = `${originalName}_reversed.pdf`;
|
||||||
zip.file(fileName, newPdfBytes);
|
zip.file(fileName, newPdfBytes);
|
||||||
}
|
}
|
||||||
const zipBlob = await zip.generateAsync({ type: 'blob' });
|
const zipBlob = await zip.generateAsync({ type: 'blob' });
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
export const state = {
|
export const state = {
|
||||||
activeTool: null,
|
activeTool: null,
|
||||||
files: [],
|
files: [],
|
||||||
pdfDocs: [],
|
|
||||||
pdfDoc: null,
|
pdfDoc: null,
|
||||||
pdfPages: [],
|
pdfPages: [],
|
||||||
currentPdfUrl: null,
|
currentPdfUrl: null,
|
||||||
@@ -11,7 +10,6 @@ export const state = {
|
|||||||
export function resetState() {
|
export function resetState() {
|
||||||
state.activeTool = null;
|
state.activeTool = null;
|
||||||
state.files = [];
|
state.files = [];
|
||||||
state.pdfDocs = [];
|
|
||||||
state.pdfDoc = null;
|
state.pdfDoc = null;
|
||||||
state.pdfPages = [];
|
state.pdfPages = [];
|
||||||
state.currentPdfUrl = null;
|
state.currentPdfUrl = null;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import * as helpers from '../js/utils/helpers';
|
|||||||
import * as ui from '../js/ui';
|
import * as ui from '../js/ui';
|
||||||
import JSZip from 'jszip';
|
import JSZip from 'jszip';
|
||||||
|
|
||||||
// -------------------- Mock Modules --------------------
|
|
||||||
vi.mock('../js/ui', () => ({
|
vi.mock('../js/ui', () => ({
|
||||||
showLoader: vi.fn(),
|
showLoader: vi.fn(),
|
||||||
hideLoader: vi.fn(),
|
hideLoader: vi.fn(),
|
||||||
@@ -20,18 +19,21 @@ vi.mock('../js/utils/helpers', () => ({
|
|||||||
vi.mock('pdf-lib', () => ({
|
vi.mock('pdf-lib', () => ({
|
||||||
PDFDocument: {
|
PDFDocument: {
|
||||||
create: vi.fn(),
|
create: vi.fn(),
|
||||||
|
load: vi.fn().mockResolvedValue({
|
||||||
|
getPageCount: vi.fn(() => 2),
|
||||||
|
copyPages: vi.fn((_, indices) =>
|
||||||
|
Promise.resolve(indices.map((i) => ({ page: `page-${i}` })))
|
||||||
|
),
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// -------------------- Test Suite --------------------
|
|
||||||
describe('reversePages - multi PDF support', () => {
|
describe('reversePages - multi PDF support', () => {
|
||||||
let mockNewDoc: any;
|
let mockNewDoc: any;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Reset state
|
state.files = []; // ✅ now using files, not pdfDocs
|
||||||
state.pdfDocs = [];
|
|
||||||
|
|
||||||
// Mock PDFDocument.create
|
|
||||||
mockNewDoc = {
|
mockNewDoc = {
|
||||||
copyPages: vi.fn((doc: any, indices: number[]) =>
|
copyPages: vi.fn((doc: any, indices: number[]) =>
|
||||||
Promise.resolve(indices.map((i: number) => ({ page: `page-${i}` })))
|
Promise.resolve(indices.map((i: number) => ({ page: `page-${i}` })))
|
||||||
@@ -41,7 +43,6 @@ describe('reversePages - multi PDF support', () => {
|
|||||||
};
|
};
|
||||||
vi.mocked(PDFLibDocument.create).mockResolvedValue(mockNewDoc);
|
vi.mocked(PDFLibDocument.create).mockResolvedValue(mockNewDoc);
|
||||||
|
|
||||||
// Mock helpers
|
|
||||||
vi.mocked(helpers.downloadFile).mockImplementation(() => {});
|
vi.mocked(helpers.downloadFile).mockImplementation(() => {});
|
||||||
vi.mocked(ui.showLoader).mockImplementation(() => {});
|
vi.mocked(ui.showLoader).mockImplementation(() => {});
|
||||||
vi.mocked(ui.hideLoader).mockImplementation(() => {});
|
vi.mocked(ui.hideLoader).mockImplementation(() => {});
|
||||||
@@ -53,35 +54,33 @@ describe('reversePages - multi PDF support', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should reverse pages for multiple PDFs and create a zip', async () => {
|
it('should reverse pages for multiple PDFs and create a zip', async () => {
|
||||||
// Mock 2 PDFs
|
const mockFile = (name: string) => ({
|
||||||
const pdf1 = { getPageCount: () => 2 };
|
name,
|
||||||
const pdf2 = { getPageCount: () => 3 };
|
type: 'application/pdf',
|
||||||
state.pdfDocs = [pdf1, pdf2];
|
arrayBuffer: vi.fn().mockResolvedValue(new ArrayBuffer(8)),
|
||||||
|
});
|
||||||
|
|
||||||
|
state.files = [mockFile('a.pdf'), mockFile('b.pdf')]; // ✅ now matches function
|
||||||
|
|
||||||
await reversePages();
|
await reversePages();
|
||||||
|
|
||||||
// downloadFile called
|
|
||||||
expect(helpers.downloadFile).toHaveBeenCalledWith(expect.any(Blob), 'reversed_pdfs.zip');
|
expect(helpers.downloadFile).toHaveBeenCalledWith(expect.any(Blob), 'reversed_pdfs.zip');
|
||||||
|
|
||||||
// copyPages called for each PDF
|
|
||||||
expect(mockNewDoc.copyPages).toHaveBeenCalledTimes(2);
|
expect(mockNewDoc.copyPages).toHaveBeenCalledTimes(2);
|
||||||
|
|
||||||
// addPage called correct number of times
|
|
||||||
expect(mockNewDoc.addPage).toHaveBeenCalled();
|
expect(mockNewDoc.addPage).toHaveBeenCalled();
|
||||||
|
|
||||||
// save called for each PDF
|
|
||||||
expect(mockNewDoc.save).toHaveBeenCalledTimes(2);
|
expect(mockNewDoc.save).toHaveBeenCalledTimes(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle empty PDF list gracefully', async () => {
|
it('should handle empty PDF list gracefully', async () => {
|
||||||
state.pdfDocs = [];
|
state.files = [];
|
||||||
await reversePages();
|
await reversePages();
|
||||||
expect(ui.showAlert).toHaveBeenCalledWith('Error', 'PDF not loaded.');
|
expect(ui.showAlert).toHaveBeenCalledWith('Error', 'PDF not loaded.');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle PDF creation errors', async () => {
|
it('should handle PDF creation errors', async () => {
|
||||||
vi.mocked(PDFLibDocument.create).mockRejectedValue(new Error('Create failed'));
|
vi.mocked(PDFLibDocument.create).mockRejectedValue(new Error('Create failed'));
|
||||||
state.pdfDocs = [{ getPageCount: () => 2 }];
|
state.files = [
|
||||||
|
{ name: 'x.pdf', type: 'application/pdf', arrayBuffer: vi.fn().mockResolvedValue(new ArrayBuffer(8)) },
|
||||||
|
];
|
||||||
|
|
||||||
await reversePages();
|
await reversePages();
|
||||||
|
|
||||||
@@ -91,7 +90,9 @@ describe('reversePages - multi PDF support', () => {
|
|||||||
|
|
||||||
it('should handle PDF processing errors', async () => {
|
it('should handle PDF processing errors', async () => {
|
||||||
mockNewDoc.copyPages.mockRejectedValue(new Error('Copy failed'));
|
mockNewDoc.copyPages.mockRejectedValue(new Error('Copy failed'));
|
||||||
state.pdfDocs = [{ getPageCount: () => 2 }];
|
state.files = [
|
||||||
|
{ name: 'y.pdf', type: 'application/pdf', arrayBuffer: vi.fn().mockResolvedValue(new ArrayBuffer(8)) },
|
||||||
|
];
|
||||||
|
|
||||||
await reversePages();
|
await reversePages();
|
||||||
|
|
||||||
@@ -101,7 +102,9 @@ describe('reversePages - multi PDF support', () => {
|
|||||||
|
|
||||||
it('should handle save errors', async () => {
|
it('should handle save errors', async () => {
|
||||||
mockNewDoc.save.mockRejectedValue(new Error('Save failed'));
|
mockNewDoc.save.mockRejectedValue(new Error('Save failed'));
|
||||||
state.pdfDocs = [{ getPageCount: () => 2 }];
|
state.files = [
|
||||||
|
{ name: 'z.pdf', type: 'application/pdf', arrayBuffer: vi.fn().mockResolvedValue(new ArrayBuffer(8)) },
|
||||||
|
];
|
||||||
|
|
||||||
await reversePages();
|
await reversePages();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user