From 56c09a9ae9eb5fb02aa630f2ef6f0598711e8805 Mon Sep 17 00:00:00 2001 From: Simon <10131203+gaomeng1900@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:10:05 +0800 Subject: [PATCH] test(page-controller): add happy-dom env and basic tests --- package-lock.json | 75 +++++++++++++++++++ packages/page-controller/package.json | 4 + .../src/PageController.test.ts | 40 ++++++++++ packages/page-controller/vitest.config.js | 10 +++ 4 files changed, 129 insertions(+) create mode 100644 packages/page-controller/src/PageController.test.ts create mode 100644 packages/page-controller/vitest.config.js diff --git a/package-lock.json b/package-lock.json index 9a1025f..8e9b8be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3412,6 +3412,23 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.61.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", @@ -4346,6 +4363,19 @@ "dev": true, "license": "MIT" }, + "node_modules/buffer-image-size": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz", + "integrity": "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -6597,6 +6627,38 @@ "dev": true, "license": "MIT" }, + "node_modules/happy-dom": { + "version": "20.10.2", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.10.2.tgz", + "integrity": "sha512-5p9Sxis3eowDJKqx90QCsgbNA02XXqJ59NOHvD4V6cxp+rP4d/xOyVx7uY3hS8hiUbY1VeiFH8lbJ81AyuDVLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "buffer-image-size": "^0.6.4", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/happy-dom/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10875,6 +10937,16 @@ "dev": true, "license": "MIT" }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/when": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", @@ -11384,6 +11456,9 @@ "license": "MIT", "dependencies": { "ai-motion": "^0.4.8" + }, + "devDependencies": { + "happy-dom": "^20.10.2" } }, "packages/ui": { diff --git a/packages/page-controller/package.json b/packages/page-controller/package.json index d3039b1..5198599 100644 --- a/packages/page-controller/package.json +++ b/packages/page-controller/package.json @@ -42,10 +42,14 @@ "homepage": "https://alibaba.github.io/page-agent/", "scripts": { "build": "vite build", + "test": "vitest run", "prepublishOnly": "node ../../scripts/pre-publish.js", "postpublish": "node ../../scripts/post-publish.js" }, "dependencies": { "ai-motion": "^0.4.8" + }, + "devDependencies": { + "happy-dom": "^20.10.2" } } diff --git a/packages/page-controller/src/PageController.test.ts b/packages/page-controller/src/PageController.test.ts new file mode 100644 index 0000000..122d6ec --- /dev/null +++ b/packages/page-controller/src/PageController.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest' + +import { PageController } from './PageController' + +describe('PageController', () => { + it('constructs and exposes the current url', async () => { + const controller = new PageController() + expect(controller).toBeInstanceOf(PageController) + expect(await controller.getCurrentUrl()).toBe(window.location.href) + }) + + describe('executeJavascript', () => { + it('runs a script and returns its result', async () => { + const controller = new PageController() + const result = await controller.executeJavascript('return 1 + 2') + expect(result).toMatchObject({ success: true }) + expect(result.message).toContain('3') + }) + + it('exposes the abort signal to the script scope', async () => { + const controller = new PageController() + const controllerSignal = new AbortController() + controllerSignal.abort() + + const result = await controller.executeJavascript( + 'return signal.aborted', + controllerSignal.signal + ) + expect(result).toMatchObject({ success: true }) + expect(result.message).toContain('true') + }) + + it('reports a syntax error as a failed result', async () => { + const controller = new PageController() + const result = await controller.executeJavascript('return (') + expect(result.success).toBe(false) + expect(result.message).toContain('❌') + }) + }) +}) diff --git a/packages/page-controller/vitest.config.js b/packages/page-controller/vitest.config.js new file mode 100644 index 0000000..6877056 --- /dev/null +++ b/packages/page-controller/vitest.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'page-controller', + environment: 'happy-dom', + include: ['src/**/*.test.ts'], + silent: 'passed-only', + }, +})