Files
upstream-affine/tests/blocksuite/e2e/edgeless/note/resize.spec.ts
upstream-mirror 702cc698a7
Some checks failed
Build & Test / Analyze (javascript, affine) (push) Failing after 4s
Build & Test / Analyze (typescript, affine) (push) Failing after 3s
Build & Test / Rust test filter (push) Failing after 4s
Build & Test / Check yarn binary (push) Failing after 3s
Build & Test / E2E BlockSuite Test (3) (push) Failing after 3s
Build & Test / Analyze (javascript, blocksuite) (push) Failing after 3s
Build & Test / Analyze (typescript, blocksuite) (push) Failing after 3s
Build & Test / Mobile native build filter (push) Failing after 3s
Build & Test / E2E BlockSuite Test (1) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (2) (push) Failing after 4s
Build & Test / E2E Mobile Test (1) (push) Failing after 3s
Build & Test / Unit Test (1) (push) Has been skipped
Build & Test / Unit Test (2) (push) Has been skipped
Build & Test / Unit Test (3) (push) Has been skipped
Build & Test / Unit Test (4) (push) Has been skipped
Build & Test / Unit Test (5) (push) Has been skipped
Build & Test / Native Unit Test (push) Has been skipped
Build & Test / E2E BlockSuite Test (4) (push) Failing after 3s
Build & Test / E2E BlockSuite Test (5) (push) Failing after 3s
Build & Test / E2E BlockSuite Cross Browser Test (push) Failing after 3s
Build & Test / E2E Mobile Test (2) (push) Failing after 3s
Build & Test / Build AFFiNE native (x86_64-unknown-linux-gnu) (push) Failing after 3s
Build & Test / Build Server native (push) Failing after 3s
Build & Test / Check Git Status (push) Has been skipped
Build & Test / Server Test (0, 4) (push) Has been skipped
Build & Test / Server Test (1, 4) (push) Has been skipped
Build & Test / Server Test (2, 4) (push) Has been skipped
Build & Test / Server Test (3, 4) (push) Has been skipped
Build & Test / Server Test with Elasticsearch (push) Has been skipped
Build & Test / Build @affine/electron renderer (push) Failing after 3s
Build & Test / Copilot test filter (push) Failing after 4s
Build & Test / Lint Rust (push) Has been skipped
Build & Test / Server Test with Embedded Search (push) Has been skipped
Build & Test / Server Test with Manticore Search (push) Has been skipped
Build & Test / Server E2E Test (push) Has been skipped
Build & Test / Cloud Desktop E2E Test (push) Has been skipped
Build & Test / Cloud E2E Test 1/2 (push) Has been skipped
Build & Test / Cloud E2E Test 2/2 (push) Has been skipped
Build & Test / Build Android app (push) Has been skipped
Build & Test / Test Android app (push) Has been skipped
Build & Test / Run native tests (push) Has been skipped
Build & Test / Server Copilot Api Test (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (1, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (2, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (3, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (4, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (5, 5) (push) Has been skipped
Release / Canary Gate (push) Has been skipped
Build & Test / Build AFFiNE native (aarch64-apple-darwin) (push) Has been cancelled
Build & Test / Lint (push) Has been cancelled
Build & Test / Typecheck (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-apple-darwin) (push) Has been cancelled
Build & Test / Desktop Test (ubuntu-latest, linux, x64, x86_64-unknown-linux-gnu, true) (push) Has been cancelled
Build & Test / Desktop Test (windows-latest, windows, x64, x86_64-pc-windows-msvc, true) (push) Has been cancelled
Build & Test / E2E Test (1) (push) Has been cancelled
Build & Test / E2E Test (2) (push) Has been cancelled
Build & Test / E2E Test (3) (push) Has been cancelled
Build & Test / E2E Test (4) (push) Has been cancelled
Build & Test / E2E Test (5) (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, arm64, aarch64-apple-darwin, true) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, x64, x86_64-apple-darwin, false) (push) Has been cancelled
Build & Test / 3, 2, 1 Launch (push) Has been cancelled
Build & Test / Build iOS app (push) Has been cancelled
Copilot Test Automatically / Setup Test (push) Failing after 1s
Release / Prepare (push) Failing after 2s
Release / Release Cloud (push) Has been skipped
Release / Release Desktop (push) Has been skipped
Release / Release Docker Image (push) Has been skipped
Release / Release Mobile (push) Has been skipped
snapshot of https://github.com/toeverything/AFFiNE.git (canary, 2026-09-16; blobs > 131072B omitted)
2026-09-16 04:01:20 +05:00

224 lines
6.6 KiB
TypeScript

import { expect } from '@playwright/test';
import {
activeNoteInEdgeless,
enterPlaygroundRoom,
getNoteRect,
initEmptyEdgelessState,
redoByClick,
resizeElementByHandle,
selectNoteInEdgeless,
setEdgelessTool,
switchEditorMode,
triggerComponentToolbarAction,
type,
undoByClick,
waitForInlineEditorStateUpdated,
waitNextFrame,
zoomResetByKeyboard,
} from '../../utils/actions/index.js';
import {
assertBlockCount,
assertEdgelessSelectedRect,
assertNoteRectEqual,
assertRectEqual,
assertRichTexts,
} from '../../utils/asserts.js';
import { NOTE_MIN_HEIGHT, NOTE_MIN_WIDTH } from '../../utils/bs-alternative.js';
import { test } from '../../utils/playwright.js';
test('resize note in edgeless mode', async ({ page }) => {
await enterPlaygroundRoom(page);
const { noteId } = await initEmptyEdgelessState(page);
await switchEditorMode(page);
await zoomResetByKeyboard(page);
await activeNoteInEdgeless(page, noteId);
await waitNextFrame(page, 400);
await type(page, 'hello');
await assertRichTexts(page, ['hello']);
// unselect note
await page.mouse.click(50, 50);
expect(noteId).toBe('2'); // 0 for page, 1 for surface
await selectNoteInEdgeless(page, noteId);
const initRect = await getNoteRect(page, noteId);
await resizeElementByHandle(page, { x: -100, y: 0 }, 'bottom-left');
const draggedRect = await getNoteRect(page, noteId);
assertRectEqual(draggedRect, {
x: initRect.x - 100,
y: initRect.y,
w: initRect.w + 100,
h: initRect.h,
});
await switchEditorMode(page);
await switchEditorMode(page);
const newRect = await getNoteRect(page, noteId);
assertRectEqual(newRect, draggedRect);
});
test('resize note then collapse note', async ({ page }) => {
await enterPlaygroundRoom(page);
const { noteId } = await initEmptyEdgelessState(page);
await switchEditorMode(page);
await zoomResetByKeyboard(page);
await activeNoteInEdgeless(page, noteId);
await waitNextFrame(page, 400);
await type(page, 'hello');
await assertRichTexts(page, ['hello']);
// unselect note
await page.mouse.click(50, 50);
expect(noteId).toBe('2'); // 0 for page, 1 for surface
await selectNoteInEdgeless(page, noteId);
const initRect = await getNoteRect(page, noteId);
await resizeElementByHandle(page, { x: 0, y: 100 }, 'bottom-right');
let noteRect = await getNoteRect(page, noteId);
await expect(page.getByTestId('edgeless-note-collapse-button')).toBeVisible();
assertRectEqual(noteRect, {
x: initRect.x,
y: initRect.y,
w: initRect.w,
h: initRect.h + 100,
});
await page.getByTestId('edgeless-note-collapse-button')!.click();
let domRect = await page.locator('affine-edgeless-note').boundingBox();
expect(domRect!.height).toBeCloseTo(NOTE_MIN_HEIGHT);
await page.getByTestId('edgeless-note-collapse-button')!.click();
domRect = await page.locator('affine-edgeless-note').boundingBox();
expect(domRect!.height).toBeCloseTo(initRect.h + 100);
await selectNoteInEdgeless(page, noteId);
await resizeElementByHandle(page, { x: 0, y: -150 }, 'bottom-right');
noteRect = await getNoteRect(page, noteId);
assertRectEqual(noteRect, {
x: initRect.x,
y: initRect.y,
w: initRect.w,
h: NOTE_MIN_HEIGHT,
});
await switchEditorMode(page);
await switchEditorMode(page);
const newRect = await getNoteRect(page, noteId);
assertRectEqual(newRect, noteRect);
});
test('resize note then auto size and custom size', async ({ page }) => {
await enterPlaygroundRoom(page);
const { noteId } = await initEmptyEdgelessState(page);
await switchEditorMode(page);
await zoomResetByKeyboard(page);
await activeNoteInEdgeless(page, noteId);
await waitNextFrame(page, 400);
await type(page, 'hello');
await assertRichTexts(page, ['hello']);
// unselect note
await page.mouse.click(50, 50);
await selectNoteInEdgeless(page, noteId);
const initRect = await getNoteRect(page, noteId);
await resizeElementByHandle(page, { x: 0, y: 100 }, 'bottom-right');
const draggedRect = await getNoteRect(page, noteId);
assertRectEqual(draggedRect, {
x: initRect.x,
y: initRect.y,
w: initRect.w,
h: initRect.h + 100,
});
await triggerComponentToolbarAction(page, 'autoSize');
await waitNextFrame(page, 200);
const autoSizeRect = await getNoteRect(page, noteId);
assertRectEqual(autoSizeRect, initRect);
await triggerComponentToolbarAction(page, 'autoSize');
await waitNextFrame(page, 200);
await assertNoteRectEqual(page, noteId, draggedRect);
await undoByClick(page);
await page.mouse.click(50, 50);
await waitNextFrame(page, 200);
await assertNoteRectEqual(page, noteId, initRect);
await redoByClick(page);
await waitNextFrame(page, 200);
await assertNoteRectEqual(page, noteId, draggedRect);
});
test('drag to add customized size note', async ({ page }) => {
await enterPlaygroundRoom(page);
await initEmptyEdgelessState(page);
await switchEditorMode(page);
await zoomResetByKeyboard(page);
await setEdgelessTool(page, 'note');
// add note at 300,300
await page.mouse.move(300, 300);
await page.mouse.down();
await page.mouse.move(900, 600, { steps: 10 });
await page.mouse.up();
// should wait for inline editor update and resizeObserver callback
await waitForInlineEditorStateUpdated(page);
// assert add note success
await assertBlockCount(page, 'edgeless-note', 2);
// click out of note
await page.mouse.click(250, 200);
// click on note to select it
await page.mouse.click(600, 500);
// assert selected note
// note add on edgeless mode will have a offsetX of 30 and offsetY of 40
await assertEdgelessSelectedRect(page, [270, 260, 600, 300]);
});
test('drag to add customized size note: should clamp to min width and min height', async ({
page,
}) => {
await enterPlaygroundRoom(page);
await initEmptyEdgelessState(page);
await switchEditorMode(page);
await zoomResetByKeyboard(page);
await setEdgelessTool(page, 'note');
// add note at 300,300
await page.mouse.move(300, 300);
await page.mouse.down();
await page.mouse.move(400, 360, { steps: 10 });
await page.mouse.up();
await waitNextFrame(page);
await waitNextFrame(page);
// should wait for inline editor update and resizeObserver callback
await waitForInlineEditorStateUpdated(page);
// assert add note success
await assertBlockCount(page, 'edgeless-note', 2);
// click out of note
await page.mouse.click(250, 200);
// click on note to select it
await page.mouse.click(320, 300);
// assert selected note
// note add on edgeless mode will have a offsetX of 30 and offsetY of 40
await assertEdgelessSelectedRect(page, [
270,
260,
NOTE_MIN_WIDTH,
NOTE_MIN_HEIGHT,
]);
});