diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js b/e2e-tests/tests/visuals/sd-export-reimport.spec.js new file mode 100644 index 000000000..5dd856057 --- /dev/null +++ b/e2e-tests/tests/visuals/sd-export-reimport.spec.js @@ -0,0 +1,104 @@ +import { test, expect } from '@playwright/test'; +import fs from 'fs'; +import path from 'path'; +import config from '../../test-config'; + +const APP_URL = process.env.SUPERDOC_E2E_APP_URL ?? 'http://localhost:4173/'; +const ROUND_TRIP_EXPORT_DIR = './test-results/sd-export-reimport'; +const IGNORED_DOCUMENTS = [ + 'advanced-tables', + 'msa-list-base-indent', + 'custom-list-numbering', + 'sdpr', + 'ooxml-rFonts-rstyle-linked-combos-demo', + 'ooxml-color-rstyle-linked-combos-demo', + 'ooxml-underline-rstyle-linked-combos-demo', + 'table-of-contents', + 'table-of-contents-sdt', + 'tiny-spacing', // FIXME: exportDocx returns undefined for this doc +]; + +const documents = fs + .readdirSync(config.basicDocumentsFolder) + .filter((name) => !config.ignoreDocuments.includes(name)) + .filter((name) => /\.docx$/i.test(name)) + .map((name) => ({ + fileName: name, + baseName: name.replace(/\.docx$/i, ''), + })) + .filter(({ baseName }) => !IGNORED_DOCUMENTS.includes(baseName)); + +const ensureDir = (dir) => { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } +}; + +const waitForEditorReady = async (page) => { + const superEditor = page.locator('div.super-editor').first(); + await expect(superEditor).toBeVisible({ timeout: 10_000 }); + await page.waitForFunction( + () => { + const superdoc = window.superdoc ?? window.superdocdev; + const editor = superdoc?.activeEditor ?? window.editor; + return superdoc !== undefined && editor !== undefined && typeof editor.exportDocx === 'function'; + }, + null, + { polling: 100, timeout: 10_000 }, + ); + await page.evaluate(() => { + const superdoc = window.superdoc ?? window.superdocdev; + if (superdoc) { + window.superdoc = superdoc; + window.editor = superdoc.activeEditor; + } + }); +}; + +const uploadDocument = async (page, filePath) => { + await page.locator('input[type="file"]').setInputFiles(filePath); + await waitForEditorReady(page); +}; + +const exportDocxAsBuffer = async (page) => { + const serialized = await page.evaluate(async () => { + const superdoc = window.superdoc ?? window.superdocdev; + const activeEditor = superdoc?.activeEditor ?? window.editor; + if (!activeEditor || typeof activeEditor.exportDocx !== 'function') { + throw new Error('Active editor with exportDocx is not available.'); + } + const blob = await activeEditor.exportDocx({ + isFinalDoc: true, + }); + const arrayBuffer = await blob.arrayBuffer(); + return Array.from(new Uint8Array(arrayBuffer)); + }); + + return Buffer.from(serialized); +}; + +ensureDir(ROUND_TRIP_EXPORT_DIR); + +test.describe('SD x SD export (visual)', () => { + for (const document of documents) { + test(document.fileName, async ({ page }) => { + test.setTimeout(60_000); + + await page.goto(APP_URL); + await uploadDocument(page, path.join(config.basicDocumentsFolder, document.fileName)); + + const exportedDocx = await exportDocxAsBuffer(page); + const exportedDocPath = path.join(ROUND_TRIP_EXPORT_DIR, `${document.baseName}-roundtrip.docx`); + fs.writeFileSync(exportedDocPath, exportedDocx); + + await page.goto(APP_URL); + await uploadDocument(page, exportedDocPath); + + await expect(page).toHaveScreenshot({ + name: `${document.baseName}.png`, + fullPage: true, + timeout: 30_000, + }); + }); + } +}); diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/.gitkeep b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/.gitkeep @@ -0,0 +1 @@ + diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/base-custom.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/base-custom.png new file mode 100644 index 000000000..07a283db9 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/base-custom.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/base-ordered.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/base-ordered.png new file mode 100644 index 000000000..4ecc82cd1 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/base-ordered.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/broken-list-missing-items.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/broken-list-missing-items.png new file mode 100644 index 000000000..9766d0198 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/broken-list-missing-items.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/cropped_image_test.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/cropped_image_test.png new file mode 100644 index 000000000..1bff8cf4f Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/cropped_image_test.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/custom-list1.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/custom-list1.png new file mode 100644 index 000000000..840bbeb63 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/custom-list1.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/exported-list-font.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/exported-list-font.png new file mode 100644 index 000000000..399aa5de1 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/exported-list-font.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/extensions-structured-content.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/extensions-structured-content.png new file mode 100644 index 000000000..4f3f1e177 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/extensions-structured-content.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/features-lists.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/features-lists.png new file mode 100644 index 000000000..c11e14cab Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/features-lists.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/features-redlines-comments-annotations-and-more.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/features-redlines-comments-annotations-and-more.png new file mode 100644 index 000000000..de33b1bbd Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/features-redlines-comments-annotations-and-more.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/gdocs-comments-export.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/gdocs-comments-export.png new file mode 100644 index 000000000..b953acfaa Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/gdocs-comments-export.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/gdocs-tracked-changes.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/gdocs-tracked-changes.png new file mode 100644 index 000000000..b6ede89d8 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/gdocs-tracked-changes.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/header-footer-anchored-images.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/header-footer-anchored-images.png new file mode 100644 index 000000000..2872f5b91 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/header-footer-anchored-images.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/invalid-list-def-fallback.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/invalid-list-def-fallback.png new file mode 100644 index 000000000..c7a0f5b8b Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/invalid-list-def-fallback.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/list-formatting-indents.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/list-formatting-indents.png new file mode 100644 index 000000000..fc25cf096 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/list-formatting-indents.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/list-with-table-break.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/list-with-table-break.png new file mode 100644 index 000000000..e8c540841 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/list-with-table-break.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/lists-complex-items.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/lists-complex-items.png new file mode 100644 index 000000000..688819a03 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/lists-complex-items.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/longer-header.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/longer-header.png new file mode 100644 index 000000000..e68977377 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/longer-header.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/msword-tracked-changes.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/msword-tracked-changes.png new file mode 100644 index 000000000..47877691f Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/msword-tracked-changes.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/multiple-nodes-in-list.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/multiple-nodes-in-list.png new file mode 100644 index 000000000..51f8dabe0 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/multiple-nodes-in-list.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-bold-rstyle-linked-combos-demo.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-bold-rstyle-linked-combos-demo.png new file mode 100644 index 000000000..f9613f5aa Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-bold-rstyle-linked-combos-demo.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-highlight-rstyle-linked-combos-demo.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-highlight-rstyle-linked-combos-demo.png new file mode 100644 index 000000000..7c9993d5e Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-highlight-rstyle-linked-combos-demo.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-italic-rstyle-combos-demo.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-italic-rstyle-combos-demo.png new file mode 100644 index 000000000..d7df58bd9 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-italic-rstyle-combos-demo.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-size-rstyle-linked-combos-demo.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-size-rstyle-linked-combos-demo.png new file mode 100644 index 000000000..0733a942c Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-size-rstyle-linked-combos-demo.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-strike-rstyle-linked-combos-demo.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-strike-rstyle-linked-combos-demo.png new file mode 100644 index 000000000..de6a8a898 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/ooxml-strike-rstyle-linked-combos-demo.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/restart-numbering-sub-list.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/restart-numbering-sub-list.png new file mode 100644 index 000000000..fd6e37f9a Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/restart-numbering-sub-list.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/superdoc-hyperlink-cases.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/superdoc-hyperlink-cases.png new file mode 100644 index 000000000..9f9e78a1d Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/superdoc-hyperlink-cases.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/tab-stops-basic-test.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/tab-stops-basic-test.png new file mode 100644 index 000000000..fdd164324 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/tab-stops-basic-test.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/tab-stops-test-signer-area.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/tab-stops-test-signer-area.png new file mode 100644 index 000000000..24afe96a7 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/tab-stops-test-signer-area.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/table-in-list.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/table-in-list.png new file mode 100644 index 000000000..146cd6ee4 Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/table-in-list.png differ diff --git a/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/vertical-merge.png b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/vertical-merge.png new file mode 100644 index 000000000..519181f5b Binary files /dev/null and b/e2e-tests/tests/visuals/sd-export-reimport.spec.js-snapshots/vertical-merge.png differ