From dd1c8dc7dd65764419467db35498ac9c54b6ca4f Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:56:48 +0800 Subject: [PATCH] fix(editor): test stability (#15377) ## Summary by CodeRabbit * **Tests** * Improved automated validation for AI file embedding readiness. * Expanded coverage for paragraph behavior when converting between list types and deleting content. * Strengthened checks for block structure and formatting outcomes to help prevent regressions. --- .../e2e/utils/settings-panel-utils.ts | 13 ++++- tests/blocksuite/e2e/paragraph.spec.ts | 50 +++++++++++-------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/tests/affine-cloud-copilot/e2e/utils/settings-panel-utils.ts b/tests/affine-cloud-copilot/e2e/utils/settings-panel-utils.ts index 167252f990..66383203f3 100644 --- a/tests/affine-cloud-copilot/e2e/utils/settings-panel-utils.ts +++ b/tests/affine-cloud-copilot/e2e/utils/settings-panel-utils.ts @@ -1,4 +1,4 @@ -import { cleanupWorkspace } from '@affine-test/kit/utils/cloud'; +import { cleanupWorkspace, runPrisma } from '@affine-test/kit/utils/cloud'; import { expect, type Page } from '@playwright/test'; const WORKSPACE_EMBEDDING_SWITCH_TEST_ID = 'workspace-embedding-setting-switch'; @@ -268,6 +268,15 @@ export class SettingsPanelUtils { await expect(attachmentItems).toHaveCount(expectedFileCount); }).toPass({ timeout }); - await this.waitForEmbeddingComplete(page, timeout); + const workspaceId = page.url().split('/').slice(-2)[0] || ''; + await cleanupWorkspace(workspaceId); + await expect(async () => { + const embeddedFileCount = await runPrisma(client => + client.aiWorkspaceFiles.count({ + where: { workspaceId, embeddings: { some: {} } }, + }) + ); + expect(embeddedFileCount).toBe(expectedFileCount); + }).toPass({ timeout }); } } diff --git a/tests/blocksuite/e2e/paragraph.spec.ts b/tests/blocksuite/e2e/paragraph.spec.ts index 2e802b25f0..116b56a0f9 100644 --- a/tests/blocksuite/e2e/paragraph.spec.ts +++ b/tests/blocksuite/e2e/paragraph.spec.ts @@ -7,6 +7,7 @@ import { dragOverTitle, enterPlaygroundRoom, focusRichText, + focusRichTextEnd, focusTitle, getBlockIds, getIndexCoordinate, @@ -49,6 +50,7 @@ import { assertBlockSelections, assertBlockTextContent, assertBlockType, + assertBlockTypes, assertClassName, assertDivider, assertDocTitleFocus, @@ -661,58 +663,64 @@ test('delete at start of paragraph immediately following list', async ({ await captureHistory(page); await assertRichTexts(page, ['hello', 'a']); - await assertBlockChildrenIds(page, '1', ['2', '3']); - await assertBlockType(page, '3', 'text'); + await assertBlockTypes(page, ['text', 'text']); // text -> bulleted await focusRichText(page, 1); await updateBlockType(page, 'affine:list', 'bulleted'); - await assertBlockType(page, '2', 'text'); - await assertBlockType(page, '4', 'bulleted'); + await assertBlockTypes(page, ['text', 'bulleted']); + await focusRichTextEnd(page, 1); await pressBackspace(page, 2); await waitNextFrame(page); - await assertBlockType(page, '5', 'text'); - await assertBlockChildrenIds(page, '1', ['2', '5']); + await assertBlockTypes(page, ['text', 'text']); + await assertBlockChildrenFlavours(page, '1', [ + 'affine:paragraph', + 'affine:paragraph', + ]); await pressBackspace(page); - await assertBlockChildrenIds(page, '1', ['2']); + await assertBlockTypes(page, ['text']); // reset await undoByClick(page); await undoByClick(page); await assertRichTexts(page, ['hello', 'a']); - await assertBlockChildrenIds(page, '1', ['2', '3']); - await assertBlockType(page, '3', 'text'); + await assertBlockTypes(page, ['text', 'text']); // text -> numbered await focusRichText(page, 1); await updateBlockType(page, 'affine:list', 'numbered'); - await assertBlockType(page, '2', 'text'); - await assertBlockType(page, '6', 'numbered'); + await assertBlockTypes(page, ['text', 'numbered']); + await focusRichTextEnd(page, 1); await pressBackspace(page, 2); await waitNextFrame(page); - await assertBlockType(page, '7', 'text'); - await assertBlockChildrenIds(page, '1', ['2', '7']); + await assertBlockTypes(page, ['text', 'text']); + await assertBlockChildrenFlavours(page, '1', [ + 'affine:paragraph', + 'affine:paragraph', + ]); await pressBackspace(page); - await assertBlockChildrenIds(page, '1', ['2']); + await assertBlockTypes(page, ['text']); // reset await undoByClick(page); await undoByClick(page); await assertRichTexts(page, ['hello', 'a']); - await assertBlockChildrenIds(page, '1', ['2', '3']); - await assertBlockType(page, '3', 'text'); + await assertBlockTypes(page, ['text', 'text']); // text -> todo await focusRichText(page, 1); await updateBlockType(page, 'affine:list', 'todo'); - await assertBlockType(page, '2', 'text'); - await assertBlockType(page, '8', 'todo'); + await assertBlockTypes(page, ['text', 'todo']); + await focusRichTextEnd(page, 1); await pressBackspace(page, 2); await waitNextFrame(page); - await assertBlockType(page, '9', 'text'); - await assertBlockChildrenIds(page, '1', ['2', '9']); + await assertBlockTypes(page, ['text', 'text']); + await assertBlockChildrenFlavours(page, '1', [ + 'affine:paragraph', + 'affine:paragraph', + ]); await pressBackspace(page); - await assertBlockChildrenIds(page, '1', ['2']); + await assertBlockTypes(page, ['text']); }); test('delete at start of paragraph with content', async ({ page }) => {