@testrelic/core 2.14.0-next.114 → 2.16.0-next.124
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/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +312 -3
- package/dist/index.d.ts +312 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* All interfaces for the JSON output schema, reporter configuration,
|
|
5
5
|
* and internal fixture-to-reporter communication.
|
|
6
6
|
*
|
|
7
|
-
* Schema Version: 1.
|
|
7
|
+
* Schema Version: 1.6.0
|
|
8
8
|
*/
|
|
9
9
|
type NavigationType = 'goto' | 'navigation' | 'back' | 'forward' | 'refresh' | 'spa_route' | 'spa_replace' | 'hash_change' | 'link_click' | 'form_submit' | 'redirect' | 'popstate' | 'page_load' | 'manual_record' | 'fallback' | 'dummy';
|
|
10
10
|
interface TestRunReport {
|
|
@@ -56,6 +56,30 @@ interface Summary {
|
|
|
56
56
|
readonly totalTimelineSteps: number;
|
|
57
57
|
readonly totalActionSteps: number;
|
|
58
58
|
readonly actionStepsByCategory: Record<string, number>;
|
|
59
|
+
/** Visual baseline comparisons across the run. */
|
|
60
|
+
readonly visualChecks?: number;
|
|
61
|
+
/** Of those, how many differed from their baseline. */
|
|
62
|
+
readonly visualFailures?: number;
|
|
63
|
+
/** Of those, how many had no baseline and wrote one. */
|
|
64
|
+
readonly visualNew?: number;
|
|
65
|
+
/** DOM elements that differed across the run's visual comparisons. */
|
|
66
|
+
readonly visualDomChanges?: number;
|
|
67
|
+
/** Action steps across the run, bucketed by the driver's own category. */
|
|
68
|
+
readonly actionStepsByKind?: Record<string, number>;
|
|
69
|
+
/** Device-log lines captured across the run (mobile). */
|
|
70
|
+
readonly deviceLogLines?: number;
|
|
71
|
+
/** Of those, how many were error or fatal. */
|
|
72
|
+
readonly deviceLogErrors?: number;
|
|
73
|
+
/** Of those, how many came from a crash log. */
|
|
74
|
+
readonly deviceLogCrashes?: number;
|
|
75
|
+
/** Screenshots captured across the run. */
|
|
76
|
+
readonly screenshotCount?: number;
|
|
77
|
+
/** Screen recordings captured across the run. */
|
|
78
|
+
readonly videoCount?: number;
|
|
79
|
+
/** AI-detected defects across the run, by severity. */
|
|
80
|
+
readonly aiDefectsBySeverity?: Record<string, number>;
|
|
81
|
+
/** Distinct devices the run touched. */
|
|
82
|
+
readonly devices?: readonly DeviceInfo[];
|
|
59
83
|
}
|
|
60
84
|
interface CIMetadata {
|
|
61
85
|
readonly provider: CIProvider;
|
|
@@ -99,6 +123,12 @@ interface TestResult {
|
|
|
99
123
|
readonly apiAssertions: readonly ApiAssertion[] | null;
|
|
100
124
|
readonly actions: readonly ActionStep[] | null;
|
|
101
125
|
readonly consoleLogs: readonly ConsoleLogEntry[] | null;
|
|
126
|
+
/** Visual baseline comparisons recorded during this test, if any. */
|
|
127
|
+
readonly visual?: readonly VisualComparison[] | null;
|
|
128
|
+
/** The device this test drove (mobile runs only). */
|
|
129
|
+
readonly device?: DeviceInfo | null;
|
|
130
|
+
/** AI-detected defects attributed to this test. */
|
|
131
|
+
readonly aiDefects?: readonly AiDefect[] | null;
|
|
102
132
|
}
|
|
103
133
|
type ResourceType = 'xhr' | 'document' | 'script' | 'stylesheet' | 'image' | 'font' | 'other';
|
|
104
134
|
interface CapturedNetworkRequest {
|
|
@@ -121,6 +151,15 @@ interface CapturedNetworkRequest {
|
|
|
121
151
|
}
|
|
122
152
|
interface TestArtifacts {
|
|
123
153
|
readonly screenshot?: string;
|
|
154
|
+
/**
|
|
155
|
+
* Every screenshot captured for this test, report-relative.
|
|
156
|
+
*
|
|
157
|
+
* `screenshot` is the first one and stays for compatibility. Mobile
|
|
158
|
+
* collectors have always gathered an array — one per step, or one per
|
|
159
|
+
* failure — and only index 0 survived: the artifact copier wrote a single
|
|
160
|
+
* `screenshot.png` and dropped the rest before the report could ask.
|
|
161
|
+
*/
|
|
162
|
+
readonly screenshots?: readonly string[];
|
|
124
163
|
readonly video?: string;
|
|
125
164
|
/**
|
|
126
165
|
* Playwright's trace archive — the DOM snapshots, network log and screencast
|
|
@@ -138,8 +177,183 @@ interface TestArtifacts {
|
|
|
138
177
|
readonly videoKey?: string;
|
|
139
178
|
readonly traceKey?: string;
|
|
140
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Outcome of a single visual baseline comparison.
|
|
182
|
+
*
|
|
183
|
+
* `new` is a snapshot Playwright had no baseline for and therefore wrote one
|
|
184
|
+
* for — it is not a pass, because nothing was actually compared. `updated`
|
|
185
|
+
* means the run was invoked with `--update-snapshots` and the baseline was
|
|
186
|
+
* rewritten, which likewise compares nothing.
|
|
187
|
+
*/
|
|
188
|
+
type VisualStatus = 'passed' | 'failed' | 'new' | 'updated';
|
|
189
|
+
/** Which assertion produced a comparison. */
|
|
190
|
+
type VisualSource = 'toHaveScreenshot' | 'toMatchSnapshot' | 'toMatchVisualBaseline';
|
|
191
|
+
/**
|
|
192
|
+
* One visual baseline comparison within a test.
|
|
193
|
+
*
|
|
194
|
+
* A test may hold many of these — `TestArtifacts` deliberately is not the home
|
|
195
|
+
* for them, because it is single-slot per type (one screenshot, one video, one
|
|
196
|
+
* trace) while a single test can assert against any number of named snapshots.
|
|
197
|
+
*
|
|
198
|
+
* Every image field is a report-relative POSIX path, matching `TestArtifacts`.
|
|
199
|
+
* A passing comparison carries no `actual` or `diff`: Playwright attaches
|
|
200
|
+
* nothing when the images match, so there is nothing to copy.
|
|
201
|
+
*/
|
|
202
|
+
interface VisualComparison {
|
|
203
|
+
/** Snapshot identity within the test, e.g. `home` or `checkout/cart`. */
|
|
204
|
+
readonly name: string;
|
|
205
|
+
readonly status: VisualStatus;
|
|
206
|
+
readonly source: VisualSource;
|
|
207
|
+
/** The committed baseline image. */
|
|
208
|
+
readonly baseline?: string;
|
|
209
|
+
/** What this run rendered. Absent when the comparison passed. */
|
|
210
|
+
readonly actual?: string;
|
|
211
|
+
/** Playwright's rendered diff. Present only on failure. */
|
|
212
|
+
readonly diff?: string;
|
|
213
|
+
/** The previous attempt's render, on a retried failure. */
|
|
214
|
+
readonly previous?: string;
|
|
215
|
+
/** Baseline dimensions, read from the PNG header. */
|
|
216
|
+
readonly width?: number;
|
|
217
|
+
readonly height?: number;
|
|
218
|
+
/** Actual dimensions — set only when they differ from the baseline. */
|
|
219
|
+
readonly actualWidth?: number;
|
|
220
|
+
readonly actualHeight?: number;
|
|
221
|
+
/** Differing pixel count, as reported by Playwright's comparator. */
|
|
222
|
+
readonly diffPixels?: number;
|
|
223
|
+
/** `diffPixels / (width * height)`, computed at full precision. */
|
|
224
|
+
readonly diffPixelRatio?: number;
|
|
225
|
+
/** Cloud storage keys, populated after artifact upload. */
|
|
226
|
+
readonly baselineKey?: string;
|
|
227
|
+
readonly actualKey?: string;
|
|
228
|
+
readonly diffKey?: string;
|
|
229
|
+
/**
|
|
230
|
+
* Which elements changed, ranked by the area they affect.
|
|
231
|
+
*
|
|
232
|
+
* Present only when a DOM baseline existed to compare against. Capped — see
|
|
233
|
+
* `domChangeCount` for the number found before the cap.
|
|
234
|
+
*/
|
|
235
|
+
readonly domChanges?: readonly DomChange[];
|
|
236
|
+
/** Total changes found, which may exceed `domChanges.length`. */
|
|
237
|
+
readonly domChangeCount?: number;
|
|
238
|
+
/**
|
|
239
|
+
* Of those, how many actually changed rather than merely shifting position.
|
|
240
|
+
*
|
|
241
|
+
* The gap between this and `domChangeCount` is the layout knock-on: one card
|
|
242
|
+
* gaining a margin moves everything below it, and a report that presents all
|
|
243
|
+
* of those as equals hides the single edit that caused them.
|
|
244
|
+
*/
|
|
245
|
+
readonly domRootCauses?: number;
|
|
246
|
+
/** True when the DOM capture itself hit a node or byte cap. */
|
|
247
|
+
readonly domTruncated?: boolean;
|
|
248
|
+
/** Report-relative paths to the two captured DOM snapshots. */
|
|
249
|
+
readonly baselineDom?: string;
|
|
250
|
+
readonly actualDom?: string;
|
|
251
|
+
/**
|
|
252
|
+
* The document-space region the screenshot covered: `[x, y, width, height]`.
|
|
253
|
+
*
|
|
254
|
+
* Element rectangles are in document coordinates, so the report needs this to
|
|
255
|
+
* place a box over the image — for a locator screenshot the image covers only
|
|
256
|
+
* that element's box, not the viewport.
|
|
257
|
+
*/
|
|
258
|
+
readonly domCaptureBox?: readonly [number, number, number, number];
|
|
259
|
+
/** Cloud storage keys for the DOM snapshots. */
|
|
260
|
+
readonly baselineDomKey?: string;
|
|
261
|
+
readonly actualDomKey?: string;
|
|
262
|
+
}
|
|
263
|
+
/** How an element differs between the baseline render and this one. */
|
|
264
|
+
type DomChangeKind = 'added' | 'removed' | 'moved' | 'resized' | 'restyled' | 'text'
|
|
265
|
+
/** Its id or class list changed — often the real story behind a restyle. */
|
|
266
|
+
| 'attrs';
|
|
267
|
+
/** One computed style property that differs. */
|
|
268
|
+
interface DomStyleChange {
|
|
269
|
+
readonly prop: string;
|
|
270
|
+
readonly from: string;
|
|
271
|
+
readonly to: string;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* One element that differs between two renders.
|
|
275
|
+
*
|
|
276
|
+
* Deliberately shaped like the platform's existing `RegionEvidence` — rank,
|
|
277
|
+
* bbox, area share, a kind and a human label — so that a DOM overlay becomes
|
|
278
|
+
* another caller of the dashboard's existing box-overlay component rather than
|
|
279
|
+
* a second renderer built alongside it.
|
|
280
|
+
*/
|
|
281
|
+
interface DomChange {
|
|
282
|
+
/** 1-based, ordered by affected area descending. Drives the overlay colour. */
|
|
283
|
+
readonly rank: number;
|
|
284
|
+
/** Structural path used to match the element across the two snapshots. */
|
|
285
|
+
readonly path: string;
|
|
286
|
+
/** What a human reads, e.g. `div.card.accent`. */
|
|
287
|
+
readonly label: string;
|
|
288
|
+
readonly kinds: readonly DomChangeKind[];
|
|
289
|
+
/** Document-space `[x, y, width, height]` in this render. */
|
|
290
|
+
readonly rect?: readonly [number, number, number, number];
|
|
291
|
+
/** The same, in the baseline. Absent for an added element. */
|
|
292
|
+
readonly baselineRect?: readonly [number, number, number, number];
|
|
293
|
+
/** Share of the capture box this element occupies, 0–1. */
|
|
294
|
+
readonly areaPct: number;
|
|
295
|
+
readonly styles?: readonly DomStyleChange[];
|
|
296
|
+
readonly text?: {
|
|
297
|
+
readonly from: string;
|
|
298
|
+
readonly to: string;
|
|
299
|
+
};
|
|
300
|
+
/** Identity attributes that changed, e.g. `class: "card" → "banner"`. */
|
|
301
|
+
readonly attrs?: readonly DomStyleChange[];
|
|
302
|
+
/**
|
|
303
|
+
* True when this element only moved or resized, in a comparison where
|
|
304
|
+
* something else actually changed.
|
|
305
|
+
*
|
|
306
|
+
* Shifting one card down by 24px shifts everything below it too, so a naive
|
|
307
|
+
* list reports eleven changes for one edit. This flags the ten that merely
|
|
308
|
+
* got pushed around, so a report can lead with the one that did something.
|
|
309
|
+
*
|
|
310
|
+
* It is a statement about this element — that nothing about it changed except
|
|
311
|
+
* its position — and deliberately not a claim to have proven what moved it.
|
|
312
|
+
*/
|
|
313
|
+
readonly consequence?: boolean;
|
|
314
|
+
}
|
|
141
315
|
type TestStatus = 'passed' | 'failed' | 'skipped' | 'flaky' | 'timedout';
|
|
142
316
|
type TestType = 'e2e' | 'api' | 'unit' | 'mobile' | 'unknown';
|
|
317
|
+
/** Platform a mobile test drove. */
|
|
318
|
+
type MobilePlatform = 'android' | 'ios' | 'web' | 'unknown';
|
|
319
|
+
/** How the app under test was driven. */
|
|
320
|
+
type AppTestMode = 'native' | 'hybrid' | 'mobile-web';
|
|
321
|
+
/**
|
|
322
|
+
* The device a mobile test ran on.
|
|
323
|
+
*
|
|
324
|
+
* Appium detects all of this from the W3C capabilities and Maestro reads it
|
|
325
|
+
* from the CLI flags and driver log. Both used to collapse it to two words in
|
|
326
|
+
* `tags` before the report saw it; this carries it through intact.
|
|
327
|
+
*/
|
|
328
|
+
interface DeviceInfo {
|
|
329
|
+
readonly platform: MobilePlatform;
|
|
330
|
+
/** OS version, e.g. "14" or "17.5". */
|
|
331
|
+
readonly platformVersion: string | null;
|
|
332
|
+
/** Human-facing device name, e.g. "Pixel 4a" or "iPhone 15". */
|
|
333
|
+
readonly deviceName: string | null;
|
|
334
|
+
/** Driver, e.g. "UiAutomator2", "XCUITest", "maestro". */
|
|
335
|
+
readonly automationName: string | null;
|
|
336
|
+
/** App package / bundle id / apk path under test. */
|
|
337
|
+
readonly appId: string | null;
|
|
338
|
+
/** Native, hybrid or mobile-web. Null when the runner cannot tell. */
|
|
339
|
+
readonly appTestMode: AppTestMode | null;
|
|
340
|
+
/** Device serial or UDID, e.g. "emulator-5554". */
|
|
341
|
+
readonly udid: string | null;
|
|
342
|
+
}
|
|
343
|
+
/** Severity of an AI-detected defect. */
|
|
344
|
+
type AiDefectSeverity = 'critical' | 'warning' | 'info';
|
|
345
|
+
/** Category of an AI-detected defect. */
|
|
346
|
+
type AiDefectType = 'ui' | 'spelling' | 'i18n' | 'layout' | 'accessibility';
|
|
347
|
+
/** A defect reported by an AI analysis pass over a captured screen. */
|
|
348
|
+
interface AiDefect {
|
|
349
|
+
readonly type: AiDefectType;
|
|
350
|
+
readonly severity: AiDefectSeverity;
|
|
351
|
+
readonly description: string;
|
|
352
|
+
/** Where in the app it was seen, when the analyser says. */
|
|
353
|
+
readonly location: string | null;
|
|
354
|
+
/** Report-relative path to the screenshot it was found on. */
|
|
355
|
+
readonly screenshot: string | null;
|
|
356
|
+
}
|
|
143
357
|
interface FailureDiagnostic {
|
|
144
358
|
readonly message: string;
|
|
145
359
|
readonly line: number | null;
|
|
@@ -218,6 +432,13 @@ interface AssertionLocation {
|
|
|
218
432
|
/** Column number (1-based), if available */
|
|
219
433
|
readonly column?: number;
|
|
220
434
|
}
|
|
435
|
+
/** A failed assertion reduced to what a summary row needs. */
|
|
436
|
+
interface FailedAssertionSummary {
|
|
437
|
+
readonly type: AssertionType;
|
|
438
|
+
readonly expected: string;
|
|
439
|
+
readonly actual: string;
|
|
440
|
+
readonly expression?: string;
|
|
441
|
+
}
|
|
221
442
|
/** A single captured assertion on API response data. */
|
|
222
443
|
interface ApiAssertion {
|
|
223
444
|
/** Links to ApiCallRecord.id from the API proxy */
|
|
@@ -309,10 +530,24 @@ type TimelineStep = NavigationStep | ApiCallStep;
|
|
|
309
530
|
* distinct bucket from generic `custom_step`.
|
|
310
531
|
*/
|
|
311
532
|
type ActionCategory = 'ui_action' | 'assertion' | 'navigation' | 'custom_step';
|
|
533
|
+
/**
|
|
534
|
+
* The driver's own step category, preserved alongside `ActionCategory`.
|
|
535
|
+
*
|
|
536
|
+
* `ActionCategory` is the four-bucket vocabulary the platform's timeline and
|
|
537
|
+
* Ask AI tools filter on, and it stays closed. Mobile drivers distinguish far
|
|
538
|
+
* more than four kinds — Appium reports eleven, Maestro ten — and flattening
|
|
539
|
+
* them made a swipe, an app launch and a screenshot render identically. This
|
|
540
|
+
* keeps the finer label for the report to badge.
|
|
541
|
+
*/
|
|
542
|
+
type StepKind = 'find' | 'interaction' | 'gesture' | 'navigation' | 'lifecycle' | 'context' | 'device' | 'keyboard' | 'alert' | 'screenshot' | 'assertion' | 'media' | 'script' | 'flow_control' | 'ai' | 'other';
|
|
312
543
|
/** A single captured test action step. */
|
|
313
544
|
interface ActionStep {
|
|
314
545
|
readonly title: string;
|
|
315
546
|
readonly category: ActionCategory;
|
|
547
|
+
/** The driver's own finer-grained category, when it reported one. */
|
|
548
|
+
readonly kind?: StepKind | null;
|
|
549
|
+
/** Element selector this step acted on, when the driver reported one. */
|
|
550
|
+
readonly selector?: string | null;
|
|
316
551
|
readonly timestamp: string;
|
|
317
552
|
readonly duration: number;
|
|
318
553
|
readonly videoOffset: number | null;
|
|
@@ -323,6 +558,14 @@ interface ActionStep {
|
|
|
323
558
|
/** Level of a captured console/terminal log message. */
|
|
324
559
|
type ConsoleLogLevel = 'log' | 'warn' | 'error' | 'info' | 'debug' | 'stdout' | 'stderr';
|
|
325
560
|
/** A single captured console or terminal log entry. */
|
|
561
|
+
/**
|
|
562
|
+
* Where a captured log line came from.
|
|
563
|
+
*
|
|
564
|
+
* Browser consoles only ever produce `console`. Mobile runs mix several
|
|
565
|
+
* streams, and telling a crash log from ordinary logcat chatter is the whole
|
|
566
|
+
* point of showing them — so the stream survives to the row.
|
|
567
|
+
*/
|
|
568
|
+
type LogSource = 'console' | 'logcat' | 'syslog' | 'crashlog' | 'browser' | 'safariConsole' | 'performance' | 'server' | 'bidi' | 'driver';
|
|
326
569
|
interface ConsoleLogEntry {
|
|
327
570
|
/** Log level or stream type */
|
|
328
571
|
readonly level: ConsoleLogLevel;
|
|
@@ -332,6 +575,14 @@ interface ConsoleLogEntry {
|
|
|
332
575
|
readonly timestamp: string;
|
|
333
576
|
/** Source file location (browser console only, best-effort) */
|
|
334
577
|
readonly location: string | null;
|
|
578
|
+
/** Which stream produced the line. Defaults to `console` when absent. */
|
|
579
|
+
readonly source?: LogSource | null;
|
|
580
|
+
/** Emitting tag, e.g. an Android logcat tag like "ActivityManager". */
|
|
581
|
+
readonly tag?: string | null;
|
|
582
|
+
/** Emitting process id, when the stream reports one. */
|
|
583
|
+
readonly pid?: number | null;
|
|
584
|
+
/** Stack trace attached to the line (crash logs). */
|
|
585
|
+
readonly stackTrace?: string | null;
|
|
335
586
|
}
|
|
336
587
|
/** Report generation mode. */
|
|
337
588
|
type ReportMode = 'streaming' | 'embedded' | 'auto';
|
|
@@ -466,6 +717,14 @@ interface TestRelicFilePayload {
|
|
|
466
717
|
readonly apiCallsFile: string | null;
|
|
467
718
|
/** Number of API call items in the file. */
|
|
468
719
|
readonly apiCallsCount: number;
|
|
720
|
+
/**
|
|
721
|
+
* Response-status mix of the calls in the file.
|
|
722
|
+
*
|
|
723
|
+
* Tallied as each record is appended. The file itself is never read back
|
|
724
|
+
* into memory in streaming mode, so an aggregate computed at write time is
|
|
725
|
+
* the only way the grid can show a row's status chips.
|
|
726
|
+
*/
|
|
727
|
+
readonly apiStatusMix?: ApiCallsByStatusRange | null;
|
|
469
728
|
}
|
|
470
729
|
/** Type guard: validates that a parsed object is a v2 file-based payload. */
|
|
471
730
|
declare function isTestRelicFilePayload(obj: unknown): obj is TestRelicFilePayload;
|
|
@@ -562,7 +821,7 @@ interface ArtifactFile {
|
|
|
562
821
|
/** File name (e.g., `screenshot.png`, `video.webm`, `trace.zip`) */
|
|
563
822
|
readonly name: string;
|
|
564
823
|
/** Artifact type for rendering */
|
|
565
|
-
readonly type: 'screenshot' | 'video' | 'trace' | 'other';
|
|
824
|
+
readonly type: 'screenshot' | 'video' | 'trace' | 'baseline' | 'diff' | 'dom' | 'other';
|
|
566
825
|
/** Path relative to the report output directory */
|
|
567
826
|
readonly relativePath: string;
|
|
568
827
|
/** File size in bytes */
|
|
@@ -625,6 +884,8 @@ interface TestIndexEntry {
|
|
|
625
884
|
readonly retryIndex: number;
|
|
626
885
|
/** Test tags */
|
|
627
886
|
readonly tags: readonly string[];
|
|
887
|
+
/** What kind of test this is — badges the row, and picks the row's evidence. */
|
|
888
|
+
readonly testType?: TestType;
|
|
628
889
|
/** Whether this test has network request data */
|
|
629
890
|
readonly hasNetworkData: boolean;
|
|
630
891
|
/** Whether this test has console log data */
|
|
@@ -633,6 +894,20 @@ interface TestIndexEntry {
|
|
|
633
894
|
readonly hasArtifacts: boolean;
|
|
634
895
|
/** Whether this test has action step data */
|
|
635
896
|
readonly hasActionSteps: boolean;
|
|
897
|
+
/** Number of visual baseline comparisons recorded */
|
|
898
|
+
readonly visualCount?: number;
|
|
899
|
+
/** Of those, how many differed from their baseline */
|
|
900
|
+
readonly visualFailedCount?: number;
|
|
901
|
+
/** DOM elements that differed across this test's comparisons */
|
|
902
|
+
readonly domChangeCount?: number;
|
|
903
|
+
/**
|
|
904
|
+
* Report-relative path to a diff image for this test, when one exists.
|
|
905
|
+
*
|
|
906
|
+
* Carried on the index so the run overview can show the failure itself
|
|
907
|
+
* rather than only describing it — the grid must never fetch per-test
|
|
908
|
+
* detail files to render.
|
|
909
|
+
*/
|
|
910
|
+
readonly visualDiffPath?: string;
|
|
636
911
|
/** First line of error message (failed/flaky tests only) */
|
|
637
912
|
readonly errorMessage: string | null;
|
|
638
913
|
/** Number of network requests captured */
|
|
@@ -641,6 +916,34 @@ interface TestIndexEntry {
|
|
|
641
916
|
readonly consoleCount: number;
|
|
642
917
|
/** Number of action steps captured */
|
|
643
918
|
readonly actionCount: number;
|
|
919
|
+
/** API calls captured for this test. */
|
|
920
|
+
readonly apiCallCount?: number;
|
|
921
|
+
/** Response-status mix of those calls, for the row's status chips. */
|
|
922
|
+
readonly apiStatusMix?: ApiCallsByStatusRange;
|
|
923
|
+
/** API assertions that passed during this test. */
|
|
924
|
+
readonly assertionsPassed?: number;
|
|
925
|
+
/** API assertions that failed during this test. */
|
|
926
|
+
readonly assertionsFailed?: number;
|
|
927
|
+
/**
|
|
928
|
+
* The first failed assertion, flattened to strings.
|
|
929
|
+
*
|
|
930
|
+
* The run overview leads with "expected 101, received undefined" and must
|
|
931
|
+
* do so without opening the test's detail file. The first line of an API
|
|
932
|
+
* failure message is the matcher wrapper, which says nothing.
|
|
933
|
+
*/
|
|
934
|
+
readonly firstFailedAssertion?: FailedAssertionSummary;
|
|
935
|
+
/** The device this test drove (mobile runs only). */
|
|
936
|
+
readonly device?: DeviceInfo | null;
|
|
937
|
+
/** Action steps for this test, bucketed by the driver's own category. */
|
|
938
|
+
readonly stepKinds?: Record<string, number>;
|
|
939
|
+
/** Device-log errors and fatals recorded during this test. */
|
|
940
|
+
readonly deviceLogErrors?: number;
|
|
941
|
+
/** Whether a crash-log line was recorded during this test. */
|
|
942
|
+
readonly hasCrashLog?: boolean;
|
|
943
|
+
/** Whether a screen recording exists for this test. */
|
|
944
|
+
readonly hasVideo?: boolean;
|
|
945
|
+
/** AI-detected defects attributed to this test. */
|
|
946
|
+
readonly aiDefectCount?: number;
|
|
644
947
|
/** Whether this is a retry attempt (not the final attempt) */
|
|
645
948
|
readonly isRetry: boolean;
|
|
646
949
|
/** Stable key shared by every attempt of the same test (same across retries, unlike `id`) */
|
|
@@ -664,6 +967,8 @@ interface TestDetailData {
|
|
|
664
967
|
readonly actions: readonly ActionStep[];
|
|
665
968
|
/** References to screenshot/video files */
|
|
666
969
|
readonly artifacts: TestArtifacts | null;
|
|
970
|
+
/** Visual baseline comparisons (inline — a handful per test at most) */
|
|
971
|
+
readonly visual?: readonly VisualComparison[] | null;
|
|
667
972
|
/** Error details for failed/flaky tests */
|
|
668
973
|
readonly failureDiagnostic: FailureDiagnostic | null;
|
|
669
974
|
/** Whether network.jsonl exists for this test */
|
|
@@ -680,6 +985,10 @@ interface TestDetailData {
|
|
|
680
985
|
readonly apiCallsCount: number;
|
|
681
986
|
/** Test start time (ISO 8601) — used for video sync */
|
|
682
987
|
readonly startedAt?: string;
|
|
988
|
+
/** The device this test drove (mobile runs only). */
|
|
989
|
+
readonly device?: DeviceInfo | null;
|
|
990
|
+
/** AI-detected defects attributed to this test. */
|
|
991
|
+
readonly aiDefects?: readonly AiDefect[] | null;
|
|
683
992
|
}
|
|
684
993
|
/** Streaming report summary — running counters written to summary.json. */
|
|
685
994
|
interface StreamingReportSummary {
|
|
@@ -833,4 +1142,4 @@ declare function isValidCloudConfig(input: unknown): input is CloudConfig;
|
|
|
833
1142
|
declare function isValidQueueEntry(input: unknown): input is QueueEntry;
|
|
834
1143
|
declare function isValidTestRunReport(value: unknown): value is TestRunReport;
|
|
835
1144
|
|
|
836
|
-
export { ATTACHMENT_CONTENT_TYPE, ATTACHMENT_NAME, type ActionCategory, type ActionStep, type ApiAssertion, type ApiCallRecord, type ApiCallStep, type ApiCallStepRequest, type ApiCallStepResponse, type ArtifactFile, type ArtifactRunEntry, type ArtifactRunManifest, type ArtifactTestEntry, type AssertionLocation, type AssertionType, type AuthMode, type AuthState, type CIMetadata, type CIProvider, type CapturedNetworkRequest, type CloudConfig, type CloudReporterOptions, type ConsoleLogEntry, type ConsoleLogLevel, ErrorCode, type FailureDiagnostic, type GitMetadata, type LogLevel, type Logger, type LoggerOptions, type MergeOptions, type NavigationAnnotation, type NavigationStep, type NavigationType, type NetworkStats, PAYLOAD_VERSION, PAYLOAD_VERSION_LEGACY, type QueueEntry, type RepoResolution, type ReportMode, type ReporterConfig, type ResourceBreakdown, type ResourceType, type StepAssertion, type StepTestIdentity, type StreamingFileStats, type StreamingReportManifest, type StreamingReportSummary, type StreamingValidation, type StreamingWriteError, type Summary, type TestArtifacts, type TestDetailData, type TestIndexEntry, type TestRelicDataPayload, TestRelicError, type TestRelicFilePayload, type TestResult, type TestRunReport, type TestStatus, type TestType, type TimelineEntry, type TimelineStep, type UploadStrategy, createError, createLogger, isTestRelicDataPayload, isTestRelicFilePayload, isValidApiKeyFormat, isValidCloudConfig, isValidConfig, isValidEndpointUrl, isValidNavigationType, isValidQueueEntry, isValidTestRunReport, isValidUploadStrategy };
|
|
1145
|
+
export { ATTACHMENT_CONTENT_TYPE, ATTACHMENT_NAME, type ActionCategory, type ActionStep, type AiDefect, type AiDefectSeverity, type AiDefectType, type ApiAssertion, type ApiCallRecord, type ApiCallStep, type ApiCallStepRequest, type ApiCallStepResponse, type ApiCallsByStatusRange, type ApiResponseTimeStats, type AppTestMode, type ArtifactFile, type ArtifactRunEntry, type ArtifactRunManifest, type ArtifactTestEntry, type AssertionLocation, type AssertionType, type AuthMode, type AuthState, type CIMetadata, type CIProvider, type CapturedCookie, type CapturedNetworkRequest, type CloudConfig, type CloudReporterOptions, type ConsoleLogEntry, type ConsoleLogLevel, type DeviceInfo, type DomChange, type DomChangeKind, type DomStyleChange, ErrorCode, type FailedAssertionSummary, type FailureDiagnostic, type GitMetadata, type LogLevel, type LogSource, type Logger, type LoggerOptions, type MergeOptions, type MobilePlatform, type NavigationAnnotation, type NavigationStep, type NavigationType, type NetworkStats, PAYLOAD_VERSION, PAYLOAD_VERSION_LEGACY, type QueueEntry, type RepoResolution, type ReportMode, type ReporterConfig, type ResourceBreakdown, type ResourceType, type StepAssertion, type StepKind, type StepTestIdentity, type StreamingFileStats, type StreamingReportManifest, type StreamingReportSummary, type StreamingValidation, type StreamingWriteError, type Summary, type TestArtifacts, type TestDetailData, type TestIndexEntry, type TestRelicDataPayload, TestRelicError, type TestRelicFilePayload, type TestResult, type TestRunReport, type TestStatus, type TestType, type TimelineEntry, type TimelineStep, type UploadStrategy, type VisualComparison, type VisualSource, type VisualStatus, createError, createLogger, isTestRelicDataPayload, isTestRelicFilePayload, isValidApiKeyFormat, isValidCloudConfig, isValidConfig, isValidEndpointUrl, isValidNavigationType, isValidQueueEntry, isValidTestRunReport, isValidUploadStrategy };
|