@allurereport/plugin-awesome 3.0.0-beta.10 → 3.0.0-beta.12

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/charts.d.ts CHANGED
@@ -11,4 +11,4 @@ export type TestResultChartData = {
11
11
  export declare const d3Arc: import("d3-shape").Arc<any, PieArcDatum<TestResultSlice>>;
12
12
  export declare const d3Pie: import("d3-shape").Pie<any, TestResultSlice>;
13
13
  export declare const getPercentage: (value: number, total: number) => number;
14
- export declare const getChartData: (stats: Statistic) => TestResultChartData;
14
+ export declare const getPieChartData: (stats: Statistic) => TestResultChartData;
package/dist/charts.js CHANGED
@@ -6,7 +6,7 @@ export const d3Pie = pie()
6
6
  .padAngle(0.03)
7
7
  .sortValues((a, b) => a - b);
8
8
  export const getPercentage = (value, total) => Math.floor((value / total) * 10000) / 100;
9
- export const getChartData = (stats) => {
9
+ export const getPieChartData = (stats) => {
10
10
  const convertedStatuses = statusesList
11
11
  .filter((status) => !!stats?.[status])
12
12
  .map((status) => ({
@@ -27,6 +27,8 @@ export const convertTestResult = (tr) => {
27
27
  links: tr.links,
28
28
  steps: tr.steps,
29
29
  error: tr.error,
30
+ testCase: tr.testCase,
31
+ environment: tr.environment,
30
32
  setup: [],
31
33
  teardown: [],
32
34
  history: [],
@@ -0,0 +1,3 @@
1
+ import type { TestResult } from "@allurereport/core-api";
2
+ import type { TestResultFilter } from "@allurereport/plugin-api";
3
+ export declare const filterEnv: (env: string, filter?: TestResultFilter) => (testResult: TestResult) => boolean;
@@ -0,0 +1,8 @@
1
+ export const filterEnv = (env, filter) => {
2
+ return (testResult) => {
3
+ if (testResult.environment !== env) {
4
+ return false;
5
+ }
6
+ return filter ? filter(testResult) : true;
7
+ };
8
+ };
@@ -1,14 +1,19 @@
1
- import { type AttachmentLink, type EnvironmentItem, type Statistic } from "@allurereport/core-api";
2
- import { type AllureStore, type ReportFiles, type ResultFile } from "@allurereport/plugin-api";
1
+ import { type AttachmentLink, type EnvironmentItem } from "@allurereport/core-api";
2
+ import { type AllureStore, type ReportFiles, type ResultFile, type TestResultFilter } from "@allurereport/plugin-api";
3
3
  import type { 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: (writer: AwesomeDataWriter, store: AllureStore) => Promise<AwesomeTestResult[]>;
8
- export declare const generateTree: (writer: AwesomeDataWriter, treeName: string, labels: string[], tests: AwesomeTestResult[]) => Promise<void>;
7
+ export declare const generateTestResults: (writer: AwesomeDataWriter, store: AllureStore, filter?: TestResultFilter) => Promise<AwesomeTestResult[]>;
8
+ export declare const generateTestCases: (writer: AwesomeDataWriter, trs: AwesomeTestResult[]) => Promise<void>;
9
+ export declare const generateTestEnvGroups: (writer: AwesomeDataWriter, store: AllureStore) => Promise<void>;
10
+ export declare const generateNav: (writer: AwesomeDataWriter, trs: AwesomeTestResult[], filename?: string) => Promise<void>;
11
+ export declare const generateTree: (writer: AwesomeDataWriter, treeFilename: string, labels: string[], tests: AwesomeTestResult[]) => Promise<void>;
9
12
  export declare const generateEnvironmentJson: (writer: AwesomeDataWriter, env: EnvironmentItem[]) => Promise<void>;
10
- export declare const generateStatistic: (writer: AwesomeDataWriter, statistic: Statistic) => Promise<void>;
11
- export declare const generatePieChart: (writer: AwesomeDataWriter, statistic: Statistic) => Promise<void>;
13
+ export declare const generateEnvirontmentsList: (writer: AwesomeDataWriter, store: AllureStore) => Promise<void>;
14
+ export declare const generateVariables: (writer: AwesomeDataWriter, store: AllureStore) => Promise<void>;
15
+ export declare const generateStatistic: (writer: AwesomeDataWriter, store: AllureStore, filter?: TestResultFilter) => Promise<void>;
16
+ export declare const generatePieChart: (writer: AwesomeDataWriter, store: AllureStore, filter?: TestResultFilter) => Promise<void>;
12
17
  export declare const generateAttachmentsFiles: (writer: AwesomeDataWriter, attachmentLinks: AttachmentLink[], contentFunction: (id: string) => Promise<ResultFile | undefined>) => Promise<Map<string, string> | undefined>;
13
18
  export declare const generateHistoryDataPoints: (writer: AwesomeDataWriter, store: AllureStore) => Promise<Map<string, string>>;
14
19
  export declare const generateStaticFiles: (payload: AwesomeOptions & {
@@ -1,13 +1,14 @@
1
1
  import { compareBy, incrementStatistic, nullsLast, ordinal, } from "@allurereport/core-api";
2
- import { filterTree } from "@allurereport/plugin-api";
2
+ import { filterTree, } from "@allurereport/plugin-api";
3
3
  import { createTreeByLabels, sortTree, transformTree } from "@allurereport/plugin-api";
4
4
  import { createBaseUrlScript, createFontLinkTag, createReportDataScript, createScriptTag, createStylesLinkTag, } from "@allurereport/web-commons";
5
5
  import Handlebars from "handlebars";
6
6
  import { readFile } from "node:fs/promises";
7
7
  import { createRequire } from "node:module";
8
8
  import { basename, join } from "node:path";
9
- import { getChartData } from "./charts.js";
9
+ import { getPieChartData } from "./charts.js";
10
10
  import { convertFixtureResult, convertTestResult } from "./converters.js";
11
+ import { filterEnv } from "./environments.js";
11
12
  const require = createRequire(import.meta.url);
12
13
  const template = `<!DOCTYPE html>
13
14
  <html dir="ltr" lang="en">
@@ -73,8 +74,8 @@ const createBreadcrumbs = (convertedTr) => {
73
74
  return acc;
74
75
  }, []);
75
76
  };
76
- export const generateTestResults = async (writer, store) => {
77
- const allTr = await store.allTestResults({ includeHidden: true });
77
+ export const generateTestResults = async (writer, store, filter) => {
78
+ const allTr = (await store.allTestResults({ includeHidden: true })).filter((tr) => (filter ? filter(tr) : true));
78
79
  let convertedTrs = [];
79
80
  for (const tr of allTr) {
80
81
  const trFixtures = await store.fixturesByTrId(tr.id);
@@ -99,15 +100,31 @@ export const generateTestResults = async (writer, store) => {
99
100
  for (const convertedTr of convertedTrs) {
100
101
  await writer.writeTestCase(convertedTr);
101
102
  }
102
- await writer.writeWidget("nav.json", convertedTrs.filter(({ hidden }) => !hidden).map(({ id }) => id));
103
103
  return convertedTrs;
104
104
  };
105
- export const generateTree = async (writer, treeName, labels, tests) => {
105
+ export const generateTestCases = async (writer, trs) => {
106
+ for (const tr of trs) {
107
+ await writer.writeTestCase(tr);
108
+ }
109
+ };
110
+ export const generateTestEnvGroups = async (writer, store) => {
111
+ const groups = await store.allTestEnvGroups();
112
+ for (const group of groups) {
113
+ const src = join("test-env-groups", `${group.id}.json`);
114
+ await writer.writeData(src, group);
115
+ }
116
+ };
117
+ export const generateNav = async (writer, trs, filename = "nav.json") => {
118
+ await writer.writeWidget(filename, trs.filter(({ hidden }) => !hidden).map(({ id }) => id));
119
+ };
120
+ export const generateTree = async (writer, treeFilename, labels, tests) => {
106
121
  const visibleTests = tests.filter((test) => !test.hidden);
107
122
  const tree = createTreeByLabels(visibleTests, labels, ({ id, name, status, duration, flaky, start, retries }) => {
123
+ const retriesCount = retries?.length;
108
124
  return {
109
125
  nodeId: id,
110
- retry: !!retries?.length,
126
+ retry: Boolean(retriesCount),
127
+ retriesCount,
111
128
  name,
112
129
  status,
113
130
  duration,
@@ -120,17 +137,41 @@ export const generateTree = async (writer, treeName, labels, tests) => {
120
137
  filterTree(tree, (leaf) => !leaf.hidden);
121
138
  sortTree(tree, nullsLast(compareBy("start", ordinal())));
122
139
  transformTree(tree, (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }));
123
- await writer.writeWidget(`${treeName}.json`, tree);
140
+ await writer.writeWidget(treeFilename, tree);
124
141
  };
125
142
  export const generateEnvironmentJson = async (writer, env) => {
126
143
  await writer.writeWidget("allure_environment.json", env);
127
144
  };
128
- export const generateStatistic = async (writer, statistic) => {
129
- await writer.writeWidget("allure_statistic.json", statistic);
145
+ export const generateEnvirontmentsList = async (writer, store) => {
146
+ const environments = await store.allEnvironments();
147
+ await writer.writeWidget("environments.json", environments);
130
148
  };
131
- export const generatePieChart = async (writer, statistic) => {
132
- const chartData = getChartData(statistic);
133
- await writer.writeWidget("allure_pie_chart.json", chartData);
149
+ export const generateVariables = async (writer, store) => {
150
+ const reportVariables = await store.allVariables();
151
+ const environments = await store.allEnvironments();
152
+ await writer.writeWidget("variables.json", reportVariables);
153
+ for (const env of environments) {
154
+ const envVariables = await store.envVariables(env);
155
+ await writer.writeWidget(join(env, "variables.json"), envVariables);
156
+ }
157
+ };
158
+ export const generateStatistic = async (writer, store, filter) => {
159
+ const statistic = await store.testsStatistic(filter);
160
+ const environments = await store.allEnvironments();
161
+ await writer.writeWidget("statistic.json", statistic);
162
+ for (const env of environments) {
163
+ const envStatistic = await store.testsStatistic(filterEnv(env, filter));
164
+ await writer.writeWidget(join(env, "statistic.json"), envStatistic);
165
+ }
166
+ };
167
+ export const generatePieChart = async (writer, store, filter) => {
168
+ const reportStatistic = await store.testsStatistic(filter);
169
+ const environments = await store.allEnvironments();
170
+ await writer.writeWidget("pie_chart.json", getPieChartData(reportStatistic));
171
+ for (const env of environments) {
172
+ const envStatistic = await store.testsStatistic(filterEnv(env, filter));
173
+ await writer.writeWidget(join(env, "pie_chart.json"), getPieChartData(envStatistic));
174
+ }
134
175
  };
135
176
  export const generateAttachmentsFiles = async (writer, attachmentLinks, contentFunction) => {
136
177
  const result = new Map();
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import { AwesomePlugin } from "./plugin.js";
2
+ export type { AwesomePluginOptions } from "./model.js";
2
3
  export default AwesomePlugin;
package/dist/model.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { EnvironmentsConfig } from "@allurereport/core-api";
1
+ import type { EnvironmentsConfig, TestResult } from "@allurereport/core-api";
2
2
  export type AwesomeOptions = {
3
3
  reportName?: string;
4
4
  singleFile?: boolean;
@@ -13,6 +13,7 @@ export type AwesomeOptions = {
13
13
  url: string;
14
14
  name: string;
15
15
  };
16
+ filter?: (testResult: TestResult) => boolean;
16
17
  };
17
18
  export type TemplateManifest = Record<string, string>;
18
19
  export type AwesomePluginOptions = AwesomeOptions;
package/dist/plugin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AllureStore, Plugin, PluginContext } from "@allurereport/plugin-api";
1
+ import type { AllureStore, Plugin, PluginContext, PluginSummary } from "@allurereport/plugin-api";
2
2
  import type { AwesomePluginOptions } from "./model.js";
3
3
  export declare class AwesomePlugin implements Plugin {
4
4
  #private;
@@ -7,4 +7,5 @@ export declare class AwesomePlugin implements Plugin {
7
7
  start: (context: PluginContext) => Promise<void>;
8
8
  update: (context: PluginContext, store: AllureStore) => Promise<void>;
9
9
  done: (context: PluginContext, store: AllureStore) => Promise<void>;
10
+ info(context: PluginContext, store: AllureStore): Promise<PluginSummary>;
10
11
  }
package/dist/plugin.js CHANGED
@@ -10,8 +10,10 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
10
10
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
11
  };
12
12
  var _AwesomePlugin_writer, _AwesomePlugin_generate;
13
+ import { getWorstStatus } from "@allurereport/core-api";
13
14
  import { preciseTreeLabels } from "@allurereport/plugin-api";
14
- import { generateAttachmentsFiles, generateEnvironmentJson, generateHistoryDataPoints, generatePieChart, generateStaticFiles, generateStatistic, generateTestResults, generateTree, } from "./generators.js";
15
+ import { join } from "node:path";
16
+ import { generateAttachmentsFiles, generateEnvironmentJson, generateEnvirontmentsList, generateHistoryDataPoints, generateNav, generatePieChart, generateStaticFiles, generateStatistic, generateTestCases, generateTestEnvGroups, generateTestResults, generateTree, generateVariables, } from "./generators.js";
15
17
  import { InMemoryReportDataWriter, ReportFileDataWriter } from "./writer.js";
16
18
  export class AwesomePlugin {
17
19
  constructor(options = {}) {
@@ -20,14 +22,26 @@ export class AwesomePlugin {
20
22
  _AwesomePlugin_generate.set(this, async (context, store) => {
21
23
  const { singleFile, groupBy = [] } = this.options ?? {};
22
24
  const environmentItems = await store.metadataByKey("allure_environment");
23
- const statistic = await store.testsStatistic();
25
+ const reportEnvironments = await store.allEnvironments();
24
26
  const attachments = await store.allAttachments();
25
- await generateStatistic(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), statistic);
26
- await generatePieChart(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), statistic);
27
- const convertedTrs = await generateTestResults(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
27
+ await generateStatistic(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, this.options.filter);
28
+ await generatePieChart(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, this.options.filter);
29
+ const convertedTrs = await generateTestResults(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, this.options.filter);
28
30
  const treeLabels = preciseTreeLabels(!groupBy.length ? ["parentSuite", "suite", "subSuite"] : groupBy, convertedTrs, ({ labels }) => labels.map(({ name }) => name));
29
- await generateTree(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), "tree", treeLabels, convertedTrs);
30
31
  await generateHistoryDataPoints(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
32
+ await generateTestCases(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs);
33
+ await generateTree(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), "tree.json", treeLabels, convertedTrs);
34
+ await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "nav.json");
35
+ await generateTestEnvGroups(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
36
+ for (const reportEnvironment of reportEnvironments) {
37
+ const envTrs = await store.testResultsByEnvironment(reportEnvironment);
38
+ const envTrsIds = envTrs.map(({ id }) => id);
39
+ const envConvertedTrs = convertedTrs.filter(({ id }) => envTrsIds.includes(id));
40
+ await generateTree(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), join(reportEnvironment, "tree.json"), treeLabels, envConvertedTrs);
41
+ await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, join(reportEnvironment, "nav.json"));
42
+ }
43
+ await generateEnvirontmentsList(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
44
+ await generateVariables(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
31
45
  if (environmentItems?.length) {
32
46
  await generateEnvironmentJson(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), environmentItems);
33
47
  }
@@ -66,5 +80,16 @@ export class AwesomePlugin {
66
80
  await __classPrivateFieldGet(this, _AwesomePlugin_generate, "f").call(this, context, store);
67
81
  };
68
82
  }
83
+ async info(context, store) {
84
+ const allTrs = (await store.allTestResults()).filter((tr) => this.options.filter ? this.options.filter(tr) : true);
85
+ const duration = allTrs.reduce((acc, { duration: trDuration = 0 }) => acc + trDuration, 0);
86
+ const worstStatus = getWorstStatus(allTrs.map(({ status }) => status));
87
+ return {
88
+ name: this.options.reportName || context.reportName,
89
+ stats: await store.testsStatistic(this.options.filter),
90
+ status: worstStatus ?? "passed",
91
+ duration,
92
+ };
93
+ }
69
94
  }
70
95
  _AwesomePlugin_writer = new WeakMap(), _AwesomePlugin_generate = new WeakMap();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allurereport/plugin-awesome",
3
- "version": "3.0.0-beta.10",
3
+ "version": "3.0.0-beta.12",
4
4
  "description": "Allure Awesome Plugin – brand new HTML report with modern design and new features",
5
5
  "keywords": [
6
6
  "allure",
@@ -30,10 +30,10 @@
30
30
  "test": "rimraf ./out && vitest run"
31
31
  },
32
32
  "dependencies": {
33
- "@allurereport/core-api": "3.0.0-beta.10",
34
- "@allurereport/plugin-api": "3.0.0-beta.10",
35
- "@allurereport/web-awesome": "3.0.0-beta.10",
36
- "@allurereport/web-commons": "3.0.0-beta.10",
33
+ "@allurereport/core-api": "3.0.0-beta.12",
34
+ "@allurereport/plugin-api": "3.0.0-beta.12",
35
+ "@allurereport/web-awesome": "3.0.0-beta.12",
36
+ "@allurereport/web-commons": "3.0.0-beta.12",
37
37
  "d3-shape": "^3.2.0",
38
38
  "handlebars": "^4.7.8"
39
39
  },