refactor: move test utils to package (#3206)

This commit is contained in:
Alex Yang
2023-07-13 17:05:01 +08:00
committed by GitHub
parent 4f5ed30298
commit 0230cea16e
61 changed files with 199 additions and 551 deletions

View File

@@ -232,6 +232,7 @@ jobs:
- name: Run playwright tests
run: yarn e2e --forbid-only --shard=${{ matrix.shard }}/${{ strategy.job-total }}
working-directory: tests/affine-local
env:
COVERAGE: true

7
.gitignore vendored
View File

@@ -60,9 +60,10 @@ out/
storybook-static
i18n-generated.ts
/test-results/
/playwright-report/
/playwright/.cache/
test-results
playwright-report
playwright/.cache
download
# Cache
.eslintcache

11
nx.json
View File

@@ -88,17 +88,6 @@
}
]
},
"e2e:coverage": {
"outputs": ["{workspaceRoot}/.nyc_output", "{projectRoot}/test-results"],
"inputs": [
{
"runtime": "node -v"
},
{
"runtime": "yarn playwright --version"
}
]
},
"test": {
"outputs": ["{workspaceRoot}/.nyc_output"],
"inputs": [

View File

@@ -11,7 +11,8 @@
"packages/*",
"tests/fixtures",
"tests/kit",
"tests/affine-legacy/*"
"tests/affine-legacy/*",
"tests/affine-local"
],
"engines": {
"node": ">=18.16.1 <19.0.0"
@@ -35,8 +36,6 @@
"lint:prettier:fix": "prettier --ignore-unknown --cache --write .",
"lint": "yarn lint:eslint && yarn lint:prettier",
"lint:fix": "yarn lint:eslint:fix && yarn lint:prettier:fix",
"e2e": "playwright test",
"e2e:coverage": "COVERAGE=true yarn e2e --forbid-only",
"test": "ENABLE_PRELOADING=false vitest --run",
"test:ui": "ENABLE_PRELOADING=false vitest --ui",
"test:coverage": "ENABLE_PRELOADING=false vitest run --coverage",

View File

@@ -1,7 +1,4 @@
import { test } from '@affine-test/kit/playwright';
import type { Page } from '@playwright/test';
import { expect } from '@playwright/test';
import {
changeFilter,
checkDatePicker,
@@ -15,14 +12,16 @@ import {
selectDateFromDatePicker,
selectMonthFromMonthPicker,
selectTag,
} from '../libs/filter';
import { openHomePage } from '../libs/load-page';
} from '@affine-test/kit/utils/filter';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
closeDownloadTip,
getBlockSuiteEditorTitle,
waitEditorLoad,
} from '../libs/page-logic';
import { clickSideBarAllPageButton } from '../libs/sidebar';
} from '@affine-test/kit/utils/page-logic';
import { clickSideBarAllPageButton } from '@affine-test/kit/utils/sidebar';
import type { Page } from '@playwright/test';
import { expect } from '@playwright/test';
function getAllPage(page: Page) {
const newPageButton = page

View File

@@ -1,8 +1,7 @@
import { test } from '@affine-test/kit/playwright';
import { checkBlockHub } from '../../libs/editor';
import { openHomePage } from '../../libs/load-page';
import { newPage, waitEditorLoad } from '../../libs/page-logic';
import { checkBlockHub } from '@affine-test/kit/utils/editor';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { newPage, waitEditorLoad } from '@affine-test/kit/utils/page-logic';
test('block-hub should work', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { newPage, waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import type { Page } from '@playwright/test';
import { expect } from '@playwright/test';
import { openHomePage } from '../../libs/load-page';
import { newPage, waitEditorLoad } from '../../libs/page-logic';
const addDatabase = async (page: Page) => {
await page.keyboard.press('/', { delay: 50 });
await page.keyboard.press('d');

View File

@@ -1,12 +1,15 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
clickPageMoreActions,
waitEditorLoad,
} from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { clickPageMoreActions, waitEditorLoad } from '../libs/page-logic';
test('Switch to edgeless by switch edgeless item', async ({ page }) => {
async function getCount(): Promise<number> {
return page.evaluate(() => {
// @ts-expect-error
return globalThis.__toastCount;
});
}
@@ -14,8 +17,10 @@ test('Switch to edgeless by switch edgeless item', async ({ page }) => {
await waitEditorLoad(page);
const btn = await page.getByTestId('switch-edgeless-mode-button');
await page.evaluate(() => {
// @ts-expect-error
globalThis.__toastCount = 0;
window.addEventListener('affine-toast:emit', () => {
// @ts-expect-error
globalThis.__toastCount++;
});
});

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
test('Click right-bottom corner contact icon', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -5,6 +5,7 @@ test('should have page0', async ({ page }) => {
await page.goto('http://localhost:8080/_debug/init-page.html');
await page.waitForSelector('v-line');
const pageId = await page.evaluate(async () => {
// @ts-expect-error
return globalThis.page.id;
});
expect(pageId).toBe('page0');

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
test('drag a page from "All pages" list onto the "Trash" folder in the sidebar to move it to trash list', async ({
page,
}) => {

View File

@@ -1,13 +1,12 @@
import type { Page } from '@playwright/test';
import { expect, test } from '@playwright/test';
import fs from 'fs';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
} from '@affine-test/kit/utils/page-logic';
import type { Page } from '@playwright/test';
import { expect, test } from '@playwright/test';
import fs from 'fs';
async function importImage(page: Page, url: string) {
await page.evaluate(

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
test('Collapse Sidebar', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,9 +1,10 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { resolve } from 'node:path';
import { openHomePage } from '../libs/load-page';
import { newPage, waitEditorLoad } from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
import { rootDir, test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { newPage, waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('should create a page with a local first avatar', async ({ page }) => {
await openHomePage(page);
@@ -21,7 +22,7 @@ test('should create a page with a local first avatar', async ({ page }) => {
await page.getByText('current').click();
await page
.getByTestId('upload-avatar')
.setInputFiles('./tests/fixtures/smile.png');
.setInputFiles(resolve(rootDir, 'tests', 'fixtures', 'smile.png'));
await page.mouse.click(0, 0);
await page.getByTestId('workspace-name').click();
await page.getByTestId('workspace-card').nth(0).click();

View File

@@ -1,15 +1,17 @@
import { test } from '@affine-test/kit/playwright';
import type { Page } from '@playwright/test';
import { expect } from '@playwright/test';
import { checkDatePicker, selectDateFromDatePicker } from '../libs/filter';
import { openHomePage } from '../libs/load-page';
import {
checkDatePicker,
selectDateFromDatePicker,
} from '@affine-test/kit/utils/filter';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
closeDownloadTip,
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
} from '@affine-test/kit/utils/page-logic';
import type { Page } from '@playwright/test';
import { expect } from '@playwright/test';
const createAndPinCollection = async (
page: Page,

View File

@@ -1,13 +1,12 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('New a page , then delete it in all pages, permanently delete it', async ({
page,

View File

@@ -1,13 +1,12 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { openWorkspaceSettingPanel } from '@affine-test/kit/utils/setting';
import { openSettingModal } from '@affine-test/kit/utils/setting';
import { clickSideBarCurrentWorkspaceBanner } from '@affine-test/kit/utils/sidebar';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
import { openWorkspaceSettingPanel } from '../libs/setting';
import { openSettingModal } from '../libs/setting';
import { clickSideBarCurrentWorkspaceBanner } from '../libs/sidebar';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
test('Create new workspace, then delete it', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,14 +1,13 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
clickPageMoreActions,
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test.skip('New a page ,then open it and export html', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,15 +1,14 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
clickPageMoreActions,
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { waitForLogMessage } from '../libs/utils';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { waitForLogMessage } from '@affine-test/kit/utils/utils';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('New a page and open it ,then favorite it', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,14 +1,13 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
clickPageMoreActions,
createLinkedPage,
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
} from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
test('Show favorite items in sidebar', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,13 +1,12 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('click btn new page', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,13 +1,12 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('click btn bew page and open in tab', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,13 +1,12 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('New a page , then delete it in all pages, restore it', async ({
page,

View File

@@ -1,14 +1,13 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
clickPageMoreActions,
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('New a page ,then open it and show delete modal', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,13 +1,12 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import {
getBlockSuiteEditorTitle,
newPage,
waitEditorLoad,
} from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
} from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('New a page , then delete it in all pages, finally find it in trash', async ({
page,

View File

@@ -1,11 +1,13 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { clickSideBarAllPageButton } from '@affine-test/kit/utils/sidebar';
import {
createWorkspace,
openWorkspaceListModal,
} from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
import { clickSideBarAllPageButton } from '../libs/sidebar';
import { createWorkspace, openWorkspaceListModal } from '../libs/workspace';
test('just one item in the workspace list at first', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,10 +1,9 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { assertCurrentWorkspaceFlavour } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
import { assertCurrentWorkspaceFlavour } from '../libs/workspace';
test('preset workspace name', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,10 +1,9 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { createWorkspace } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
import { createWorkspace } from '../libs/workspace';
test('Open last workspace when back to affine', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,10 +1,9 @@
import { test } from '@affine-test/kit/playwright';
import { withCtrlOrMeta } from '@affine-test/kit/utils/keyboard';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { newPage, waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect, type Page } from '@playwright/test';
import { withCtrlOrMeta } from '../libs/keyboard';
import { openHomePage } from '../libs/load-page';
import { newPage, waitEditorLoad } from '../libs/page-logic';
const openQuickSearchByShortcut = async (page: Page) =>
await withCtrlOrMeta(page, () => page.keyboard.press('k', { delay: 50 }));

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage, webUrl } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage, webUrl } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
test('goto not found page', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,15 +1,14 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import {
openAboutPanel,
openAppearancePanel,
openSettingModal,
openShortcutsPanel,
} from '../libs/setting';
import { createWorkspace } from '../libs/workspace';
} from '@affine-test/kit/utils/setting';
import { createWorkspace } from '@affine-test/kit/utils/workspace';
import { expect } from '@playwright/test';
test('Open settings modal', async ({ page }) => {
await openHomePage(page);

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
test('Open shortcuts modal', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,9 +1,8 @@
import { test } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
test('Create subpage', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);

View File

@@ -1,11 +1,10 @@
import { resolve } from 'node:path';
import { test, testResultDir } from '@affine-test/kit/playwright';
import { openHomePage } from '@affine-test/kit/utils/load-page';
import { waitEditorLoad } from '@affine-test/kit/utils/page-logic';
import { expect } from '@playwright/test';
import { openHomePage } from '../libs/load-page';
import { waitEditorLoad } from '../libs/page-logic';
// default could be anything, according to the system
test('default white', async ({ browser }) => {
const context = await browser.newContext({

View File

@@ -0,0 +1,12 @@
{
"name": "@affine-test/affine-local",
"private": true,
"scripts": {
"e2e": "yarn playwright test"
},
"devDependencies": {
"@affine-test/fixtures": "workspace:*",
"@affine-test/kit": "workspace:*",
"@playwright/test": "^1.35.1"
}
}

View File

@@ -14,7 +14,7 @@ import type {
* See https://playwright.dev/docs/test-configuration.
*/
const config: PlaywrightTestConfig = {
testDir: './tests/parallels',
testDir: './e2e',
fullyParallel: true,
timeout: process.env.CI ? 50_000 : 30_000,
use: {

View File

@@ -0,0 +1,16 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"esModuleInterop": true,
"outDir": "lib"
},
"include": ["e2e"],
"references": [
{
"path": "../kit"
},
{
"path": "../fixtures"
}
]
}

View File

@@ -3,7 +3,8 @@
"private": true,
"version": "0.7.0-canary.44",
"exports": {
"./playwright": "./playwright.ts"
"./playwright": "./playwright.ts",
"./utils/*": "./utils/*.ts"
},
"devDependencies": {
"@playwright/test": "^1.35.1"

View File

@@ -5,5 +5,5 @@
"noEmit": false,
"outDir": "lib"
},
"include": ["./*.ts"]
"include": ["./*.ts", "utils"]
}

14
tests/kit/utils/utils.ts Normal file
View File

@@ -0,0 +1,14 @@
import type { Page } from '@playwright/test';
export async function waitForLogMessage(
page: Page,
log: string
): Promise<boolean> {
return new Promise(resolve => {
page.on('console', msg => {
if (msg.type() === 'log' && msg.text() === log) {
resolve(true);
}
});
});
}

View File

@@ -34,6 +34,7 @@ export async function assertCurrentWorkspaceFlavour(
flavour: 'affine' | 'local',
page: Page
) {
// @ts-expect-error
const actual = await page.evaluate(() => globalThis.currentWorkspace.flavour);
expect(actual).toBe(flavour);
}

View File

@@ -1,140 +0,0 @@
import type { PageMeta } from '@blocksuite/store';
import { faker } from '@faker-js/faker';
import type { Page } from '@playwright/test';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const user1 = require('@affine-test/fixtures/built-in-user1.json');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const user2 = require('@affine-test/fixtures/built-in-user2.json');
export async function getBuiltInUser() {
return Promise.all([
fetch('http://localhost:3000/api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugLoginUser',
email: user1.email,
password: user1.password,
}),
}).then(r => r.json()),
fetch('http://localhost:3000/api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugLoginUser',
email: user2.email,
password: user2.password,
}),
}).then(r => r.json()),
]);
}
export async function createFakeUser(
userA = {
name: faker.name.fullName(),
email: faker.internet.email(),
password: faker.internet.password(),
},
userB = {
name: faker.name.fullName(),
email: faker.internet.email(),
password: faker.internet.password(),
}
) {
try {
const response = await Promise.all([
fetch('http://127.0.0.1:3000/api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugLoginUser',
email: userA.email,
password: userA.password,
}),
}),
fetch('http://127.0.0.1:3000/api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugLoginUser',
email: userB.email,
password: userB.password,
}),
}),
]);
return Promise.all(
response.map(res => {
if (!res.ok) {
throw new Error('User not found');
}
return res.json();
})
);
} catch (e) {
const response = await Promise.all([
// Register user A
fetch('http://localhost:3000/api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugCreateUser',
...userA,
}),
}),
// Register user B
fetch('http://localhost:3000/api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugCreateUser',
...userB,
}),
}),
]);
return Promise.all(response.map(res => res.json()));
}
}
export async function loginUser(
page: Page,
token: {
refresh: string;
token: string;
}
) {
await page.evaluate(async token => {
globalThis.setLogin(token);
}, token);
}
export async function getMetas(page: Page): Promise<PageMeta[]> {
return page.evaluate(
() => globalThis.currentWorkspace.blockSuiteWorkspace.meta.pageMetas ?? []
);
}
export async function waitForLogMessage(
page: Page,
log: string
): Promise<boolean> {
return new Promise(resolve => {
page.on('console', msg => {
if (msg.type() === 'log' && msg.text() === log) {
resolve(true);
}
});
});
}

View File

@@ -1,40 +0,0 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../../libs/load-page';
import { waitEditorLoad } from '../../libs/page-logic';
import {
clickNewPageButton,
clickSideBarCurrentWorkspaceBanner,
} from '../../libs/sidebar';
import { getBuiltInUser, loginUser } from '../../libs/utils';
test.fixme('collaborative', async ({ page, browser }) => {
await openHomePage(page);
await waitEditorLoad(page);
const [a, b] = await getBuiltInUser();
await loginUser(page, a);
await page.reload();
await page.waitForTimeout(50);
await clickSideBarCurrentWorkspaceBanner(page);
await page.getByText('Cloud Workspace').click();
const context2 = await browser.newContext();
const page2 = await context2.newPage();
await openHomePage(page2);
await loginUser(page2, b);
await page2.reload();
await clickSideBarCurrentWorkspaceBanner(page2);
await page2.getByText('Joined Workspace').click();
await clickNewPageButton(page);
const url = page.url();
await page2.goto(url);
await page.focus('.affine-default-page-block-title');
await page.type('.affine-default-page-block-title', 'hello', {
delay: 100,
});
await page.waitForTimeout(100);
const title = (await page
.locator('.affine-default-page-block-title')
.textContent()) as string;
expect(title.trim()).toBe('hello');
});

View File

@@ -1,20 +0,0 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../../libs/load-page';
import { waitEditorLoad } from '../../libs/page-logic';
import { clickSideBarAllPageButton } from '../../libs/sidebar';
import { createFakeUser, loginUser } from '../../libs/utils';
import { enableAffineCloudWorkspace } from '../../libs/workspace';
test.fixme('authorization expired', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);
const [a] = await createFakeUser();
await loginUser(page, a);
await enableAffineCloudWorkspace(page);
await clickSideBarAllPageButton(page);
await page.evaluate(() => localStorage.removeItem('affine-login-v2'));
await openHomePage(page);
await expect(page.getByTestId('new-workspace')).toBeVisible();
});

View File

@@ -1,58 +0,0 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../../libs/load-page';
import { waitEditorLoad } from '../../libs/page-logic';
import { clickNewPageButton } from '../../libs/sidebar';
import { createFakeUser, loginUser } from '../../libs/utils';
import { createWorkspace } from '../../libs/workspace';
test.fixme('public single page', async ({ page, browser }) => {
await openHomePage(page);
const [a] = await createFakeUser();
await loginUser(page, a);
const name = `test-${Date.now()}`;
await createWorkspace({ name }, page);
await waitEditorLoad(page);
await clickNewPageButton(page);
const page1Id = page.url().split('/').at(-1);
await clickNewPageButton(page);
const page2Id = page.url().split('/').at(-1);
expect(typeof page2Id).toBe('string');
expect(page1Id).not.toBe(page2Id);
const title = 'This is page 2';
await page.locator('[data-block-is-title="true"]').type(title, {
delay: 50,
});
await page.getByTestId('share-menu-button').click();
await page.getByTestId('share-menu-enable-affine-cloud-button').click();
const promise = page.evaluate(
async () =>
new Promise(resolve =>
window.addEventListener('affine-workspace:transform', resolve, {
once: true,
})
)
);
await page.getByTestId('confirm-enable-cloud-button').click();
await promise;
await page.waitForSelector('v-line');
const currentTitle = await page
.locator('[data-block-is-title="true"]')
.textContent();
expect(currentTitle).toBe(title);
await page.getByTestId('share-menu-button').click();
await page.getByTestId('affine-share-create-link').click();
await page.getByTestId('affine-share-copy-link').click();
const url = await page.evaluate(() => navigator.clipboard.readText());
expect(url.startsWith('http://localhost:8080/public-workspace/')).toBe(true);
await page.waitForTimeout(1000);
const context2 = await browser.newContext();
const page2 = await context2.newPage();
await page2.goto(url);
await page2.waitForSelector('v-line');
const currentTitle2 = await page2
.locator('[data-block-is-title="true"]')
.textContent();
expect(currentTitle2).toBe(title);
});

View File

@@ -1,71 +0,0 @@
import { test } from '@affine-test/kit/playwright';
import { expect } from '@playwright/test';
import { openHomePage } from '../../libs/load-page';
import { waitEditorLoad } from '../../libs/page-logic';
import { clickPublishPanel } from '../../libs/setting';
import {
clickSideBarAllPageButton,
clickSideBarSettingButton,
} from '../../libs/sidebar';
import { createFakeUser, loginUser } from '../../libs/utils';
import { createWorkspace } from '../../libs/workspace';
test.fixme('enable public workspace', async ({ page, context }) => {
await openHomePage(page);
const [a] = await createFakeUser();
await loginUser(page, a);
await waitEditorLoad(page);
const name = `test-${Date.now()}`;
await createWorkspace({ name }, page);
await waitEditorLoad(page);
await clickSideBarSettingButton(page);
await page.waitForTimeout(50);
await clickPublishPanel(page);
await page.getByTestId('publish-enable-affine-cloud-button').click();
await page.getByTestId('confirm-enable-affine-cloud-button').click();
await page.getByTestId('publish-to-web-button').waitFor({
timeout: 10000,
});
await page.getByTestId('publish-to-web-button').click();
await page.getByTestId('share-url').waitFor({
timeout: 10000,
});
const url = await page.getByTestId('share-url').inputValue();
expect(url.startsWith('http://localhost:8080/public-workspace/')).toBe(true);
const page2 = await context.newPage();
await page2.goto(url);
await page2.waitForSelector('thead', {
timeout: 10000,
});
await page2.getByText('Untitled').click();
});
test.fixme('access public workspace page', async ({ page, browser }) => {
await openHomePage(page);
const [a] = await createFakeUser();
await loginUser(page, a);
await waitEditorLoad(page);
const name = `test-${Date.now()}`;
await createWorkspace({ name }, page);
await waitEditorLoad(page);
await clickSideBarSettingButton(page);
await page.waitForTimeout(50);
await clickPublishPanel(page);
await page.getByTestId('publish-enable-affine-cloud-button').click();
await page.getByTestId('confirm-enable-affine-cloud-button').click();
await page.getByTestId('publish-to-web-button').waitFor({
timeout: 10000,
});
await page.getByTestId('publish-to-web-button').click();
await page.getByTestId('share-url').waitFor({
timeout: 10000,
});
await clickSideBarAllPageButton(page);
await page.locator('tr').nth(2).click();
const url = page.url();
const context = await browser.newContext();
const page2 = await context.newPage();
await page2.goto(url.replace('workspace', 'public-workspace'));
await page2.waitForSelector('v-line');
});

View File

@@ -1,55 +0,0 @@
import { expect } from '@playwright/test';
import { openHomePage } from '../../libs/load-page';
import { waitEditorLoad } from '../../libs/page-logic';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const userA = require('../../fixtures/userA.json');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const userB = require('../../fixtures/userB.json');
import { test } from '@affine-test/kit/playwright';
import {
clickNewPageButton,
clickSideBarCurrentWorkspaceBanner,
} from '../../libs/sidebar';
import { createFakeUser, loginUser } from '../../libs/utils';
import {
assertCurrentWorkspaceFlavour,
createWorkspace,
enableAffineCloudWorkspace,
openWorkspaceListModal,
} from '../../libs/workspace';
test.fixme('should login with user A', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);
const [a] = await createFakeUser(userA, userB);
await loginUser(page, a);
await clickSideBarCurrentWorkspaceBanner(page);
const footer = page.locator('[data-testid="workspace-list-modal-footer"]');
expect(await footer.getByText(userA.name).isVisible()).toBe(true);
expect(await footer.getByText(userA.email).isVisible()).toBe(true);
await assertCurrentWorkspaceFlavour('local', page);
});
test.fixme('should enable affine workspace successfully', async ({ page }) => {
await openHomePage(page);
await waitEditorLoad(page);
const [a] = await createFakeUser();
await loginUser(page, a);
const name = `test-${Date.now()}`;
await createWorkspace({ name }, page);
await page.waitForTimeout(50);
await enableAffineCloudWorkspace(page);
await clickNewPageButton(page);
await page.locator('[data-block-is-title="true"]').type('Hello, world!', {
delay: 50,
});
await page.waitForTimeout(1000);
await assertCurrentWorkspaceFlavour('affine', page);
await openWorkspaceListModal(page);
await page.getByTestId('workspace-list-modal-sign-out').click();
await waitEditorLoad(page);
await assertCurrentWorkspaceFlavour('local', page);
});

View File

@@ -1,8 +0,0 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"baseUrl": ".",
"noEmit": true
},
"include": ["**.spec.ts", "**.test.ts"]
}

View File

@@ -2,10 +2,14 @@ import { expect, test } from 'vitest';
test('compare config', async () => {
const { default: nextConfigMock } = await import(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
'../../scripts/vitest/next-config-mock'
);
const mockConfig = nextConfigMock().publicRuntimeConfig;
const { default: nextConfig } = await import(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
'../../apps/web/next.config.mjs'
);
const config = nextConfig.publicRuntimeConfig;

8
tests/unit/tsconfig.json Normal file
View File

@@ -0,0 +1,8 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"baseUrl": "..",
"noEmit": true
},
"include": ["**.spec.ts"]
}

View File

@@ -120,12 +120,7 @@
{
"path": "./plugins/copilot"
},
// Tests
{
"path": "./tests"
},
// Packages
{
"path": "./packages/component"
},
@@ -144,9 +139,9 @@
{
"path": "./packages/y-indexeddb"
},
// Tests
{
"path": "./tests/fixtures"
"path": "./tests/unit"
},
{
"path": "./tests/kit"
@@ -154,6 +149,9 @@
{
"path": "./tsconfig.node.json"
},
{
"path": "./tests/affine-local"
},
{
"path": "./tests/affine-legacy/0.7.0-canary.18"
}

View File

@@ -38,6 +38,16 @@ __metadata:
languageName: unknown
linkType: soft
"@affine-test/affine-local@workspace:tests/affine-local":
version: 0.0.0-use.local
resolution: "@affine-test/affine-local@workspace:tests/affine-local"
dependencies:
"@affine-test/fixtures": "workspace:*"
"@affine-test/kit": "workspace:*"
"@playwright/test": ^1.35.1
languageName: unknown
linkType: soft
"@affine-test/fixtures@workspace:*, @affine-test/fixtures@workspace:tests/fixtures":
version: 0.0.0-use.local
resolution: "@affine-test/fixtures@workspace:tests/fixtures"