test: migrate test & utils (#14569)

#### PR Dependency Tree


* **PR #14569** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Upgraded development test tooling to Vitest v4 and added Playwright
browser test integration; normalized test configurations and CI shard
matrix.

* **Tests**
* Added a large suite of new integration tests covering editor flows
(edgeless, database, embeds, images, latex, code, clipboard,
multi-editor, presentation, undo/redo, etc.).
* Removed numerous end-to-end Playwright test suites across the same
feature areas.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-03-07 04:12:27 +08:00
committed by GitHub
parent b5d5b71f95
commit f34e25e122
61 changed files with 370 additions and 328 deletions

View File

@@ -226,7 +226,7 @@ jobs:
strategy:
fail-fast: false
matrix:
shard: [1, 2]
shard: [1, 2, 3, 4, 5]
steps:
- uses: actions/checkout@v6
- name: Setup Node.js
@@ -356,7 +356,7 @@ jobs:
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
shard: [1, 2, 3, 4, 5]
steps:
- uses: actions/checkout@v6
- name: Setup Node.js

View File

@@ -300,6 +300,6 @@
"devDependencies": {
"@vanilla-extract/vite-plugin": "^5.0.0",
"msw": "^2.12.4",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
}
}

View File

@@ -11,7 +11,7 @@ export default defineConfig({
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 1000,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/blocksuite-affine',
},

View File

@@ -31,7 +31,8 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"@vitest/browser-playwright": "^4.0.18",
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -1,3 +1,4 @@
import { playwright } from '@vitest/browser-playwright';
import { defineConfig } from 'vitest/config';
export default defineConfig({
@@ -8,10 +9,9 @@ export default defineConfig({
browser: {
enabled: true,
headless: true,
name: 'chromium',
provider: 'playwright',
instances: [{ browser: 'chromium' }],
provider: playwright(),
isolate: false,
providerOptions: {},
},
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,

View File

@@ -45,8 +45,10 @@ export class AffineCodeUnit extends ShadowlessElement {
if (!codeBlock || !vElement) return plainContent;
const tokens = codeBlock.highlightTokens$.value;
if (tokens.length === 0) return plainContent;
const line = tokens[vElement.lineIndex];
if (!line) return plainContent;
// copy the tokens to avoid modifying the original tokens
const lineTokens = structuredClone(tokens[vElement.lineIndex]);
const lineTokens = structuredClone(line);
if (lineTokens.length === 0) return plainContent;
const startOffset = vElement.startOffset;

View File

@@ -35,7 +35,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -35,7 +35,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -31,7 +31,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -33,7 +33,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -32,7 +32,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -15,7 +15,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts"

View File

@@ -8,7 +8,7 @@ export default defineConfig({
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/ext-loader',
},

View File

@@ -34,7 +34,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -32,7 +32,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -29,7 +29,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -34,7 +34,8 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"@vitest/browser-playwright": "^4.0.18",
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -1,3 +1,4 @@
import { playwright } from '@vitest/browser-playwright';
import { defineConfig } from 'vitest/config';
export default defineConfig({
@@ -8,10 +9,9 @@ export default defineConfig({
browser: {
enabled: true,
headless: true,
name: 'chromium',
provider: 'playwright',
instances: [{ browser: 'chromium' }],
provider: playwright(),
isolate: false,
providerOptions: {},
},
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,

View File

@@ -74,7 +74,7 @@
],
"devDependencies": {
"@types/pdfmake": "^0.2.12",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"version": "0.26.3"
}

View File

@@ -9,7 +9,7 @@ export default defineConfig({
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 1000,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul', // or 'istanbul'
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/affine-shared',
},

View File

@@ -62,7 +62,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"version": "0.26.3"
}

View File

@@ -5,7 +5,7 @@ export default defineConfig({
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/global',
},

View File

@@ -33,7 +33,8 @@
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "^3.2.4"
"@vitest/browser-playwright": "^4.0.18",
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -1,3 +1,4 @@
import { playwright } from '@vitest/browser-playwright';
import { defineConfig } from 'vitest/config';
export default defineConfig({
@@ -8,15 +9,14 @@ export default defineConfig({
browser: {
enabled: true,
headless: true,
name: 'chromium',
provider: 'playwright',
instances: [{ browser: 'chromium' }],
provider: playwright(),
isolate: false,
providerOptions: {},
},
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/std',
},

View File

@@ -29,7 +29,7 @@
"devDependencies": {
"@types/lodash.clonedeep": "^4.5.9",
"@types/lodash.merge": "^4.6.9",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
".": "./src/index.ts",

View File

@@ -7,15 +7,11 @@ export * from './transformer';
export { type IdGenerator, nanoid, uuidv4 } from './utils/id-generator';
export * from './yjs';
const env = (
typeof globalThis !== 'undefined'
? globalThis
: typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: {}
) as Record<string, boolean>;
const env = (typeof globalThis !== 'undefined'
? globalThis
: typeof window !== 'undefined'
? window
: {}) as unknown as Record<string, boolean>;
const importIdentifier = '__ $BLOCKSUITE_STORE$ __';
if (env[importIdentifier] === true) {

View File

@@ -8,7 +8,7 @@ export default defineConfig({
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/store',
},

View File

@@ -19,7 +19,7 @@
"y-protocols": "^1.0.6"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"peerDependencies": {
"yjs": "*"

View File

@@ -5,7 +5,7 @@ export default defineConfig({
include: ['src/__tests__/**/*.unit.spec.ts'],
testTimeout: 500,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../../.coverage/sync',
},

View File

@@ -6,7 +6,7 @@
"dev": "vite",
"build": "tsc",
"test:unit": "vitest --browser.headless --run",
"test:debug": "PWDEBUG=1 npx vitest"
"test:debug": "PWDEBUG=1 npx vitest --browser.headless=false"
},
"sideEffects": false,
"keywords": [],
@@ -41,10 +41,11 @@
],
"devDependencies": {
"@vanilla-extract/vite-plugin": "^5.0.0",
"@vitest/browser-playwright": "^4.0.18",
"vite": "^7.2.7",
"vite-plugin-istanbul": "^7.2.1",
"vite-plugin-wasm": "^3.5.0",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"version": "0.26.3"
}

View File

@@ -1,4 +1,5 @@
import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
import { playwright } from '@vitest/browser-playwright';
import { defineConfig } from 'vitest/config';
export default defineConfig(_configEnv =>
@@ -18,13 +19,13 @@ export default defineConfig(_configEnv =>
retry: process.env.CI === 'true' ? 3 : 0,
browser: {
enabled: true,
headless: process.env.CI === 'true',
headless: true,
instances: [
{ browser: 'chromium' },
{ browser: 'firefox' },
{ browser: 'webkit' },
],
provider: 'playwright',
provider: playwright(),
isolate: false,
viewport: {
width: 1024,
@@ -32,16 +33,13 @@ export default defineConfig(_configEnv =>
},
},
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul',
reporter: ['lcov'],
reportsDirectory: '../../.coverage/integration-test',
},
deps: {
interopDefault: true,
},
testTransformMode: {
web: ['src/__tests__/**/*.spec.ts'],
},
},
})
);

View File

@@ -64,9 +64,9 @@
"@types/node": "^22.0.0",
"@typescript-eslint/parser": "^8.55.0",
"@vanilla-extract/vite-plugin": "^5.0.0",
"@vitest/browser": "^3.2.4",
"@vitest/coverage-istanbul": "^3.2.4",
"@vitest/ui": "^3.2.4",
"@vitest/browser": "^4.0.18",
"@vitest/coverage-istanbul": "^4.0.18",
"@vitest/ui": "^4.0.18",
"cross-env": "^10.1.0",
"electron": "^39.0.0",
"eslint": "^9.39.2",
@@ -90,7 +90,7 @@
"typescript-eslint": "^8.55.0",
"unplugin-swc": "^1.5.9",
"vite": "^7.2.7",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"packageManager": "yarn@4.12.0",
"resolutions": {

View File

@@ -4,9 +4,6 @@
"version": "0.26.3",
"description": "Affine Node.js server",
"type": "module",
"bin": {
"run-test": "./scripts/run-test.ts"
},
"scripts": {
"build": "affine bundle -p @affine/server",
"dev": "nodemon ./src/index.ts",

View File

@@ -10,7 +10,7 @@
},
"devDependencies": {
"@types/debug": "^4.1.12",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"version": "0.26.3"
}

View File

@@ -3,7 +3,7 @@
"private": true,
"type": "module",
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"exports": {
"./automation": "./src/automation.ts",

View File

@@ -11,6 +11,6 @@
"graphql": "^16.9.0"
},
"devDependencies": {
"vitest": "^3.2.4"
"vitest": "^4.0.18"
}
}

View File

@@ -18,7 +18,7 @@
"@graphql-codegen/typescript-operations": "^4.6.1",
"@types/lodash-es": "^4.17.12",
"prettier": "^3.7.4",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"scripts": {
"build": "gql-gen --errors-only"

View File

@@ -39,7 +39,7 @@
"@types/react": "^19.0.1",
"fake-indexeddb": "^6.0.0",
"rxjs": "^7.8.2",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"peerDependencies": {
"electron": "*",

View File

@@ -2,6 +2,7 @@
"extends": "../../../tsconfig.web.json",
"include": ["./src"],
"compilerOptions": {
"types": ["build-config", "affine__env", "node"],
"rootDir": "./src",
"outDir": "./dist",
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"

View File

@@ -37,7 +37,7 @@
"fake-indexeddb": "^6.0.0",
"idb": "^8.0.0",
"socket.io-client": "^4.8.3",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"peerDependencies": {
"@affine/error": "workspace:*",

View File

@@ -2,6 +2,7 @@
"extends": "../../../tsconfig.web.json",
"include": ["./src"],
"compilerOptions": {
"types": ["build-config", "affine__env", "node"],
"rootDir": "./src",
"outDir": "./dist",
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"

View File

@@ -19,7 +19,7 @@
},
"devDependencies": {
"@blocksuite/affine": "workspace:*",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"peerDependencies": {
"@blocksuite/affine": "workspace:*"

View File

@@ -12,7 +12,7 @@
},
"devDependencies": {
"@types/aws4": "^1.11.6",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"version": "0.26.3"
}

View File

@@ -69,7 +69,7 @@
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.17",
"tailwindcss-animate": "^1.0.7",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"scripts": {
"build": "affine bundle",

View File

@@ -2,6 +2,7 @@
"extends": "../../../tsconfig.web.json",
"include": ["./src", "./src/config.json"],
"compilerOptions": {
"types": ["build-config", "affine__env", "node"],
"resolveJsonModule": true,
"rootDir": "./src",
"outDir": "./dist",

View File

@@ -73,7 +73,7 @@
"tree-kill": "^1.2.2",
"typescript": "^5.9.3",
"uuid": "^13.0.0",
"vitest": "^3.2.4",
"vitest": "^4.0.18",
"zod": "^3.25.76"
},
"dependencies": {

View File

@@ -24,13 +24,10 @@ export default defineConfig({
setupFiles: [resolve(rootDir, './scripts/setup/global.ts')],
include: ['./test/**/*.spec.ts'],
testTimeout: 5000,
poolOptions: {
forks: {
singleFork: true,
},
},
pool: 'forks',
maxWorkers: 1,
coverage: {
provider: 'istanbul', // or 'c8'
provider: 'istanbul', // or 'istanbul'
reporter: ['lcov'],
reportsDirectory: resolve(rootDir, '.coverage/electron'),
},

View File

@@ -14,6 +14,6 @@
},
"devDependencies": {
"typescript": "^5.9.3",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
}
}

View File

@@ -73,19 +73,19 @@
"devDependencies": {
"@affine-tools/utils": "workspace:*",
"@blocksuite/affine": "workspace:*",
"@storybook/react": "^10.2.13",
"@storybook/react-vite": "^10.2.13",
"@storybook/react": "^10.2.14",
"@storybook/react-vite": "^10.2.14",
"@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.1.0",
"@types/bytes": "^3.1.5",
"@types/react": "^19.0.1",
"@types/react-dom": "^19.0.2",
"@vanilla-extract/css": "^1.17.0",
"storybook": "^10.2.13",
"storybook": "^10.2.14",
"typescript": "^5.9.3",
"unplugin-swc": "^1.5.9",
"vite": "^7.2.7",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"version": "0.26.3"
}

View File

@@ -112,6 +112,6 @@
"fake-indexeddb": "^6.0.0",
"happy-dom": "^20.3.0",
"lodash-es": "^4.17.23",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
}
}

View File

@@ -1,9 +1,7 @@
/**
* @vitest-environment happy-dom
*/
import { afterEach } from 'node:test';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
import { resolveLinkToDoc, toURLSearchParams } from '../utils';

View File

@@ -29,6 +29,6 @@
"@affine-tools/cli": "workspace:*",
"@affine-tools/utils": "workspace:*",
"glob": "^11.0.0",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
}
}

View File

@@ -14,7 +14,7 @@
"@affine-tools/utils": "workspace:*",
"path-to-regexp": "^8.3.0",
"query-string": "^9.1.1",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
},
"peerDependencies": {
"react": "^19.2.1",

View File

@@ -14,6 +14,6 @@
},
"devDependencies": {
"@types/react": "^19.0.1",
"vitest": "^3.2.4"
"vitest": "^4.0.18"
}
}

View File

@@ -46,6 +46,11 @@ export default defineConfig({
},
},
test: {
projects: [
'.',
'./packages/frontend/apps/electron',
'./blocksuite/**/*/vitest.config.ts',
],
setupFiles: [
resolve(rootDir, './scripts/setup/polyfill.ts'),
resolve(rootDir, './scripts/setup/lit.ts'),
@@ -66,8 +71,7 @@ export default defineConfig({
],
testTimeout: 5000,
coverage: {
all: false,
provider: 'istanbul', // or 'c8'
provider: 'istanbul', // or 'istanbul'
reporter: ['lcov'],
reportsDirectory: resolve(rootDir, '.coverage/store'),
},

View File

@@ -1,7 +0,0 @@
import { defineWorkspace } from 'vitest/config';
export default defineWorkspace([
'.',
'./packages/frontend/apps/electron',
'./blocksuite/**/*/vitest.config.ts',
]);

512
yarn.lock

File diff suppressed because it is too large Load Diff