Removed new state pdfDocs

- update reverse-pages function
- updated test-case
This commit is contained in:
divy-11
2025-10-20 16:39:45 +05:30
parent a605e56834
commit 4e6cc77a28
4 changed files with 35 additions and 32 deletions

View File

@@ -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
); );

View File

@@ -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' });

View File

@@ -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;

View File

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