This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { expect, test, type Download, type Locator, type Page } from '@playwright/test';
|
||||
import {
|
||||
decodePDFRawStream,
|
||||
degrees,
|
||||
PDFArray,
|
||||
PDFDocument,
|
||||
PDFRawStream,
|
||||
@@ -132,6 +133,23 @@ const createEncryptedPdf = async (pageCount: number, label: string, password: st
|
||||
return Buffer.from(await document.save());
|
||||
};
|
||||
|
||||
const createPreRotatedPdf = async (pageCount: number, label: string) => {
|
||||
const document = await PDFDocument.create();
|
||||
const font = await document.embedFont(StandardFonts.Helvetica);
|
||||
for (let pageNumber = 1; pageNumber <= pageCount; pageNumber += 1) {
|
||||
const page = document.addPage([420, 594]);
|
||||
page.drawText(`${label} – Seite ${pageNumber}`, {
|
||||
x: 40,
|
||||
y: 520,
|
||||
size: 20,
|
||||
font,
|
||||
color: rgb(0.1, 0.2, 0.4)
|
||||
});
|
||||
if (pageNumber === 1) page.setRotation(degrees(90));
|
||||
}
|
||||
return Buffer.from(await document.save());
|
||||
};
|
||||
|
||||
const trackPageErrors = (page: Page) => {
|
||||
const errors: Error[] = [];
|
||||
page.on('pageerror', (error) => errors.push(error));
|
||||
@@ -264,6 +282,68 @@ test('separate renders dropped PDF pages and removes a selected page', async ({
|
||||
expect(pageErrors).toEqual([]);
|
||||
});
|
||||
|
||||
test('rotate turns pages losslessly via /Rotate and reset clears deltas', async ({ page }) => {
|
||||
const pageErrors = trackPageErrors(page);
|
||||
await page.goto('/tools/rotate');
|
||||
await dropFiles(page, pdfDropzone(page), [
|
||||
{ name: 'drehung.pdf', mimeType: 'application/pdf', buffer: await createPdf(3, 'Drehen') }
|
||||
]);
|
||||
|
||||
const downloadButton = page.getByRole('button', { name: 'Drehen & herunterladen' });
|
||||
await expect(page.getByRole('button', { name: 'Seite 2 um 90° nach rechts drehen' })).toBeVisible(
|
||||
{
|
||||
timeout: 15_000
|
||||
}
|
||||
);
|
||||
await expect(downloadButton).toBeDisabled();
|
||||
|
||||
const rotateRightPage2 = page.getByRole('button', { name: 'Seite 2 um 90° nach rechts drehen' });
|
||||
await rotateRightPage2.click();
|
||||
await rotateRightPage2.click();
|
||||
await expect(page.getByText('1 von 3 Seiten gedreht')).toBeVisible();
|
||||
await expect(page.getByText('180°', { exact: true })).toBeVisible();
|
||||
|
||||
const downloadPromise = page.waitForEvent('download');
|
||||
await downloadButton.click();
|
||||
const bytes = await expectPdfDownload(await downloadPromise, /^drehung_gedreht\.pdf$/);
|
||||
const output = await PDFDocument.load(bytes);
|
||||
expect(output.getPage(1).getRotation().angle).toBe(180);
|
||||
expect(output.getPage(0).getRotation().angle).toBe(0);
|
||||
|
||||
await page.getByRole('button', { name: 'Zurücksetzen' }).click();
|
||||
await expect(page.getByText('0 von 3 Seiten gedreht')).toBeVisible();
|
||||
await expect(downloadButton).toBeDisabled();
|
||||
expect(pageErrors).toEqual([]);
|
||||
});
|
||||
|
||||
test('rotate adds the delta on top of an existing /Rotate value', async ({ page }) => {
|
||||
const pageErrors = trackPageErrors(page);
|
||||
await page.goto('/tools/rotate');
|
||||
await dropFiles(page, pdfDropzone(page), [
|
||||
{
|
||||
name: 'vorgedreht.pdf',
|
||||
mimeType: 'application/pdf',
|
||||
buffer: await createPreRotatedPdf(2, 'Vorgedreht')
|
||||
}
|
||||
]);
|
||||
|
||||
await expect(page.getByRole('button', { name: 'Seite 1 um 90° nach rechts drehen' })).toBeVisible(
|
||||
{
|
||||
timeout: 15_000
|
||||
}
|
||||
);
|
||||
await page.getByRole('button', { name: 'Seite 1 um 90° nach rechts drehen' }).click();
|
||||
await expect(page.getByText('1 von 2 Seiten gedreht')).toBeVisible();
|
||||
|
||||
const downloadPromise = page.waitForEvent('download');
|
||||
await page.getByRole('button', { name: 'Drehen & herunterladen' }).click();
|
||||
const bytes = await expectPdfDownload(await downloadPromise, /^vorgedreht_gedreht\.pdf$/);
|
||||
const output = await PDFDocument.load(bytes);
|
||||
expect(output.getPage(0).getRotation().angle).toBe(180);
|
||||
expect(output.getPage(1).getRotation().angle).toBe(0);
|
||||
expect(pageErrors).toEqual([]);
|
||||
});
|
||||
|
||||
test('watermark accepts numeric controls and downloads text and image watermarks', async ({
|
||||
page
|
||||
}) => {
|
||||
|
||||
Reference in New Issue
Block a user