### TL:DR By sharing initialization logic, accelerate test case execution. ### What Changed * Global setup for copilot e2e * Login * Create Workspace * Enable fully parallel for ci ### Optimization Comparison Comparing with PR [fix(core): ask AI input box in the whiteboard is blocked by the menu …](https://github.com/toeverything/AFFiNE/pull/11634): | | Shard 1 |2|3|4|5|6|7|8| | ------|----|----|----|----|----|---|---|--| |Before|15min|14min|14min|14min|14min|13min|15min|10min| |After|8min|11min|8min|8min|8min|8min|8min|7min| ### Trade-Off Since all copilot use cases currently share a single user and workspace, some test cases need to focus on **isolation** and **independence**. For example, when testing Embedding-related workflows: * Different document contents should be used to avoid interference. * After each test case execution, **cleanup** operations are also required. * Some tests should be configured to **serial** mode. ```ts test.describe.configure({ mode: 'serial' }); test.describe('AIChatWith/Collections', () => { test.beforeEach(async ({ loggedInPage: page, utils }) => { await utils.testUtils.setupTestEnvironment(page); await utils.chatPanel.openChatPanel(page); await utils.editor.clearAllCollections(page); await utils.testUtils.createNewPage(page); }); test.afterEach(async ({ loggedInPage: page, utils }) => { // clear all collections await utils.editor.clearAllCollections(page); }); test('should support chat with collection', async ({ loggedInPage: page, utils, }) => { // Create two collections await utils.editor.createCollectionAndDoc( page, 'Collection 1', 'CollectionAAaa is a cute dog' ); await utils.chatPanel.chatWithCollections(page, ['Collection 1']); await utils.chatPanel.makeChat(page, 'What is CollectionAAaa(Use English)'); // ... }); test('should support chat with multiple collections', async ({ loggedInPage: page, utils, }) => { // Create two collections await utils.editor.createCollectionAndDoc( page, 'Collection 2', 'CollectionEEee is a cute cat' ); await utils.editor.createCollectionAndDoc( page, 'Collection 3', 'CollectionFFff is a cute dog' ); await utils.chatPanel.chatWithCollections(page, [ 'Collection 2', 'Collection 3', ]); await utils.chatPanel.makeChat( page, 'What is CollectionEEee? What is CollectionFFff?(Use English)' ); // ... }); }); ``` > CLOSE AI-51
50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
import type { EdgelessRootBlockComponent } from '@blocksuite/affine/blocks/root';
|
|
import type { GfxModel } from '@blocksuite/std/gfx';
|
|
import { expect } from '@playwright/test';
|
|
|
|
import { test } from '../base/base-test';
|
|
|
|
test.describe('AIChatWith/EdgelessMindMap', () => {
|
|
test.beforeEach(async ({ loggedInPage: page, utils }) => {
|
|
await utils.testUtils.setupTestEnvironment(page);
|
|
await utils.chatPanel.openChatPanel(page);
|
|
});
|
|
|
|
test('should support replace mindmap with the regenerated one', async ({
|
|
loggedInPage: page,
|
|
utils,
|
|
}) => {
|
|
let id: string;
|
|
const { regenerateMindMap } = await utils.editor.askAIWithEdgeless(
|
|
page,
|
|
async () => {
|
|
id = await utils.editor.createMindmap(page);
|
|
},
|
|
async () => {
|
|
const { id: rootId } = await utils.editor.getMindMapNode(page, id!, [
|
|
0,
|
|
]);
|
|
await utils.editor.selectElementInEdgeless(page, [rootId]);
|
|
}
|
|
);
|
|
|
|
const { answer } = await regenerateMindMap();
|
|
await expect(answer.locator('mini-mindmap-preview')).toBeVisible();
|
|
const replace = answer.getByTestId('answer-replace');
|
|
await replace.click();
|
|
|
|
// Expect original mindmap to be replaced
|
|
const mindmaps = await page.evaluate(() => {
|
|
const edgelessBlock = document.querySelector(
|
|
'affine-edgeless-root'
|
|
) as EdgelessRootBlockComponent;
|
|
const mindmaps = edgelessBlock?.gfx.gfxElements
|
|
.filter((el: GfxModel) => 'type' in el && el.type === 'mindmap')
|
|
.map((el: GfxModel) => el.id);
|
|
return mindmaps;
|
|
});
|
|
expect(mindmaps).toHaveLength(1);
|
|
expect(mindmaps?.[0]).not.toBe(id!);
|
|
});
|
|
});
|