diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index f4cb4822d..bb3974550 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -1064,24 +1064,36 @@ jobs: fail-fast: false matrix: tests: - - name: 'Cloud E2E Test 1/6' + - name: 'Cloud E2E Test 1/10' shard: 1 - script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=1/6 - - name: 'Cloud E2E Test 2/6' + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=1/10 + - name: 'Cloud E2E Test 2/10' shard: 2 - script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=2/6 - - name: 'Cloud E2E Test 3/6' + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=2/10 + - name: 'Cloud E2E Test 3/10' shard: 3 - script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=3/6 - - name: 'Cloud E2E Test 4/6' + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=3/10 + - name: 'Cloud E2E Test 4/10' shard: 4 - script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=4/6 - - name: 'Cloud E2E Test 5/6' + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=4/10 + - name: 'Cloud E2E Test 5/10' shard: 5 - script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=5/6 - - name: 'Cloud E2E Test 6/6' + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=5/10 + - name: 'Cloud E2E Test 6/10' shard: 6 - script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=6/6 + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=6/10 + - name: 'Cloud E2E Test 7/10' + shard: 7 + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=7/10 + - name: 'Cloud E2E Test 8/10' + shard: 8 + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=8/10 + - name: 'Cloud E2E Test 9/10' + shard: 9 + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=9/10 + - name: 'Cloud E2E Test 10/10' + shard: 10 + script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=10/10 - name: 'Cloud Desktop E2E Test' shard: desktop script: | diff --git a/tests/affine-cloud/e2e/migration.spec.ts b/tests/affine-cloud/e2e/migration.spec.skip.ts similarity index 100% rename from tests/affine-cloud/e2e/migration.spec.ts rename to tests/affine-cloud/e2e/migration.spec.skip.ts diff --git a/tests/affine-cloud/e2e/share-page-1.spec.ts b/tests/affine-cloud/e2e/share-page-1.spec.ts new file mode 100644 index 000000000..827ab4d9b --- /dev/null +++ b/tests/affine-cloud/e2e/share-page-1.spec.ts @@ -0,0 +1,256 @@ +import { skipOnboarding, test } from '@affine-test/kit/playwright'; +import { + createRandomUser, + enableCloudWorkspaceFromShareButton, + enableShare, + loginUser, +} from '@affine-test/kit/utils/cloud'; +import { clickEdgelessModeButton } from '@affine-test/kit/utils/editor'; +import { importImage } from '@affine-test/kit/utils/image'; +import { + getBlockSuiteEditorTitle, + waitForEditorLoad, +} from '@affine-test/kit/utils/page-logic'; +import { createLocalWorkspace } from '@affine-test/kit/utils/workspace'; +import { expect } from '@playwright/test'; + +let user: { + id: string; + name: string; + email: string; + password: string; +}; + +test.beforeEach(async ({ page }) => { + user = await createRandomUser(); + await loginUser(page, user); +}); + +test('can enable share page', async ({ page, browser }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspaceFromShareButton(page); + const title = getBlockSuiteEditorTitle(page); + await title.pressSequentially('TEST TITLE', { + delay: 50, + }); + await page.keyboard.press('Enter', { delay: 50 }); + await page.keyboard.type('TEST CONTENT', { delay: 50 }); + + // enable share page and copy page link + await enableShare(page); + await page.getByTestId('share-menu-copy-link-button').click(); + await page.getByTestId('share-link-menu-copy-page').click(); + + // check share page is accessible + { + const context = await browser.newContext(); + await skipOnboarding(context); + const url: string = await page.evaluate(() => + navigator.clipboard.readText() + ); + const page2 = await context.newPage(); + await page2.goto(url); + await waitForEditorLoad(page2); + const title = getBlockSuiteEditorTitle(page2); + await expect(title).toContainText('TEST TITLE'); + await expect(page2.locator('affine-paragraph').first()).toContainText( + 'TEST CONTENT' + ); + } +}); + +test('share page should have toc', async ({ page, browser }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspaceFromShareButton(page); + const title = getBlockSuiteEditorTitle(page); + await title.pressSequentially('TEST TITLE', { + delay: 50, + }); + await page.keyboard.press('Enter', { delay: 50 }); + + await page.keyboard.type('# Heading 1'); + await page.keyboard.press('Enter'); + await page.keyboard.type('# Heading 2'); + await page.keyboard.press('Enter'); + + // enable share page and copy page link + await enableShare(page); + await page.getByTestId('share-menu-copy-link-button').click(); + await page.getByTestId('share-link-menu-copy-page').click(); + + // check share page is accessible + { + const context = await browser.newContext(); + await skipOnboarding(context); + const url: string = await page.evaluate(() => + navigator.clipboard.readText() + ); + const page2 = await context.newPage(); + await page2.goto(url); + await waitForEditorLoad(page2); + + const tocIndicators = page2.locator( + 'affine-outline-viewer .outline-viewer-indicator' + ); + await expect(tocIndicators).toHaveCount(3); + await expect(tocIndicators.nth(0)).toBeVisible(); + await expect(tocIndicators.nth(1)).toBeVisible(); + await expect(tocIndicators.nth(2)).toBeVisible(); + + const viewer = page2.locator('affine-outline-viewer'); + await tocIndicators.first().hover({ force: true }); + await expect(viewer).toBeVisible(); + + const toggleButton = viewer.locator( + '[data-testid="toggle-outline-panel-button"]' + ); + await expect(toggleButton).toHaveCount(0); + } +}); + +test('append paragraph should be disabled in shared mode', async ({ + page, + browser, +}) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspaceFromShareButton(page); + const title = getBlockSuiteEditorTitle(page); + await title.pressSequentially('TEST TITLE', { + delay: 50, + }); + + // enable share page and copy page link + await enableShare(page); + await page.getByTestId('share-menu-copy-link-button').click(); + await page.getByTestId('share-link-menu-copy-page').click(); + + { + const context = await browser.newContext(); + await skipOnboarding(context); + const url: string = await page.evaluate(() => + navigator.clipboard.readText() + ); + const page2 = await context.newPage(); + await page2.goto(url); + await waitForEditorLoad(page2); + + const paragraph = page2.locator('affine-paragraph'); + const numParagraphs = await paragraph.count(); + + let error = null; + try { + await page2.locator('[data-testid=page-editor-blank]').click(); + } catch (e) { + error = e; + } + expect(error).toBeNull(); + + await expect(paragraph).toHaveCount(numParagraphs); + } +}); + +test('share page with default edgeless', async ({ page, browser }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspaceFromShareButton(page); + const title = getBlockSuiteEditorTitle(page); + await title.pressSequentially('TEST TITLE', { + delay: 50, + }); + await page.keyboard.press('Enter', { delay: 50 }); + await page.keyboard.type('TEST CONTENT', { delay: 50 }); + await clickEdgelessModeButton(page); + await expect(page.locator('affine-edgeless-root')).toBeVisible({ + timeout: 1000, + }); + + // enable share page and copy page link + await enableShare(page); + await page.getByTestId('share-menu-copy-link-button').click(); + await page.getByTestId('share-link-menu-copy-edgeless').click(); + + // check share page is accessible + { + const context = await browser.newContext(); + await skipOnboarding(context); + const url: string = await page.evaluate(() => + navigator.clipboard.readText() + ); + const page2 = await context.newPage(); + await page2.goto(url); + await waitForEditorLoad(page2); + await expect(page.locator('affine-edgeless-root')).toBeVisible({ + timeout: 1000, + }); + await expect(page2.locator('affine-paragraph').first()).toContainText( + 'TEST CONTENT' + ); + } +}); + +test('image preview should be shown', async ({ page, browser }) => { + await page.reload(); + await waitForEditorLoad(page); + await createLocalWorkspace( + { + name: 'test', + }, + page + ); + await enableCloudWorkspaceFromShareButton(page); + const title = getBlockSuiteEditorTitle(page); + await title.click(); + await page.keyboard.press('Enter'); + await importImage(page, 'large-image.png'); + + // enable share page and copy page link + await enableShare(page); + await page.getByTestId('share-menu-copy-link-button').click(); + await page.getByTestId('share-link-menu-copy-page').click(); + + // check share page is accessible + { + const context = await browser.newContext(); + await skipOnboarding(context); + const url: string = await page.evaluate(() => + navigator.clipboard.readText() + ); + const page2 = await context.newPage(); + await page2.goto(url); + await waitForEditorLoad(page2); + + await page.locator('affine-page-image').first().dblclick(); + const locator = page.getByTestId('image-preview-modal'); + await expect(locator).toBeVisible(); + await page.getByTestId('image-preview-close-button').first().click(); + await page.waitForTimeout(500); + await expect(locator).not.toBeVisible(); + } +}); diff --git a/tests/affine-cloud/e2e/share-page.spec.ts b/tests/affine-cloud/e2e/share-page-2.spec.ts similarity index 55% rename from tests/affine-cloud/e2e/share-page.spec.ts rename to tests/affine-cloud/e2e/share-page-2.spec.ts index d7e0ec933..516636542 100644 --- a/tests/affine-cloud/e2e/share-page.spec.ts +++ b/tests/affine-cloud/e2e/share-page-2.spec.ts @@ -6,12 +6,7 @@ import { enableShare, loginUser, } from '@affine-test/kit/utils/cloud'; -import { - clickEdgelessModeButton, - getParagraphIds, - locateToolbar, -} from '@affine-test/kit/utils/editor'; -import { importImage } from '@affine-test/kit/utils/image'; +import { getParagraphIds, locateToolbar } from '@affine-test/kit/utils/editor'; import { copyByKeyboard } from '@affine-test/kit/utils/keyboard'; import { clickNewPageButton, @@ -34,235 +29,6 @@ test.beforeEach(async ({ page }) => { await loginUser(page, user); }); -test('can enable share page', async ({ page, browser }) => { - await page.reload(); - await waitForEditorLoad(page); - await createLocalWorkspace( - { - name: 'test', - }, - page - ); - await enableCloudWorkspaceFromShareButton(page); - const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('TEST TITLE', { - delay: 50, - }); - await page.keyboard.press('Enter', { delay: 50 }); - await page.keyboard.type('TEST CONTENT', { delay: 50 }); - - // enable share page and copy page link - await enableShare(page); - await page.getByTestId('share-menu-copy-link-button').click(); - await page.getByTestId('share-link-menu-copy-page').click(); - - // check share page is accessible - { - const context = await browser.newContext(); - await skipOnboarding(context); - const url: string = await page.evaluate(() => - navigator.clipboard.readText() - ); - const page2 = await context.newPage(); - await page2.goto(url); - await waitForEditorLoad(page2); - const title = getBlockSuiteEditorTitle(page2); - await expect(title).toContainText('TEST TITLE'); - await expect(page2.locator('affine-paragraph').first()).toContainText( - 'TEST CONTENT' - ); - } -}); - -test('share page should have toc', async ({ page, browser }) => { - await page.reload(); - await waitForEditorLoad(page); - await createLocalWorkspace( - { - name: 'test', - }, - page - ); - await enableCloudWorkspaceFromShareButton(page); - const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('TEST TITLE', { - delay: 50, - }); - await page.keyboard.press('Enter', { delay: 50 }); - - await page.keyboard.type('# Heading 1'); - await page.keyboard.press('Enter'); - await page.keyboard.type('# Heading 2'); - await page.keyboard.press('Enter'); - - // enable share page and copy page link - await enableShare(page); - await page.getByTestId('share-menu-copy-link-button').click(); - await page.getByTestId('share-link-menu-copy-page').click(); - - // check share page is accessible - { - const context = await browser.newContext(); - await skipOnboarding(context); - const url: string = await page.evaluate(() => - navigator.clipboard.readText() - ); - const page2 = await context.newPage(); - await page2.goto(url); - await waitForEditorLoad(page2); - - const tocIndicators = page2.locator( - 'affine-outline-viewer .outline-viewer-indicator' - ); - await expect(tocIndicators).toHaveCount(3); - await expect(tocIndicators.nth(0)).toBeVisible(); - await expect(tocIndicators.nth(1)).toBeVisible(); - await expect(tocIndicators.nth(2)).toBeVisible(); - - const viewer = page2.locator('affine-outline-viewer'); - await tocIndicators.first().hover({ force: true }); - await expect(viewer).toBeVisible(); - - const toggleButton = viewer.locator( - '[data-testid="toggle-outline-panel-button"]' - ); - await expect(toggleButton).toHaveCount(0); - } -}); - -test('append paragraph should be disabled in shared mode', async ({ - page, - browser, -}) => { - await page.reload(); - await waitForEditorLoad(page); - await createLocalWorkspace( - { - name: 'test', - }, - page - ); - await enableCloudWorkspaceFromShareButton(page); - const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('TEST TITLE', { - delay: 50, - }); - - // enable share page and copy page link - await enableShare(page); - await page.getByTestId('share-menu-copy-link-button').click(); - await page.getByTestId('share-link-menu-copy-page').click(); - - { - const context = await browser.newContext(); - await skipOnboarding(context); - const url: string = await page.evaluate(() => - navigator.clipboard.readText() - ); - const page2 = await context.newPage(); - await page2.goto(url); - await waitForEditorLoad(page2); - - const paragraph = page2.locator('affine-paragraph'); - const numParagraphs = await paragraph.count(); - - let error = null; - try { - await page2.locator('[data-testid=page-editor-blank]').click(); - } catch (e) { - error = e; - } - expect(error).toBeNull(); - - await expect(paragraph).toHaveCount(numParagraphs); - } -}); - -test('share page with default edgeless', async ({ page, browser }) => { - await page.reload(); - await waitForEditorLoad(page); - await createLocalWorkspace( - { - name: 'test', - }, - page - ); - await enableCloudWorkspaceFromShareButton(page); - const title = getBlockSuiteEditorTitle(page); - await title.pressSequentially('TEST TITLE', { - delay: 50, - }); - await page.keyboard.press('Enter', { delay: 50 }); - await page.keyboard.type('TEST CONTENT', { delay: 50 }); - await clickEdgelessModeButton(page); - await expect(page.locator('affine-edgeless-root')).toBeVisible({ - timeout: 1000, - }); - - // enable share page and copy page link - await enableShare(page); - await page.getByTestId('share-menu-copy-link-button').click(); - await page.getByTestId('share-link-menu-copy-edgeless').click(); - - // check share page is accessible - { - const context = await browser.newContext(); - await skipOnboarding(context); - const url: string = await page.evaluate(() => - navigator.clipboard.readText() - ); - const page2 = await context.newPage(); - await page2.goto(url); - await waitForEditorLoad(page2); - await expect(page.locator('affine-edgeless-root')).toBeVisible({ - timeout: 1000, - }); - await expect(page2.locator('affine-paragraph').first()).toContainText( - 'TEST CONTENT' - ); - } -}); - -test('image preview should be shown', async ({ page, browser }) => { - await page.reload(); - await waitForEditorLoad(page); - await createLocalWorkspace( - { - name: 'test', - }, - page - ); - await enableCloudWorkspaceFromShareButton(page); - const title = getBlockSuiteEditorTitle(page); - await title.click(); - await page.keyboard.press('Enter'); - await importImage(page, 'large-image.png'); - - // enable share page and copy page link - await enableShare(page); - await page.getByTestId('share-menu-copy-link-button').click(); - await page.getByTestId('share-link-menu-copy-page').click(); - - // check share page is accessible - { - const context = await browser.newContext(); - await skipOnboarding(context); - const url: string = await page.evaluate(() => - navigator.clipboard.readText() - ); - const page2 = await context.newPage(); - await page2.goto(url); - await waitForEditorLoad(page2); - - await page.locator('affine-page-image').first().dblclick(); - const locator = page.getByTestId('image-preview-modal'); - await expect(locator).toBeVisible(); - await page.getByTestId('image-preview-close-button').first().click(); - await page.waitForTimeout(500); - await expect(locator).not.toBeVisible(); - } -}); - test('The reference links in the shared page should be accessible normally and can go back and forward', async ({ page, browser, diff --git a/tests/affine-cloud/package.json b/tests/affine-cloud/package.json index d7f1ac9fc..0880c94cd 100644 --- a/tests/affine-cloud/package.json +++ b/tests/affine-cloud/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "scripts": { - "e2e": "yarn playwright test" + "e2e": "yarn playwright test --reporter=list" }, "devDependencies": { "@affine-test/kit": "workspace:*",