@nexustools/nwjstestrunner 0.0.0-stage → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +21 -0
- package/README.md +142 -2
- package/bin/nwjstestrunner.js +13 -0
- package/dist/cli/nwjs-cli-launcher.d.ts +10 -0
- package/dist/cli/nwjs-cli-launcher.d.ts.map +1 -0
- package/dist/cli/nwjs-cli-launcher.js +281 -0
- package/dist/cli/nwjs-cli-launcher.js.map +1 -0
- package/dist/config/harness-config-loader.d.ts +10 -0
- package/dist/config/harness-config-loader.d.ts.map +1 -0
- package/dist/config/harness-config-loader.js +242 -0
- package/dist/config/harness-config-loader.js.map +1 -0
- package/dist/core/test-runner.d.ts +61 -0
- package/dist/core/test-runner.d.ts.map +1 -0
- package/dist/core/test-runner.js +450 -0
- package/dist/core/test-runner.js.map +1 -0
- package/dist/esm/index.d.mts +2 -0
- package/dist/esm/index.mjs +26 -0
- package/dist/harness/graphical-overlay-view.d.ts +18 -0
- package/dist/harness/graphical-overlay-view.d.ts.map +1 -0
- package/dist/harness/graphical-overlay-view.js +213 -0
- package/dist/harness/graphical-overlay-view.js.map +1 -0
- package/dist/harness/nwjs-graphical-test-harness.d.ts +40 -0
- package/dist/harness/nwjs-graphical-test-harness.d.ts.map +1 -0
- package/dist/harness/nwjs-graphical-test-harness.js +398 -0
- package/dist/harness/nwjs-graphical-test-harness.js.map +1 -0
- package/dist/harness/test-http-server.d.ts +12 -0
- package/dist/harness/test-http-server.d.ts.map +1 -0
- package/dist/harness/test-http-server.js +183 -0
- package/dist/harness/test-http-server.js.map +1 -0
- package/dist/harness/test-log-writer.d.ts +29 -0
- package/dist/harness/test-log-writer.d.ts.map +1 -0
- package/dist/harness/test-log-writer.js +173 -0
- package/dist/harness/test-log-writer.js.map +1 -0
- package/dist/harness/webview-test-controller.d.ts +18 -0
- package/dist/harness/webview-test-controller.d.ts.map +1 -0
- package/dist/harness/webview-test-controller.js +163 -0
- package/dist/harness/webview-test-controller.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/matchers/deep-equality-helper.d.ts +10 -0
- package/dist/matchers/deep-equality-helper.d.ts.map +1 -0
- package/dist/matchers/deep-equality-helper.js +188 -0
- package/dist/matchers/deep-equality-helper.js.map +1 -0
- package/dist/matchers/expect-matcher.d.ts +7 -0
- package/dist/matchers/expect-matcher.d.ts.map +1 -0
- package/dist/matchers/expect-matcher.js +261 -0
- package/dist/matchers/expect-matcher.js.map +1 -0
- package/dist/mock/jest-mock-factory.d.ts +20 -0
- package/dist/mock/jest-mock-factory.d.ts.map +1 -0
- package/dist/mock/jest-mock-factory.js +141 -0
- package/dist/mock/jest-mock-factory.js.map +1 -0
- package/dist/tests/NwjsTestRunnerSuites.d.ts +3 -0
- package/dist/tests/NwjsTestRunnerSuites.d.ts.map +1 -0
- package/dist/tests/NwjsTestRunnerSuites.js +266 -0
- package/dist/tests/NwjsTestRunnerSuites.js.map +1 -0
- package/dist/types/test-runner-types.d.ts +321 -0
- package/dist/types/test-runner-types.d.ts.map +1 -0
- package/dist/types/test-runner-types.js +3 -0
- package/dist/types/test-runner-types.js.map +1 -0
- package/package.json +56 -4
- package/runner/demo-client.html +70 -0
- package/runner/index.html +223 -0
- package/runner/package.json +27 -0
- package/src/cli/nwjs-cli-launcher.ts +243 -0
- package/src/config/harness-config-loader.ts +214 -0
- package/src/core/test-runner.ts +553 -0
- package/src/harness/graphical-overlay-view.ts +219 -0
- package/src/harness/nwjs-graphical-test-harness.ts +468 -0
- package/src/harness/test-http-server.ts +162 -0
- package/src/harness/test-log-writer.ts +154 -0
- package/src/harness/webview-test-controller.ts +192 -0
- package/src/index.ts +28 -0
- package/src/matchers/deep-equality-helper.ts +193 -0
- package/src/matchers/expect-matcher.ts +361 -0
- package/src/mock/jest-mock-factory.ts +170 -0
- package/src/tests/NwjsTestRunnerSuites.ts +267 -0
- package/src/types/test-runner-types.ts +335 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# `@nexustools/nwjstestrunner` — Agent Architecture & Guidelines
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
`@nexustools/nwjstestrunner` (`D:\GitHub\nwjstestrunner`) is the shared graphical NW.js & `<webview>` Jest test runner package for NW.js Node.js applications across the `AICore` and `NexusTools` ecosystem.
|
|
5
|
+
|
|
6
|
+
## Modular 1-Class-Per-File Layout
|
|
7
|
+
Every `.ts` file in `src/` exports **at most 1 class**:
|
|
8
|
+
- [`src/types/test-runner-types.ts`](file:///D:/GitHub/nwjstestrunner/src/types/test-runner-types.ts) — Type definitions and configuration interfaces (0 classes)
|
|
9
|
+
- [`src/matchers/deep-equality-helper.ts`](file:///D:/GitHub/nwjstestrunner/src/matchers/deep-equality-helper.ts) — `DeepEqualityHelper` (1 class)
|
|
10
|
+
- [`src/matchers/expect-matcher.ts`](file:///D:/GitHub/nwjstestrunner/src/matchers/expect-matcher.ts) — `ExpectMatcherBuilder` + `expect()` (1 class)
|
|
11
|
+
- [`src/mock/jest-mock-factory.ts`](file:///D:/GitHub/nwjstestrunner/src/mock/jest-mock-factory.ts) — `JestMockFactory` + `jest` (1 class)
|
|
12
|
+
- [`src/core/test-runner.ts`](file:///D:/GitHub/nwjstestrunner/src/core/test-runner.ts) — `TestRunner` + `describe`, `it`, `test`, `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, `installJestGlobals` (1 class)
|
|
13
|
+
- [`src/harness/test-log-writer.ts`](file:///D:/GitHub/nwjstestrunner/src/harness/test-log-writer.ts) — `TestLogWriter` (1 class)
|
|
14
|
+
- [`src/harness/test-http-server.ts`](file:///D:/GitHub/nwjstestrunner/src/harness/test-http-server.ts) — `TestHttpServer` (1 class)
|
|
15
|
+
- [`src/harness/graphical-overlay-view.ts`](file:///D:/GitHub/nwjstestrunner/src/harness/graphical-overlay-view.ts) — `GraphicalOverlayView` (1 class)
|
|
16
|
+
- [`src/harness/webview-test-controller.ts`](file:///D:/GitHub/nwjstestrunner/src/harness/webview-test-controller.ts) — `WebviewTestController` (1 class)
|
|
17
|
+
- [`src/harness/nwjs-graphical-test-harness.ts`](file:///D:/GitHub/nwjstestrunner/src/harness/nwjs-graphical-test-harness.ts) — `NwjsGraphicalTestHarness` + `runNwjsTestHarness()` (1 class)
|
|
18
|
+
- [`src/config/harness-config-loader.ts`](file:///D:/GitHub/nwjstestrunner/src/config/harness-config-loader.ts) — `HarnessConfigLoader` (1 class)
|
|
19
|
+
- [`src/cli/nwjs-cli-launcher.ts`](file:///D:/GitHub/nwjstestrunner/src/cli/nwjs-cli-launcher.ts) — `NwjsCliLauncher` (1 class)
|
|
20
|
+
- [`src/index.ts`](file:///D:/GitHub/nwjstestrunner/src/index.ts) — Barrel export (0 classes)
|
|
21
|
+
- [`src/tests/NwjsTestRunnerSuites.ts`](file:///D:/GitHub/nwjstestrunner/src/tests/NwjsTestRunnerSuites.ts) — Self-test suites (0 classes)
|
package/README.md
CHANGED
|
@@ -1,3 +1,143 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@nexustools/nwjstestrunner`
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Graphical NW.js Window & `<webview>` Jest-Compatible Test Runner and Harness for NW.js Node.js Applications.
|
|
4
|
+
|
|
5
|
+
`@nexustools/nwjstestrunner` allows any NW.js Node.js package to run:
|
|
6
|
+
1. **Jest-Compatible Unit & Integration Test Suites** (`describe`, `it`, `test`, `expect`, `.resolves`, `.rejects`, `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, `jest.fn()`, `jest.spyOn()`) directly inside a real NW.js graphical environment with full Node.js + Chromium DOM access.
|
|
7
|
+
2. **Live `<webview>` Desktop Client DOM Integration Tests** with an isolated local HTTP server, custom mock API/SSE route handlers, console error capture, HTTP 404 tracking, `runInMainWorld` helpers, and screen readiness checks.
|
|
8
|
+
3. **Real-Time Graphical Progress Overlay & Deterministic Crash-Safe Logging** (`desktop-tests.log`) with startup `"Tests interupted"` watchdog protection, window-close detection, and automatic exit code (`0` or `1`).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install --save-dev @nexustools/nwjstestrunner
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For local live symlink development across `@nexustools` / `AICore` repositories:
|
|
19
|
+
```powershell
|
|
20
|
+
New-Item -ItemType Junction -Path "<project>\node_modules\@nexustools\nwjstestrunner" -Target "D:\GitHub\nwjstestrunner"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Usage Modes
|
|
26
|
+
|
|
27
|
+
### 1. CLI Runner (`npx nwjstestrunner`)
|
|
28
|
+
|
|
29
|
+
Add `nwjstestrunner` to your `package.json`:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc -p tsconfig.json",
|
|
35
|
+
"test": "npm run build && nwjstestrunner"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
And configure `nwjstestrunner.config.cjs` (or `"nwjstestrunner"` in `package.json`):
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
const path = require('path');
|
|
44
|
+
|
|
45
|
+
/** @type {import('@nexustools/nwjstestrunner').NwjsHarnessConfig} */
|
|
46
|
+
module.exports = {
|
|
47
|
+
title: '🧪 My NW.js App Test Runner',
|
|
48
|
+
logHeaderTitle: 'My NW.js App Desktop Client Test Harness Log',
|
|
49
|
+
projectRootDir: __dirname,
|
|
50
|
+
testLogPath: path.join(__dirname, 'testrunner', 'test-results', 'desktop-tests.log'),
|
|
51
|
+
enableWebview: true,
|
|
52
|
+
webviewEntryHtml: 'index.html',
|
|
53
|
+
screenLoadOptions: {
|
|
54
|
+
requiredElementIds: ['app-shell', 'main-canvas'],
|
|
55
|
+
timeoutMs: 4000
|
|
56
|
+
},
|
|
57
|
+
testFiles: ['dist/src/tests/**/*.js'],
|
|
58
|
+
httpRouteHandler: (req, res, { reqPath }) => {
|
|
59
|
+
if (req.method === 'GET' && reqPath === '/v1/health') {
|
|
60
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
61
|
+
res.end(JSON.stringify({ ok: true }));
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
},
|
|
66
|
+
liveWebviewTests: [
|
|
67
|
+
{
|
|
68
|
+
id: 'startup_dom_check',
|
|
69
|
+
name: 'Verify main application shell renders on startup',
|
|
70
|
+
timeoutMs: 4000,
|
|
71
|
+
code: `
|
|
72
|
+
if (!document.getElementById('app-shell')) {
|
|
73
|
+
window.__testErrors.push('Missing #app-shell element');
|
|
74
|
+
}
|
|
75
|
+
`
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 2. Custom `testrunner/index.html` Harness (`nw testrunner`)
|
|
82
|
+
|
|
83
|
+
If your NW.js project launches `nw testrunner`, you can invoke `runNwjsTestHarness()` directly inside `testrunner/index.html`:
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<!DOCTYPE html>
|
|
87
|
+
<html lang="en">
|
|
88
|
+
<head>
|
|
89
|
+
<meta charset="UTF-8">
|
|
90
|
+
<title>NW.js Test Harness</title>
|
|
91
|
+
</head>
|
|
92
|
+
<body>
|
|
93
|
+
<script>
|
|
94
|
+
const { runNwjsTestHarness } = require('@nexustools/nwjstestrunner');
|
|
95
|
+
runNwjsTestHarness({
|
|
96
|
+
title: '🧪 My App Live Webview Test Runner',
|
|
97
|
+
enableWebview: true,
|
|
98
|
+
webviewEntryHtml: 'index.html',
|
|
99
|
+
testFiles: ['dist/src/tests/AppSuites.js']
|
|
100
|
+
});
|
|
101
|
+
</script>
|
|
102
|
+
</body>
|
|
103
|
+
</html>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 3. Writing Jest Test Suites (`describe`, `it`, `expect`, `jest.fn()`)
|
|
107
|
+
|
|
108
|
+
Both ESM (`import`) and CommonJS (`require`) are supported out of the box:
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
import {
|
|
112
|
+
TestRunner,
|
|
113
|
+
describe,
|
|
114
|
+
it,
|
|
115
|
+
expect,
|
|
116
|
+
beforeEach,
|
|
117
|
+
jest
|
|
118
|
+
} from '@nexustools/nwjstestrunner';
|
|
119
|
+
|
|
120
|
+
describe('Canvas State Suite', () => {
|
|
121
|
+
let counter = 0;
|
|
122
|
+
|
|
123
|
+
beforeEach(() => {
|
|
124
|
+
counter = 10;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('supports Jest matchers and spies', async () => {
|
|
128
|
+
const onUpdate = jest.fn((v: number) => v * 2);
|
|
129
|
+
expect(onUpdate(counter)).toBe(20);
|
|
130
|
+
expect(onUpdate).toHaveBeenCalledWith(10);
|
|
131
|
+
await expect(Promise.resolve('ready')).resolves.toBe('ready');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Or register suites explicitly on a TestRunner instance:
|
|
136
|
+
export function registerMyTestSuites(runner: TestRunner): void {
|
|
137
|
+
runner.registerSuite('EngineSuite', (suite) => {
|
|
138
|
+
suite.it('verifies calculations', () => {
|
|
139
|
+
expect({ width: 800, height: 600 }).toMatchObject({ width: 800 });
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { NwjsCliLauncher } = require(path.resolve(__dirname, '..', 'dist', 'index.js'));
|
|
4
|
+
|
|
5
|
+
(async function main() {
|
|
6
|
+
const args = NwjsCliLauncher.parseCliArgs(process.argv.slice(2));
|
|
7
|
+
if (args.help) {
|
|
8
|
+
console.log(NwjsCliLauncher.getHelpText());
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}
|
|
11
|
+
const exitCode = await NwjsCliLauncher.launch(args);
|
|
12
|
+
process.exit(exitCode);
|
|
13
|
+
})();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { NwjsCliOptions } from '../types/test-runner-types';
|
|
2
|
+
export declare class NwjsCliLauncher {
|
|
3
|
+
static parseCliArgs(argv: string[]): NwjsCliOptions & {
|
|
4
|
+
help?: boolean;
|
|
5
|
+
};
|
|
6
|
+
static getHelpText(): string;
|
|
7
|
+
static resolveNwExecutable(projectRootDir: string, explicitPath?: string): string;
|
|
8
|
+
static launch(cliOptions?: NwjsCliOptions): Promise<number>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=nwjs-cli-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nwjs-cli-launcher.d.ts","sourceRoot":"","sources":["../../src/cli/nwjs-cli-launcher.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,qBAAa,eAAe;WACZ,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE;WAyEjE,WAAW,IAAI,MAAM;WAsBrB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;WAuEpE,MAAM,CAAC,UAAU,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CAqE7E"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NwjsCliLauncher = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const harness_config_loader_1 = require("../config/harness-config-loader");
|
|
41
|
+
class NwjsCliLauncher {
|
|
42
|
+
static parseCliArgs(argv) {
|
|
43
|
+
const options = {
|
|
44
|
+
testFiles: []
|
|
45
|
+
};
|
|
46
|
+
for (let i = 0; i < argv.length; i++) {
|
|
47
|
+
const arg = argv[i];
|
|
48
|
+
if (arg === '--help' || arg === '-h') {
|
|
49
|
+
options.help = true;
|
|
50
|
+
}
|
|
51
|
+
else if ((arg === '--project-root' || arg === '-r') && argv[i + 1]) {
|
|
52
|
+
options.projectRootDir = argv[++i];
|
|
53
|
+
}
|
|
54
|
+
else if (arg.startsWith('--project-root=')) {
|
|
55
|
+
options.projectRootDir = arg.slice('--project-root='.length);
|
|
56
|
+
}
|
|
57
|
+
else if ((arg === '--config' || arg === '-c') && argv[i + 1]) {
|
|
58
|
+
options.configPath = argv[++i];
|
|
59
|
+
}
|
|
60
|
+
else if (arg.startsWith('--config=')) {
|
|
61
|
+
options.configPath = arg.slice('--config='.length);
|
|
62
|
+
}
|
|
63
|
+
else if ((arg === '--filter' || arg === '-t') && argv[i + 1]) {
|
|
64
|
+
options.testFilter = argv[++i];
|
|
65
|
+
}
|
|
66
|
+
else if (arg.startsWith('--filter=')) {
|
|
67
|
+
options.testFilter = arg.slice('--filter='.length);
|
|
68
|
+
}
|
|
69
|
+
else if ((arg === '--log-path' || arg === '-o') && argv[i + 1]) {
|
|
70
|
+
options.logPath = argv[++i];
|
|
71
|
+
}
|
|
72
|
+
else if (arg.startsWith('--log-path=')) {
|
|
73
|
+
options.logPath = arg.slice('--log-path='.length);
|
|
74
|
+
}
|
|
75
|
+
else if (arg === '--title' && argv[i + 1]) {
|
|
76
|
+
options.title = argv[++i];
|
|
77
|
+
}
|
|
78
|
+
else if (arg.startsWith('--title=')) {
|
|
79
|
+
options.title = arg.slice('--title='.length);
|
|
80
|
+
}
|
|
81
|
+
else if (arg === '--webview-entry' && argv[i + 1]) {
|
|
82
|
+
options.webviewEntryHtml = argv[++i];
|
|
83
|
+
}
|
|
84
|
+
else if (arg.startsWith('--webview-entry=')) {
|
|
85
|
+
options.webviewEntryHtml = arg.slice('--webview-entry='.length);
|
|
86
|
+
}
|
|
87
|
+
else if (arg === '--enable-webview') {
|
|
88
|
+
options.enableWebview = true;
|
|
89
|
+
}
|
|
90
|
+
else if (arg === '--no-webview') {
|
|
91
|
+
options.enableWebview = false;
|
|
92
|
+
}
|
|
93
|
+
else if (arg === '--init-timeout' && argv[i + 1]) {
|
|
94
|
+
options.initTimeoutMs = Number(argv[++i]);
|
|
95
|
+
}
|
|
96
|
+
else if (arg.startsWith('--init-timeout=')) {
|
|
97
|
+
options.initTimeoutMs = Number(arg.slice('--init-timeout='.length));
|
|
98
|
+
}
|
|
99
|
+
else if (arg === '--timeout' && argv[i + 1]) {
|
|
100
|
+
options.globalTimeoutMs = Number(argv[++i]);
|
|
101
|
+
}
|
|
102
|
+
else if (arg.startsWith('--timeout=')) {
|
|
103
|
+
options.globalTimeoutMs = Number(arg.slice('--timeout='.length));
|
|
104
|
+
}
|
|
105
|
+
else if (arg === '--user-data-dir' && argv[i + 1]) {
|
|
106
|
+
options.userDataDir = argv[++i];
|
|
107
|
+
}
|
|
108
|
+
else if (arg.startsWith('--user-data-dir=')) {
|
|
109
|
+
options.userDataDir = arg.slice('--user-data-dir='.length);
|
|
110
|
+
}
|
|
111
|
+
else if (arg === '--nw-path' && argv[i + 1]) {
|
|
112
|
+
options.nwExecutablePath = argv[++i];
|
|
113
|
+
}
|
|
114
|
+
else if (arg.startsWith('--nw-path=')) {
|
|
115
|
+
options.nwExecutablePath = arg.slice('--nw-path='.length);
|
|
116
|
+
}
|
|
117
|
+
else if (arg === '--keep-open') {
|
|
118
|
+
options.keepOpen = true;
|
|
119
|
+
}
|
|
120
|
+
else if (arg === '--test-files' && argv[i + 1]) {
|
|
121
|
+
const parts = argv[++i]
|
|
122
|
+
.split(',')
|
|
123
|
+
.map((s) => s.trim())
|
|
124
|
+
.filter(Boolean);
|
|
125
|
+
options.testFiles.push(...parts);
|
|
126
|
+
}
|
|
127
|
+
else if (!arg.startsWith('-')) {
|
|
128
|
+
options.testFiles.push(arg);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (options.testFiles && options.testFiles.length === 0) {
|
|
132
|
+
delete options.testFiles;
|
|
133
|
+
}
|
|
134
|
+
return options;
|
|
135
|
+
}
|
|
136
|
+
static getHelpText() {
|
|
137
|
+
return [
|
|
138
|
+
'Usage: nwjstestrunner [options] [testFilePatterns...]',
|
|
139
|
+
'',
|
|
140
|
+
'Options:',
|
|
141
|
+
' -r, --project-root <dir> Project root directory (default: process.cwd())',
|
|
142
|
+
' -c, --config <file> Path to nwjstestrunner.config.{cjs,js,json}',
|
|
143
|
+
' -t, --filter <pattern> Run only tests matching the given substring',
|
|
144
|
+
' -o, --log-path <file> Output path for desktop-tests.log',
|
|
145
|
+
' --title <title> Window & overlay card title',
|
|
146
|
+
' --webview-entry <html> Entry HTML file to load into <webview>',
|
|
147
|
+
' --enable-webview Force enable <webview> client loading',
|
|
148
|
+
' --no-webview Disable <webview> and run Jest unit suites only',
|
|
149
|
+
' --init-timeout <ms> Watchdog initialization timeout (default: 8000)',
|
|
150
|
+
' --timeout <ms> Global harness deadline timeout (default: 35000)',
|
|
151
|
+
' --user-data-dir <dir> Custom Chromium user-data-dir for NW.js',
|
|
152
|
+
' --nw-path <executable> Explicit path to NW.js executable',
|
|
153
|
+
' --keep-open Keep the graphical NW.js window open after tests finish',
|
|
154
|
+
' -h, --help Display this help message'
|
|
155
|
+
].join('\n');
|
|
156
|
+
}
|
|
157
|
+
static resolveNwExecutable(projectRootDir, explicitPath) {
|
|
158
|
+
if (explicitPath && fs.existsSync(explicitPath)) {
|
|
159
|
+
return path.resolve(explicitPath);
|
|
160
|
+
}
|
|
161
|
+
if (process.env.NWJS_EXECUTABLE_PATH && fs.existsSync(process.env.NWJS_EXECUTABLE_PATH)) {
|
|
162
|
+
return path.resolve(process.env.NWJS_EXECUTABLE_PATH);
|
|
163
|
+
}
|
|
164
|
+
const packageRoot = path.resolve(__dirname, '..', '..');
|
|
165
|
+
const searchPaths = [projectRootDir, packageRoot, process.cwd()];
|
|
166
|
+
const isWin = process.platform === 'win32';
|
|
167
|
+
// Prefer direct native NW.js executable (nw.exe / nw) inside node_modules/nw/nwjs* first
|
|
168
|
+
for (const base of searchPaths) {
|
|
169
|
+
let dir = path.resolve(base);
|
|
170
|
+
for (let depth = 0; depth < 4; depth++) {
|
|
171
|
+
const nwPkgDir = path.join(dir, 'node_modules', 'nw');
|
|
172
|
+
if (fs.existsSync(nwPkgDir) && fs.statSync(nwPkgDir).isDirectory()) {
|
|
173
|
+
try {
|
|
174
|
+
const subEntries = fs.readdirSync(nwPkgDir, { withFileTypes: true });
|
|
175
|
+
for (const sub of subEntries) {
|
|
176
|
+
if ((sub.isDirectory() || sub.isSymbolicLink()) && sub.name.startsWith('nwjs')) {
|
|
177
|
+
const candidate = isWin
|
|
178
|
+
? path.join(nwPkgDir, sub.name, 'nw.exe')
|
|
179
|
+
: process.platform === 'darwin'
|
|
180
|
+
? path.join(nwPkgDir, sub.name, 'nwjs.app', 'Contents', 'MacOS', 'nwjs')
|
|
181
|
+
: path.join(nwPkgDir, sub.name, 'nw');
|
|
182
|
+
if (fs.existsSync(candidate)) {
|
|
183
|
+
return candidate;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (_e) { }
|
|
189
|
+
}
|
|
190
|
+
const parent = path.dirname(dir);
|
|
191
|
+
if (parent === dir)
|
|
192
|
+
break;
|
|
193
|
+
dir = parent;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
for (const base of searchPaths) {
|
|
197
|
+
try {
|
|
198
|
+
const nwModPath = require.resolve('nw', { paths: [base] });
|
|
199
|
+
const nwMod = require(nwModPath);
|
|
200
|
+
if (nwMod && typeof nwMod.findpath === 'function') {
|
|
201
|
+
const binPath = nwMod.findpath();
|
|
202
|
+
if (typeof binPath === 'string' && fs.existsSync(binPath)) {
|
|
203
|
+
return binPath;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (_e) { }
|
|
208
|
+
}
|
|
209
|
+
for (const base of searchPaths) {
|
|
210
|
+
let dir = path.resolve(base);
|
|
211
|
+
for (let depth = 0; depth < 4; depth++) {
|
|
212
|
+
const dotBin = isWin
|
|
213
|
+
? path.join(dir, 'node_modules', '.bin', 'nw.cmd')
|
|
214
|
+
: path.join(dir, 'node_modules', '.bin', 'nw');
|
|
215
|
+
if (typeof dotBin === 'string' && fs.existsSync(dotBin)) {
|
|
216
|
+
return dotBin;
|
|
217
|
+
}
|
|
218
|
+
const parent = path.dirname(dir);
|
|
219
|
+
if (parent === dir)
|
|
220
|
+
break;
|
|
221
|
+
dir = parent;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return isWin ? 'nw.exe' : 'nw';
|
|
225
|
+
}
|
|
226
|
+
static async launch(cliOptions = {}) {
|
|
227
|
+
const projectRootDir = harness_config_loader_1.HarnessConfigLoader.resolveProjectRoot(cliOptions.projectRootDir);
|
|
228
|
+
const configFile = harness_config_loader_1.HarnessConfigLoader.findConfigFile(projectRootDir, cliOptions.configPath);
|
|
229
|
+
const mergedConfig = harness_config_loader_1.HarnessConfigLoader.loadConfig(projectRootDir, configFile || undefined, cliOptions);
|
|
230
|
+
const logPath = mergedConfig.testLogPath ||
|
|
231
|
+
path.join(projectRootDir, 'testrunner', 'test-results', 'desktop-tests.log');
|
|
232
|
+
const userDataDir = cliOptions.userDataDir
|
|
233
|
+
? path.resolve(projectRootDir, cliOptions.userDataDir)
|
|
234
|
+
: path.join(projectRootDir, '.nw-userdata-test');
|
|
235
|
+
const packageRoot = path.resolve(__dirname, '..', '..');
|
|
236
|
+
const runnerDir = path.join(packageRoot, 'runner');
|
|
237
|
+
const nwExe = NwjsCliLauncher.resolveNwExecutable(projectRootDir, cliOptions.nwExecutablePath);
|
|
238
|
+
const args = [runnerDir, `--user-data-dir=${userDataDir}`, ...(cliOptions.headlessArgs || [])];
|
|
239
|
+
const env = {
|
|
240
|
+
...process.env,
|
|
241
|
+
NWJS_TEST_PROJECT_ROOT: projectRootDir,
|
|
242
|
+
NWJS_TEST_LOG_PATH: logPath,
|
|
243
|
+
NWJS_TEST_PACKAGE_ROOT: packageRoot,
|
|
244
|
+
NWJS_TEST_CLI_OVERRIDES: JSON.stringify(cliOptions)
|
|
245
|
+
};
|
|
246
|
+
if (configFile) {
|
|
247
|
+
env.NWJS_TEST_CONFIG_PATH = configFile;
|
|
248
|
+
}
|
|
249
|
+
const useShell = process.platform === 'win32' && /\.(cmd|bat)$/i.test(nwExe);
|
|
250
|
+
return new Promise((resolve) => {
|
|
251
|
+
const child = (0, child_process_1.spawn)(nwExe, args, {
|
|
252
|
+
cwd: projectRootDir,
|
|
253
|
+
env,
|
|
254
|
+
stdio: 'inherit',
|
|
255
|
+
shell: useShell
|
|
256
|
+
});
|
|
257
|
+
child.on('error', (err) => {
|
|
258
|
+
console.error(`[nwjstestrunner] Failed to spawn NW.js (${nwExe}):`, err.message);
|
|
259
|
+
resolve(1);
|
|
260
|
+
});
|
|
261
|
+
child.on('close', (code) => {
|
|
262
|
+
let logContent = '';
|
|
263
|
+
if (fs.existsSync(logPath)) {
|
|
264
|
+
try {
|
|
265
|
+
logContent = fs.readFileSync(logPath, 'utf-8');
|
|
266
|
+
console.log('\n' + logContent + '\n');
|
|
267
|
+
}
|
|
268
|
+
catch (_e) { }
|
|
269
|
+
}
|
|
270
|
+
const logFailed = !logContent ||
|
|
271
|
+
logContent.includes('Status: Tests interupted') ||
|
|
272
|
+
logContent.includes('FAILURES & ERRORS:') ||
|
|
273
|
+
!logContent.includes('SUCCESS: All tests completed cleanly.');
|
|
274
|
+
const exitCode = code === 0 && !logFailed ? 0 : 1;
|
|
275
|
+
resolve(exitCode);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.NwjsCliLauncher = NwjsCliLauncher;
|
|
281
|
+
//# sourceMappingURL=nwjs-cli-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nwjs-cli-launcher.js","sourceRoot":"","sources":["../../src/cli/nwjs-cli-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { NwjsCliOptions, NwjsHarnessConfig } from '../types/test-runner-types';
|
|
2
|
+
export declare class HarnessConfigLoader {
|
|
3
|
+
static resolveProjectRoot(explicitRoot?: string): string;
|
|
4
|
+
static findConfigFile(projectRootDir: string, explicitConfigPath?: string): string | null;
|
|
5
|
+
static loadConfig(projectRootDir?: string, explicitConfigPath?: string, cliOverrides?: NwjsCliOptions): NwjsHarnessConfig;
|
|
6
|
+
static resolveTestFiles(projectRootDir: string, patterns?: string[]): string[];
|
|
7
|
+
private static collectDefaultTestFiles;
|
|
8
|
+
private static walkMatchingFiles;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=harness-config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-config-loader.d.ts","sourceRoot":"","sources":["../../src/config/harness-config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/E,qBAAa,mBAAmB;WAChB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;WAkBjD,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;WA4BlF,UAAU,CACtB,cAAc,CAAC,EAAE,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,YAAY,CAAC,EAAE,cAAc,GAC5B,iBAAiB;WAkEN,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAgCrF,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAuBtC,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAqCjC"}
|