From e82fb2a5c7a22a969d2e25c4709691b8ea2bf3db Mon Sep 17 00:00:00 2001 From: lucaronin Date: Sun, 26 Apr 2026 02:58:46 +0200 Subject: [PATCH] test: cover table cell paste regression --- .../smoke/table-cell-paste-regression.spec.ts | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/smoke/table-cell-paste-regression.spec.ts diff --git a/tests/smoke/table-cell-paste-regression.spec.ts b/tests/smoke/table-cell-paste-regression.spec.ts new file mode 100644 index 00000000..6ea1884f --- /dev/null +++ b/tests/smoke/table-cell-paste-regression.spec.ts @@ -0,0 +1,73 @@ +import { test, expect, type Page } from '@playwright/test' +import { createFixtureVaultCopy, openFixtureVaultTauri, removeFixtureVaultCopy } from '../helpers/fixtureVault' +import { seedBlockNoteTable, triggerMenuCommand } from './testBridge' + +let tempVaultDir: string + +function trackUnexpectedErrors(page: Page): string[] { + const errors: string[] = [] + + page.on('pageerror', (error) => { + errors.push(error.message) + }) + + page.on('console', (message) => { + if (message.type() !== 'error') return + const text = message.text() + if (text.includes('ws://localhost:9711')) return + errors.push(text) + }) + + return errors +} + +async function createUntitledNote(page: Page): Promise { + await triggerMenuCommand(page, 'file-new-note') + await expect(page.locator('.bn-editor')).toBeVisible({ timeout: 5_000 }) +} + +async function pasteTextIntoCell(page: Page, cellIndex: number, text: string): Promise { + await page.locator('table td').nth(cellIndex).click() + await page.evaluate(async (value) => { + await navigator.clipboard.writeText(value) + }, text) + await page.keyboard.press(process.platform === 'darwin' ? 'Meta+V' : 'Control+V') +} + +test.describe('table cell paste regression', () => { + test.beforeEach(({ page }, testInfo) => { + void page + testInfo.setTimeout(60_000) + tempVaultDir = createFixtureVaultCopy() + }) + + test.afterEach(() => { + removeFixtureVaultCopy(tempVaultDir) + }) + + test('pasting plain and multiline text into table cells keeps note editing usable', async ({ page, context }) => { + const errors = trackUnexpectedErrors(page) + + await context.grantPermissions(['clipboard-read', 'clipboard-write']) + await openFixtureVaultTauri(page, tempVaultDir) + await createUntitledNote(page) + await seedBlockNoteTable(page, [180, 120, 120]) + + await expect(page.locator('table')).toHaveCount(1, { timeout: 5_000 }) + + await pasteTextIntoCell(page, 0, 'plain pasted cell') + await triggerMenuCommand(page, 'file-save') + await pasteTextIntoCell(page, 1, 'line one\nline two') + + const trailingParagraph = page.locator('.bn-editor [data-content-type="paragraph"]').last() + await trailingParagraph.click() + await page.keyboard.type('still editable after table paste') + + const editor = page.getByRole('textbox').last() + await expect(editor).toContainText('plain pasted cell') + await expect(editor).toContainText('line one') + await expect(editor).toContainText('still editable after table paste') + await expect(page.locator('table')).toHaveCount(1) + expect(errors).toEqual([]) + }) +})