@allurereport/plugin-awesome 3.8.2 → 3.10.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 +21 -0
- package/dist/categories.js +1 -1
- package/dist/converters.js +1 -1
- package/dist/generateTimeline.js +1 -1
- package/dist/generators.d.ts +6 -2
- package/dist/generators.js +99 -24
- package/dist/model.d.ts +1 -0
- package/dist/plugin.js +13 -6
- package/dist/writer.d.ts +1 -0
- package/dist/writer.js +32 -13
- package/package.json +13 -12
package/README.md
CHANGED
|
@@ -58,6 +58,27 @@ The plugin accepts the following options:
|
|
|
58
58
|
| `groupBy` | Grouping tests by labels or combining labels. By default, tests are grouped using the `titlePath` provided by the test framework. | `string` | `[]`(Grouping by `titlepath`) |
|
|
59
59
|
| `appendTitlePath`| Special marker for `groupBy`. Forces a final grouping by `titlePath` after all label-based groups. | `boolean` | `false` |
|
|
60
60
|
| `stepTreeExpansion` | Default expansion policy for step trees in test details. | `"collapsed" \| "expand_failed_only" \| "expanded"` | `"expand_failed_only"` |
|
|
61
|
+
| `defaultSortBy` | Default sort order for the test tree. Accepted values: `order,asc`, `order,desc`, `duration,asc`, `duration,desc`, `name,asc`, `name,desc`, `status,asc`, `status,desc`. User's manual selection is preserved in `localStorage` and takes priority over this value. | `string` | `order,asc` |
|
|
62
|
+
|
|
63
|
+
### Default sort order
|
|
64
|
+
|
|
65
|
+
Use `defaultSortBy` to change the initial sort order of the test tree:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { defineConfig } from "allure";
|
|
69
|
+
|
|
70
|
+
export default defineConfig({
|
|
71
|
+
plugins: {
|
|
72
|
+
awesome: {
|
|
73
|
+
options: {
|
|
74
|
+
defaultSortBy: "name,asc",
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The user's last selected sort order is always preserved in `localStorage`, so once a user changes the sort manually, their preference takes priority over the configured default.
|
|
61
82
|
|
|
62
83
|
### Step tree expansion
|
|
63
84
|
|
package/dist/categories.js
CHANGED
|
@@ -110,7 +110,7 @@ const buildGroupLevels = (category, testResult, matchingData, environmentCount,
|
|
|
110
110
|
return levels;
|
|
111
111
|
};
|
|
112
112
|
export const generateCategories = async (writer, { tests, categories, filename = "categories.json", environmentCount = 0, selectedEnvironmentCount, environments = [], defaultEnvironment = "default", }) => {
|
|
113
|
-
const visible = tests.filter((t) => !t.
|
|
113
|
+
const visible = tests.filter((t) => !t.isRetry);
|
|
114
114
|
const environmentOrderMap = buildEnvironmentSortOrder(environments, defaultEnvironment);
|
|
115
115
|
const nodes = {};
|
|
116
116
|
const roots = [];
|
package/dist/converters.js
CHANGED
package/dist/generateTimeline.js
CHANGED
|
@@ -26,7 +26,7 @@ export const generateTimeline = async (writer, trs, options, environmentIdByTrId
|
|
|
26
26
|
historyId: test.historyId,
|
|
27
27
|
name: test.name,
|
|
28
28
|
status: test.status,
|
|
29
|
-
|
|
29
|
+
isRetry: test.isRetry,
|
|
30
30
|
host,
|
|
31
31
|
thread,
|
|
32
32
|
environment: environmentIdByTrId.get(test.id) ?? test.environment,
|
package/dist/generators.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { type AttachmentLink, type EnvironmentIdentity, type EnvironmentItem, type Statistic, type TestEnvGroup, type TestResult } from "@allurereport/core-api";
|
|
2
2
|
import type { AllureStore, ExitCode, PluginContext, PluginGlobalAttachment, PluginGlobalError, QualityGateValidationResult, ReportFiles, ResultFile } from "@allurereport/plugin-api";
|
|
3
|
-
import type { AwesomeTestResult } from "@allurereport/web-awesome";
|
|
3
|
+
import type { AwesomeExecutorInfo, AwesomeRunSummary, AwesomeTestResult } from "@allurereport/web-awesome";
|
|
4
4
|
import type { AwesomeOptions, TemplateManifest } from "./model.js";
|
|
5
5
|
import type { AwesomeDataWriter, ReportFile } from "./writer.js";
|
|
6
6
|
export declare const readTemplateManifest: (singleFileMode?: boolean) => Promise<TemplateManifest>;
|
|
7
|
-
export declare const generateTestResults: (
|
|
7
|
+
export declare const generateTestResults: (_writer: AwesomeDataWriter, store: AllureStore, trs: TestResult[], options?: {
|
|
8
8
|
hideLabels?: readonly (string | RegExp)[];
|
|
9
9
|
}) => Promise<AwesomeTestResult[]>;
|
|
10
10
|
export declare const generateTestCases: (writer: AwesomeDataWriter, trs: AwesomeTestResult[]) => Promise<void>;
|
|
11
11
|
export declare const generateTestEnvGroups: (writer: AwesomeDataWriter, groups: TestEnvGroup[]) => Promise<void>;
|
|
12
12
|
export declare const generateNav: (writer: AwesomeDataWriter, trs: AwesomeTestResult[], filename?: string) => Promise<void>;
|
|
13
|
+
export declare const generateSearchIndex: (writer: AwesomeDataWriter, trs: AwesomeTestResult[], filename?: string) => Promise<void>;
|
|
14
|
+
export declare const getRunSummary: (testResults: Pick<TestResult, "start" | "stop">[]) => AwesomeRunSummary | undefined;
|
|
13
15
|
export declare const generateTree: (writer: AwesomeDataWriter, treeFilename: string, labels: string[], tests: AwesomeTestResult[], options?: {
|
|
14
16
|
appendTitlePath?: boolean;
|
|
15
17
|
}) => Promise<void>;
|
|
@@ -39,6 +41,8 @@ export declare const generateStaticFiles: (payload: AwesomeOptions & {
|
|
|
39
41
|
reportDataFiles: ReportFile[];
|
|
40
42
|
reportUuid: string;
|
|
41
43
|
reportName: string;
|
|
44
|
+
executor?: AwesomeExecutorInfo;
|
|
45
|
+
runSummary?: AwesomeRunSummary;
|
|
42
46
|
}) => Promise<void>;
|
|
43
47
|
export declare const generateAllCharts: (writer: AwesomeDataWriter, store: AllureStore, options: AwesomeOptions, context: PluginContext) => Promise<void>;
|
|
44
48
|
export declare const generateTreeFilters: (writer: AwesomeDataWriter, testResults: AwesomeTestResult[]) => Promise<void>;
|
package/dist/generators.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
|
-
import { basename, join } from "node:path";
|
|
4
|
+
import { basename, dirname, join } from "node:path";
|
|
5
5
|
import { defaultChartsConfig } from "@allurereport/charts-api";
|
|
6
6
|
import { compareBy, createBaseUrlScript, createFontLinkTag, createReportDataScript, stringifyForInlineScript, createScriptTag, createStylesLinkTag, incrementStatistic, joinPosixPath, nullsLast, ordinal, } from "@allurereport/core-api";
|
|
7
|
-
import { createTreeByLabels, createTreeByLabelsAndTitlePath, createTreeByTitlePath,
|
|
7
|
+
import { createTreeByLabels, createTreeByLabelsAndTitlePath, createTreeByTitlePath, preciseTreeLabels, processTree, } from "@allurereport/plugin-api";
|
|
8
8
|
import { generateCharts, getPieChartValues } from "@allurereport/web-commons";
|
|
9
9
|
import Handlebars from "handlebars";
|
|
10
10
|
import { convertFixtureResult, convertTestResult } from "./converters.js";
|
|
@@ -45,6 +45,7 @@ const template = `<!DOCTYPE html>
|
|
|
45
45
|
</body>
|
|
46
46
|
</html>
|
|
47
47
|
`;
|
|
48
|
+
const compiledTemplate = Handlebars.compile(template);
|
|
48
49
|
export const readTemplateManifest = async (singleFileMode) => {
|
|
49
50
|
const templateManifestSource = require.resolve(`@allurereport/web-awesome/dist/${singleFileMode ? "single" : "multi"}/manifest.json`);
|
|
50
51
|
const templateManifest = await readFile(templateManifestSource, { encoding: "utf-8" });
|
|
@@ -73,21 +74,28 @@ const createBreadcrumbs = (convertedTr) => {
|
|
|
73
74
|
return acc;
|
|
74
75
|
}, []);
|
|
75
76
|
};
|
|
76
|
-
|
|
77
|
+
const writeConcurrently = async (items, write, concurrency = 64) => {
|
|
78
|
+
for (let i = 0; i < items.length; i += concurrency) {
|
|
79
|
+
await Promise.all(items.slice(i, i + concurrency).map(write));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
export const generateTestResults = async (_writer, store, trs, options = {}) => {
|
|
77
83
|
let convertedTrs = [];
|
|
84
|
+
const related = await store.relatedByTestResultIds(trs.map(({ id }) => id));
|
|
78
85
|
for (const tr of trs) {
|
|
79
|
-
const trFixtures =
|
|
86
|
+
const trFixtures = related.fixturesByTrId.get(tr.id) ?? [];
|
|
80
87
|
const convertedTrFixtures = trFixtures.map(convertFixtureResult);
|
|
81
88
|
const convertedTr = convertTestResult(tr, {
|
|
82
89
|
hideLabels: options.hideLabels,
|
|
83
90
|
});
|
|
84
|
-
convertedTr.history =
|
|
85
|
-
convertedTr.retries =
|
|
91
|
+
convertedTr.history = related.historyByTrId.get(tr.id) ?? [];
|
|
92
|
+
convertedTr.retries = related.retriesByTrId.get(tr.id) ?? [];
|
|
86
93
|
convertedTr.retriesCount = convertedTr.retries.length;
|
|
87
94
|
convertedTr.retry = convertedTr.retriesCount > 0;
|
|
95
|
+
convertedTr.isRetry = tr.isRetry;
|
|
88
96
|
convertedTr.setup = convertedTrFixtures.filter((f) => f.type === "before");
|
|
89
97
|
convertedTr.teardown = convertedTrFixtures.filter((f) => f.type === "after");
|
|
90
|
-
convertedTr.attachments = (
|
|
98
|
+
convertedTr.attachments = (related.attachmentsByTrId.get(tr.id) ?? []).map((attachment) => ({
|
|
91
99
|
link: attachment,
|
|
92
100
|
type: "attachment",
|
|
93
101
|
}));
|
|
@@ -98,15 +106,10 @@ export const generateTestResults = async (writer, store, trs, options = {}) => {
|
|
|
98
106
|
...tr,
|
|
99
107
|
order: idx + 1,
|
|
100
108
|
}));
|
|
101
|
-
for (const convertedTr of convertedTrs) {
|
|
102
|
-
await writer.writeTestCase(convertedTr);
|
|
103
|
-
}
|
|
104
109
|
return convertedTrs;
|
|
105
110
|
};
|
|
106
111
|
export const generateTestCases = async (writer, trs) => {
|
|
107
|
-
|
|
108
|
-
await writer.writeTestCase(tr);
|
|
109
|
-
}
|
|
112
|
+
await writeConcurrently(trs, (tr) => writer.writeTestCase(tr));
|
|
110
113
|
};
|
|
111
114
|
export const generateTestEnvGroups = async (writer, groups) => {
|
|
112
115
|
for (const group of groups) {
|
|
@@ -115,10 +118,75 @@ export const generateTestEnvGroups = async (writer, groups) => {
|
|
|
115
118
|
}
|
|
116
119
|
};
|
|
117
120
|
export const generateNav = async (writer, trs, filename = "nav.json") => {
|
|
118
|
-
await writer.writeWidget(filename, trs.filter(({
|
|
121
|
+
await writer.writeWidget(filename, trs.filter(({ isRetry }) => !isRetry).map(({ id }) => id));
|
|
122
|
+
};
|
|
123
|
+
const SEARCHABLE_LABELS = new Set([
|
|
124
|
+
"owner",
|
|
125
|
+
"suite",
|
|
126
|
+
"package",
|
|
127
|
+
"testClass",
|
|
128
|
+
"testMethod",
|
|
129
|
+
"epic",
|
|
130
|
+
"feature",
|
|
131
|
+
"story",
|
|
132
|
+
"tag",
|
|
133
|
+
"host",
|
|
134
|
+
"thread",
|
|
135
|
+
]);
|
|
136
|
+
const joinSearchValues = (values) => {
|
|
137
|
+
const uniqueValues = new Set(values.map((value) => value?.trim()).filter((value) => Boolean(value)));
|
|
138
|
+
return uniqueValues.size > 0 ? [...uniqueValues].join(" ") : undefined;
|
|
139
|
+
};
|
|
140
|
+
const searchDocumentFactory = (test) => {
|
|
141
|
+
const labels = (test.labels ?? []).flatMap(({ name, value }) => {
|
|
142
|
+
if (!value || !SEARCHABLE_LABELS.has(name)) {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
return [`${name}:${value}`, value];
|
|
146
|
+
});
|
|
147
|
+
const tags = (test.labels ?? []).flatMap(({ name, value }) => (name === "tag" && value ? [value] : []));
|
|
148
|
+
const parameters = (test.parameters ?? []).flatMap(({ name, value, hidden, masked }) => {
|
|
149
|
+
if (hidden) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
return masked ? [name] : [`${name}:${value}`, name, value];
|
|
153
|
+
});
|
|
154
|
+
const links = (test.links ?? []).flatMap(({ name, url, type }) => [name, url, type]);
|
|
155
|
+
const categories = test.categories?.map((category) => category.name);
|
|
156
|
+
return {
|
|
157
|
+
id: test.id,
|
|
158
|
+
nodeId: test.id,
|
|
159
|
+
name: test.name,
|
|
160
|
+
fullName: test.fullName,
|
|
161
|
+
historyId: test.historyId,
|
|
162
|
+
labels: joinSearchValues(labels),
|
|
163
|
+
owner: joinSearchValues(test.groupedLabels.owner ?? []),
|
|
164
|
+
tags: joinSearchValues(tags),
|
|
165
|
+
parameters: joinSearchValues(parameters),
|
|
166
|
+
categories: joinSearchValues(categories ?? []),
|
|
167
|
+
statusMessage: test.error?.message,
|
|
168
|
+
links: joinSearchValues(links),
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
export const generateSearchIndex = async (writer, trs, filename = "search-index.json") => {
|
|
172
|
+
const searchDocuments = trs.filter(({ isRetry }) => !isRetry).map(searchDocumentFactory);
|
|
173
|
+
await writer.writeWidget(filename, searchDocuments);
|
|
174
|
+
};
|
|
175
|
+
export const getRunSummary = (testResults) => {
|
|
176
|
+
let start = Infinity;
|
|
177
|
+
let stop = -Infinity;
|
|
178
|
+
for (const { start: s, stop: e } of testResults) {
|
|
179
|
+
if (typeof s === "number" && Number.isFinite(s) && typeof e === "number" && Number.isFinite(e)) {
|
|
180
|
+
start = Math.min(start, s);
|
|
181
|
+
stop = Math.max(stop, e);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return Number.isFinite(start) && Number.isFinite(stop)
|
|
185
|
+
? { start, stop, duration: Math.max(0, stop - start) }
|
|
186
|
+
: undefined;
|
|
119
187
|
};
|
|
120
188
|
export const generateTree = async (writer, treeFilename, labels, tests, options) => {
|
|
121
|
-
const visibleTests = tests.filter((test) => !test.
|
|
189
|
+
const visibleTests = tests.filter((test) => !test.isRetry);
|
|
122
190
|
const { appendTitlePath } = options || {};
|
|
123
191
|
let tree;
|
|
124
192
|
if (labels.length === 0) {
|
|
@@ -130,9 +198,10 @@ export const generateTree = async (writer, treeFilename, labels, tests, options)
|
|
|
130
198
|
else {
|
|
131
199
|
tree = buildTreeByLabels(visibleTests, labels);
|
|
132
200
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
201
|
+
processTree(tree, {
|
|
202
|
+
sort: nullsLast(compareBy("start", ordinal())),
|
|
203
|
+
transform: (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }),
|
|
204
|
+
});
|
|
136
205
|
await writer.writeWidget(treeFilename, tree);
|
|
137
206
|
};
|
|
138
207
|
const buildTreeByLabels = (tests, labels) => {
|
|
@@ -306,16 +375,16 @@ export const generateQualityGateResults = async (writer, qualityGateResults = {}
|
|
|
306
375
|
await writer.writeWidget("quality-gate.json", qualityGateResults);
|
|
307
376
|
};
|
|
308
377
|
export const generateStaticFiles = async (payload) => {
|
|
309
|
-
const { id, reportName = "Allure Report", reportLanguage = "en", singleFile, logo = "", theme = "auto", groupBy, reportFiles, reportDataFiles, reportUuid, allureVersion, layout = "base", defaultSection = "", ci, stepTreeExpansion, } = payload;
|
|
310
|
-
const compile = Handlebars.compile(template);
|
|
378
|
+
const { id, reportName = "Allure Report", reportLanguage = "en", singleFile, logo = "", theme = "auto", groupBy, reportFiles, reportDataFiles, reportUuid, allureVersion, layout = "base", defaultSection = "", ci, executor, runSummary, stepTreeExpansion, defaultSortBy, } = payload;
|
|
311
379
|
const manifest = await readTemplateManifest(payload.singleFile);
|
|
312
380
|
const headTags = [];
|
|
313
381
|
const bodyTags = [];
|
|
314
382
|
const sections = ["charts", "timeline"];
|
|
315
383
|
if (!payload.singleFile) {
|
|
384
|
+
const manifestPath = require.resolve(join("@allurereport/web-awesome/dist", singleFile ? "single" : "multi", "manifest.json"));
|
|
385
|
+
const templateDir = dirname(manifestPath);
|
|
316
386
|
for (const key in manifest) {
|
|
317
387
|
const fileName = manifest[key];
|
|
318
|
-
const filePath = require.resolve(join("@allurereport/web-awesome/dist", singleFile ? "single" : "multi", fileName));
|
|
319
388
|
if (key.includes(".woff")) {
|
|
320
389
|
headTags.push(createFontLinkTag(fileName));
|
|
321
390
|
}
|
|
@@ -325,9 +394,12 @@ export const generateStaticFiles = async (payload) => {
|
|
|
325
394
|
if (key === "main.js") {
|
|
326
395
|
bodyTags.push(createScriptTag(fileName));
|
|
327
396
|
}
|
|
328
|
-
|
|
397
|
+
}
|
|
398
|
+
for (const fileName of await readdir(templateDir)) {
|
|
399
|
+
if (fileName === "manifest.json") {
|
|
329
400
|
continue;
|
|
330
401
|
}
|
|
402
|
+
const filePath = join(templateDir, fileName);
|
|
331
403
|
const fileContent = await readFile(filePath);
|
|
332
404
|
await reportFiles.addFile(basename(filePath), fileContent);
|
|
333
405
|
}
|
|
@@ -350,14 +422,17 @@ export const generateStaticFiles = async (payload) => {
|
|
|
350
422
|
groupBy: groupBy?.length ? groupBy : [],
|
|
351
423
|
cacheKey: now.toString(),
|
|
352
424
|
ci,
|
|
425
|
+
executor,
|
|
426
|
+
runSummary,
|
|
353
427
|
layout,
|
|
354
428
|
allureVersion,
|
|
355
429
|
sections,
|
|
356
430
|
defaultSection,
|
|
357
431
|
stepTreeExpansion,
|
|
432
|
+
defaultSortBy,
|
|
358
433
|
};
|
|
359
434
|
try {
|
|
360
|
-
const html =
|
|
435
|
+
const html = compiledTemplate({
|
|
361
436
|
headTags: headTags.join("\n"),
|
|
362
437
|
bodyTags: bodyTags.join("\n"),
|
|
363
438
|
reportFilesScript: createReportDataScript(reportDataFiles),
|
package/dist/model.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export type AwesomeOptions = {
|
|
|
21
21
|
publish?: boolean;
|
|
22
22
|
appendTitlePath?: boolean;
|
|
23
23
|
stepTreeExpansion?: StepTreeExpansion;
|
|
24
|
+
defaultSortBy?: string;
|
|
24
25
|
};
|
|
25
26
|
export type TemplateManifest = Record<string, string>;
|
|
26
27
|
export type AwesomePluginOptions = AwesomeOptions;
|
package/dist/plugin.js
CHANGED
|
@@ -15,16 +15,17 @@ import { createPluginSummary, } from "@allurereport/plugin-api";
|
|
|
15
15
|
import { preciseTreeLabels } from "@allurereport/plugin-api";
|
|
16
16
|
import { applyCategoriesToTestResults, generateCategories } from "./categories.js";
|
|
17
17
|
import { generateTimeline } from "./generateTimeline.js";
|
|
18
|
-
import { generateAllCharts, generateAttachmentsFiles, generateEnvironmentJson, generateEnvirontmentsList, generateGlobals, generateHistoryDataPoints, generateNav, generateQualityGateResults, generateStaticFiles, generateStatistic, generateTestCases, generateTestEnvGroups, generateTestResults, generateTree, generateTreeFilters, generateVariables, } from "./generators.js";
|
|
18
|
+
import { generateAllCharts, generateAttachmentsFiles, generateEnvironmentJson, generateEnvirontmentsList, generateGlobals, generateHistoryDataPoints, generateNav, generateQualityGateResults, generateSearchIndex, generateStaticFiles, generateStatistic, generateTestCases, generateTestEnvGroups, generateTestResults, generateTree, generateTreeFilters, generateVariables, getRunSummary, } from "./generators.js";
|
|
19
19
|
import { InMemoryReportDataWriter, ReportFileDataWriter } from "./writer.js";
|
|
20
20
|
const statisticByTestResults = async (store, testResults) => {
|
|
21
21
|
const statistic = { total: 0 };
|
|
22
|
+
const related = await store.relatedByTestResultIds(testResults.map(({ id }) => id));
|
|
22
23
|
for (const testResult of testResults) {
|
|
23
|
-
if (testResult.
|
|
24
|
+
if (testResult.isRetry) {
|
|
24
25
|
continue;
|
|
25
26
|
}
|
|
26
27
|
incrementStatistic(statistic, testResult.status);
|
|
27
|
-
if ((
|
|
28
|
+
if ((related.retriesByTrId.get(testResult.id)?.length ?? 0) > 0) {
|
|
28
29
|
statistic.retries = (statistic.retries ?? 0) + 1;
|
|
29
30
|
}
|
|
30
31
|
if (testResult.flaky) {
|
|
@@ -45,8 +46,10 @@ export class AwesomePlugin {
|
|
|
45
46
|
const hideLabels = context.hideLabels;
|
|
46
47
|
const categories = context.categories ?? [];
|
|
47
48
|
const environmentItems = await store.metadataByKey("allure_environment");
|
|
49
|
+
const executor = await store.metadataByKey("allure2_executor");
|
|
48
50
|
const attachments = await store.allAttachments();
|
|
49
|
-
const allTrs = await store.allTestResults({
|
|
51
|
+
const allTrs = await store.allTestResults({ includeRetries: true, filter });
|
|
52
|
+
const runSummary = getRunSummary(allTrs);
|
|
50
53
|
const statistics = await store.testsStatistic(filter);
|
|
51
54
|
const environments = await store.allEnvironmentIdentities();
|
|
52
55
|
const envStatistics = new Map();
|
|
@@ -66,7 +69,7 @@ export class AwesomePlugin {
|
|
|
66
69
|
envIdByTrId.set(tr.id, environmentId);
|
|
67
70
|
}));
|
|
68
71
|
await Promise.all(environments.map(async ({ id }) => {
|
|
69
|
-
const envTrs = await store.testResultsByEnvironmentId(id, {
|
|
72
|
+
const envTrs = await store.testResultsByEnvironmentId(id, { includeRetries: true });
|
|
70
73
|
envStatistics.set(id, await statisticByTestResults(store, envTrs));
|
|
71
74
|
}));
|
|
72
75
|
await generateStatistic(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), {
|
|
@@ -94,10 +97,11 @@ export class AwesomePlugin {
|
|
|
94
97
|
await generateTestCases(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs);
|
|
95
98
|
await generateTree(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), "tree.json", treeLabels, convertedTrs, { appendTitlePath });
|
|
96
99
|
await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "nav.json");
|
|
100
|
+
await generateSearchIndex(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "search-index.json");
|
|
97
101
|
await generateTestEnvGroups(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), allTestEnvGroups);
|
|
98
102
|
const convertedTrsById = new Map(convertedTrs.map((tr) => [tr.id, tr]));
|
|
99
103
|
for (const reportEnvironment of environments) {
|
|
100
|
-
const envTrs = await store.testResultsByEnvironmentId(reportEnvironment.id, {
|
|
104
|
+
const envTrs = await store.testResultsByEnvironmentId(reportEnvironment.id, { includeRetries: true });
|
|
101
105
|
const envConvertedTrs = envTrs
|
|
102
106
|
.map((tr) => convertedTrsById.get(tr.id))
|
|
103
107
|
.filter((tr) => Boolean(tr));
|
|
@@ -105,6 +109,7 @@ export class AwesomePlugin {
|
|
|
105
109
|
appendTitlePath,
|
|
106
110
|
});
|
|
107
111
|
await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, joinPosixPath(reportEnvironment.id, "nav.json"));
|
|
112
|
+
await generateSearchIndex(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, joinPosixPath(reportEnvironment.id, "search-index.json"));
|
|
108
113
|
await generateCategories(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), {
|
|
109
114
|
tests: envConvertedTrs,
|
|
110
115
|
categories,
|
|
@@ -139,6 +144,8 @@ export class AwesomePlugin {
|
|
|
139
144
|
reportUuid: context.reportUuid,
|
|
140
145
|
reportName: context.reportName,
|
|
141
146
|
ci: context.ci,
|
|
147
|
+
executor,
|
|
148
|
+
runSummary,
|
|
142
149
|
reportDataFiles,
|
|
143
150
|
});
|
|
144
151
|
});
|
package/dist/writer.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface AwesomeDataWriter {
|
|
|
11
11
|
writeAttachment(source: string, file: ResultFile): Promise<void>;
|
|
12
12
|
}
|
|
13
13
|
export declare class FileSystemReportDataWriter implements AwesomeDataWriter {
|
|
14
|
+
#private;
|
|
14
15
|
private readonly output;
|
|
15
16
|
constructor(output: string);
|
|
16
17
|
writeData(fileName: string, data: any): Promise<void>;
|
package/dist/writer.js
CHANGED
|
@@ -1,37 +1,56 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
1
7
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
8
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
11
|
};
|
|
6
|
-
var _InMemoryReportDataWriter_data;
|
|
12
|
+
var _FileSystemReportDataWriter_dataDir, _FileSystemReportDataWriter_widgetsDir, _FileSystemReportDataWriter_testResultsDir, _FileSystemReportDataWriter_attachmentsDir, _FileSystemReportDataWriter_dataDirReady, _FileSystemReportDataWriter_widgetsDirReady, _FileSystemReportDataWriter_testResultsDirReady, _FileSystemReportDataWriter_attachmentsDirReady, _InMemoryReportDataWriter_data;
|
|
7
13
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
14
|
import { resolve } from "node:path";
|
|
9
15
|
import { joinPosixPath } from "@allurereport/core-api";
|
|
10
16
|
export class FileSystemReportDataWriter {
|
|
11
17
|
constructor(output) {
|
|
12
18
|
this.output = output;
|
|
19
|
+
_FileSystemReportDataWriter_dataDir.set(this, void 0);
|
|
20
|
+
_FileSystemReportDataWriter_widgetsDir.set(this, void 0);
|
|
21
|
+
_FileSystemReportDataWriter_testResultsDir.set(this, void 0);
|
|
22
|
+
_FileSystemReportDataWriter_attachmentsDir.set(this, void 0);
|
|
23
|
+
_FileSystemReportDataWriter_dataDirReady.set(this, void 0);
|
|
24
|
+
_FileSystemReportDataWriter_widgetsDirReady.set(this, void 0);
|
|
25
|
+
_FileSystemReportDataWriter_testResultsDirReady.set(this, void 0);
|
|
26
|
+
_FileSystemReportDataWriter_attachmentsDirReady.set(this, void 0);
|
|
27
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_dataDir, resolve(this.output, "data"), "f");
|
|
28
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_widgetsDir, resolve(this.output, "widgets"), "f");
|
|
29
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_testResultsDir, resolve(this.output, "data", "test-results"), "f");
|
|
30
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_attachmentsDir, resolve(this.output, "data", "attachments"), "f");
|
|
31
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_dataDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_dataDir, "f"), { recursive: true }), "f");
|
|
32
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_widgetsDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_widgetsDir, "f"), { recursive: true }), "f");
|
|
33
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_testResultsDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_testResultsDir, "f"), { recursive: true }), "f");
|
|
34
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_attachmentsDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_attachmentsDir, "f"), { recursive: true }), "f");
|
|
13
35
|
}
|
|
14
36
|
async writeData(fileName, data) {
|
|
15
|
-
|
|
16
|
-
await
|
|
17
|
-
await writeFile(resolve(distFolder, fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
37
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_dataDirReady, "f");
|
|
38
|
+
await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_dataDir, "f"), fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
18
39
|
}
|
|
19
40
|
async writeWidget(fileName, data) {
|
|
20
|
-
|
|
21
|
-
await
|
|
22
|
-
await writeFile(resolve(distFolder, fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
41
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_widgetsDirReady, "f");
|
|
42
|
+
await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_widgetsDir, "f"), fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
23
43
|
}
|
|
24
44
|
async writeTestCase(test) {
|
|
25
|
-
|
|
26
|
-
await
|
|
27
|
-
await writeFile(resolve(distFolder, `${test.id}.json`), JSON.stringify(test), { encoding: "utf-8" });
|
|
45
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_testResultsDirReady, "f");
|
|
46
|
+
await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_testResultsDir, "f"), `${test.id}.json`), JSON.stringify(test), { encoding: "utf-8" });
|
|
28
47
|
}
|
|
29
48
|
async writeAttachment(source, file) {
|
|
30
|
-
|
|
31
|
-
await
|
|
32
|
-
await file.writeTo(resolve(distFolder, source));
|
|
49
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_attachmentsDirReady, "f");
|
|
50
|
+
await file.writeTo(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_attachmentsDir, "f"), source));
|
|
33
51
|
}
|
|
34
52
|
}
|
|
53
|
+
_FileSystemReportDataWriter_dataDir = new WeakMap(), _FileSystemReportDataWriter_widgetsDir = new WeakMap(), _FileSystemReportDataWriter_testResultsDir = new WeakMap(), _FileSystemReportDataWriter_attachmentsDir = new WeakMap(), _FileSystemReportDataWriter_dataDirReady = new WeakMap(), _FileSystemReportDataWriter_widgetsDirReady = new WeakMap(), _FileSystemReportDataWriter_testResultsDirReady = new WeakMap(), _FileSystemReportDataWriter_attachmentsDirReady = new WeakMap();
|
|
35
54
|
export class InMemoryReportDataWriter {
|
|
36
55
|
constructor() {
|
|
37
56
|
_InMemoryReportDataWriter_data.set(this, {});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allurereport/plugin-awesome",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.10.0",
|
|
4
4
|
"description": "Allure Awesome Plugin – brand new HTML report with modern design and new features",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"allure",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"lint:fix": "oxlint --import-plugin --fix src test features stories"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@allurereport/charts-api": "3.
|
|
34
|
-
"@allurereport/core-api": "3.
|
|
35
|
-
"@allurereport/plugin-api": "3.
|
|
36
|
-
"@allurereport/web-awesome": "3.
|
|
37
|
-
"@allurereport/web-commons": "3.
|
|
33
|
+
"@allurereport/charts-api": "3.10.0",
|
|
34
|
+
"@allurereport/core-api": "3.10.0",
|
|
35
|
+
"@allurereport/plugin-api": "3.10.0",
|
|
36
|
+
"@allurereport/web-awesome": "3.10.0",
|
|
37
|
+
"@allurereport/web-commons": "3.10.0",
|
|
38
38
|
"d3-shape": "^3.2.0",
|
|
39
39
|
"handlebars": "^4.7.9",
|
|
40
40
|
"markdown-it": "^14.1.0"
|
|
@@ -42,11 +42,12 @@
|
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/d3-shape": "^3.1.6",
|
|
44
44
|
"@types/markdown-it": "^14.1.2",
|
|
45
|
-
"@types/node": "^20
|
|
46
|
-
"@vitest/runner": "^2
|
|
47
|
-
"allure-
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
45
|
+
"@types/node": "^20",
|
|
46
|
+
"@vitest/runner": "^2",
|
|
47
|
+
"allure-js-commons": "^3",
|
|
48
|
+
"allure-vitest": "^3",
|
|
49
|
+
"rimraf": "^6",
|
|
50
|
+
"typescript": "^5",
|
|
51
|
+
"vitest": "^4.1.0"
|
|
51
52
|
}
|
|
52
53
|
}
|