@reportforge/playwright-pdf 0.23.0 → 0.25.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 +3 -3
- package/ci-templates/azure-devops/azure-pipelines.yml +58 -58
- package/ci-templates/github-actions/basic-workflow.yml +44 -44
- package/ci-templates/gitlab-ci/.gitlab-ci.yml +42 -42
- package/ci-templates/jenkins/Jenkinsfile +54 -54
- package/dist/cli/index.js +0 -0
- package/dist/index.d.mts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +307 -24
- package/dist/index.mjs +307 -24
- package/dist/templates/layouts/detailed.hbs +41 -41
- package/dist/templates/layouts/executive.hbs +41 -41
- package/dist/templates/layouts/minimal.hbs +41 -41
- package/dist/templates/partials/analysis-oneliner.hbs +3 -3
- package/dist/templates/partials/chart-summary-grid.hbs +40 -40
- package/dist/templates/partials/chart-trend-card.hbs +16 -16
- package/dist/templates/partials/charts.hbs +433 -433
- package/dist/templates/partials/ci-environment.hbs +56 -56
- package/dist/templates/partials/cover-page.hbs +48 -48
- package/dist/templates/partials/defect-log.hbs +79 -79
- package/dist/templates/partials/executive-hero-summary.hbs +66 -66
- package/dist/templates/partials/executive-summary.hbs +78 -78
- package/dist/templates/partials/failure-card.hbs +35 -35
- package/dist/templates/partials/head.hbs +17 -17
- package/dist/templates/partials/release-gate.hbs +84 -84
- package/dist/templates/partials/requirements-matrix.hbs +51 -51
- package/dist/templates/partials/suite-breakdown.hbs +89 -89
- package/dist/templates/partials/watermark.hbs +42 -42
- package/package.json +1 -2
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
<div class="section">
|
|
2
|
-
<h2>Environment & CI</h2>
|
|
3
|
-
{{#if options.showFullEnvironment}}
|
|
4
|
-
<table class="env-table">
|
|
5
|
-
<tbody>
|
|
6
|
-
<tr><td>CI Provider</td><td class="env-value">{{environment.ciProvider}}</td></tr>
|
|
7
|
-
<tr><td>Branch</td> <td class="env-value">{{gitVal environment.branch}}</td></tr>
|
|
8
|
-
<tr><td>Commit</td> <td class="env-value">{{gitVal environment.commit}}</td></tr>
|
|
9
|
-
{{#if environment.buildUrl}}
|
|
10
|
-
<tr><td>Build URL</td> <td class="env-value"><a href="{{environment.buildUrl}}" style="color:var(--primary,#CC785C);">{{environment.buildUrl}}</a></td></tr>
|
|
11
|
-
{{/if}}
|
|
12
|
-
<tr><td>Browsers</td> <td class="env-value">{{join environment.browsers ", "}}</td></tr>
|
|
13
|
-
<tr><td>OS</td> <td class="env-value">{{environment.os}}</td></tr>
|
|
14
|
-
<tr><td>Node.js</td> <td class="env-value">{{environment.nodeVersion}}</td></tr>
|
|
15
|
-
<tr><td>Playwright</td> <td class="env-value">v{{environment.playwrightVersion}}</td></tr>
|
|
16
|
-
<tr><td>Projects</td> <td class="env-value">{{environment.projectCount}}</td></tr>
|
|
17
|
-
<tr><td>Workers</td> <td class="env-value">{{environment.workerCount}}</td></tr>
|
|
18
|
-
</tbody>
|
|
19
|
-
</table>
|
|
20
|
-
{{else}}
|
|
21
|
-
<div class="env-grid">
|
|
22
|
-
<div class="env-item">
|
|
23
|
-
<span class="env-item__key">Branch</span>
|
|
24
|
-
<span class="env-item__val">{{gitVal environment.branch}}</span>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="env-item">
|
|
27
|
-
<span class="env-item__key">Commit</span>
|
|
28
|
-
<span class="env-item__val">{{gitVal environment.commit}}</span>
|
|
29
|
-
</div>
|
|
30
|
-
<div class="env-item">
|
|
31
|
-
<span class="env-item__key">Browsers</span>
|
|
32
|
-
<span class="env-item__val">{{join environment.browsers ", "}}</span>
|
|
33
|
-
</div>
|
|
34
|
-
<div class="env-item">
|
|
35
|
-
<span class="env-item__key">CI</span>
|
|
36
|
-
<span class="env-item__val">{{environment.ciProvider}}</span>
|
|
37
|
-
</div>
|
|
38
|
-
<div class="env-item">
|
|
39
|
-
<span class="env-item__key">Node</span>
|
|
40
|
-
<span class="env-item__val">{{environment.nodeVersion}}</span>
|
|
41
|
-
</div>
|
|
42
|
-
<div class="env-item">
|
|
43
|
-
<span class="env-item__key">Playwright</span>
|
|
44
|
-
<span class="env-item__val">v{{environment.playwrightVersion}}</span>
|
|
45
|
-
</div>
|
|
46
|
-
<div class="env-item">
|
|
47
|
-
<span class="env-item__key">Projects</span>
|
|
48
|
-
<span class="env-item__val">{{environment.projectCount}}</span>
|
|
49
|
-
</div>
|
|
50
|
-
<div class="env-item">
|
|
51
|
-
<span class="env-item__key">Workers</span>
|
|
52
|
-
<span class="env-item__val">{{environment.workerCount}}</span>
|
|
53
|
-
</div>
|
|
54
|
-
</div>
|
|
55
|
-
{{/if}}
|
|
56
|
-
</div>
|
|
1
|
+
<div class="section">
|
|
2
|
+
<h2>Environment & CI</h2>
|
|
3
|
+
{{#if options.showFullEnvironment}}
|
|
4
|
+
<table class="env-table">
|
|
5
|
+
<tbody>
|
|
6
|
+
<tr><td>CI Provider</td><td class="env-value">{{environment.ciProvider}}</td></tr>
|
|
7
|
+
<tr><td>Branch</td> <td class="env-value">{{gitVal environment.branch}}</td></tr>
|
|
8
|
+
<tr><td>Commit</td> <td class="env-value">{{gitVal environment.commit}}</td></tr>
|
|
9
|
+
{{#if environment.buildUrl}}
|
|
10
|
+
<tr><td>Build URL</td> <td class="env-value"><a href="{{environment.buildUrl}}" style="color:var(--primary,#CC785C);">{{environment.buildUrl}}</a></td></tr>
|
|
11
|
+
{{/if}}
|
|
12
|
+
<tr><td>Browsers</td> <td class="env-value">{{join environment.browsers ", "}}</td></tr>
|
|
13
|
+
<tr><td>OS</td> <td class="env-value">{{environment.os}}</td></tr>
|
|
14
|
+
<tr><td>Node.js</td> <td class="env-value">{{environment.nodeVersion}}</td></tr>
|
|
15
|
+
<tr><td>Playwright</td> <td class="env-value">v{{environment.playwrightVersion}}</td></tr>
|
|
16
|
+
<tr><td>Projects</td> <td class="env-value">{{environment.projectCount}}</td></tr>
|
|
17
|
+
<tr><td>Workers</td> <td class="env-value">{{environment.workerCount}}</td></tr>
|
|
18
|
+
</tbody>
|
|
19
|
+
</table>
|
|
20
|
+
{{else}}
|
|
21
|
+
<div class="env-grid">
|
|
22
|
+
<div class="env-item">
|
|
23
|
+
<span class="env-item__key">Branch</span>
|
|
24
|
+
<span class="env-item__val">{{gitVal environment.branch}}</span>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="env-item">
|
|
27
|
+
<span class="env-item__key">Commit</span>
|
|
28
|
+
<span class="env-item__val">{{gitVal environment.commit}}</span>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="env-item">
|
|
31
|
+
<span class="env-item__key">Browsers</span>
|
|
32
|
+
<span class="env-item__val">{{join environment.browsers ", "}}</span>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="env-item">
|
|
35
|
+
<span class="env-item__key">CI</span>
|
|
36
|
+
<span class="env-item__val">{{environment.ciProvider}}</span>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="env-item">
|
|
39
|
+
<span class="env-item__key">Node</span>
|
|
40
|
+
<span class="env-item__val">{{environment.nodeVersion}}</span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="env-item">
|
|
43
|
+
<span class="env-item__key">Playwright</span>
|
|
44
|
+
<span class="env-item__val">v{{environment.playwrightVersion}}</span>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="env-item">
|
|
47
|
+
<span class="env-item__key">Projects</span>
|
|
48
|
+
<span class="env-item__val">{{environment.projectCount}}</span>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="env-item">
|
|
51
|
+
<span class="env-item__key">Workers</span>
|
|
52
|
+
<span class="env-item__val">{{environment.workerCount}}</span>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
{{/if}}
|
|
56
|
+
</div>
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
<div class="cover-page">
|
|
2
|
-
{{#if meta.branding.logoBase64}}
|
|
3
|
-
<img class="cover-page__logo" src="{{meta.branding.logoBase64}}" alt="Logo">
|
|
4
|
-
{{/if}}
|
|
5
|
-
|
|
6
|
-
<div class="cover-page__title">{{meta.title}}</div>
|
|
7
|
-
<div class="cover-page__subtitle">{{meta.projectName}}</div>
|
|
8
|
-
|
|
9
|
-
<div class="cover-page__divider"></div>
|
|
10
|
-
|
|
11
|
-
<span class="cover-page__verdict cover-page__verdict--{{stats.verdict}}">
|
|
12
|
-
{{verdictLabel stats.verdict}}
|
|
13
|
-
</span>
|
|
14
|
-
|
|
15
|
-
<div class="cover-page__stats-strip">
|
|
16
|
-
<div class="cover-page__stat">
|
|
17
|
-
<div class="cover-page__stat-val">{{stats.total}}</div>
|
|
18
|
-
<div class="cover-page__stat-lbl">Tests</div>
|
|
19
|
-
</div>
|
|
20
|
-
<div class="cover-page__stat">
|
|
21
|
-
<div class="cover-page__stat-val" style="color:var(--pass);">{{stats.passed}}</div>
|
|
22
|
-
<div class="cover-page__stat-lbl">Passed</div>
|
|
23
|
-
</div>
|
|
24
|
-
<div class="cover-page__stat">
|
|
25
|
-
<div class="cover-page__stat-val" style="color:var(--fail);">{{stats.failed}}</div>
|
|
26
|
-
<div class="cover-page__stat-lbl">Failed</div>
|
|
27
|
-
</div>
|
|
28
|
-
<div class="cover-page__stat">
|
|
29
|
-
<div class="cover-page__stat-val" style="color:var(--pass);">{{stats.passRate}}%</div>
|
|
30
|
-
<div class="cover-page__stat-lbl">Pass Rate</div>
|
|
31
|
-
</div>
|
|
32
|
-
<div class="cover-page__stat">
|
|
33
|
-
<div class="cover-page__stat-val">{{formatDuration stats.duration}}</div>
|
|
34
|
-
<div class="cover-page__stat-lbl">Duration</div>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
<div class="cover-page__meta">
|
|
39
|
-
Generated {{formatDate meta.generatedAt}}
|
|
40
|
-
</div>
|
|
41
|
-
{{#unless (and (isUnknown environment.branch) (isUnknown environment.commit))}}
|
|
42
|
-
<div class="cover-page__meta">
|
|
43
|
-
{{#unless (isUnknown environment.branch)}}Branch: <strong style="color:var(--text-1);">{{environment.branch}}</strong>{{/unless}}
|
|
44
|
-
{{#unless (or (isUnknown environment.branch) (isUnknown environment.commit))}} · {{/unless}}
|
|
45
|
-
{{#unless (isUnknown environment.commit)}}Commit: <strong style="color:var(--text-1);">{{environment.commit}}</strong>{{/unless}}
|
|
46
|
-
</div>
|
|
47
|
-
{{/unless}}
|
|
48
|
-
</div>
|
|
1
|
+
<div class="cover-page">
|
|
2
|
+
{{#if meta.branding.logoBase64}}
|
|
3
|
+
<img class="cover-page__logo" src="{{meta.branding.logoBase64}}" alt="Logo">
|
|
4
|
+
{{/if}}
|
|
5
|
+
|
|
6
|
+
<div class="cover-page__title">{{meta.title}}</div>
|
|
7
|
+
<div class="cover-page__subtitle">{{meta.projectName}}</div>
|
|
8
|
+
|
|
9
|
+
<div class="cover-page__divider"></div>
|
|
10
|
+
|
|
11
|
+
<span class="cover-page__verdict cover-page__verdict--{{stats.verdict}}">
|
|
12
|
+
{{verdictLabel stats.verdict}}
|
|
13
|
+
</span>
|
|
14
|
+
|
|
15
|
+
<div class="cover-page__stats-strip">
|
|
16
|
+
<div class="cover-page__stat">
|
|
17
|
+
<div class="cover-page__stat-val">{{stats.total}}</div>
|
|
18
|
+
<div class="cover-page__stat-lbl">Tests</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="cover-page__stat">
|
|
21
|
+
<div class="cover-page__stat-val" style="color:var(--pass);">{{stats.passed}}</div>
|
|
22
|
+
<div class="cover-page__stat-lbl">Passed</div>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="cover-page__stat">
|
|
25
|
+
<div class="cover-page__stat-val" style="color:var(--fail);">{{stats.failed}}</div>
|
|
26
|
+
<div class="cover-page__stat-lbl">Failed</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="cover-page__stat">
|
|
29
|
+
<div class="cover-page__stat-val" style="color:var(--pass);">{{stats.passRate}}%</div>
|
|
30
|
+
<div class="cover-page__stat-lbl">Pass Rate</div>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="cover-page__stat">
|
|
33
|
+
<div class="cover-page__stat-val">{{formatDuration stats.duration}}</div>
|
|
34
|
+
<div class="cover-page__stat-lbl">Duration</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div class="cover-page__meta">
|
|
39
|
+
Generated {{formatDate meta.generatedAt}}
|
|
40
|
+
</div>
|
|
41
|
+
{{#unless (and (isUnknown environment.branch) (isUnknown environment.commit))}}
|
|
42
|
+
<div class="cover-page__meta">
|
|
43
|
+
{{#unless (isUnknown environment.branch)}}Branch: <strong style="color:var(--text-1);">{{environment.branch}}</strong>{{/unless}}
|
|
44
|
+
{{#unless (or (isUnknown environment.branch) (isUnknown environment.commit))}} · {{/unless}}
|
|
45
|
+
{{#unless (isUnknown environment.commit)}}Commit: <strong style="color:var(--text-1);">{{environment.commit}}</strong>{{/unless}}
|
|
46
|
+
</div>
|
|
47
|
+
{{/unless}}
|
|
48
|
+
</div>
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
{{#if failures.length}}
|
|
2
|
-
<div class="section">
|
|
3
|
-
<h2>Defect Log</h2>
|
|
4
|
-
<table>
|
|
5
|
-
<thead>
|
|
6
|
-
<tr>
|
|
7
|
-
<th style="width:58px;">ID</th>
|
|
8
|
-
<th>Title</th>
|
|
9
|
-
<th style="width:100px;">Suite</th>
|
|
10
|
-
<th style="width:80px;">Severity</th>
|
|
11
|
-
<th style="width:72px;text-align:right;">Duration</th>
|
|
12
|
-
</tr>
|
|
13
|
-
</thead>
|
|
14
|
-
{{#each failures}}
|
|
15
|
-
<tbody class="defect-row-group">
|
|
16
|
-
<tr class="no-break">
|
|
17
|
-
<td class="defect-id">DEF-{{addOne @index}}</td>
|
|
18
|
-
<td style="font-weight:500;">{{testTitle}}</td>
|
|
19
|
-
<td style="font-size:9px;color:var(--text-3);font-family:'JetBrains Mono',monospace;">{{lastItem suitePath}}</td>
|
|
20
|
-
<td><span class="severity--{{severity}}">{{upperCase severity}}</span></td>
|
|
21
|
-
<td style="text-align:right;color:var(--text-3);font-family:'JetBrains Mono',monospace;">{{formatDuration durationMs}}</td>
|
|
22
|
-
</tr>
|
|
23
|
-
{{#if execution}}
|
|
24
|
-
<tr class="defect-detail-row">
|
|
25
|
-
<td colspan="5">
|
|
26
|
-
<div class="defect-detail">
|
|
27
|
-
{{! Error sits at the failing step inside the trail. Only when there is no
|
|
28
|
-
identified failing step (capture.steps off, or no errored step) is it
|
|
29
|
-
shown here under the title as a fallback. }}
|
|
30
|
-
{{#unless execution.failingStep}}
|
|
31
|
-
{{#if error.message}}
|
|
32
|
-
<div class="defect-detail__error">{{error.message}}</div>
|
|
33
|
-
{{/if}}
|
|
34
|
-
{{/unless}}
|
|
35
|
-
|
|
36
|
-
{{#if execution.steps.length}}
|
|
37
|
-
<div class="repro">
|
|
38
|
-
<div class="repro__tag">Steps to Reproduce</div>
|
|
39
|
-
{{! Each row is a real Markdown list line — `' '×depth + '- ' + title` rendered
|
|
40
|
-
pre-wrap — so the outline both displays indented and survives a copy-paste
|
|
41
|
-
into a bug tracker as a nested list. }}
|
|
42
|
-
<div class="repro-steps">
|
|
43
|
-
{{#each execution.steps}}
|
|
44
|
-
<div class="repro-step{{#if failed}} repro-step--failed{{/if}}">
|
|
45
|
-
<span class="repro-step__line">{{repeat " " depth}}- {{title}}{{#if failed}} [FAILED]{{#if location}} ({{location}}){{/if}}{{/if}}</span>
|
|
46
|
-
{{! Error renders once, at the failing leaf: the step's own message, else the
|
|
47
|
-
authoritative record error so an empty step message never hides it. }}
|
|
48
|
-
{{#if failingLeaf}}<div class="repro-step__error">{{#if errorMessage}}{{errorMessage}}{{else}}{{../error.message}}{{/if}}</div>{{/if}}
|
|
49
|
-
</div>
|
|
50
|
-
{{/each}}
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
|
-
{{/if}}
|
|
54
|
-
|
|
55
|
-
{{#if execution.console}}
|
|
56
|
-
<div class="console-tail">
|
|
57
|
-
<div class="console-tail__tag">Console</div>
|
|
58
|
-
{{#if execution.console.stdoutTruncated}}<div class="console-tail__more">… earlier stdout truncated</div>{{/if}}
|
|
59
|
-
{{#each execution.console.stdout}}<div class="console-tail__line"><span class="console-tail__stream">out</span>{{this}}</div>{{/each}}
|
|
60
|
-
{{#if execution.console.stderrTruncated}}<div class="console-tail__more">… earlier stderr truncated</div>{{/if}}
|
|
61
|
-
{{#each execution.console.stderr}}<div class="console-tail__line console-tail__line--err"><span class="console-tail__stream">err</span>{{this}}</div>{{/each}}
|
|
62
|
-
</div>
|
|
63
|
-
{{/if}}
|
|
64
|
-
|
|
65
|
-
{{#if execution.evidence}}
|
|
66
|
-
<div class="evidence-links">
|
|
67
|
-
{{#if execution.evidence.tracePath}}<span class="evidence-link"><span class="evidence-link__tag">Trace</span><span class="evidence-link__path">{{execution.evidence.tracePath}}</span></span>{{/if}}
|
|
68
|
-
{{#if execution.evidence.videoPath}}<span class="evidence-link"><span class="evidence-link__tag">Video</span><span class="evidence-link__path">{{execution.evidence.videoPath}}</span></span>{{/if}}
|
|
69
|
-
</div>
|
|
70
|
-
{{/if}}
|
|
71
|
-
</div>
|
|
72
|
-
</td>
|
|
73
|
-
</tr>
|
|
74
|
-
{{/if}}
|
|
75
|
-
</tbody>
|
|
76
|
-
{{/each}}
|
|
77
|
-
</table>
|
|
78
|
-
</div>
|
|
79
|
-
{{/if}}
|
|
1
|
+
{{#if failures.length}}
|
|
2
|
+
<div class="section">
|
|
3
|
+
<h2>Defect Log</h2>
|
|
4
|
+
<table>
|
|
5
|
+
<thead>
|
|
6
|
+
<tr>
|
|
7
|
+
<th style="width:58px;">ID</th>
|
|
8
|
+
<th>Title</th>
|
|
9
|
+
<th style="width:100px;">Suite</th>
|
|
10
|
+
<th style="width:80px;">Severity</th>
|
|
11
|
+
<th style="width:72px;text-align:right;">Duration</th>
|
|
12
|
+
</tr>
|
|
13
|
+
</thead>
|
|
14
|
+
{{#each failures}}
|
|
15
|
+
<tbody class="defect-row-group">
|
|
16
|
+
<tr class="no-break">
|
|
17
|
+
<td class="defect-id">DEF-{{addOne @index}}</td>
|
|
18
|
+
<td style="font-weight:500;">{{testTitle}}</td>
|
|
19
|
+
<td style="font-size:9px;color:var(--text-3);font-family:'JetBrains Mono',monospace;">{{lastItem suitePath}}</td>
|
|
20
|
+
<td><span class="severity--{{severity}}">{{upperCase severity}}</span></td>
|
|
21
|
+
<td style="text-align:right;color:var(--text-3);font-family:'JetBrains Mono',monospace;">{{formatDuration durationMs}}</td>
|
|
22
|
+
</tr>
|
|
23
|
+
{{#if execution}}
|
|
24
|
+
<tr class="defect-detail-row">
|
|
25
|
+
<td colspan="5">
|
|
26
|
+
<div class="defect-detail">
|
|
27
|
+
{{! Error sits at the failing step inside the trail. Only when there is no
|
|
28
|
+
identified failing step (capture.steps off, or no errored step) is it
|
|
29
|
+
shown here under the title as a fallback. }}
|
|
30
|
+
{{#unless execution.failingStep}}
|
|
31
|
+
{{#if error.message}}
|
|
32
|
+
<div class="defect-detail__error">{{error.message}}</div>
|
|
33
|
+
{{/if}}
|
|
34
|
+
{{/unless}}
|
|
35
|
+
|
|
36
|
+
{{#if execution.steps.length}}
|
|
37
|
+
<div class="repro">
|
|
38
|
+
<div class="repro__tag">Steps to Reproduce</div>
|
|
39
|
+
{{! Each row is a real Markdown list line — `' '×depth + '- ' + title` rendered
|
|
40
|
+
pre-wrap — so the outline both displays indented and survives a copy-paste
|
|
41
|
+
into a bug tracker as a nested list. }}
|
|
42
|
+
<div class="repro-steps">
|
|
43
|
+
{{#each execution.steps}}
|
|
44
|
+
<div class="repro-step{{#if failed}} repro-step--failed{{/if}}">
|
|
45
|
+
<span class="repro-step__line">{{repeat " " depth}}- {{title}}{{#if failed}} [FAILED]{{#if location}} ({{location}}){{/if}}{{/if}}</span>
|
|
46
|
+
{{! Error renders once, at the failing leaf: the step's own message, else the
|
|
47
|
+
authoritative record error so an empty step message never hides it. }}
|
|
48
|
+
{{#if failingLeaf}}<div class="repro-step__error">{{#if errorMessage}}{{errorMessage}}{{else}}{{../error.message}}{{/if}}</div>{{/if}}
|
|
49
|
+
</div>
|
|
50
|
+
{{/each}}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
{{/if}}
|
|
54
|
+
|
|
55
|
+
{{#if execution.console}}
|
|
56
|
+
<div class="console-tail">
|
|
57
|
+
<div class="console-tail__tag">Console</div>
|
|
58
|
+
{{#if execution.console.stdoutTruncated}}<div class="console-tail__more">… earlier stdout truncated</div>{{/if}}
|
|
59
|
+
{{#each execution.console.stdout}}<div class="console-tail__line"><span class="console-tail__stream">out</span>{{this}}</div>{{/each}}
|
|
60
|
+
{{#if execution.console.stderrTruncated}}<div class="console-tail__more">… earlier stderr truncated</div>{{/if}}
|
|
61
|
+
{{#each execution.console.stderr}}<div class="console-tail__line console-tail__line--err"><span class="console-tail__stream">err</span>{{this}}</div>{{/each}}
|
|
62
|
+
</div>
|
|
63
|
+
{{/if}}
|
|
64
|
+
|
|
65
|
+
{{#if execution.evidence}}
|
|
66
|
+
<div class="evidence-links">
|
|
67
|
+
{{#if execution.evidence.tracePath}}<span class="evidence-link"><span class="evidence-link__tag">Trace</span><span class="evidence-link__path">{{execution.evidence.tracePath}}</span></span>{{/if}}
|
|
68
|
+
{{#if execution.evidence.videoPath}}<span class="evidence-link"><span class="evidence-link__tag">Video</span><span class="evidence-link__path">{{execution.evidence.videoPath}}</span></span>{{/if}}
|
|
69
|
+
</div>
|
|
70
|
+
{{/if}}
|
|
71
|
+
</div>
|
|
72
|
+
</td>
|
|
73
|
+
</tr>
|
|
74
|
+
{{/if}}
|
|
75
|
+
</tbody>
|
|
76
|
+
{{/each}}
|
|
77
|
+
</table>
|
|
78
|
+
</div>
|
|
79
|
+
{{/if}}
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
<div class="section">
|
|
2
|
-
{{#unless options.releaseGateShown}}
|
|
3
|
-
<span class="verdict verdict--{{stats.verdict}}">
|
|
4
|
-
{{verdictLabel stats.verdict}}
|
|
5
|
-
</span>
|
|
6
|
-
{{/unless}}
|
|
7
|
-
|
|
8
|
-
<div class="hero-summary">
|
|
9
|
-
<div class="hero-summary__value">{{stats.passRate}}<span class="hero-summary__pct">%</span></div>
|
|
10
|
-
<div class="hero-summary__label">Pass Rate</div>
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
<div class="hero-stat-row">
|
|
14
|
-
<div class="hero-stat">
|
|
15
|
-
<span class="hero-stat__value">{{stats.total}}</span>
|
|
16
|
-
<span class="hero-stat__label">Total</span>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="hero-stat{{#unless stats.failed}} hero-stat--zero{{/unless}}">
|
|
19
|
-
<span class="hero-stat__value" style="color:var(--fail);">{{stats.failed}}</span>
|
|
20
|
-
<span class="hero-stat__label">Failed</span>
|
|
21
|
-
</div>
|
|
22
|
-
<div class="hero-stat{{#unless stats.timedOut}} hero-stat--zero{{/unless}}">
|
|
23
|
-
<span class="hero-stat__value" style="color:var(--timeout);">{{stats.timedOut}}</span>
|
|
24
|
-
<span class="hero-stat__label">Timed Out</span>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="hero-stat{{#unless stats.skipped}} hero-stat--zero{{/unless}}">
|
|
27
|
-
<span class="hero-stat__value" style="color:var(--skip);">{{stats.skipped}}</span>
|
|
28
|
-
<span class="hero-stat__label">Skipped</span>
|
|
29
|
-
</div>
|
|
30
|
-
<div class="hero-stat{{#unless stats.flaky}} hero-stat--zero{{/unless}}">
|
|
31
|
-
<span class="hero-stat__value" style="color:var(--flaky);">{{stats.flaky}}</span>
|
|
32
|
-
<span class="hero-stat__label">Flaky</span>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
|
|
36
|
-
<div class="summary-row">
|
|
37
|
-
<div class="summary-row__item">
|
|
38
|
-
<span class="summary-row__label">Duration</span>
|
|
39
|
-
<span class="summary-row__value">{{formatDuration stats.duration}}</span>
|
|
40
|
-
</div>
|
|
41
|
-
{{#unless (or options.showPassRate @root.sections.charts)}}
|
|
42
|
-
<div class="summary-row__item">
|
|
43
|
-
<span class="summary-row__label">Pass Rate</span>
|
|
44
|
-
<span class="summary-row__value" style="color:var(--pass);">{{stats.passRate}}%</span>
|
|
45
|
-
</div>
|
|
46
|
-
{{/unless}}
|
|
47
|
-
<div class="summary-row__item">
|
|
48
|
-
<span class="summary-row__label">Generated</span>
|
|
49
|
-
<span class="summary-row__value">{{formatDate meta.generatedAt}}</span>
|
|
50
|
-
</div>
|
|
51
|
-
<div class="summary-row__item">
|
|
52
|
-
<span class="summary-row__label">Project</span>
|
|
53
|
-
<span class="summary-row__value">{{meta.projectName}}</span>
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
|
|
57
|
-
{{#if stats.flaky}}
|
|
58
|
-
<div class="flaky-callout">
|
|
59
|
-
<span class="flaky-callout__icon">⚠</span>
|
|
60
|
-
<div class="flaky-callout__body">
|
|
61
|
-
<span class="flaky-callout__title">{{stats.flaky}} Flaky Test{{#if (gt stats.flaky 1)}}s{{/if}} Detected</span>
|
|
62
|
-
<span class="flaky-callout__text">These tests passed on retry. Results may vary across re-runs. Investigate before shipping to production.</span>
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
{{/if}}
|
|
66
|
-
</div>
|
|
1
|
+
<div class="section">
|
|
2
|
+
{{#unless options.releaseGateShown}}
|
|
3
|
+
<span class="verdict verdict--{{stats.verdict}}">
|
|
4
|
+
{{verdictLabel stats.verdict}}
|
|
5
|
+
</span>
|
|
6
|
+
{{/unless}}
|
|
7
|
+
|
|
8
|
+
<div class="hero-summary">
|
|
9
|
+
<div class="hero-summary__value">{{stats.passRate}}<span class="hero-summary__pct">%</span></div>
|
|
10
|
+
<div class="hero-summary__label">Pass Rate</div>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="hero-stat-row">
|
|
14
|
+
<div class="hero-stat">
|
|
15
|
+
<span class="hero-stat__value">{{stats.total}}</span>
|
|
16
|
+
<span class="hero-stat__label">Total</span>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="hero-stat{{#unless stats.failed}} hero-stat--zero{{/unless}}">
|
|
19
|
+
<span class="hero-stat__value" style="color:var(--fail);">{{stats.failed}}</span>
|
|
20
|
+
<span class="hero-stat__label">Failed</span>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="hero-stat{{#unless stats.timedOut}} hero-stat--zero{{/unless}}">
|
|
23
|
+
<span class="hero-stat__value" style="color:var(--timeout);">{{stats.timedOut}}</span>
|
|
24
|
+
<span class="hero-stat__label">Timed Out</span>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="hero-stat{{#unless stats.skipped}} hero-stat--zero{{/unless}}">
|
|
27
|
+
<span class="hero-stat__value" style="color:var(--skip);">{{stats.skipped}}</span>
|
|
28
|
+
<span class="hero-stat__label">Skipped</span>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="hero-stat{{#unless stats.flaky}} hero-stat--zero{{/unless}}">
|
|
31
|
+
<span class="hero-stat__value" style="color:var(--flaky);">{{stats.flaky}}</span>
|
|
32
|
+
<span class="hero-stat__label">Flaky</span>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="summary-row">
|
|
37
|
+
<div class="summary-row__item">
|
|
38
|
+
<span class="summary-row__label">Duration</span>
|
|
39
|
+
<span class="summary-row__value">{{formatDuration stats.duration}}</span>
|
|
40
|
+
</div>
|
|
41
|
+
{{#unless (or options.showPassRate @root.sections.charts)}}
|
|
42
|
+
<div class="summary-row__item">
|
|
43
|
+
<span class="summary-row__label">Pass Rate</span>
|
|
44
|
+
<span class="summary-row__value" style="color:var(--pass);">{{stats.passRate}}%</span>
|
|
45
|
+
</div>
|
|
46
|
+
{{/unless}}
|
|
47
|
+
<div class="summary-row__item">
|
|
48
|
+
<span class="summary-row__label">Generated</span>
|
|
49
|
+
<span class="summary-row__value">{{formatDate meta.generatedAt}}</span>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="summary-row__item">
|
|
52
|
+
<span class="summary-row__label">Project</span>
|
|
53
|
+
<span class="summary-row__value">{{meta.projectName}}</span>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
{{#if stats.flaky}}
|
|
58
|
+
<div class="flaky-callout">
|
|
59
|
+
<span class="flaky-callout__icon">⚠</span>
|
|
60
|
+
<div class="flaky-callout__body">
|
|
61
|
+
<span class="flaky-callout__title">{{stats.flaky}} Flaky Test{{#if (gt stats.flaky 1)}}s{{/if}} Detected</span>
|
|
62
|
+
<span class="flaky-callout__text">These tests passed on retry. Results may vary across re-runs. Investigate before shipping to production.</span>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
{{/if}}
|
|
66
|
+
</div>
|