@nsxbet/playwright-orchestrator 1.1.0 → 2.0.0
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 +65 -136
- package/dist/commands/assign.d.ts.map +1 -1
- package/dist/commands/assign.js +26 -2
- package/dist/commands/assign.js.map +1 -1
- package/dist/commands/extract-timing.d.ts +0 -1
- package/dist/commands/extract-timing.d.ts.map +1 -1
- package/dist/commands/extract-timing.js +2 -32
- package/dist/commands/extract-timing.js.map +1 -1
- package/dist/core/test-discovery.d.ts +17 -3
- package/dist/core/test-discovery.d.ts.map +1 -1
- package/dist/core/test-discovery.js +39 -19
- package/dist/core/test-discovery.js.map +1 -1
- package/dist/core/test-id.d.ts +23 -67
- package/dist/core/test-id.d.ts.map +1 -1
- package/dist/core/test-id.js +29 -86
- package/dist/core/test-id.js.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/package.json +1 -26
- package/dist/commands/filter-report.d.ts +0 -24
- package/dist/commands/filter-report.d.ts.map +0 -1
- package/dist/commands/filter-report.js +0 -123
- package/dist/commands/filter-report.js.map +0 -1
- package/dist/fixture.d.ts +0 -75
- package/dist/fixture.d.ts.map +0 -1
- package/dist/fixture.js +0 -148
- package/dist/fixture.js.map +0 -1
- package/dist/reporter.d.ts +0 -93
- package/dist/reporter.d.ts.map +0 -1
- package/dist/reporter.js +0 -343
- package/dist/reporter.js.map +0 -1
package/dist/reporter.js
DELETED
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Playwright Orchestrator Reporter
|
|
3
|
-
*
|
|
4
|
-
* A custom Playwright reporter that provides clean output for sharded tests.
|
|
5
|
-
* Shows only tests assigned to the current shard, with proper counts and summaries.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Correct "Running X tests" count (only shard tests, not total)
|
|
9
|
-
* - Clean output showing only shard tests (no skipped noise)
|
|
10
|
-
* - Debug mode to see filtered tests
|
|
11
|
-
* - Compatible with other reporters (json, html)
|
|
12
|
-
*
|
|
13
|
-
* Usage:
|
|
14
|
-
* 1. Add to playwright.config.ts:
|
|
15
|
-
* reporter: [['@nsxbet/playwright-orchestrator/reporter'], ['json', {...}]]
|
|
16
|
-
* 2. Set ORCHESTRATOR_SHARD_FILE env var to path of JSON file with test IDs
|
|
17
|
-
*
|
|
18
|
-
* Environment variables:
|
|
19
|
-
* - ORCHESTRATOR_SHARD_FILE: Path to JSON file with array of test IDs
|
|
20
|
-
* - ORCHESTRATOR_DEBUG: Set to "1" to show filtered tests
|
|
21
|
-
*
|
|
22
|
-
* @module @nsxbet/playwright-orchestrator/reporter
|
|
23
|
-
*/
|
|
24
|
-
import * as fs from 'node:fs';
|
|
25
|
-
import * as path from 'node:path';
|
|
26
|
-
import { buildTestIdFromRuntime, filterRuntimeTitlePath, } from './core/test-id.js';
|
|
27
|
-
// ANSI color codes
|
|
28
|
-
const colors = {
|
|
29
|
-
green: '\x1b[32m',
|
|
30
|
-
red: '\x1b[31m',
|
|
31
|
-
yellow: '\x1b[33m',
|
|
32
|
-
gray: '\x1b[90m',
|
|
33
|
-
reset: '\x1b[0m',
|
|
34
|
-
bold: '\x1b[1m',
|
|
35
|
-
};
|
|
36
|
-
// Check if colors should be used
|
|
37
|
-
const useColors = process.env.FORCE_COLOR !== '0' &&
|
|
38
|
-
process.env.NO_COLOR === undefined &&
|
|
39
|
-
process.stdout.isTTY;
|
|
40
|
-
function color(code, text) {
|
|
41
|
-
return useColors ? `${colors[code]}${text}${colors.reset}` : text;
|
|
42
|
-
}
|
|
43
|
-
export default class OrchestratorReporter {
|
|
44
|
-
allowedTestIds = null;
|
|
45
|
-
debug = process.env.ORCHESTRATOR_DEBUG === '1';
|
|
46
|
-
startTime = 0;
|
|
47
|
-
rootDir = '';
|
|
48
|
-
testDir = '';
|
|
49
|
-
filterJsonPath;
|
|
50
|
-
// Counters for summary
|
|
51
|
-
passed = 0;
|
|
52
|
-
failed = 0;
|
|
53
|
-
skipped = 0;
|
|
54
|
-
filtered = 0;
|
|
55
|
-
constructor(options) {
|
|
56
|
-
this.filterJsonPath = options?.filterJson;
|
|
57
|
-
}
|
|
58
|
-
onBegin(config, suite) {
|
|
59
|
-
this.startTime = Date.now();
|
|
60
|
-
this.rootDir = config.rootDir;
|
|
61
|
-
this.testDir = config.projects[0]?.testDir ?? config.rootDir;
|
|
62
|
-
const shardFile = process.env.ORCHESTRATOR_SHARD_FILE;
|
|
63
|
-
if (!shardFile || !fs.existsSync(shardFile)) {
|
|
64
|
-
// No shard file - let other reporters handle output
|
|
65
|
-
if (this.debug) {
|
|
66
|
-
console.log(color('gray', '[Orchestrator] No shard file, running all tests'));
|
|
67
|
-
}
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
const testIds = JSON.parse(fs.readFileSync(shardFile, 'utf-8'));
|
|
72
|
-
this.allowedTestIds = new Set(testIds);
|
|
73
|
-
// Count tests
|
|
74
|
-
const allTests = suite.allTests();
|
|
75
|
-
const shardTestCount = this.allowedTestIds.size;
|
|
76
|
-
this.filtered = allTests.length - shardTestCount;
|
|
77
|
-
// Print header
|
|
78
|
-
const workers = config.workers;
|
|
79
|
-
let header = `\nRunning ${color('bold', String(shardTestCount))} tests using ${workers} workers`;
|
|
80
|
-
if (this.debug && this.filtered > 0) {
|
|
81
|
-
header += color('gray', ` (${this.filtered} filtered by orchestrator)`);
|
|
82
|
-
}
|
|
83
|
-
console.log(header);
|
|
84
|
-
console.log('');
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error('[Orchestrator] Failed to load shard file:', error);
|
|
88
|
-
throw error;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
onTestEnd(test, result) {
|
|
92
|
-
const testId = this.buildTestId(test);
|
|
93
|
-
const isInShard = !this.allowedTestIds || this.allowedTestIds.has(testId);
|
|
94
|
-
if (isInShard) {
|
|
95
|
-
// Track stats for shard tests
|
|
96
|
-
if (result.status === 'passed') {
|
|
97
|
-
this.passed++;
|
|
98
|
-
}
|
|
99
|
-
else if (result.status === 'failed' || result.status === 'timedOut') {
|
|
100
|
-
this.failed++;
|
|
101
|
-
}
|
|
102
|
-
else if (result.status === 'skipped') {
|
|
103
|
-
this.skipped++;
|
|
104
|
-
}
|
|
105
|
-
// Print test result
|
|
106
|
-
this.printTestResult(test, result);
|
|
107
|
-
}
|
|
108
|
-
else if (this.debug) {
|
|
109
|
-
// Show filtered tests only in debug mode
|
|
110
|
-
this.printFiltered(test);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
onEnd(_result) {
|
|
114
|
-
// Only print summary if we have a shard file
|
|
115
|
-
if (!this.allowedTestIds)
|
|
116
|
-
return;
|
|
117
|
-
const duration = Date.now() - this.startTime;
|
|
118
|
-
const durationStr = this.formatDuration(duration);
|
|
119
|
-
console.log('');
|
|
120
|
-
// Build summary parts
|
|
121
|
-
const parts = [];
|
|
122
|
-
if (this.passed > 0) {
|
|
123
|
-
parts.push(color('green', `${this.passed} passed`));
|
|
124
|
-
}
|
|
125
|
-
if (this.failed > 0) {
|
|
126
|
-
parts.push(color('red', `${this.failed} failed`));
|
|
127
|
-
}
|
|
128
|
-
if (this.skipped > 0) {
|
|
129
|
-
parts.push(color('yellow', `${this.skipped} skipped`));
|
|
130
|
-
}
|
|
131
|
-
if (parts.length > 0) {
|
|
132
|
-
console.log(` ${parts.join(', ')} ${color('gray', `(${durationStr})`)}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Print a test result line
|
|
137
|
-
*/
|
|
138
|
-
printTestResult(test, result) {
|
|
139
|
-
const duration = result.duration;
|
|
140
|
-
const durationStr = duration > 0 ? color('gray', ` (${this.formatDuration(duration)})`) : '';
|
|
141
|
-
const titlePath = this.getDisplayTitle(test);
|
|
142
|
-
let status;
|
|
143
|
-
switch (result.status) {
|
|
144
|
-
case 'passed':
|
|
145
|
-
status = color('green', '✓');
|
|
146
|
-
break;
|
|
147
|
-
case 'failed':
|
|
148
|
-
case 'timedOut':
|
|
149
|
-
status = color('red', '✗');
|
|
150
|
-
break;
|
|
151
|
-
case 'skipped':
|
|
152
|
-
status = color('yellow', '-');
|
|
153
|
-
break;
|
|
154
|
-
default:
|
|
155
|
-
status = '?';
|
|
156
|
-
}
|
|
157
|
-
console.log(` ${status} ${titlePath}${durationStr}`);
|
|
158
|
-
// Print error for failed tests
|
|
159
|
-
if (result.status === 'failed' || result.status === 'timedOut') {
|
|
160
|
-
for (const error of result.errors) {
|
|
161
|
-
if (error.message) {
|
|
162
|
-
const lines = error.message.split('\n').slice(0, 3);
|
|
163
|
-
for (const line of lines) {
|
|
164
|
-
console.log(color('red', ` ${line}`));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Print a filtered test (debug mode only)
|
|
172
|
-
*/
|
|
173
|
-
printFiltered(test) {
|
|
174
|
-
const titlePath = this.getDisplayTitle(test);
|
|
175
|
-
console.log(` ${color('gray', '○')} ${color('gray', titlePath)}`);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Get display title for a test (file > describe > test)
|
|
179
|
-
*/
|
|
180
|
-
getDisplayTitle(test) {
|
|
181
|
-
const file = path.basename(test.location.file);
|
|
182
|
-
const filteredTitles = this.getFilteredTitles(test);
|
|
183
|
-
return `${file} > ${filteredTitles.join(' > ')}`;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Filter titlePath to get only describe blocks and test title.
|
|
187
|
-
* Uses shared filterRuntimeTitlePath function for consistency.
|
|
188
|
-
*/
|
|
189
|
-
getFilteredTitles(test) {
|
|
190
|
-
const titlePath = test.titlePath();
|
|
191
|
-
const projectName = test.parent?.project()?.name;
|
|
192
|
-
const fileName = path.basename(test.location.file);
|
|
193
|
-
return filterRuntimeTitlePath(titlePath, { projectName, fileName });
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Format duration in human readable format
|
|
197
|
-
*/
|
|
198
|
-
formatDuration(ms) {
|
|
199
|
-
if (ms < 1000) {
|
|
200
|
-
return `${ms}ms`;
|
|
201
|
-
}
|
|
202
|
-
const seconds = ms / 1000;
|
|
203
|
-
if (seconds < 60) {
|
|
204
|
-
return `${seconds.toFixed(1)}s`;
|
|
205
|
-
}
|
|
206
|
-
const minutes = Math.floor(seconds / 60);
|
|
207
|
-
const remainingSeconds = Math.round(seconds % 60);
|
|
208
|
-
return `${minutes}m ${remainingSeconds}s`;
|
|
209
|
-
}
|
|
210
|
-
async onExit() {
|
|
211
|
-
if (!this.filterJsonPath || !this.allowedTestIds)
|
|
212
|
-
return;
|
|
213
|
-
const reportPath = path.resolve(this.filterJsonPath);
|
|
214
|
-
if (!fs.existsSync(reportPath)) {
|
|
215
|
-
if (this.debug) {
|
|
216
|
-
console.log(color('gray', `[Orchestrator] filterJson file not found: ${reportPath}`));
|
|
217
|
-
}
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));
|
|
222
|
-
if (!report.suites)
|
|
223
|
-
return;
|
|
224
|
-
const testDir = report.config?.projects?.[0]?.testDir || this.testDir || this.rootDir;
|
|
225
|
-
const beforeCount = this.countSpecs(report.suites);
|
|
226
|
-
this.filterSuitesById(report.suites, testDir, this.allowedTestIds, [], true);
|
|
227
|
-
const afterCount = this.countSpecs(report.suites);
|
|
228
|
-
if (report.stats) {
|
|
229
|
-
report.stats = this.recalculateStats(report.suites, report.stats);
|
|
230
|
-
}
|
|
231
|
-
fs.writeFileSync(reportPath, JSON.stringify(report));
|
|
232
|
-
if (this.debug) {
|
|
233
|
-
console.log(color('gray', `[Orchestrator] Filtered JSON report: ${beforeCount} → ${afterCount} specs (removed ${beforeCount - afterCount})`));
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
catch (error) {
|
|
237
|
-
console.error('[Orchestrator] Failed to filter JSON report:', error);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Filter specs by checking test IDs against the allowedTestIds set.
|
|
242
|
-
* Builds test IDs from the JSON report structure (file path + describe chain + spec title),
|
|
243
|
-
* matching the same format used by discovery (buildTestId) and runtime (buildTestIdFromRuntime).
|
|
244
|
-
*
|
|
245
|
-
* This correctly handles ALL non-shard tests, including genuinely skipped tests
|
|
246
|
-
* (test.skip, test.fixme, test.describe.skip) that never receive the "Not in shard" annotation
|
|
247
|
-
* because the orchestrator fixture doesn't run for them.
|
|
248
|
-
*/
|
|
249
|
-
filterSuitesById(suites, testDir, allowedIds, parentTitles, isRootLevel) {
|
|
250
|
-
for (let i = suites.length - 1; i >= 0; i--) {
|
|
251
|
-
const suite = suites[i];
|
|
252
|
-
if (!suite)
|
|
253
|
-
continue;
|
|
254
|
-
const suiteTitle = suite.title;
|
|
255
|
-
const suiteFile = suite.file;
|
|
256
|
-
// Root-level suites are file-level (title = filename) → skip from describe chain
|
|
257
|
-
// Nested suites are describe blocks → include title in chain
|
|
258
|
-
const currentTitles = isRootLevel ? [] : [...parentTitles, suiteTitle];
|
|
259
|
-
const filePath = suiteFile
|
|
260
|
-
? this.resolveReportFilePath(suiteFile, testDir)
|
|
261
|
-
: '';
|
|
262
|
-
if (Array.isArray(suite.specs)) {
|
|
263
|
-
suite.specs = suite.specs.filter((spec) => {
|
|
264
|
-
const specTitle = spec.title;
|
|
265
|
-
const testId = [filePath, ...currentTitles, specTitle].join('::');
|
|
266
|
-
return allowedIds.has(testId);
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
if (Array.isArray(suite.suites)) {
|
|
270
|
-
this.filterSuitesById(suite.suites, testDir, allowedIds, currentTitles, false);
|
|
271
|
-
}
|
|
272
|
-
const hasSpecs = Array.isArray(suite.specs) && suite.specs.length > 0;
|
|
273
|
-
const hasSubSuites = Array.isArray(suite.suites) && suite.suites.length > 0;
|
|
274
|
-
if (!hasSpecs && !hasSubSuites) {
|
|
275
|
-
suites.splice(i, 1);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
resolveReportFilePath(filePath, testDir) {
|
|
280
|
-
if (path.isAbsolute(filePath)) {
|
|
281
|
-
return path.relative(testDir, filePath).replace(/\\/g, '/');
|
|
282
|
-
}
|
|
283
|
-
return filePath.replace(/\\/g, '/');
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Recalculate the stats object to match the filtered suites.
|
|
287
|
-
* Playwright JSON stats use: expected (passed), skipped, unexpected (failed), flaky.
|
|
288
|
-
*/
|
|
289
|
-
recalculateStats(suites, originalStats) {
|
|
290
|
-
const counts = { expected: 0, unexpected: 0, skipped: 0, flaky: 0 };
|
|
291
|
-
this.countTestStatuses(suites, counts);
|
|
292
|
-
return { ...originalStats, ...counts };
|
|
293
|
-
}
|
|
294
|
-
countTestStatuses(suites, counts) {
|
|
295
|
-
for (const suite of suites) {
|
|
296
|
-
if (Array.isArray(suite.specs)) {
|
|
297
|
-
for (const spec of suite.specs) {
|
|
298
|
-
const tests = spec.tests;
|
|
299
|
-
if (!tests)
|
|
300
|
-
continue;
|
|
301
|
-
for (const test of tests) {
|
|
302
|
-
const status = test.status;
|
|
303
|
-
if (status in counts && counts[status] !== undefined) {
|
|
304
|
-
counts[status] = counts[status] + 1;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
if (Array.isArray(suite.suites)) {
|
|
310
|
-
this.countTestStatuses(suite.suites, counts);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
countSpecs(suites) {
|
|
315
|
-
let count = 0;
|
|
316
|
-
for (const suite of suites) {
|
|
317
|
-
if (Array.isArray(suite.specs))
|
|
318
|
-
count += suite.specs.length;
|
|
319
|
-
if (Array.isArray(suite.suites))
|
|
320
|
-
count += this.countSpecs(suite.suites);
|
|
321
|
-
}
|
|
322
|
-
return count;
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Build test ID from TestCase.
|
|
326
|
-
* Uses shared buildTestIdFromRuntime function for consistency with fixture.
|
|
327
|
-
*
|
|
328
|
-
* CRITICAL: Must use project.testDir to match discovery-generated test IDs.
|
|
329
|
-
* No fallback to rootDir or process.cwd() - these cause path mismatch bugs.
|
|
330
|
-
*/
|
|
331
|
-
buildTestId(test) {
|
|
332
|
-
const testDir = test.parent?.project()?.testDir;
|
|
333
|
-
if (!testDir) {
|
|
334
|
-
throw new Error('[Orchestrator Reporter] Could not determine project testDir. ' +
|
|
335
|
-
'Ensure your playwright.config.ts has projects configured with testDir.');
|
|
336
|
-
}
|
|
337
|
-
return buildTestIdFromRuntime(test.location.file, test.titlePath(), {
|
|
338
|
-
projectName: test.parent?.project()?.name,
|
|
339
|
-
baseDir: testDir,
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
//# sourceMappingURL=reporter.js.map
|
package/dist/reporter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|