mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-23 13:29:02 +08:00
Merge branch 'canary' into stable
This commit is contained in:
@@ -1,144 +0,0 @@
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import { resolve } from 'node:path';
|
||||
|
||||
import { test } from '@affine-test/kit/playwright';
|
||||
import {
|
||||
createRandomUser,
|
||||
deleteUser,
|
||||
enableCloudWorkspace,
|
||||
getLoginCookie,
|
||||
loginUser,
|
||||
runPrisma,
|
||||
} from '@affine-test/kit/utils/cloud';
|
||||
import { clickEdgelessModeButton } from '@affine-test/kit/utils/editor';
|
||||
import { coreUrl } from '@affine-test/kit/utils/load-page';
|
||||
import {
|
||||
clickNewPageButton,
|
||||
waitForEditorLoad,
|
||||
} from '@affine-test/kit/utils/page-logic';
|
||||
import { clickSideBarSettingButton } from '@affine-test/kit/utils/sidebar';
|
||||
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 () => {
|
||||
user = await createRandomUser();
|
||||
});
|
||||
|
||||
test.beforeEach(async ({ page, context }) => {
|
||||
await loginUser(page, user.email, {
|
||||
beforeLogin: async () => {
|
||||
expect(await getLoginCookie(context)).toBeUndefined();
|
||||
},
|
||||
afterLogin: async () => {
|
||||
expect(await getLoginCookie(context)).toBeTruthy();
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
expect(await getLoginCookie(context)).toBeTruthy();
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test.afterEach(async () => {
|
||||
// if you want to keep the user in the database for debugging,
|
||||
// comment this line
|
||||
await deleteUser(user.email);
|
||||
});
|
||||
|
||||
test.describe('basic', () => {
|
||||
test('migration', async ({ page, browser }) => {
|
||||
let workspaceId: string;
|
||||
{
|
||||
// create the old cloud workspace in another browser
|
||||
const context = await browser.newContext();
|
||||
const page = await context.newPage();
|
||||
await loginUser(page, user.email);
|
||||
await page.reload();
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickNewPageButton(page);
|
||||
await waitForEditorLoad(page);
|
||||
// http://localhost:8080/workspace/2bc0b6c8-f68d-4dd3-98a8-be746754f9e1/xxx
|
||||
workspaceId = page.url().split('/')[4];
|
||||
await runPrisma(async client => {
|
||||
const sqls = (
|
||||
await readFile(
|
||||
resolve(__dirname, 'fixtures', '0.9.0-canary.9-snapshots.sql'),
|
||||
'utf-8'
|
||||
)
|
||||
)
|
||||
.replaceAll('2bc0b6c8-f68d-4dd3-98a8-be746754f9e1', workspaceId)
|
||||
.split('\n');
|
||||
await client.snapshot.deleteMany({
|
||||
where: {
|
||||
workspaceId,
|
||||
},
|
||||
});
|
||||
|
||||
for (const sql of sqls) {
|
||||
await client.$executeRawUnsafe(sql);
|
||||
}
|
||||
});
|
||||
await page.close();
|
||||
}
|
||||
await page.reload();
|
||||
await page.waitForTimeout(1000);
|
||||
await page.goto(`${coreUrl}/workspace/${workspaceId}/all`);
|
||||
await page.getByTestId('upgrade-workspace-button').click();
|
||||
await expect(page.getByText('Refresh Current Page')).toBeVisible({
|
||||
timeout: 60000,
|
||||
});
|
||||
await page.goto(
|
||||
// page 'F1SX6cgNxy' has edgeless mode
|
||||
`${coreUrl}/workspace/${workspaceId}/F1SX6cgNxy`
|
||||
);
|
||||
await page.waitForTimeout(5000);
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await clickEdgelessModeButton(page);
|
||||
await expect(page.locator('affine-edgeless-page')).toBeVisible({
|
||||
timeout: 1000,
|
||||
});
|
||||
});
|
||||
|
||||
test('can see and change email and password in setting panel', async ({
|
||||
page,
|
||||
}) => {
|
||||
const newName = 'test name';
|
||||
{
|
||||
await clickSideBarSettingButton(page);
|
||||
const locator = page.getByTestId('user-info-card');
|
||||
expect(locator.getByText(user.email)).toBeTruthy();
|
||||
expect(locator.getByText(user.name)).toBeTruthy();
|
||||
await locator.click({
|
||||
delay: 50,
|
||||
});
|
||||
const nameInput = page.getByPlaceholder('Input account name');
|
||||
await nameInput.clear();
|
||||
await nameInput.pressSequentially(newName, {
|
||||
delay: 50,
|
||||
});
|
||||
await page.getByTestId('save-user-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
}
|
||||
await page.reload();
|
||||
{
|
||||
await clickSideBarSettingButton(page);
|
||||
const locator = page.getByTestId('user-info-card');
|
||||
expect(locator.getByText(user.email)).toBeTruthy();
|
||||
expect(locator.getByText(newName)).toBeTruthy();
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -6,25 +6,17 @@ import {
|
||||
enableCloudWorkspaceFromShareButton,
|
||||
loginUser,
|
||||
} from '@affine-test/kit/utils/cloud';
|
||||
import { dropFile } from '@affine-test/kit/utils/drop-file';
|
||||
import { clickEdgelessModeButton } from '@affine-test/kit/utils/editor';
|
||||
import {
|
||||
clickNewPageButton,
|
||||
getBlockSuiteEditorTitle,
|
||||
waitForEditorLoad,
|
||||
} from '@affine-test/kit/utils/page-logic';
|
||||
import {
|
||||
clickUserInfoCard,
|
||||
openSettingModal,
|
||||
openWorkspaceSettingPanel,
|
||||
} from '@affine-test/kit/utils/setting';
|
||||
import {
|
||||
clickSideBarAllPageButton,
|
||||
clickSideBarCurrentWorkspaceBanner,
|
||||
clickSideBarSettingButton,
|
||||
} from '@affine-test/kit/utils/sidebar';
|
||||
import { clickUserInfoCard } from '@affine-test/kit/utils/setting';
|
||||
import { clickSideBarSettingButton } from '@affine-test/kit/utils/sidebar';
|
||||
import { createLocalWorkspace } from '@affine-test/kit/utils/workspace';
|
||||
import { expect } from '@playwright/test';
|
||||
import { resolve } from 'path';
|
||||
|
||||
let user: {
|
||||
id: string;
|
||||
@@ -41,298 +33,184 @@ test.beforeEach(async ({ page }) => {
|
||||
await loginUser(page, user.email);
|
||||
});
|
||||
|
||||
test.describe('collaboration', () => {
|
||||
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 });
|
||||
await page.getByTestId('cloud-share-menu-button').click();
|
||||
await page.getByTestId('share-menu-create-link-button').click();
|
||||
await page.getByTestId('share-menu-copy-link-button').click();
|
||||
|
||||
// check share page is accessible
|
||||
test('can enable share page', async ({ page, browser }) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
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);
|
||||
expect(await title.innerText()).toBe('TEST TITLE');
|
||||
expect(await page2.textContent('affine-paragraph')).toContain(
|
||||
'TEST CONTENT'
|
||||
);
|
||||
}
|
||||
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 page.getByTestId('cloud-share-menu-button').click();
|
||||
await page.getByTestId('share-menu-create-link-button').click();
|
||||
await page.getByTestId('share-menu-copy-link-button').click();
|
||||
|
||||
test('share page with default edgeless', async ({ page, browser }) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
// check share page is accessible
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
const url: string = await page.evaluate(() =>
|
||||
navigator.clipboard.readText()
|
||||
);
|
||||
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);
|
||||
const page2 = await context.newPage();
|
||||
await page2.goto(url);
|
||||
await waitForEditorLoad(page2);
|
||||
const title = getBlockSuiteEditorTitle(page2);
|
||||
expect(await title.innerText()).toBe('TEST TITLE');
|
||||
expect(await page2.textContent('affine-paragraph')).toContain(
|
||||
'TEST CONTENT'
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
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-page')).toBeVisible({
|
||||
timeout: 1000,
|
||||
});
|
||||
await page.getByTestId('cloud-share-menu-button').click();
|
||||
await page.getByTestId('share-menu-create-link-button').click();
|
||||
await page.getByTestId('share-menu-copy-link-button').click();
|
||||
|
||||
// check share page is accessible
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
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-page')).toBeVisible({
|
||||
timeout: 1000,
|
||||
});
|
||||
await page.getByTestId('cloud-share-menu-button').click();
|
||||
await page.getByTestId('share-menu-create-link-button').click();
|
||||
await page.getByTestId('share-menu-copy-link-button').click();
|
||||
|
||||
// check share page is accessible
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
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-page')).toBeVisible({
|
||||
timeout: 1000,
|
||||
});
|
||||
expect(await page2.textContent('affine-paragraph')).toContain(
|
||||
'TEST CONTENT'
|
||||
);
|
||||
const logo = page2.getByTestId('share-page-logo');
|
||||
const editButton = page2.getByTestId('share-page-edit-button');
|
||||
await expect(editButton).not.toBeVisible();
|
||||
await expect(logo).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('can collaborate with other user and name should display when editing', async ({
|
||||
page,
|
||||
browser,
|
||||
}) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
expect(await page2.textContent('affine-paragraph')).toContain(
|
||||
'TEST CONTENT'
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickNewPageButton(page);
|
||||
const currentUrl = page.url();
|
||||
// format: http://localhost:8080/workspace/${workspaceId}/xxx
|
||||
const workspaceId = currentUrl.split('/')[4];
|
||||
const userB = await createRandomUser();
|
||||
const logo = page2.getByTestId('share-page-logo');
|
||||
const editButton = page2.getByTestId('share-page-edit-button');
|
||||
await expect(editButton).not.toBeVisible();
|
||||
await expect(logo).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('can collaborate with other user and name should display when editing', async ({
|
||||
page,
|
||||
browser,
|
||||
}) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickNewPageButton(page);
|
||||
const currentUrl = page.url();
|
||||
// format: http://localhost:8080/workspace/${workspaceId}/xxx
|
||||
const workspaceId = currentUrl.split('/')[4];
|
||||
const userB = await createRandomUser();
|
||||
const context = await browser.newContext();
|
||||
const page2 = await context.newPage();
|
||||
await loginUser(page2, userB.email);
|
||||
await addUserToWorkspace(workspaceId, userB.id, 1 /* READ */);
|
||||
await page2.reload();
|
||||
await waitForEditorLoad(page2);
|
||||
await page2.goto(currentUrl);
|
||||
{
|
||||
const title = getBlockSuiteEditorTitle(page);
|
||||
await title.pressSequentially('TEST TITLE', {
|
||||
delay: 50,
|
||||
});
|
||||
}
|
||||
await page2.waitForTimeout(200);
|
||||
{
|
||||
const title = getBlockSuiteEditorTitle(page2);
|
||||
expect(await title.innerText()).toBe('TEST TITLE');
|
||||
const typingPromise = Promise.all([
|
||||
page.keyboard.press('Enter', { delay: 50 }),
|
||||
page.keyboard.type('TEST CONTENT', { delay: 50 }),
|
||||
]);
|
||||
// username should be visible when editing
|
||||
await expect(page2.getByText(user.name)).toBeVisible();
|
||||
await typingPromise;
|
||||
}
|
||||
|
||||
// change username
|
||||
await clickSideBarSettingButton(page);
|
||||
await clickUserInfoCard(page);
|
||||
const input = page.getByTestId('user-name-input');
|
||||
await input.clear();
|
||||
await input.pressSequentially('TEST USER', {
|
||||
delay: 50,
|
||||
});
|
||||
await page.getByTestId('save-user-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
await page.keyboard.press('Escape', {
|
||||
delay: 50,
|
||||
});
|
||||
const title = getBlockSuiteEditorTitle(page);
|
||||
await title.focus();
|
||||
|
||||
{
|
||||
await expect(page2.getByText('TEST USER')).toBeVisible({
|
||||
timeout: 2000,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
test('can sync collections between different browser', async ({
|
||||
page,
|
||||
browser,
|
||||
}) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await page.getByTestId('slider-bar-add-collection-button').click();
|
||||
const title = page.getByTestId('input-collection-title');
|
||||
await title.isVisible();
|
||||
await title.fill('test collection');
|
||||
await page.getByTestId('save-collection').click();
|
||||
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
const page2 = await context.newPage();
|
||||
await loginUser(page2, userB.email);
|
||||
await addUserToWorkspace(workspaceId, userB.id, 1 /* READ */);
|
||||
await page2.reload();
|
||||
await waitForEditorLoad(page2);
|
||||
await page2.goto(currentUrl);
|
||||
{
|
||||
const title = getBlockSuiteEditorTitle(page);
|
||||
await title.pressSequentially('TEST TITLE', {
|
||||
delay: 50,
|
||||
});
|
||||
}
|
||||
await page2.waitForTimeout(200);
|
||||
{
|
||||
const title = getBlockSuiteEditorTitle(page2);
|
||||
expect(await title.innerText()).toBe('TEST TITLE');
|
||||
const typingPromise = Promise.all([
|
||||
page.keyboard.press('Enter', { delay: 50 }),
|
||||
page.keyboard.type('TEST CONTENT', { delay: 50 }),
|
||||
]);
|
||||
// username should be visible when editing
|
||||
await expect(page2.getByText(user.name)).toBeVisible();
|
||||
await typingPromise;
|
||||
}
|
||||
|
||||
// change username
|
||||
await clickSideBarSettingButton(page);
|
||||
await clickUserInfoCard(page);
|
||||
const input = page.getByTestId('user-name-input');
|
||||
await input.clear();
|
||||
await input.pressSequentially('TEST USER', {
|
||||
delay: 50,
|
||||
});
|
||||
await page.getByTestId('save-user-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
await page.keyboard.press('Escape', {
|
||||
delay: 50,
|
||||
});
|
||||
const title = getBlockSuiteEditorTitle(page);
|
||||
await title.focus();
|
||||
|
||||
{
|
||||
await expect(page2.getByText('TEST USER')).toBeVisible({
|
||||
timeout: 2000,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
test('can sync collections between different browser', async ({
|
||||
page,
|
||||
browser,
|
||||
}) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await page.getByTestId('slider-bar-add-collection-button').click();
|
||||
const title = page.getByTestId('input-collection-title');
|
||||
await title.isVisible();
|
||||
await title.fill('test collection');
|
||||
await page.getByTestId('save-collection').click();
|
||||
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
const page2 = await context.newPage();
|
||||
await loginUser(page2, user.email);
|
||||
await page2.goto(page.url());
|
||||
const collections = page2.getByTestId('collections');
|
||||
await expect(collections.getByText('test collection')).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('exit successfully and re-login', async ({ page }) => {
|
||||
await page.reload();
|
||||
await clickSideBarAllPageButton(page);
|
||||
await page.waitForTimeout(200);
|
||||
const url = page.url();
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickSideBarSettingButton(page);
|
||||
await clickUserInfoCard(page);
|
||||
await page.getByTestId('sign-out-button').click();
|
||||
await page.getByTestId('confirm-sign-out-button').click();
|
||||
await page.waitForTimeout(5000);
|
||||
expect(page.url()).toBe(url);
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('collaboration members', () => {
|
||||
test('should have pagination in member list', async ({ page }) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickNewPageButton(page);
|
||||
const currentUrl = page.url();
|
||||
// format: http://localhost:8080/workspace/${workspaceId}/xxx
|
||||
const workspaceId = currentUrl.split('/')[4];
|
||||
|
||||
// create 10 user and add to workspace
|
||||
const createUserAndAddToWorkspace = async () => {
|
||||
const userB = await createRandomUser();
|
||||
await addUserToWorkspace(workspaceId, userB.id, 1 /* READ */);
|
||||
};
|
||||
await Promise.all(
|
||||
Array.from({ length: 10 })
|
||||
.fill(1)
|
||||
.map(() => createUserAndAddToWorkspace())
|
||||
);
|
||||
|
||||
await openSettingModal(page);
|
||||
await openWorkspaceSettingPanel(page, 'test');
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
const firstPageMemberItemCount = await page
|
||||
.locator('[data-testid="member-item"]')
|
||||
.count();
|
||||
|
||||
expect(firstPageMemberItemCount).toBe(8);
|
||||
|
||||
const navigationItems = await page
|
||||
.getByRole('navigation')
|
||||
.getByRole('button')
|
||||
.all();
|
||||
|
||||
// make sure the first member is the owner
|
||||
await expect(page.getByTestId('member-item').first()).toContainText(
|
||||
'Workspace Owner'
|
||||
);
|
||||
|
||||
// There have four pagination items: < 1 2 >
|
||||
expect(navigationItems.length).toBe(4);
|
||||
// Click second page
|
||||
await navigationItems[2].click();
|
||||
await page.waitForTimeout(500);
|
||||
// There should have other three members in second page
|
||||
const secondPageMemberItemCount = await page
|
||||
.locator('[data-testid="member-item"]')
|
||||
.count();
|
||||
expect(secondPageMemberItemCount).toBe(3);
|
||||
// Click left arrow to back to first page
|
||||
await navigationItems[0].click();
|
||||
await page.waitForTimeout(500);
|
||||
expect(await page.locator('[data-testid="member-item"]').count()).toBe(8);
|
||||
// Click right arrow to second page
|
||||
await navigationItems[3].click();
|
||||
await page.waitForTimeout(500);
|
||||
expect(await page.locator('[data-testid="member-item"]').count()).toBe(3);
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('sign out', () => {
|
||||
test('can sign out', async ({ page }) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await clickSideBarAllPageButton(page);
|
||||
const currentUrl = page.url();
|
||||
await clickSideBarCurrentWorkspaceBanner(page);
|
||||
await page.getByTestId('workspace-modal-account-option').click();
|
||||
await page.getByTestId('workspace-modal-sign-out-option').click();
|
||||
await page.getByTestId('confirm-sign-out-button').click();
|
||||
await clickSideBarCurrentWorkspaceBanner(page);
|
||||
const signInButton = page.getByTestId('cloud-signin-button');
|
||||
await expect(signInButton).toBeVisible();
|
||||
expect(page.url()).toBe(currentUrl);
|
||||
});
|
||||
await loginUser(page2, user.email);
|
||||
await page2.goto(page.url());
|
||||
const collections = page2.getByTestId('collections');
|
||||
await expect(collections.getByText('test collection')).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test('can sync svg between different browsers', async ({ page, browser }) => {
|
||||
@@ -348,12 +226,45 @@ test('can sync svg between different browsers', async ({ page, browser }) => {
|
||||
await clickNewPageButton(page);
|
||||
await waitForEditorLoad(page);
|
||||
|
||||
// drop an svg file
|
||||
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
|
||||
<rect x="0" y="0" width="200" height="200" fill="red" />
|
||||
</svg>`;
|
||||
// upload local svg
|
||||
|
||||
await dropFile(page, 'affine-paragraph', svg, 'test.svg', 'image/svg+xml');
|
||||
const slashMenu = page.locator(`.slash-menu`);
|
||||
const image = page.locator('affine-image');
|
||||
|
||||
page.evaluate(async () => {
|
||||
window.showOpenFilePicker = undefined;
|
||||
});
|
||||
|
||||
const title = getBlockSuiteEditorTitle(page);
|
||||
await title.pressSequentially('TEST TITLE', {
|
||||
delay: 50,
|
||||
});
|
||||
await page.keyboard.press('Enter', { delay: 50 });
|
||||
await page.waitForTimeout(100);
|
||||
await page.keyboard.type('/', { delay: 50 });
|
||||
await expect(slashMenu).toBeVisible();
|
||||
await page.keyboard.type('image', { delay: 100 });
|
||||
await expect(slashMenu).toBeVisible();
|
||||
await page.keyboard.press('Enter', { delay: 50 });
|
||||
await page.setInputFiles(
|
||||
"input[type='file']",
|
||||
resolve(__dirname, 'logo.svg')
|
||||
);
|
||||
await expect(image).toBeVisible();
|
||||
|
||||
// the user should see the svg
|
||||
// get the image src under "affine-image img"
|
||||
const src1 = await page.locator('affine-image img').getAttribute('src');
|
||||
expect(src1).not.toBeNull();
|
||||
|
||||
// fetch the actual src1 resource in the browser
|
||||
const svg1 = await page.evaluate(
|
||||
src =>
|
||||
fetch(src!)
|
||||
.then(res => res.blob())
|
||||
.then(blob => blob.text()),
|
||||
src1
|
||||
);
|
||||
|
||||
{
|
||||
const context = await browser.newContext();
|
||||
@@ -361,20 +272,20 @@ test('can sync svg between different browsers', async ({ page, browser }) => {
|
||||
await loginUser(page2, user.email);
|
||||
await page2.goto(page.url());
|
||||
|
||||
// the user should see the svg
|
||||
// second user should see the svg
|
||||
// get the image src under "affine-image img"
|
||||
const src = await page2.locator('affine-image img').getAttribute('src');
|
||||
const src2 = await page2.locator('affine-image img').getAttribute('src');
|
||||
expect(src2).not.toBeNull();
|
||||
|
||||
expect(src).not.toBeNull();
|
||||
// fetch the actual src2 resource in the browser
|
||||
const svg2 = await page2.evaluate(
|
||||
src =>
|
||||
fetch(src!)
|
||||
.then(res => res.blob())
|
||||
.then(blob => blob.text()),
|
||||
src2
|
||||
);
|
||||
|
||||
// fetch the src resource in the browser
|
||||
const svg2 = await page2.evaluate(src => {
|
||||
return fetch(src!)
|
||||
.then(res => res.blob())
|
||||
.then(blob => blob.text());
|
||||
}, src);
|
||||
|
||||
// turn the blob into string and check if it contains the svg
|
||||
expect(svg2).toContain(svg);
|
||||
expect(svg2).toEqual(svg1);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,17 +1,111 @@
|
||||
import { test } from '@affine-test/kit/playwright';
|
||||
import {
|
||||
createRandomUser,
|
||||
enableCloudWorkspace,
|
||||
loginUser,
|
||||
} from '@affine-test/kit/utils/cloud';
|
||||
import { openHomePage } from '@affine-test/kit/utils/load-page';
|
||||
import { waitForEditorLoad } from '@affine-test/kit/utils/page-logic';
|
||||
import { clickSideBarCurrentWorkspaceBanner } from '@affine-test/kit/utils/sidebar';
|
||||
import { clickUserInfoCard } from '@affine-test/kit/utils/setting';
|
||||
import {
|
||||
clickSideBarAllPageButton,
|
||||
clickSideBarCurrentWorkspaceBanner,
|
||||
clickSideBarSettingButton,
|
||||
} from '@affine-test/kit/utils/sidebar';
|
||||
import { createLocalWorkspace } from '@affine-test/kit/utils/workspace';
|
||||
import { expect } from '@playwright/test';
|
||||
|
||||
test.describe('login', () => {
|
||||
test('can open login modal in workspace list', async ({ page }) => {
|
||||
await openHomePage(page);
|
||||
test('can open login modal in workspace list', async ({ page }) => {
|
||||
await openHomePage(page);
|
||||
await waitForEditorLoad(page);
|
||||
await clickSideBarCurrentWorkspaceBanner(page);
|
||||
await page.getByTestId('cloud-signin-button').click({
|
||||
delay: 200,
|
||||
});
|
||||
await expect(page.getByTestId('auth-modal')).toBeVisible();
|
||||
});
|
||||
|
||||
test.describe('login first', () => {
|
||||
let user: {
|
||||
id: string;
|
||||
name: string;
|
||||
email: string;
|
||||
password: string;
|
||||
};
|
||||
|
||||
test.beforeEach(async ({ page }) => {
|
||||
user = await createRandomUser();
|
||||
await loginUser(page, user.email);
|
||||
});
|
||||
|
||||
test('exit successfully and re-login', async ({ page }) => {
|
||||
await page.reload();
|
||||
await clickSideBarAllPageButton(page);
|
||||
await page.waitForTimeout(200);
|
||||
const url = page.url();
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickSideBarSettingButton(page);
|
||||
await clickUserInfoCard(page);
|
||||
await page.getByTestId('sign-out-button').click();
|
||||
await page.getByTestId('confirm-sign-out-button').click();
|
||||
await page.waitForTimeout(5000);
|
||||
expect(page.url()).toBe(url);
|
||||
});
|
||||
|
||||
test('can sign out', async ({ page }) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await clickSideBarAllPageButton(page);
|
||||
const currentUrl = page.url();
|
||||
await clickSideBarCurrentWorkspaceBanner(page);
|
||||
await page.getByTestId('cloud-signin-button').click({
|
||||
delay: 200,
|
||||
});
|
||||
await expect(page.getByTestId('auth-modal')).toBeVisible();
|
||||
await page.getByTestId('workspace-modal-account-option').click();
|
||||
await page.getByTestId('workspace-modal-sign-out-option').click();
|
||||
await page.getByTestId('confirm-sign-out-button').click();
|
||||
await clickSideBarCurrentWorkspaceBanner(page);
|
||||
const signInButton = page.getByTestId('cloud-signin-button');
|
||||
await expect(signInButton).toBeVisible();
|
||||
expect(page.url()).toBe(currentUrl);
|
||||
});
|
||||
|
||||
test('can see and change email and password in setting panel', async ({
|
||||
page,
|
||||
}) => {
|
||||
const newName = 'test name';
|
||||
{
|
||||
await clickSideBarSettingButton(page);
|
||||
const locator = page.getByTestId('user-info-card');
|
||||
expect(locator.getByText(user.email)).toBeTruthy();
|
||||
expect(locator.getByText(user.name)).toBeTruthy();
|
||||
await locator.click({
|
||||
delay: 50,
|
||||
});
|
||||
const nameInput = page.getByPlaceholder('Input account name');
|
||||
await nameInput.clear();
|
||||
await nameInput.pressSequentially(newName, {
|
||||
delay: 50,
|
||||
});
|
||||
await page.getByTestId('save-user-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
}
|
||||
await page.reload();
|
||||
{
|
||||
await clickSideBarSettingButton(page);
|
||||
const locator = page.getByTestId('user-info-card');
|
||||
expect(locator.getByText(user.email)).toBeTruthy();
|
||||
expect(locator.getByText(newName)).toBeTruthy();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><svg id="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#000000;}</style></defs><g id="_20230202-pull_request"><path class="cls-1" d="m512,133.82L342.5,0,0,67.88v310.26l169.56,133.86,342.44-67.88V133.82Zm-203.39-84.81v89.67l51.84-10.27v-56.25l74.87,59.09-249.93,49.53-108.71-85.8,231.93-45.96ZM51.84,133.32l99.71,78.7v93.92l51.84-10.27v-76.15l256.78-50.89v210.06l-99.71-78.7v-93.92l-51.84,10.27v76.16l-256.78,50.89v-210.06Zm151.55,329.67v-89.67l-51.84,10.27v56.25l-74.87-59.09,249.93-49.53,108.71,85.8-231.93,45.96Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 608 B |
@@ -0,0 +1,113 @@
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import { resolve } from 'node:path';
|
||||
|
||||
import { test } from '@affine-test/kit/playwright';
|
||||
import {
|
||||
createRandomUser,
|
||||
deleteUser,
|
||||
enableCloudWorkspace,
|
||||
getLoginCookie,
|
||||
loginUser,
|
||||
runPrisma,
|
||||
} from '@affine-test/kit/utils/cloud';
|
||||
import { coreUrl } from '@affine-test/kit/utils/load-page';
|
||||
import {
|
||||
clickNewPageButton,
|
||||
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 () => {
|
||||
user = await createRandomUser();
|
||||
});
|
||||
|
||||
test.beforeEach(async ({ page, context }) => {
|
||||
await loginUser(page, user.email, {
|
||||
beforeLogin: async () => {
|
||||
expect(await getLoginCookie(context)).toBeUndefined();
|
||||
},
|
||||
afterLogin: async () => {
|
||||
expect(await getLoginCookie(context)).toBeTruthy();
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
expect(await getLoginCookie(context)).toBeTruthy();
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test.afterEach(async () => {
|
||||
// if you want to keep the user in the database for debugging,
|
||||
// comment this line
|
||||
await deleteUser(user.email);
|
||||
});
|
||||
|
||||
// TODO: @joooye34 mock migration from server data after page level upgrade implemented.
|
||||
test.skip('migration', async ({ page, browser }) => {
|
||||
let workspaceId: string;
|
||||
{
|
||||
// create the old cloud workspace in another browser
|
||||
const context = await browser.newContext();
|
||||
const page = await context.newPage();
|
||||
await loginUser(page, user.email);
|
||||
await page.reload();
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickNewPageButton(page);
|
||||
await waitForEditorLoad(page);
|
||||
// http://localhost:8080/workspace/2bc0b6c8-f68d-4dd3-98a8-be746754f9e1/xxx
|
||||
workspaceId = page.url().split('/')[4];
|
||||
await runPrisma(async client => {
|
||||
const sqls = (
|
||||
await readFile(
|
||||
resolve(__dirname, 'fixtures', '0.9.0-canary.9-snapshots.sql'),
|
||||
'utf-8'
|
||||
)
|
||||
)
|
||||
.replaceAll('2bc0b6c8-f68d-4dd3-98a8-be746754f9e1', workspaceId)
|
||||
.split('\n');
|
||||
await client.snapshot.deleteMany({
|
||||
where: {
|
||||
workspaceId,
|
||||
},
|
||||
});
|
||||
|
||||
for (const sql of sqls) {
|
||||
await client.$executeRawUnsafe(sql);
|
||||
}
|
||||
});
|
||||
await page.close();
|
||||
}
|
||||
await page.reload();
|
||||
await page.waitForTimeout(1000);
|
||||
await page.goto(`${coreUrl}/workspace/${workspaceId}/all`);
|
||||
await page.getByTestId('upgrade-workspace-button').click();
|
||||
await expect(page.getByText('Refresh Current Page')).toBeVisible({
|
||||
timeout: 60000,
|
||||
});
|
||||
await page.goto(
|
||||
// page 'F1SX6cgNxy' has edgeless mode
|
||||
`${coreUrl}/workspace/${workspaceId}/F1SX6cgNxy`
|
||||
);
|
||||
await page.waitForTimeout(5000);
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
|
||||
// click edgeless switch button is flaky in e2e
|
||||
// await clickEdgelessModeButton(page);
|
||||
// await expect(page.locator('affine-edgeless-page')).toBeVisible({
|
||||
// timeout: 1000,
|
||||
// });
|
||||
});
|
||||
@@ -0,0 +1,96 @@
|
||||
import { test } from '@affine-test/kit/playwright';
|
||||
import {
|
||||
addUserToWorkspace,
|
||||
createRandomUser,
|
||||
enableCloudWorkspace,
|
||||
loginUser,
|
||||
} from '@affine-test/kit/utils/cloud';
|
||||
import {
|
||||
clickNewPageButton,
|
||||
waitForEditorLoad,
|
||||
} from '@affine-test/kit/utils/page-logic';
|
||||
import {
|
||||
openSettingModal,
|
||||
openWorkspaceSettingPanel,
|
||||
} from '@affine-test/kit/utils/setting';
|
||||
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.email);
|
||||
});
|
||||
|
||||
test('should have pagination in member list', async ({ page }) => {
|
||||
await page.reload();
|
||||
await waitForEditorLoad(page);
|
||||
await createLocalWorkspace(
|
||||
{
|
||||
name: 'test',
|
||||
},
|
||||
page
|
||||
);
|
||||
await enableCloudWorkspace(page);
|
||||
await clickNewPageButton(page);
|
||||
const currentUrl = page.url();
|
||||
// format: http://localhost:8080/workspace/${workspaceId}/xxx
|
||||
const workspaceId = currentUrl.split('/')[4];
|
||||
|
||||
// create 10 user and add to workspace
|
||||
const createUserAndAddToWorkspace = async () => {
|
||||
const userB = await createRandomUser();
|
||||
await addUserToWorkspace(workspaceId, userB.id, 1 /* READ */);
|
||||
};
|
||||
await Promise.all(
|
||||
Array.from({ length: 10 })
|
||||
.fill(1)
|
||||
.map(() => createUserAndAddToWorkspace())
|
||||
);
|
||||
|
||||
await openSettingModal(page);
|
||||
await openWorkspaceSettingPanel(page, 'test');
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
const firstPageMemberItemCount = await page
|
||||
.locator('[data-testid="member-item"]')
|
||||
.count();
|
||||
|
||||
expect(firstPageMemberItemCount).toBe(8);
|
||||
|
||||
const navigationItems = await page
|
||||
.getByRole('navigation')
|
||||
.getByRole('button')
|
||||
.all();
|
||||
|
||||
// make sure the first member is the owner
|
||||
await expect(page.getByTestId('member-item').first()).toContainText(
|
||||
'Workspace Owner'
|
||||
);
|
||||
|
||||
// There have four pagination items: < 1 2 >
|
||||
expect(navigationItems.length).toBe(4);
|
||||
// Click second page
|
||||
await navigationItems[2].click();
|
||||
await page.waitForTimeout(500);
|
||||
// There should have other three members in second page
|
||||
const secondPageMemberItemCount = await page
|
||||
.locator('[data-testid="member-item"]')
|
||||
.count();
|
||||
expect(secondPageMemberItemCount).toBe(3);
|
||||
// Click left arrow to back to first page
|
||||
await navigationItems[0].click();
|
||||
await page.waitForTimeout(500);
|
||||
expect(await page.locator('[data-testid="member-item"]').count()).toBe(8);
|
||||
// Click right arrow to second page
|
||||
await navigationItems[3].click();
|
||||
await page.waitForTimeout(500);
|
||||
expect(await page.locator('[data-testid="member-item"]').count()).toBe(3);
|
||||
});
|
||||
@@ -6,7 +6,7 @@ import type {
|
||||
const config: PlaywrightTestConfig = {
|
||||
testDir: './e2e',
|
||||
fullyParallel: !process.env.CI,
|
||||
timeout: process.env.CI ? 120_000 : 30_000,
|
||||
timeout: 120_000,
|
||||
use: {
|
||||
baseURL: 'http://localhost:8081/',
|
||||
browserName:
|
||||
|
||||
@@ -160,9 +160,9 @@ test('affine onboarding button', async ({ page }) => {
|
||||
test('windows only check', async ({ page }) => {
|
||||
const windowOnlyUI = page.locator('[data-platform-target=win32]');
|
||||
if (process.platform === 'win32') {
|
||||
await expect(windowOnlyUI).toBeVisible();
|
||||
await expect(windowOnlyUI.first()).toBeVisible();
|
||||
} else {
|
||||
await expect(windowOnlyUI).not.toBeVisible();
|
||||
await expect(windowOnlyUI.first()).not.toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
"devDependencies": {
|
||||
"@affine-test/fixtures": "workspace:*",
|
||||
"@affine-test/kit": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/global": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/store": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/block-std": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/blocks": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/global": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/store": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@playwright/test": "^1.39.0",
|
||||
"express": "^4.18.2",
|
||||
"http-proxy-middleware": "^3.0.0-beta.1",
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
"devDependencies": {
|
||||
"@affine-test/fixtures": "workspace:*",
|
||||
"@affine-test/kit": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/global": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/store": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/block-std": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/blocks": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/global": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/store": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@playwright/test": "^1.39.0",
|
||||
"express": "^4.18.2",
|
||||
"http-proxy-middleware": "^3.0.0-beta.1",
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
"devDependencies": {
|
||||
"@affine-test/fixtures": "workspace:*",
|
||||
"@affine-test/kit": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/global": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/store": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/block-std": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/blocks": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/global": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/store": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@playwright/test": "^1.39.0",
|
||||
"express": "^4.18.2",
|
||||
"http-proxy-middleware": "^3.0.0-beta.1",
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
"devDependencies": {
|
||||
"@affine-test/fixtures": "workspace:*",
|
||||
"@affine-test/kit": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/global": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/store": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/block-std": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/blocks": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/global": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/store": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@playwright/test": "^1.39.0",
|
||||
"express": "^4.18.2",
|
||||
"http-proxy-middleware": "^3.0.0-beta.1",
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
import { test } from '@affine-test/kit/playwright';
|
||||
import { checkBlockHub } from '@affine-test/kit/utils/editor';
|
||||
import { openHomePage } from '@affine-test/kit/utils/load-page';
|
||||
import { waitForEditorLoad } from '@affine-test/kit/utils/page-logic';
|
||||
|
||||
test('block-hub should work', async ({ page }) => {
|
||||
await openHomePage(page);
|
||||
await waitForEditorLoad(page);
|
||||
await checkBlockHub(page);
|
||||
});
|
||||
@@ -16,14 +16,11 @@ test('should create a page with a local first avatar and remove it', async ({
|
||||
await waitForEditorLoad(page);
|
||||
await clickNewPageButton(page);
|
||||
await page.getByTestId('workspace-name').click();
|
||||
await page.getByTestId('new-workspace').click({ delay: 50 });
|
||||
await page
|
||||
.getByTestId('create-workspace-input')
|
||||
.pressSequentially('Test Workspace 1', { delay: 50 });
|
||||
await page.getByTestId('new-workspace').click();
|
||||
await page.getByTestId('create-workspace-input').fill('Test Workspace 1');
|
||||
await page.getByTestId('create-workspace-create-button').click();
|
||||
await page.getByTestId('workspace-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.getByTestId('workspace-name').click();
|
||||
await page.getByTestId('workspace-card').nth(1).click();
|
||||
await page.getByTestId('settings-modal-trigger').click();
|
||||
await page.getByTestId('current-workspace-label').click();
|
||||
@@ -31,14 +28,10 @@ test('should create a page with a local first avatar and remove it', async ({
|
||||
.getByTestId('upload-avatar')
|
||||
.setInputFiles(resolve(rootDir, 'tests', 'fixtures', 'smile.png'));
|
||||
await page.mouse.click(0, 0);
|
||||
await page.getByTestId('workspace-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
await page.getByTestId('workspace-name').click();
|
||||
await page.getByTestId('workspace-card').nth(0).click();
|
||||
await page.waitForTimeout(1000);
|
||||
await page.getByTestId('workspace-name').click({
|
||||
delay: 50,
|
||||
});
|
||||
await page.getByTestId('workspace-name').click();
|
||||
await page.getByTestId('workspace-card').nth(1).click();
|
||||
const blobUrl = await page
|
||||
.getByTestId('workspace-avatar')
|
||||
|
||||
@@ -130,7 +130,7 @@ test("Deleted page's reference will not be shown in sidebar", async ({
|
||||
test('Add new favorite page via sidebar', async ({ page }) => {
|
||||
await openHomePage(page);
|
||||
await waitForEditorLoad(page);
|
||||
await page.getByTestId('slider-bar-add-favorite-button').click();
|
||||
await page.getByTestId('slider-bar-add-favorite-button').first().click();
|
||||
await waitForEditorLoad(page);
|
||||
|
||||
// enter random page title
|
||||
|
||||
@@ -2,7 +2,6 @@ import { test } from '@affine-test/kit/playwright';
|
||||
import { openHomePage } from '@affine-test/kit/utils/load-page';
|
||||
import {
|
||||
clickNewPageButton,
|
||||
clickPageMoreActions,
|
||||
getBlockSuiteEditorTitle,
|
||||
getPageOperationButton,
|
||||
waitForEditorLoad,
|
||||
@@ -41,21 +40,3 @@ test('New a page , then delete it in all pages, finally find it in trash', async
|
||||
|
||||
expect(currentWorkspace.flavour).toContain('local');
|
||||
});
|
||||
|
||||
test('New a page , then delete it in page, blockHub and option menu will not appear ', async ({
|
||||
page,
|
||||
}) => {
|
||||
await openHomePage(page);
|
||||
await waitForEditorLoad(page);
|
||||
await clickNewPageButton(page);
|
||||
const title = getBlockSuiteEditorTitle(page);
|
||||
await title.pressSequentially('test');
|
||||
await clickPageMoreActions(page);
|
||||
await page.getByTestId('editor-option-menu-delete').click();
|
||||
await page.getByTestId('confirm-delete-page').click();
|
||||
await expect(page.getByTestId('header-dropDownButton')).not.toBeVisible();
|
||||
await expect(page.getByTestId('block-hub')).not.toBeVisible();
|
||||
await page.getByTestId('page-restore-button').click();
|
||||
await expect(page.getByTestId('header-dropDownButton')).toBeVisible();
|
||||
await expect(page.getByTestId('block-hub')).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -89,9 +89,11 @@ test('v3 to v4, surface migration', async ({ page }) => {
|
||||
await page.getByTestId('upgrade-workspace-button').click();
|
||||
await waitForEditorLoad(page);
|
||||
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// check edgeless mode is correct
|
||||
await clickEdgelessModeButton(page);
|
||||
await expect(page.locator('edgeless-toolbar')).toBeVisible();
|
||||
await expect(page.locator('.edgeless-toolbar-container')).toBeVisible();
|
||||
await expect(page.locator('affine-edgeless-page')).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -121,6 +123,6 @@ test('v0 to v4, subdoc migration', async ({ page }) => {
|
||||
|
||||
// check edgeless mode is correct
|
||||
await clickEdgelessModeButton(page);
|
||||
await expect(page.locator('edgeless-toolbar')).toBeVisible();
|
||||
await expect(page.locator('.edgeless-toolbar-container')).toBeVisible();
|
||||
await expect(page.locator('affine-edgeless-page')).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
"devDependencies": {
|
||||
"@affine-test/fixtures": "workspace:*",
|
||||
"@affine-test/kit": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/global": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/store": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/block-std": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/blocks": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/global": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/store": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@playwright/test": "^1.39.0"
|
||||
},
|
||||
"version": "0.10.3"
|
||||
|
||||
@@ -1,15 +1,4 @@
|
||||
import type { Page } from '@playwright/test';
|
||||
import { expect } from '@playwright/test';
|
||||
|
||||
export async function checkBlockHub(page: Page) {
|
||||
const box = await page.locator('affine-block-hub').boundingBox();
|
||||
if (!box) throw new Error('block-hub not found');
|
||||
await page.getByTestId('block-hub').click();
|
||||
await page.waitForTimeout(500);
|
||||
const box2 = await page.locator('affine-block-hub').boundingBox();
|
||||
if (!box2) throw new Error('block-hub not found');
|
||||
expect(box2.height).toBeGreaterThan(box.height);
|
||||
}
|
||||
|
||||
export async function clickEdgelessModeButton(page: Page) {
|
||||
await page.getByTestId('switch-edgeless-mode-button').click({
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'ses';
|
||||
import '@affine/component/theme/global.css';
|
||||
import '@affine/component/theme/theme.css';
|
||||
import '@toeverything/components/style.css';
|
||||
import { createI18n } from '@affine/i18n';
|
||||
import MockSessionContext, {
|
||||
mockAuthStates,
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
"wait-on": "^7.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blocksuite/block-std": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/editor": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/global": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/block-std": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/blocks": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/global": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/icons": "2.1.36",
|
||||
"@blocksuite/lit": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/store": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/virgo": "0.0.0-20231124123613-7c06e95d-nightly",
|
||||
"@blocksuite/lit": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/presets": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/store": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@blocksuite/virgo": "0.11.0-nightly-202312070955-2b5bb47",
|
||||
"@dnd-kit/sortable": "^8.0.0",
|
||||
"@tomfreudenberg/next-auth-mock": "^0.5.6",
|
||||
"chromatic": "^9.1.0",
|
||||
@@ -51,9 +51,9 @@
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@blocksuite/blocks": "*",
|
||||
"@blocksuite/editor": "*",
|
||||
"@blocksuite/global": "*",
|
||||
"@blocksuite/icons": "2.1.34",
|
||||
"@blocksuite/presets": "*",
|
||||
"@blocksuite/store": "*"
|
||||
},
|
||||
"version": "0.10.3"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { toast } from '@affine/component';
|
||||
import { BlockCard } from '@affine/component/card/block-card';
|
||||
import { WorkspaceCard } from '@affine/component/card/workspace-card';
|
||||
import { Tooltip } from '@affine/component/ui/tooltip';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { getOrCreateWorkspace } from '@affine/workspace/manager';
|
||||
import {
|
||||
@@ -10,7 +11,6 @@ import {
|
||||
PageIcon,
|
||||
} from '@blocksuite/icons';
|
||||
import type { Meta } from '@storybook/react';
|
||||
import { Tooltip } from '@toeverything/components/tooltip';
|
||||
|
||||
export default {
|
||||
title: 'AFFiNE/Card',
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { RootBlockHub } from '@affine/component/block-hub';
|
||||
import { BlockSuiteEditor } from '@affine/component/block-suite-editor';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
||||
@@ -44,21 +43,18 @@ fetch(new URL('@affine-test/fixtures/large-image.png', import.meta.url))
|
||||
|
||||
export const Default = () => {
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
style={{
|
||||
height: '100vh',
|
||||
width: '100vw',
|
||||
overflow: 'auto',
|
||||
}}
|
||||
>
|
||||
<BlockSuiteEditor mode="page" page={page} />
|
||||
{createPortal(
|
||||
<ImagePreviewModal pageId={page.id} workspace={page.workspace} />,
|
||||
document.body
|
||||
)}
|
||||
</div>
|
||||
<RootBlockHub />
|
||||
</>
|
||||
<div
|
||||
style={{
|
||||
height: '100vh',
|
||||
width: '100vw',
|
||||
overflow: 'auto',
|
||||
}}
|
||||
>
|
||||
<BlockSuiteEditor mode="page" page={page} />
|
||||
{createPortal(
|
||||
<ImagePreviewModal pageId={page.id} workspace={page.workspace} />,
|
||||
document.body
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Button } from '@affine/component/ui/button';
|
||||
import { CMDKContainer, CMDKModal } from '@affine/core/components/pure/cmdk';
|
||||
import type { Meta, StoryFn } from '@storybook/react';
|
||||
import { Button } from '@toeverything/components/button';
|
||||
import { useState } from 'react';
|
||||
|
||||
export default {
|
||||
|
||||
Reference in New Issue
Block a user