@testingbot/mobilewright-driver 0.6.0 → 0.7.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/CHANGELOG.md +36 -0
- package/README.md +27 -7
- package/dist/actions.d.ts +6 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +14 -0
- package/dist/actions.js.map +1 -1
- package/dist/driver.d.ts +32 -6
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +195 -17
- package/dist/driver.js.map +1 -1
- package/dist/hierarchy.d.ts +8 -1
- package/dist/hierarchy.d.ts.map +1 -1
- package/dist/hierarchy.js +18 -19
- package/dist/hierarchy.js.map +1 -1
- package/dist/observer.d.ts +11 -1
- package/dist/observer.d.ts.map +1 -1
- package/dist/observer.js +35 -1
- package/dist/observer.js.map +1 -1
- package/dist/options.d.ts +25 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +3 -0
- package/dist/options.js.map +1 -1
- package/dist/png.d.ts +17 -0
- package/dist/png.d.ts.map +1 -0
- package/dist/png.js +201 -0
- package/dist/png.js.map +1 -0
- package/dist/run-log.d.ts +22 -1
- package/dist/run-log.d.ts.map +1 -1
- package/dist/run-log.js +6 -1
- package/dist/run-log.js.map +1 -1
- package/dist/test-info.d.ts +43 -0
- package/dist/test-info.d.ts.map +1 -0
- package/dist/test-info.js +71 -0
- package/dist/test-info.js.map +1 -0
- package/package.json +1 -1
package/dist/png.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { deflateSync, inflateSync } from 'node:zlib';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal PNG crop/downscale for `screenshot({ clip, scale })`. Appium returns
|
|
4
|
+
* 8-bit RGB or RGBA screenshots, so that is all this decodes. Anything else
|
|
5
|
+
* (palette, 16-bit, grayscale, interlaced) returns `undefined`, and the caller
|
|
6
|
+
* falls back to the uncropped image instead of failing the screenshot.
|
|
7
|
+
*/
|
|
8
|
+
const SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
9
|
+
export function pngSize(png) {
|
|
10
|
+
if (png.length < 24 || !png.subarray(0, 8).equals(SIGNATURE))
|
|
11
|
+
return undefined;
|
|
12
|
+
return { width: png.readUInt32BE(16), height: png.readUInt32BE(20) };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Crop `png` to `rect` (in image pixels, clamped to the image) and then
|
|
16
|
+
* downscale by `factor` (0 < factor <= 1). Returns undefined when the PNG
|
|
17
|
+
* format is unsupported or the rect lies entirely outside the image.
|
|
18
|
+
*/
|
|
19
|
+
export function transformPng(png, rect, factor = 1) {
|
|
20
|
+
const img = decode(png);
|
|
21
|
+
if (!img)
|
|
22
|
+
return undefined;
|
|
23
|
+
let x0 = 0, y0 = 0, w = img.width, h = img.height;
|
|
24
|
+
if (rect) {
|
|
25
|
+
x0 = clamp(Math.floor(rect.x), 0, img.width);
|
|
26
|
+
y0 = clamp(Math.floor(rect.y), 0, img.height);
|
|
27
|
+
const x1 = clamp(Math.ceil(rect.x + rect.width), 0, img.width);
|
|
28
|
+
const y1 = clamp(Math.ceil(rect.y + rect.height), 0, img.height);
|
|
29
|
+
w = x1 - x0;
|
|
30
|
+
h = y1 - y0;
|
|
31
|
+
if (w <= 0 || h <= 0)
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const { bpp } = img;
|
|
35
|
+
const srcStride = img.width * bpp;
|
|
36
|
+
let out = Buffer.alloc(w * h * bpp);
|
|
37
|
+
for (let row = 0; row < h; row++) {
|
|
38
|
+
const start = (y0 + row) * srcStride + x0 * bpp;
|
|
39
|
+
img.pixels.copy(out, row * w * bpp, start, start + w * bpp);
|
|
40
|
+
}
|
|
41
|
+
if (factor > 0 && factor < 1) {
|
|
42
|
+
const dw = Math.max(1, Math.round(w * factor));
|
|
43
|
+
const dh = Math.max(1, Math.round(h * factor));
|
|
44
|
+
out = downscale(out, w, h, dw, dh, bpp);
|
|
45
|
+
w = dw;
|
|
46
|
+
h = dh;
|
|
47
|
+
}
|
|
48
|
+
return encode(out, w, h, bpp, img.colorType);
|
|
49
|
+
}
|
|
50
|
+
function decode(png) {
|
|
51
|
+
if (png.length < 33 || !png.subarray(0, 8).equals(SIGNATURE))
|
|
52
|
+
return undefined;
|
|
53
|
+
let offset = 8;
|
|
54
|
+
let width = 0, height = 0, colorType = -1, bitDepth = 0, interlace = 0;
|
|
55
|
+
const idat = [];
|
|
56
|
+
while (offset + 8 <= png.length) {
|
|
57
|
+
const length = png.readUInt32BE(offset);
|
|
58
|
+
const type = png.toString('latin1', offset + 4, offset + 8);
|
|
59
|
+
const data = png.subarray(offset + 8, offset + 8 + length);
|
|
60
|
+
if (type === 'IHDR') {
|
|
61
|
+
width = data.readUInt32BE(0);
|
|
62
|
+
height = data.readUInt32BE(4);
|
|
63
|
+
bitDepth = data[8];
|
|
64
|
+
colorType = data[9];
|
|
65
|
+
interlace = data[12];
|
|
66
|
+
}
|
|
67
|
+
else if (type === 'IDAT') {
|
|
68
|
+
idat.push(data);
|
|
69
|
+
}
|
|
70
|
+
else if (type === 'IEND') {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
offset += 12 + length;
|
|
74
|
+
}
|
|
75
|
+
const bpp = colorType === 6 ? 4 : colorType === 2 ? 3 : 0;
|
|
76
|
+
if (!bpp || bitDepth !== 8 || interlace !== 0 || !width || !height || !idat.length)
|
|
77
|
+
return undefined;
|
|
78
|
+
const raw = inflateSync(Buffer.concat(idat));
|
|
79
|
+
const stride = width * bpp;
|
|
80
|
+
if (raw.length < height * (stride + 1))
|
|
81
|
+
return undefined;
|
|
82
|
+
const pixels = Buffer.alloc(height * stride);
|
|
83
|
+
for (let y = 0; y < height; y++) {
|
|
84
|
+
const filter = raw[y * (stride + 1)];
|
|
85
|
+
const src = y * (stride + 1) + 1;
|
|
86
|
+
const dst = y * stride;
|
|
87
|
+
const prev = y > 0 ? dst - stride : -1;
|
|
88
|
+
for (let i = 0; i < stride; i++) {
|
|
89
|
+
const left = i >= bpp ? pixels[dst + i - bpp] : 0;
|
|
90
|
+
const up = prev >= 0 ? pixels[prev + i] : 0;
|
|
91
|
+
const upLeft = prev >= 0 && i >= bpp ? pixels[prev + i - bpp] : 0;
|
|
92
|
+
let pred;
|
|
93
|
+
switch (filter) {
|
|
94
|
+
case 0:
|
|
95
|
+
pred = 0;
|
|
96
|
+
break;
|
|
97
|
+
case 1:
|
|
98
|
+
pred = left;
|
|
99
|
+
break;
|
|
100
|
+
case 2:
|
|
101
|
+
pred = up;
|
|
102
|
+
break;
|
|
103
|
+
case 3:
|
|
104
|
+
pred = (left + up) >> 1;
|
|
105
|
+
break;
|
|
106
|
+
case 4:
|
|
107
|
+
pred = paeth(left, up, upLeft);
|
|
108
|
+
break;
|
|
109
|
+
default: return undefined;
|
|
110
|
+
}
|
|
111
|
+
pixels[dst + i] = (raw[src + i] + pred) & 0xff;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { width, height, bpp, colorType, pixels };
|
|
115
|
+
}
|
|
116
|
+
function encode(pixels, width, height, bpp, colorType) {
|
|
117
|
+
const stride = width * bpp;
|
|
118
|
+
// Filter type 1 (Sub) on every row: cheap and compresses screenshots well.
|
|
119
|
+
const raw = Buffer.alloc(height * (stride + 1));
|
|
120
|
+
for (let y = 0; y < height; y++) {
|
|
121
|
+
const dst = y * (stride + 1);
|
|
122
|
+
const src = y * stride;
|
|
123
|
+
raw[dst] = 1;
|
|
124
|
+
for (let i = 0; i < stride; i++) {
|
|
125
|
+
const left = i >= bpp ? pixels[src + i - bpp] : 0;
|
|
126
|
+
raw[dst + 1 + i] = (pixels[src + i] - left) & 0xff;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const ihdr = Buffer.alloc(13);
|
|
130
|
+
ihdr.writeUInt32BE(width, 0);
|
|
131
|
+
ihdr.writeUInt32BE(height, 4);
|
|
132
|
+
ihdr[8] = 8;
|
|
133
|
+
ihdr[9] = colorType;
|
|
134
|
+
return Buffer.concat([
|
|
135
|
+
SIGNATURE,
|
|
136
|
+
chunk('IHDR', ihdr),
|
|
137
|
+
chunk('IDAT', deflateSync(raw)),
|
|
138
|
+
chunk('IEND', Buffer.alloc(0)),
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
/** Box-filter downscale: each output pixel averages the source pixels it covers. */
|
|
142
|
+
function downscale(src, sw, sh, dw, dh, bpp) {
|
|
143
|
+
const out = Buffer.alloc(dw * dh * bpp);
|
|
144
|
+
const sum = new Array(bpp);
|
|
145
|
+
for (let dy = 0; dy < dh; dy++) {
|
|
146
|
+
const ys = Math.floor((dy * sh) / dh);
|
|
147
|
+
const ye = Math.max(ys + 1, Math.floor(((dy + 1) * sh) / dh));
|
|
148
|
+
for (let dx = 0; dx < dw; dx++) {
|
|
149
|
+
const xs = Math.floor((dx * sw) / dw);
|
|
150
|
+
const xe = Math.max(xs + 1, Math.floor(((dx + 1) * sw) / dw));
|
|
151
|
+
sum.fill(0);
|
|
152
|
+
for (let y = ys; y < ye; y++) {
|
|
153
|
+
for (let x = xs; x < xe; x++) {
|
|
154
|
+
const p = (y * sw + x) * bpp;
|
|
155
|
+
for (let c = 0; c < bpp; c++)
|
|
156
|
+
sum[c] += src[p + c];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const n = (ye - ys) * (xe - xs);
|
|
160
|
+
const o = (dy * dw + dx) * bpp;
|
|
161
|
+
for (let c = 0; c < bpp; c++)
|
|
162
|
+
out[o + c] = Math.round(sum[c] / n);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
function chunk(type, data) {
|
|
168
|
+
const head = Buffer.alloc(8);
|
|
169
|
+
head.writeUInt32BE(data.length, 0);
|
|
170
|
+
head.write(type, 4, 'latin1');
|
|
171
|
+
const crc = Buffer.alloc(4);
|
|
172
|
+
crc.writeUInt32BE(crc32(Buffer.concat([head.subarray(4), data])) >>> 0, 0);
|
|
173
|
+
return Buffer.concat([head, data, crc]);
|
|
174
|
+
}
|
|
175
|
+
let crcTable;
|
|
176
|
+
function crc32(buf) {
|
|
177
|
+
if (!crcTable) {
|
|
178
|
+
crcTable = new Int32Array(256);
|
|
179
|
+
for (let n = 0; n < 256; n++) {
|
|
180
|
+
let c = n;
|
|
181
|
+
for (let k = 0; k < 8; k++)
|
|
182
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
183
|
+
crcTable[n] = c;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
let crc = -1;
|
|
187
|
+
for (let i = 0; i < buf.length; i++)
|
|
188
|
+
crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
|
|
189
|
+
return crc ^ -1;
|
|
190
|
+
}
|
|
191
|
+
function paeth(a, b, c) {
|
|
192
|
+
const p = a + b - c;
|
|
193
|
+
const pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);
|
|
194
|
+
if (pa <= pb && pa <= pc)
|
|
195
|
+
return a;
|
|
196
|
+
return pb <= pc ? b : c;
|
|
197
|
+
}
|
|
198
|
+
function clamp(v, lo, hi) {
|
|
199
|
+
return Math.min(Math.max(v, lo), hi);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=png.js.map
|
package/dist/png.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../src/png.ts"],"names":[],"mappings":"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"}
|
package/dist/run-log.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AttemptOutcome } from './test-info.js';
|
|
1
2
|
/**
|
|
2
3
|
* Tiny JSONL file shared between the coordinator process (allocator half,
|
|
3
4
|
* observer) and worker processes (session half) of one mobilewright run —
|
|
@@ -18,6 +19,9 @@ export interface SessionRecord {
|
|
|
18
19
|
* reports the same index per test, so a session can be matched against the
|
|
19
20
|
* tests of its own worker instead of every test in the run. */
|
|
20
21
|
workerIndex?: number;
|
|
22
|
+
/** The test attempt that ran in this connect/disconnect cycle, read from
|
|
23
|
+
* Playwright's test.info() inside the worker — an exact join, when present. */
|
|
24
|
+
test?: AttemptOutcome;
|
|
21
25
|
}
|
|
22
26
|
export interface AppRecord {
|
|
23
27
|
type: 'app';
|
|
@@ -32,7 +36,21 @@ export interface RecordingRecord {
|
|
|
32
36
|
/** Local MP4 path the caller asked stopRecording() to produce. */
|
|
33
37
|
output: string;
|
|
34
38
|
}
|
|
35
|
-
|
|
39
|
+
/**
|
|
40
|
+
* The criteria a pool slot was allocated with. mobilewright's connect() only
|
|
41
|
+
* forwards platform/deviceId/deviceType, so a worker rotating sessions
|
|
42
|
+
* (sessionPerTest) looks the slot's deviceName/osVersion filter up here —
|
|
43
|
+
* without it every rotated session would land on an arbitrary device.
|
|
44
|
+
*/
|
|
45
|
+
export interface SlotRecord {
|
|
46
|
+
type: 'slot';
|
|
47
|
+
/** The pool deviceId — the WebDriver session id allocate() returned. */
|
|
48
|
+
deviceId: string;
|
|
49
|
+
deviceType?: string;
|
|
50
|
+
osVersion?: string;
|
|
51
|
+
deviceNamePattern?: string;
|
|
52
|
+
}
|
|
53
|
+
type Record_ = SessionRecord | AppRecord | RecordingRecord | SlotRecord;
|
|
36
54
|
export interface MergedSession {
|
|
37
55
|
sessionId: string;
|
|
38
56
|
/** Number of connect/disconnect cycles (= tests) recorded for this session. */
|
|
@@ -43,6 +61,8 @@ export interface MergedSession {
|
|
|
43
61
|
* recorded cycle agrees, since a pooled slot re-granted across workers has
|
|
44
62
|
* no single owner. */
|
|
45
63
|
workerIndex?: number;
|
|
64
|
+
/** Test attempts recorded for this session (one per span, when known). */
|
|
65
|
+
tests: AttemptOutcome[];
|
|
46
66
|
}
|
|
47
67
|
export declare class RunLog {
|
|
48
68
|
readonly path: string;
|
|
@@ -60,6 +80,7 @@ export declare class RunLog {
|
|
|
60
80
|
sessions(): MergedSession[];
|
|
61
81
|
sessionIds(): string[];
|
|
62
82
|
recordings(): RecordingRecord[];
|
|
83
|
+
slotFor(deviceId: string): SlotRecord | undefined;
|
|
63
84
|
appUrlsFor(platform: string, deviceType: string | undefined): string[] | undefined;
|
|
64
85
|
}
|
|
65
86
|
export {};
|
package/dist/run-log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-log.d.ts","sourceRoot":"","sources":["../src/run-log.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-log.d.ts","sourceRoot":"","sources":["../src/run-log.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB;uEACmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;oEAGgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;oFACgF;IAChF,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,KAAK,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,eAAe,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;2BAEuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,qBAAa,MAAM;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,GAAG,GAAE,MAAiB,EAAE,GAAG,GAAE,MAAsB;IAK/D,QAAQ,IAAI,IAAI;IAQhB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAQ7B,IAAI,IAAI,OAAO,EAAE;IAWjB;;;;;;OAMG;IACH,QAAQ,IAAI,aAAa,EAAE;IA0B3B,UAAU,IAAI,MAAM,EAAE;IAItB,UAAU,IAAI,eAAe,EAAE;IAI/B,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIjD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS;CAOnF"}
|
package/dist/run-log.js
CHANGED
|
@@ -48,7 +48,9 @@ export class RunLog {
|
|
|
48
48
|
for (const record of this.read()) {
|
|
49
49
|
if (record.type !== 'session')
|
|
50
50
|
continue;
|
|
51
|
-
const merged = byId.get(record.sessionId) ?? { sessionId: record.sessionId, spans: 0 };
|
|
51
|
+
const merged = byId.get(record.sessionId) ?? { sessionId: record.sessionId, spans: 0, tests: [] };
|
|
52
|
+
if (record.test)
|
|
53
|
+
merged.tests.push(record.test);
|
|
52
54
|
if (record.startedAt !== undefined && record.endedAt !== undefined) {
|
|
53
55
|
merged.spans += 1;
|
|
54
56
|
merged.startedAt = Math.min(merged.startedAt ?? record.startedAt, record.startedAt);
|
|
@@ -74,6 +76,9 @@ export class RunLog {
|
|
|
74
76
|
recordings() {
|
|
75
77
|
return this.read().filter((r) => r.type === 'recording');
|
|
76
78
|
}
|
|
79
|
+
slotFor(deviceId) {
|
|
80
|
+
return this.read().find((r) => r.type === 'slot' && r.deviceId === deviceId);
|
|
81
|
+
}
|
|
77
82
|
appUrlsFor(platform, deviceType) {
|
|
78
83
|
const apps = this.read().filter((r) => r.type === 'app');
|
|
79
84
|
return (apps.find((a) => a.platform === platform && a.deviceType === deviceType) ??
|
package/dist/run-log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-log.js","sourceRoot":"","sources":["../src/run-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run-log.js","sourceRoot":"","sources":["../src/run-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** The slice of Playwright's TestInfo the driver reads. */
|
|
2
|
+
export interface CurrentTestInfo {
|
|
3
|
+
testId: string;
|
|
4
|
+
title: string;
|
|
5
|
+
/** [file, ...describe titles, title] */
|
|
6
|
+
titlePath: string[];
|
|
7
|
+
retry: number;
|
|
8
|
+
status?: 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted';
|
|
9
|
+
expectedStatus: 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted';
|
|
10
|
+
errors: {
|
|
11
|
+
message?: string;
|
|
12
|
+
}[];
|
|
13
|
+
annotations: {
|
|
14
|
+
type: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
}[];
|
|
17
|
+
project: {
|
|
18
|
+
name: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Outcome of one test attempt, as seen from inside the worker at disconnect(). */
|
|
22
|
+
export interface AttemptOutcome {
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
retry: number;
|
|
26
|
+
status: 'passed' | 'failed' | 'skipped';
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
type PlaywrightTest = {
|
|
30
|
+
test: {
|
|
31
|
+
info(): CurrentTestInfo;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
/** The test running in this worker right now, or undefined outside a test. */
|
|
35
|
+
export declare function currentTestInfo(): CurrentTestInfo | undefined;
|
|
36
|
+
/** Dashboard name for a test attempt: describe › title, marked when retried. */
|
|
37
|
+
export declare function attemptName(info: Pick<CurrentTestInfo, 'titlePath' | 'title' | 'retry'>): string;
|
|
38
|
+
/** The attempt's outcome, valid once the test body has finished (fixture teardown). */
|
|
39
|
+
export declare function attemptOutcome(info: CurrentTestInfo): AttemptOutcome | undefined;
|
|
40
|
+
/** Test seam: replace the resolver (undefined restores the real one). */
|
|
41
|
+
export declare function setPlaywrightTestForTesting(value: PlaywrightTest | null | undefined): void;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=test-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-info.d.ts","sourceRoot":"","sources":["../src/test-info.ts"],"names":[],"mappings":"AAMA,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;IACtE,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;IAC7E,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/B,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,cAAc,GAAG;IAAE,IAAI,EAAE;QAAE,IAAI,IAAI,eAAe,CAAA;KAAE,CAAA;CAAE,CAAC;AA4B5D,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,eAAe,GAAG,SAAS,CAM7D;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM,CAGhG;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS,CAahF;AAQD,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAE1F"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import createDebug from 'debug';
|
|
4
|
+
const debug = createDebug('testingbot:test-info');
|
|
5
|
+
let playwrightTest;
|
|
6
|
+
/**
|
|
7
|
+
* Load the `@playwright/test` copy the user's tests actually run on:
|
|
8
|
+
* `test.info()` reads state held by that module instance, so it is resolved
|
|
9
|
+
* the way `@mobilewright/test` resolves it, falling back to the project's own.
|
|
10
|
+
*/
|
|
11
|
+
function loadPlaywrightTest() {
|
|
12
|
+
if (playwrightTest !== undefined)
|
|
13
|
+
return playwrightTest;
|
|
14
|
+
const fromProject = createRequire(join(process.cwd(), 'package.json'));
|
|
15
|
+
const origins = [
|
|
16
|
+
() => createRequire(fromProject.resolve('@mobilewright/test')),
|
|
17
|
+
() => fromProject,
|
|
18
|
+
];
|
|
19
|
+
for (const origin of origins) {
|
|
20
|
+
try {
|
|
21
|
+
playwrightTest = origin()('@playwright/test');
|
|
22
|
+
return playwrightTest;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// try the next origin
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
debug('@playwright/test not resolvable — per-test reporting falls back to the run observer');
|
|
29
|
+
playwrightTest = null;
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/** The test running in this worker right now, or undefined outside a test. */
|
|
33
|
+
export function currentTestInfo() {
|
|
34
|
+
try {
|
|
35
|
+
return loadPlaywrightTest()?.test.info();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined; // test.info() throws outside a running test
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Dashboard name for a test attempt: describe › title, marked when retried. */
|
|
42
|
+
export function attemptName(info) {
|
|
43
|
+
const path = info.titlePath.length > 1 ? info.titlePath.slice(1) : [info.title];
|
|
44
|
+
return path.join(' › ') + (info.retry > 0 ? ` (retry ${info.retry})` : '');
|
|
45
|
+
}
|
|
46
|
+
/** The attempt's outcome, valid once the test body has finished (fixture teardown). */
|
|
47
|
+
export function attemptOutcome(info) {
|
|
48
|
+
if (!info.status)
|
|
49
|
+
return undefined;
|
|
50
|
+
const status = info.status === 'skipped'
|
|
51
|
+
? 'skipped'
|
|
52
|
+
: info.status === info.expectedStatus ? 'passed' : 'failed';
|
|
53
|
+
const message = info.errors.find((e) => e.message)?.message;
|
|
54
|
+
return {
|
|
55
|
+
id: info.testId,
|
|
56
|
+
title: attemptName(info),
|
|
57
|
+
retry: info.retry,
|
|
58
|
+
status,
|
|
59
|
+
...(status === 'failed' ? { error: firstLine(message) ?? info.status } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function firstLine(message) {
|
|
63
|
+
// Playwright error messages carry ANSI colour codes.
|
|
64
|
+
// eslint-disable-next-line no-control-regex
|
|
65
|
+
return message?.replace(/\u001b\[[0-9;]*m/g, '').split('\n').find((l) => l.trim())?.trim().slice(0, 200);
|
|
66
|
+
}
|
|
67
|
+
/** Test seam: replace the resolver (undefined restores the real one). */
|
|
68
|
+
export function setPlaywrightTestForTesting(value) {
|
|
69
|
+
playwrightTest = value;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=test-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-info.js","sourceRoot":"","sources":["../src/test-info.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED