elasticdash-test 0.1.5 → 0.1.6-alpha-2
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/README.md +4 -0
- package/dist/browser-ui.d.ts +43 -0
- package/dist/browser-ui.d.ts.map +1 -0
- package/dist/browser-ui.js +250 -0
- package/dist/browser-ui.js.map +1 -0
- package/dist/cli.js +120 -4
- package/dist/cli.js.map +1 -1
- package/dist/core/registry.d.ts +6 -0
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +12 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runner.js +15 -1
- package/dist/runner.js.map +1 -1
- package/dist/test-setup.d.ts +1 -1
- package/dist/test-setup.js +1 -1
- package/dist/trace-adapter/context.d.ts +1 -1
- package/dist/trace-adapter/context.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,6 +61,8 @@ Duration: 3.4s
|
|
|
61
61
|
|
|
62
62
|
## Writing Tests
|
|
63
63
|
|
|
64
|
+
See the full guide in [docs/test-writing-guidelines.md](docs/test-writing-guidelines.md).
|
|
65
|
+
|
|
64
66
|
### Globals
|
|
65
67
|
|
|
66
68
|
After importing `test-setup`, these are available globally — no imports needed:
|
|
@@ -69,6 +71,8 @@ After importing `test-setup`, these are available globally — no imports needed
|
|
|
69
71
|
|---|---|
|
|
70
72
|
| `aiTest(name, fn)` | Register a test |
|
|
71
73
|
| `beforeAll(fn)` | Run once before all tests in the file |
|
|
74
|
+
| `beforeEach(fn)` | Run before every test in the file |
|
|
75
|
+
| `afterEach(fn)` | Run after every test in the file (runs even if the test fails) |
|
|
72
76
|
| `afterAll(fn)` | Run once after all tests in the file |
|
|
73
77
|
|
|
74
78
|
### Test context
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type UiEvent = {
|
|
2
|
+
type: 'run-start';
|
|
3
|
+
payload: {
|
|
4
|
+
files: string[];
|
|
5
|
+
};
|
|
6
|
+
} | {
|
|
7
|
+
type: 'test-start';
|
|
8
|
+
payload: {
|
|
9
|
+
name: string;
|
|
10
|
+
};
|
|
11
|
+
} | {
|
|
12
|
+
type: 'test-finish';
|
|
13
|
+
payload: {
|
|
14
|
+
name: string;
|
|
15
|
+
passed: boolean;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
errorMessage?: string;
|
|
18
|
+
};
|
|
19
|
+
} | {
|
|
20
|
+
type: 'run-summary';
|
|
21
|
+
payload: {
|
|
22
|
+
passed: number;
|
|
23
|
+
failed: number;
|
|
24
|
+
total: number;
|
|
25
|
+
durationMs: number;
|
|
26
|
+
failures: Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
errorMessage?: string;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export interface BrowserUiServer {
|
|
33
|
+
url: string;
|
|
34
|
+
send(event: UiEvent): void;
|
|
35
|
+
close(): void;
|
|
36
|
+
}
|
|
37
|
+
interface BrowserUiOptions {
|
|
38
|
+
port?: number;
|
|
39
|
+
autoOpen?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare function startBrowserUiServer(opts?: BrowserUiOptions): Promise<BrowserUiServer | undefined>;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=browser-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-ui.d.ts","sourceRoot":"","sources":["../src/browser-ui.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC9G;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAA;CAAE,CAAA;AAErK,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC1B,KAAK,IAAI,IAAI,CAAA;CACd;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAkJD,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAmG5G"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
const defaultHtml = `<!doctype html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="UTF-8" />
|
|
10
|
+
<title>ElasticDash Test Runner</title>
|
|
11
|
+
<style>
|
|
12
|
+
:root { font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0b1021; color: #e8ecf7; }
|
|
13
|
+
body { margin: 0; padding: 24px; }
|
|
14
|
+
h1 { margin: 0 0 16px; font-size: 20px; }
|
|
15
|
+
.summary { display: flex; gap: 12px; margin-bottom: 16px; }
|
|
16
|
+
.pill { padding: 8px 12px; border-radius: 999px; font-weight: 600; }
|
|
17
|
+
.pass { background: #12351b; color: #8de0a3; }
|
|
18
|
+
.fail { background: #351212; color: #f59b9b; }
|
|
19
|
+
.total { background: #1c2745; color: #cdd7ff; }
|
|
20
|
+
.tests { margin-top: 12px; }
|
|
21
|
+
.test { border: 1px solid #1f2a4f; border-radius: 8px; padding: 12px; margin-bottom: 8px; background: #0f1731; }
|
|
22
|
+
.name { font-weight: 600; }
|
|
23
|
+
.error { margin-top: 8px; white-space: pre-wrap; color: #f59b9b; font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; }
|
|
24
|
+
.status { font-weight: 600; }
|
|
25
|
+
</style>
|
|
26
|
+
</head>
|
|
27
|
+
<body>
|
|
28
|
+
<h1>ElasticDash Test Runner</h1>
|
|
29
|
+
<div class="summary">
|
|
30
|
+
<div class="pill total" id="total">Total: -</div>
|
|
31
|
+
<div class="pill pass" id="passed">Passed: -</div>
|
|
32
|
+
<div class="pill fail" id="failed">Failed: -</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div id="progress">Waiting for test run...</div>
|
|
35
|
+
<div class="tests" id="tests"></div>
|
|
36
|
+
<script>
|
|
37
|
+
const totalEl = document.getElementById('total');
|
|
38
|
+
const passedEl = document.getElementById('passed');
|
|
39
|
+
const failedEl = document.getElementById('failed');
|
|
40
|
+
const progressEl = document.getElementById('progress');
|
|
41
|
+
const testsEl = document.getElementById('tests');
|
|
42
|
+
|
|
43
|
+
const tests = new Map();
|
|
44
|
+
let processed = 0;
|
|
45
|
+
let passedCount = 0;
|
|
46
|
+
let failedCount = 0;
|
|
47
|
+
let finalTotal = null;
|
|
48
|
+
|
|
49
|
+
function setError(el, message) {
|
|
50
|
+
const errEl = el.querySelector('.error');
|
|
51
|
+
let toggle = el.querySelector('.toggle');
|
|
52
|
+
if (!message) {
|
|
53
|
+
errEl.textContent = '';
|
|
54
|
+
errEl.style.display = 'none';
|
|
55
|
+
if (toggle) toggle.style.display = 'none';
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!toggle) {
|
|
59
|
+
toggle = document.createElement('button');
|
|
60
|
+
toggle.className = 'toggle';
|
|
61
|
+
toggle.textContent = 'Show details';
|
|
62
|
+
toggle.style.marginTop = '8px';
|
|
63
|
+
toggle.style.background = '#1c2745';
|
|
64
|
+
toggle.style.color = '#cdd7ff';
|
|
65
|
+
toggle.style.border = '1px solid #2a3866';
|
|
66
|
+
toggle.style.borderRadius = '6px';
|
|
67
|
+
toggle.style.padding = '6px 10px';
|
|
68
|
+
toggle.style.cursor = 'pointer';
|
|
69
|
+
toggle.style.fontWeight = '600';
|
|
70
|
+
el.appendChild(toggle);
|
|
71
|
+
toggle.addEventListener('click', () => {
|
|
72
|
+
const isHidden = errEl.style.display === 'none';
|
|
73
|
+
errEl.style.display = isHidden ? 'block' : 'none';
|
|
74
|
+
toggle.textContent = isHidden ? 'Hide details' : 'Show details';
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
errEl.textContent = message;
|
|
78
|
+
errEl.style.display = 'none';
|
|
79
|
+
toggle.style.display = 'inline-block';
|
|
80
|
+
toggle.textContent = 'Show details';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function renderTest(name) {
|
|
84
|
+
let el = tests.get(name);
|
|
85
|
+
if (!el) {
|
|
86
|
+
el = document.createElement('div');
|
|
87
|
+
el.className = 'test';
|
|
88
|
+
el.innerHTML = '<div class="name"></div><div class="status"></div><div class="error"></div>';
|
|
89
|
+
tests.set(name, el);
|
|
90
|
+
testsEl.appendChild(el);
|
|
91
|
+
}
|
|
92
|
+
return el;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function updatePills(passed, failed, total) {
|
|
96
|
+
totalEl.textContent = 'Total: ' + total;
|
|
97
|
+
passedEl.textContent = 'Passed: ' + passed;
|
|
98
|
+
failedEl.textContent = 'Failed: ' + failed;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const evtSource = new EventSource('/events');
|
|
102
|
+
evtSource.onmessage = (ev) => {
|
|
103
|
+
try {
|
|
104
|
+
const msg = JSON.parse(ev.data);
|
|
105
|
+
if (msg.type === 'test-start') {
|
|
106
|
+
const el = renderTest(msg.payload.name);
|
|
107
|
+
el.querySelector('.name').textContent = msg.payload.name;
|
|
108
|
+
el.querySelector('.status').textContent = 'Running...';
|
|
109
|
+
el.querySelector('.status').style.color = '#cdd7ff';
|
|
110
|
+
el.querySelector('.error').textContent = '';
|
|
111
|
+
progressEl.textContent = 'Running tests...';
|
|
112
|
+
}
|
|
113
|
+
if (msg.type === 'test-finish') {
|
|
114
|
+
const el = renderTest(msg.payload.name);
|
|
115
|
+
el.querySelector('.name').textContent = msg.payload.name;
|
|
116
|
+
el.querySelector('.status').textContent = msg.payload.passed ? 'Passed' : 'Failed';
|
|
117
|
+
el.querySelector('.status').style.color = msg.payload.passed ? '#8de0a3' : '#f59b9b';
|
|
118
|
+
setError(el, msg.payload.errorMessage || '');
|
|
119
|
+
|
|
120
|
+
// live tally
|
|
121
|
+
processed += 1;
|
|
122
|
+
if (msg.payload.passed) passedCount += 1;
|
|
123
|
+
else failedCount += 1;
|
|
124
|
+
const displayTotal = finalTotal !== null ? finalTotal : processed;
|
|
125
|
+
updatePills(passedCount, failedCount, displayTotal);
|
|
126
|
+
}
|
|
127
|
+
if (msg.type === 'run-summary') {
|
|
128
|
+
finalTotal = msg.payload.total;
|
|
129
|
+
passedCount = msg.payload.passed;
|
|
130
|
+
failedCount = msg.payload.failed;
|
|
131
|
+
processed = msg.payload.total;
|
|
132
|
+
updatePills(msg.payload.passed, msg.payload.failed, msg.payload.total);
|
|
133
|
+
progressEl.textContent = 'Finished';
|
|
134
|
+
msg.payload.failures.forEach(function (f) {
|
|
135
|
+
const el = renderTest(f.name);
|
|
136
|
+
el.querySelector('.name').textContent = f.name;
|
|
137
|
+
el.querySelector('.status').textContent = 'Failed';
|
|
138
|
+
el.querySelector('.status').style.color = '#f59b9b';
|
|
139
|
+
setError(el, f.errorMessage || '');
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
} catch (e) {
|
|
143
|
+
console.error('Bad event data', e);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
</script>
|
|
147
|
+
</body>
|
|
148
|
+
</html>`;
|
|
149
|
+
export async function startBrowserUiServer(opts = {}) {
|
|
150
|
+
const autoOpen = opts.autoOpen !== false;
|
|
151
|
+
let port = opts.port ?? 4571;
|
|
152
|
+
// Ensure base dir for potential static assets (none now)
|
|
153
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
154
|
+
const clients = [];
|
|
155
|
+
const eventBuffer = [];
|
|
156
|
+
const handler = (req, res) => {
|
|
157
|
+
if (!req.url)
|
|
158
|
+
return res.end();
|
|
159
|
+
if (req.url.startsWith('/events')) {
|
|
160
|
+
const sseRes = res;
|
|
161
|
+
sseRes.writeHead(200, {
|
|
162
|
+
'Content-Type': 'text/event-stream',
|
|
163
|
+
Connection: 'keep-alive',
|
|
164
|
+
'Cache-Control': 'no-cache',
|
|
165
|
+
});
|
|
166
|
+
// Prime the connection so browsers render immediately
|
|
167
|
+
sseRes.flushHeaders?.();
|
|
168
|
+
sseRes.write(': connected\n\n');
|
|
169
|
+
sseRes.flush?.();
|
|
170
|
+
// Replay all previously sent events so late-connecting browsers get the full history
|
|
171
|
+
for (const e of eventBuffer) {
|
|
172
|
+
sseRes.write(`data: ${JSON.stringify(e)}\n\n`);
|
|
173
|
+
}
|
|
174
|
+
sseRes.flush?.();
|
|
175
|
+
clients.push(sseRes);
|
|
176
|
+
req.on('close', () => {
|
|
177
|
+
const idx = clients.indexOf(sseRes);
|
|
178
|
+
if (idx >= 0)
|
|
179
|
+
clients.splice(idx, 1);
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Serve inline HTML
|
|
184
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
185
|
+
res.end(defaultHtml);
|
|
186
|
+
};
|
|
187
|
+
let server;
|
|
188
|
+
let heartbeat;
|
|
189
|
+
let started = false;
|
|
190
|
+
while (!started) {
|
|
191
|
+
try {
|
|
192
|
+
server = http.createServer(handler);
|
|
193
|
+
await new Promise((resolve, reject) => {
|
|
194
|
+
server.once('error', reject);
|
|
195
|
+
server.listen(port, resolve);
|
|
196
|
+
});
|
|
197
|
+
started = true;
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
port += 1;
|
|
201
|
+
if (port > (opts.port ?? 4571) + 10) {
|
|
202
|
+
console.error('[elasticdash] Browser UI server failed to start:', err.message);
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const url = `http://localhost:${port}`;
|
|
208
|
+
function send(event) {
|
|
209
|
+
eventBuffer.push(event);
|
|
210
|
+
const payload = `data: ${JSON.stringify(event)}\n\n`;
|
|
211
|
+
for (const client of [...clients]) {
|
|
212
|
+
client.write(payload);
|
|
213
|
+
client.flush?.();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function close() {
|
|
217
|
+
if (heartbeat) {
|
|
218
|
+
clearInterval(heartbeat);
|
|
219
|
+
heartbeat = undefined;
|
|
220
|
+
}
|
|
221
|
+
for (const client of clients) {
|
|
222
|
+
client.end();
|
|
223
|
+
}
|
|
224
|
+
clients.length = 0;
|
|
225
|
+
server?.close();
|
|
226
|
+
}
|
|
227
|
+
if (autoOpen) {
|
|
228
|
+
openBrowser(url);
|
|
229
|
+
}
|
|
230
|
+
// Periodic keepalive comments to keep EventSource connections from timing out
|
|
231
|
+
heartbeat = setInterval(() => {
|
|
232
|
+
for (const client of [...clients]) {
|
|
233
|
+
client.write(': keepalive\n\n');
|
|
234
|
+
client.flush?.();
|
|
235
|
+
}
|
|
236
|
+
}, 5000);
|
|
237
|
+
return { url, send, close };
|
|
238
|
+
}
|
|
239
|
+
function openBrowser(url) {
|
|
240
|
+
const platform = os.platform();
|
|
241
|
+
const command = platform === 'darwin'
|
|
242
|
+
? 'open'
|
|
243
|
+
: platform === 'win32'
|
|
244
|
+
? 'cmd'
|
|
245
|
+
: 'xdg-open';
|
|
246
|
+
const args = platform === 'win32' ? ['/c', 'start', '""', url] : [url];
|
|
247
|
+
const child = spawn(command, args, { stdio: 'ignore', detached: true });
|
|
248
|
+
child.unref();
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=browser-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-ui.js","sourceRoot":"","sources":["../src/browser-ui.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,12 @@ import { registerMatchers } from './matchers/index.js';
|
|
|
9
9
|
import { installAIInterceptor } from './interceptors/ai-interceptor.js';
|
|
10
10
|
import { runFiles } from './runner.js';
|
|
11
11
|
import { reportResults } from './reporter.js';
|
|
12
|
+
import { startBrowserUiServer } from './browser-ui.js';
|
|
13
|
+
function stripAnsi(input) {
|
|
14
|
+
if (!input)
|
|
15
|
+
return input;
|
|
16
|
+
return input.replace(/\u001b\[[0-9;]*m/g, '');
|
|
17
|
+
}
|
|
12
18
|
async function loadConfig(cwd) {
|
|
13
19
|
const configPath = path.join(cwd, 'elasticdash.config.ts');
|
|
14
20
|
const configPathJs = path.join(cwd, 'elasticdash.config.js');
|
|
@@ -55,7 +61,9 @@ async function bootstrap() {
|
|
|
55
61
|
program
|
|
56
62
|
.command('test [dir]')
|
|
57
63
|
.description('Discover and run all AI test files')
|
|
58
|
-
.
|
|
64
|
+
.option('--no-browser-ui', 'Disable browser progress UI')
|
|
65
|
+
.option('--browser-ui-port <port>', 'Port for browser UI', (v) => Number(v), undefined)
|
|
66
|
+
.action(async (dir, cmd) => {
|
|
59
67
|
const searchBase = dir ? path.resolve(cwd, dir) : cwd;
|
|
60
68
|
console.log('[elasticdash] Test discovery pattern:', defaultPattern);
|
|
61
69
|
console.log('[elasticdash] Test search base:', searchBase);
|
|
@@ -65,24 +73,132 @@ async function bootstrap() {
|
|
|
65
73
|
console.error(`No test files found matching: ${defaultPattern.join(', ')}`);
|
|
66
74
|
process.exit(1);
|
|
67
75
|
}
|
|
68
|
-
const
|
|
76
|
+
const useBrowserUiEnv = process.env.ELASTICDASH_BROWSER_UI !== '0';
|
|
77
|
+
const useBrowserUiFlag = cmd?.browserUi !== false;
|
|
78
|
+
const enableBrowserUi = useBrowserUiEnv && useBrowserUiFlag;
|
|
79
|
+
const ui = enableBrowserUi
|
|
80
|
+
? await startBrowserUiServer({ port: cmd?.browserUiPort, autoOpen: true })
|
|
81
|
+
: undefined;
|
|
82
|
+
if (ui) {
|
|
83
|
+
ui.send({ type: 'run-start', payload: { files } });
|
|
84
|
+
}
|
|
85
|
+
const startedAt = Date.now();
|
|
86
|
+
const results = await runFiles(files, {
|
|
87
|
+
hooks: {
|
|
88
|
+
onTestStart(name) {
|
|
89
|
+
ui?.send({ type: 'test-start', payload: { name } });
|
|
90
|
+
},
|
|
91
|
+
onTestFinish(name, passed, durationMs, error) {
|
|
92
|
+
ui?.send({
|
|
93
|
+
type: 'test-finish',
|
|
94
|
+
payload: { name, passed, durationMs, errorMessage: stripAnsi(error?.message) },
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
});
|
|
69
99
|
// Log registered tests
|
|
70
100
|
const { getRegistry } = await import('./core/registry.js');
|
|
71
101
|
const registry = getRegistry();
|
|
72
102
|
console.log('[elasticdash] Tests registered:', registry.tests.map(t => t.name));
|
|
73
103
|
reportResults(results);
|
|
74
104
|
const anyFailed = results.some((fr) => fr.results.some((r) => !r.passed));
|
|
105
|
+
let uiDelayMs = 0;
|
|
106
|
+
if (ui) {
|
|
107
|
+
const durationMs = Date.now() - startedAt;
|
|
108
|
+
const failures = [];
|
|
109
|
+
let totalTests = 0;
|
|
110
|
+
let passedCount = 0;
|
|
111
|
+
for (const fr of results) {
|
|
112
|
+
for (const r of fr.results) {
|
|
113
|
+
totalTests += 1;
|
|
114
|
+
if (r.passed)
|
|
115
|
+
passedCount += 1;
|
|
116
|
+
else
|
|
117
|
+
failures.push({ name: r.name, errorMessage: stripAnsi(r.error?.message) });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
ui.send({
|
|
121
|
+
type: 'run-summary',
|
|
122
|
+
payload: {
|
|
123
|
+
passed: passedCount,
|
|
124
|
+
failed: failures.length,
|
|
125
|
+
total: totalTests,
|
|
126
|
+
durationMs,
|
|
127
|
+
failures,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
uiDelayMs = 60000;
|
|
131
|
+
}
|
|
132
|
+
if (uiDelayMs > 0) {
|
|
133
|
+
await new Promise((resolve) => setTimeout(resolve, uiDelayMs));
|
|
134
|
+
ui?.close();
|
|
135
|
+
}
|
|
75
136
|
process.exit(anyFailed ? 1 : 0);
|
|
76
137
|
});
|
|
77
138
|
// elasticdash run <file>
|
|
78
139
|
program
|
|
79
140
|
.command('run <file>')
|
|
80
141
|
.description('Run a single AI test file')
|
|
81
|
-
.
|
|
142
|
+
.option('--no-browser-ui', 'Disable browser progress UI')
|
|
143
|
+
.option('--browser-ui-port <port>', 'Port for browser UI', (v) => Number(v), undefined)
|
|
144
|
+
.action(async (file, cmd) => {
|
|
82
145
|
const absFile = pathToFileURL(path.resolve(cwd, file)).href;
|
|
83
|
-
const
|
|
146
|
+
const useBrowserUiEnv = process.env.ELASTICDASH_BROWSER_UI !== '0';
|
|
147
|
+
const useBrowserUiFlag = cmd?.browserUi !== false;
|
|
148
|
+
const enableBrowserUi = useBrowserUiEnv && useBrowserUiFlag;
|
|
149
|
+
const ui = enableBrowserUi
|
|
150
|
+
? await startBrowserUiServer({ port: cmd?.browserUiPort, autoOpen: true })
|
|
151
|
+
: undefined;
|
|
152
|
+
if (ui) {
|
|
153
|
+
ui.send({ type: 'run-start', payload: { files: [absFile] } });
|
|
154
|
+
}
|
|
155
|
+
const startedAt = Date.now();
|
|
156
|
+
const results = await runFiles([absFile], {
|
|
157
|
+
hooks: {
|
|
158
|
+
onTestStart(name) {
|
|
159
|
+
ui?.send({ type: 'test-start', payload: { name } });
|
|
160
|
+
},
|
|
161
|
+
onTestFinish(name, passed, durationMs, error) {
|
|
162
|
+
ui?.send({
|
|
163
|
+
type: 'test-finish',
|
|
164
|
+
payload: { name, passed, durationMs, errorMessage: stripAnsi(error?.message) },
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
});
|
|
84
169
|
reportResults(results);
|
|
85
170
|
const anyFailed = results.some((fr) => fr.results.some((r) => !r.passed));
|
|
171
|
+
let uiDelayMs = 0;
|
|
172
|
+
if (ui) {
|
|
173
|
+
const durationMs = Date.now() - startedAt;
|
|
174
|
+
const failures = [];
|
|
175
|
+
let totalTests = 0;
|
|
176
|
+
let passedCount = 0;
|
|
177
|
+
for (const fr of results) {
|
|
178
|
+
for (const r of fr.results) {
|
|
179
|
+
totalTests += 1;
|
|
180
|
+
if (r.passed)
|
|
181
|
+
passedCount += 1;
|
|
182
|
+
else
|
|
183
|
+
failures.push({ name: r.name, errorMessage: stripAnsi(r.error?.message) });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
ui.send({
|
|
187
|
+
type: 'run-summary',
|
|
188
|
+
payload: {
|
|
189
|
+
passed: passedCount,
|
|
190
|
+
failed: failures.length,
|
|
191
|
+
total: totalTests,
|
|
192
|
+
durationMs,
|
|
193
|
+
failures,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
uiDelayMs = 60000;
|
|
197
|
+
}
|
|
198
|
+
if (uiDelayMs > 0) {
|
|
199
|
+
await new Promise((resolve) => setTimeout(resolve, uiDelayMs));
|
|
200
|
+
ui?.close();
|
|
201
|
+
}
|
|
86
202
|
process.exit(anyFailed ? 1 : 0);
|
|
87
203
|
});
|
|
88
204
|
await program.parseAsync(process.argv);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAA;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,WAAW,CAAA;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/core/registry.d.ts
CHANGED
|
@@ -8,15 +8,21 @@ export interface Registry {
|
|
|
8
8
|
tests: TestEntry[];
|
|
9
9
|
beforeAllHooks: Array<() => Promise<void> | void>;
|
|
10
10
|
afterAllHooks: Array<() => Promise<void> | void>;
|
|
11
|
+
beforeEachHooks: Array<() => Promise<void> | void>;
|
|
12
|
+
afterEachHooks: Array<() => Promise<void> | void>;
|
|
11
13
|
}
|
|
12
14
|
export declare function clearRegistry(): void;
|
|
13
15
|
export declare function getRegistry(): Registry;
|
|
14
16
|
export declare function aiTest(name: string, fn: TestFunction): void;
|
|
15
17
|
export declare function beforeAll(fn: () => Promise<void> | void): void;
|
|
16
18
|
export declare function afterAll(fn: () => Promise<void> | void): void;
|
|
19
|
+
export declare function beforeEach(fn: () => Promise<void> | void): void;
|
|
20
|
+
export declare function afterEach(fn: () => Promise<void> | void): void;
|
|
17
21
|
declare global {
|
|
18
22
|
var aiTest: (name: string, fn: TestFunction) => void;
|
|
19
23
|
var beforeAll: (fn: () => Promise<void> | void) => void;
|
|
20
24
|
var afterAll: (fn: () => Promise<void> | void) => void;
|
|
25
|
+
var beforeEach: (fn: () => Promise<void> | void) => void;
|
|
26
|
+
var afterEach: (fn: () => Promise<void> | void) => void;
|
|
21
27
|
}
|
|
22
28
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEhE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAEvE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,cAAc,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IACjD,aAAa,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEhE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAEvE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,cAAc,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IACjD,aAAa,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IAChD,eAAe,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IAClD,cAAc,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;CAClD;AAqBD,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAItC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,GAAG,IAAI,CAI3D;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAG9D;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAG7D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAG/D;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAG9D;AAGD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;IAEpD,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IAEvD,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IAEtD,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IAExD,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CACxD"}
|
package/dist/core/registry.js
CHANGED
|
@@ -10,6 +10,8 @@ function createEmptyRegistry() {
|
|
|
10
10
|
tests: [],
|
|
11
11
|
beforeAllHooks: [],
|
|
12
12
|
afterAllHooks: [],
|
|
13
|
+
beforeEachHooks: [],
|
|
14
|
+
afterEachHooks: [],
|
|
13
15
|
};
|
|
14
16
|
}
|
|
15
17
|
export function clearRegistry() {
|
|
@@ -34,7 +36,17 @@ export function afterAll(fn) {
|
|
|
34
36
|
const registry = getGlobalRegistry();
|
|
35
37
|
registry.afterAllHooks.push(fn);
|
|
36
38
|
}
|
|
39
|
+
export function beforeEach(fn) {
|
|
40
|
+
const registry = getGlobalRegistry();
|
|
41
|
+
registry.beforeEachHooks.push(fn);
|
|
42
|
+
}
|
|
43
|
+
export function afterEach(fn) {
|
|
44
|
+
const registry = getGlobalRegistry();
|
|
45
|
+
registry.afterEachHooks.push(fn);
|
|
46
|
+
}
|
|
37
47
|
globalThis.aiTest = aiTest;
|
|
38
48
|
globalThis.beforeAll = beforeAll;
|
|
39
49
|
globalThis.afterAll = afterAll;
|
|
50
|
+
globalThis.beforeEach = beforeEach;
|
|
51
|
+
globalThis.afterEach = afterEach;
|
|
40
52
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAiBA,MAAM,YAAY,GAAG,0BAA0B,CAAA;AAE/C,SAAS,iBAAiB;IACxB,IAAI,CAAE,UAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,UAAkB,CAAC,YAAY,CAAC,GAAG,mBAAmB,EAAE,CAAA;IAC3D,CAAC;IACD,OAAQ,UAAkB,CAAC,YAAY,CAAa,CAAA;AACtD,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;QACL,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,EAAE;QAClB,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,EAAE;QACnB,cAAc,EAAE,EAAE;KACnB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC1B,UAAkB,CAAC,YAAY,CAAC,GAAG,mBAAmB,EAAE,CAAA;IACzD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAChG,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,EAAgB;IACnD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IACjC,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAA8B;IACtD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAA8B;IACrD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAA8B;IACvD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAA8B;IACtD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAClC,CAAC;AAgBD,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;AAC1B,UAAU,CAAC,SAAS,GAAG,SAAS,CAAA;AAChC,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;AAC9B,UAAU,CAAC,UAAU,GAAG,UAAU,CAAA;AAClC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { aiTest, beforeAll, afterAll, getRegistry, clearRegistry } from './core/registry.js';
|
|
1
|
+
export { aiTest, beforeAll, afterAll, beforeEach, afterEach, getRegistry, clearRegistry } from './core/registry.js';
|
|
2
2
|
export { createTraceHandle, startTraceSession, setCurrentTrace, getCurrentTrace } from './trace-adapter/context.js';
|
|
3
3
|
export { registerMatchers } from './matchers/index.js';
|
|
4
4
|
export { expect } from './matchers/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACnH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC/F,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACxE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Public API surface for programmatic use
|
|
2
|
-
export { aiTest, beforeAll, afterAll, getRegistry, clearRegistry } from './core/registry.js';
|
|
2
|
+
export { aiTest, beforeAll, afterAll, beforeEach, afterEach, getRegistry, clearRegistry } from './core/registry.js';
|
|
3
3
|
export { createTraceHandle, startTraceSession, setCurrentTrace, getCurrentTrace } from './trace-adapter/context.js';
|
|
4
4
|
export { registerMatchers } from './matchers/index.js';
|
|
5
5
|
export { expect } from './matchers/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACnH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA"}
|
package/dist/runner.js
CHANGED
|
@@ -53,6 +53,9 @@ async function runFile(file, options) {
|
|
|
53
53
|
currentTestName = entry.name;
|
|
54
54
|
setCurrentTrace(context.trace);
|
|
55
55
|
try {
|
|
56
|
+
for (const hook of registry.beforeEachHooks) {
|
|
57
|
+
await hook();
|
|
58
|
+
}
|
|
56
59
|
await entry.fn(context);
|
|
57
60
|
passed = true;
|
|
58
61
|
}
|
|
@@ -60,6 +63,17 @@ async function runFile(file, options) {
|
|
|
60
63
|
error = err instanceof Error ? err : new Error(String(err));
|
|
61
64
|
}
|
|
62
65
|
finally {
|
|
66
|
+
try {
|
|
67
|
+
for (const hook of registry.afterEachHooks) {
|
|
68
|
+
await hook();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (afterErr) {
|
|
72
|
+
if (!error) {
|
|
73
|
+
error = afterErr instanceof Error ? afterErr : new Error(String(afterErr));
|
|
74
|
+
passed = false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
63
77
|
setCurrentTrace(undefined);
|
|
64
78
|
if (!error && pendingUnhandled) {
|
|
65
79
|
error = pendingUnhandled;
|
|
@@ -69,7 +83,7 @@ async function runFile(file, options) {
|
|
|
69
83
|
}
|
|
70
84
|
const durationMs = Date.now() - startTime;
|
|
71
85
|
if (hooks.onTestFinish) {
|
|
72
|
-
await hooks.onTestFinish(entry.name, passed, durationMs);
|
|
86
|
+
await hooks.onTestFinish(entry.name, passed, durationMs, error);
|
|
73
87
|
}
|
|
74
88
|
if (hooks.onTraceComplete) {
|
|
75
89
|
await hooks.onTraceComplete(entry.name, context.trace);
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/test-setup.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Import this file in your AI test files to get:
|
|
3
|
-
* - aiTest / beforeAll / afterAll available as globals (TypeScript types + runtime)
|
|
3
|
+
* - aiTest / beforeAll / afterAll / beforeEach / afterEach available as globals (TypeScript types + runtime)
|
|
4
4
|
* - Custom matcher types (toHaveLLMStep, toCallTool, toMatchSemanticOutput)
|
|
5
5
|
*
|
|
6
6
|
* The CLI registers matchers at startup, so this import is for TypeScript
|
package/dist/test-setup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Import this file in your AI test files to get:
|
|
3
|
-
* - aiTest / beforeAll / afterAll available as globals (TypeScript types + runtime)
|
|
3
|
+
* - aiTest / beforeAll / afterAll / beforeEach / afterEach available as globals (TypeScript types + runtime)
|
|
4
4
|
* - Custom matcher types (toHaveLLMStep, toCallTool, toMatchSemanticOutput)
|
|
5
5
|
*
|
|
6
6
|
* The CLI registers matchers at startup, so this import is for TypeScript
|
|
@@ -50,7 +50,7 @@ export declare function getCurrentTrace(): TraceHandle | undefined;
|
|
|
50
50
|
/** Extension points for runner hooks (scaffold for future backend integration) */
|
|
51
51
|
export interface RunnerHooks {
|
|
52
52
|
onTestStart?(name: string): void | Promise<void>;
|
|
53
|
-
onTestFinish?(name: string, passed: boolean, durationMs: number): void | Promise<void>;
|
|
53
|
+
onTestFinish?(name: string, passed: boolean, durationMs: number, error?: Error): void | Promise<void>;
|
|
54
54
|
onTraceComplete?(name: string, trace: TraceHandle): void | Promise<void>;
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/trace-adapter/context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,QAAQ,IAAI,SAAS,EAAE,CAAA;IACvB,+BAA+B;IAC/B,WAAW,IAAI,OAAO,EAAE,CAAA;IACxB,2BAA2B;IAC3B,YAAY,IAAI,QAAQ,EAAE,CAAA;IAC1B,iDAAiD;IACjD,cAAc,IAAI,UAAU,EAAE,CAAA;IAC9B,wDAAwD;IACxD,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAClC,wDAAwD;IACxD,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IACpC,6CAA6C;IAC7C,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,CAAA;CACnB;AAOD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,SAAS,CAEzD;AAED,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/trace-adapter/context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,QAAQ,IAAI,SAAS,EAAE,CAAA;IACvB,+BAA+B;IAC/B,WAAW,IAAI,OAAO,EAAE,CAAA;IACxB,2BAA2B;IAC3B,YAAY,IAAI,QAAQ,EAAE,CAAA;IAC1B,iDAAiD;IACjD,cAAc,IAAI,UAAU,EAAE,CAAA;IAC9B,wDAAwD;IACxD,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAClC,wDAAwD;IACxD,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IACpC,6CAA6C;IAC7C,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,CAAA;CACnB;AAOD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,SAAS,CAEzD;AAED,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrG,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAqD/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;CAAE,CASpF"}
|