From 2deceb6e8506feee6dae340c9f65ef61537cece7 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Mon, 27 Nov 2023 06:39:41 +0000 Subject: [PATCH] test(core): simple recovery ui e2e (#5059) --- tests/affine-cloud/e2e/page-history.spec.ts | 146 ++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 tests/affine-cloud/e2e/page-history.spec.ts diff --git a/tests/affine-cloud/e2e/page-history.spec.ts b/tests/affine-cloud/e2e/page-history.spec.ts new file mode 100644 index 0000000000..14ed1a7734 --- /dev/null +++ b/tests/affine-cloud/e2e/page-history.spec.ts @@ -0,0 +1,146 @@ +import { test } from '@affine-test/kit/playwright'; +import { + createRandomUser, + deleteUser, + enableCloudWorkspace, + loginUser, + runPrisma, +} from '@affine-test/kit/utils/cloud'; +import { + getBlockSuiteEditorTitle, + waitForEditorLoad, +} from '@affine-test/kit/utils/page-logic'; +import { createLocalWorkspace } from '@affine-test/kit/utils/workspace'; +import { expect, type Page } from '@playwright/test'; + +let user: { + id: string; + name: string; + email: string; + password: string; +}; + +test.beforeEach(async ({ page }) => { + user = await createRandomUser(); + await loginUser(page, user.email); +}); + +test.afterEach(async () => { + // if you want to keep the user in the database for debugging, + // comment this line + await deleteUser(user.email); +}); + +test('newly created page shows empty history', async ({ page }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspace(page); + + // click the history button + await page.getByTestId('header-dropDownButton').click(); + await page.getByTestId('editor-option-menu-history').click(); + + const modal = page.getByTestId('page-history-modal'); + + // expect history modal shown up + await expect(modal).toBeVisible(); + + await expect(page.getByTestId('empty-history-prompt')).toBeVisible(); +}); + +const pushCurrentPageUpdates = async (page: Page) => { + const [workspaceId, guid, updates, state] = await page.evaluate(() => { + // @ts-expect-error + const Y = window.currentWorkspace.blockSuiteWorkspace.constructor.Y; + // @ts-expect-error + const spaceDoc = window.currentEditor.page.spaceDoc; + // @ts-expect-error + const workspaceId: string = window.currentWorkspace.id; + const updates: Uint8Array = Y.encodeStateAsUpdate(spaceDoc); + const state: Uint8Array = Y.encodeStateVector(spaceDoc); + + return [workspaceId, spaceDoc.guid, [...updates], [...state]] as const; + }); + + const toBuffer = (arr: readonly number[]) => Buffer.from(arr); + + await runPrisma(async client => { + await client.snapshotHistory.create({ + data: { + workspaceId: workspaceId, + id: guid, + blob: toBuffer(updates), + state: toBuffer(state), + timestamp: new Date(Date.now() - 10000), + expiredAt: new Date(Date.now() + 100000), + }, + }); + }); +}; + +test('can restore page to a history version', async ({ page }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspace(page); + + await pushCurrentPageUpdates(page); + + const title = getBlockSuiteEditorTitle(page); + await title.pressSequentially('TEST TITLE', { + delay: 50, + }); + + // write something and push to history + await pushCurrentPageUpdates(page); + + await title.fill('New Title'); + + // click the history button + await page.getByTestId('header-dropDownButton').click(); + await page.getByTestId('editor-option-menu-history').click(); + + const modal = page.getByTestId('page-history-modal'); + + // expect history modal shown up + await expect(modal).toBeVisible(); + + // expect history list to have 2 items + await expect(modal.getByTestId('version-history-item')).toHaveCount(2); + + // check the first item in the preview should have title 'TEST TITLE' + await expect(modal.locator('[data-block-is-title]')).toHaveText('TEST TITLE'); + + // click restore + await modal + .getByRole('button', { + name: 'Restore current version', + }) + .click(); + + const confirm = page.getByTestId('confirm-restore-history-modal'); + + // expect confirm dialog to show up + await expect(confirm).toBeVisible(); + + // click restore + await confirm + .getByRole('button', { + name: 'Restore', + }) + .click(); + + // title should be restored to 'TEST TITLE' + await expect(title).toContainText('TEST TITLE'); +});