From ff343185c92d46ec7b2cba8fa507c887dd158bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Wed, 27 May 2026 14:01:47 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=AE=89=E8=A3=85=20Playwright=20+=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20E2E=20=E5=9F=BA=E7=A1=80=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 安装 @playwright/test 1.60.0 - 创建 e2e/playwright.config.ts(webServer 自动启动 vite dev) - 创建 e2e/mocks/ipc.ts(Tauri IPC mock) - 新增 npm run test:e2e 脚本 Co-Authored-By: Claude Opus 4.7 --- e2e/mocks/ipc.ts | 24 ++++++++++++++ e2e/playwright.config.ts | 14 ++++++++ package-lock.json | 72 +++++++++++++++++++++++++++++++++++++--- package.json | 4 ++- 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 e2e/mocks/ipc.ts create mode 100644 e2e/playwright.config.ts diff --git a/e2e/mocks/ipc.ts b/e2e/mocks/ipc.ts new file mode 100644 index 0000000..e553e99 --- /dev/null +++ b/e2e/mocks/ipc.ts @@ -0,0 +1,24 @@ +export function createIpcMock() { + return ` + window.__TAURI_INTERNALS__ = { + invoke: async (cmd, args) => { + switch (cmd) { + case 'check_admin': return true; + case 'load_system_paths': return ['C:\\\\Windows', 'C:\\\\Program Files']; + case 'load_user_paths': return ['C:\\\\Users\\\\me\\\\AppData']; + case 'load_disabled_state': return { system: [], user: [] }; + case 'save_system_paths': return undefined; + case 'save_user_paths': return undefined; + case 'save_disabled_state': return undefined; + case 'backup_registry': return 'C:\\\\backup\\\\path.txt'; + case 'broadcast_env_change': return undefined; + case 'validate_path': return true; + case 'expand_env_vars': return 'C:\\\\Expanded'; + case 'read_text_file': return ''; + case 'get_appdata_dir': return 'C:\\\\appdata'; + default: throw new Error('Unexpected invoke: ' + cmd); + } + } + }; + `; +} diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts new file mode 100644 index 0000000..4be6c55 --- /dev/null +++ b/e2e/playwright.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + timeout: 10000, + use: { + baseURL: 'http://localhost:5173', + }, + webServer: { + command: 'npm run dev', + url: 'http://localhost:5173', + reuseExistingServer: true, + }, +}); diff --git a/package-lock.json b/package-lock.json index 115c08e..47672a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "v4.0", - "version": "0.0.0", + "name": "patheditor", + "version": "4.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "v4.0", - "version": "0.0.0", + "name": "patheditor", + "version": "4.0.0", "dependencies": { "@tailwindcss/vite": "^4.3.0", "@tauri-apps/api": "^2.11.0", @@ -21,6 +21,7 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@playwright/test": "^1.60.0", "@tauri-apps/cli": "^2.11.2", "@types/node": "^24.12.3", "@types/react": "^19.2.14", @@ -582,6 +583,22 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmmirror.com/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", @@ -3050,6 +3067,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", diff --git a/package.json b/package.json index 0da262b..3153531 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "lint": "eslint .", "preview": "vite preview", "test": "vitest run", - "test:watch": "vitest" + "test:watch": "vitest", + "test:e2e": "playwright test --config e2e/playwright.config.ts" }, "dependencies": { "@tailwindcss/vite": "^4.3.0", @@ -25,6 +26,7 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@playwright/test": "^1.60.0", "@tauri-apps/cli": "^2.11.2", "@types/node": "^24.12.3", "@types/react": "^19.2.14",