import { expect, test } from '@playwright/test'; import { unzipSync } from 'fflate'; import { readFile } from 'node:fs/promises'; import { createPdf, dropFiles, expectPdfDownload, pdfDropzone, trackPageErrors } from './helpers'; test('compress processes a single dropped file and offers its download per row', async ({ page }) => { const pageErrors = trackPageErrors(page); await page.goto('/tools/compress'); await dropFiles(page, pdfDropzone(page), [ { name: 'gross.pdf', mimeType: 'application/pdf', buffer: await createPdf(2, 'Komprimieren') } ]); await expect(page.getByText('Dateien (1)')).toBeVisible(); await page.getByRole('button', { name: 'Komprimieren', exact: true }).click(); await expect(page.getByText('Fertig ✓')).toBeVisible({ timeout: 20_000 }); const downloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: 'gross.pdf herunterladen' }).click(); await expectPdfDownload(await downloadPromise, /^gross_komprimiert\.pdf$/); expect(pageErrors).toEqual([]); }); test('compress appends further files and bundles all results in one ZIP', async ({ page }) => { const pageErrors = trackPageErrors(page); await page.goto('/tools/compress'); await dropFiles(page, pdfDropzone(page), [ { name: 'eins.pdf', mimeType: 'application/pdf', buffer: await createPdf(1, 'Eins') } ]); await dropFiles(page, pdfDropzone(page), [ { name: 'zwei.pdf', mimeType: 'application/pdf', buffer: await createPdf(2, 'Zwei') } ]); await expect(page.getByText('Dateien (2)')).toBeVisible(); await page.getByRole('button', { name: 'Komprimieren', exact: true }).click(); await expect(page.getByText('Fertig ✓')).toHaveCount(2, { timeout: 30_000 }); const downloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: 'Alle herunterladen' }).click(); const download = await downloadPromise; expect(download.suggestedFilename()).toMatch(/^komprimiert_\d{4}-\d{2}-\d{2}\.zip$/); const zipPath = await download.path(); expect(zipPath).not.toBeNull(); const entries = Object.keys(unzipSync(new Uint8Array(await readFile(zipPath!)))); expect(entries.sort()).toEqual(['eins_komprimiert.pdf', 'zwei_komprimiert.pdf']); expect(pageErrors).toEqual([]); }); test('compress batch keeps processing after a failing file and supports retry and removal', async ({ page }) => { const pageErrors = trackPageErrors(page); await page.goto('/tools/compress'); await dropFiles(page, pdfDropzone(page), [ { name: 'gut.pdf', mimeType: 'application/pdf', buffer: await createPdf(1, 'Gut') }, { name: 'kaputt.pdf', mimeType: 'application/pdf', buffer: Buffer.from('kein gueltiges PDF') } ]); await page.getByRole('button', { name: 'Komprimieren', exact: true }).click(); await expect(page.getByText('Fertig ✓')).toHaveCount(1, { timeout: 30_000 }); await expect(page.getByText('Fehler')).toBeVisible(); // Only one result exists, so the bulk ZIP action stays hidden. await expect(page.getByRole('button', { name: 'Alle herunterladen' })).toHaveCount(0); // Retrying the broken file fails again without disturbing the finished row. await page.getByRole('button', { name: 'kaputt.pdf erneut versuchen' }).click(); await expect(page.getByText('Fertig ✓')).toHaveCount(1); await expect(page.getByText('Fehler')).toBeVisible(); const downloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: 'gut.pdf herunterladen' }).click(); await expectPdfDownload(await downloadPromise, /^gut_komprimiert\.pdf$/); await page.getByRole('button', { name: 'kaputt.pdf entfernen' }).click(); await expect(page.getByText('kaputt.pdf')).toHaveCount(0); await expect(page.getByRole('button', { name: 'gut.pdf herunterladen' })).toBeVisible(); expect(pageErrors).toEqual([]); });