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('encrypt protects a dropped PDF and decrypt rebuilds it with the password', async ({ page }) => { const pageErrors = trackPageErrors(page); await page.goto('/tools/encrypt'); await dropFiles(page, pdfDropzone(page), [ { name: 'geheim.pdf', mimeType: 'application/pdf', buffer: await createPdf(1, 'Geheim') } ]); await page.locator('#encrypt-password').fill('test-passwort'); await page.locator('#encrypt-password-confirmation').fill('test-passwort'); await page.getByRole('button', { name: 'Passwort setzen', exact: true }).click(); await expect(page.getByText('Fertig ✓')).toBeVisible({ timeout: 15_000 }); const encryptedDownloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: 'geheim.pdf herunterladen' }).click(); const encryptedBytes = await expectPdfDownload( await encryptedDownloadPromise, /^geheim_geschuetzt\.pdf$/ ); await page.goto('/tools/decrypt'); await dropFiles(page, pdfDropzone(page), [ { name: 'geheim_geschuetzt.pdf', mimeType: 'application/pdf', buffer: encryptedBytes } ]); await page.locator('#decrypt-password').fill('test-passwort'); await page.getByRole('button', { name: 'Passwort entfernen', exact: true }).click(); await expect(page.getByText('Fertig ✓')).toBeVisible({ timeout: 20_000 }); const decryptedDownloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: 'geheim_geschuetzt.pdf herunterladen' }).click(); await expectPdfDownload(await decryptedDownloadPromise, /^geheim_geschuetzt_entsperrt\.pdf$/); expect(pageErrors).toEqual([]); }); test('encrypt batch protects every file and bundles results in one ZIP', async ({ page }) => { const pageErrors = trackPageErrors(page); await page.goto('/tools/encrypt'); await dropFiles(page, pdfDropzone(page), [ { name: 'eins.pdf', mimeType: 'application/pdf', buffer: await createPdf(1, 'Eins') }, { name: 'zwei.pdf', mimeType: 'application/pdf', buffer: await createPdf(2, 'Zwei') } ]); await expect(page.getByText('Dateien (2)')).toBeVisible(); await page.locator('#encrypt-password').fill('test-passwort'); await page.locator('#encrypt-password-confirmation').fill('test-passwort'); await page.getByRole('button', { name: 'Passwort setzen', exact: true }).click(); await expect(page.getByText('Fertig ✓')).toHaveCount(2, { timeout: 15_000 }); const downloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: 'Alle herunterladen' }).click(); const download = await downloadPromise; expect(download.suggestedFilename()).toMatch(/^geschuetzt_\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_geschuetzt.pdf', 'zwei_geschuetzt.pdf']); expect(pageErrors).toEqual([]); });