@testomatio/reporter 2.0.1-beta.4 → 2.0.1-beta.5-timestamp

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.
Files changed (148) hide show
  1. package/lib/adapter/codecept.js +335 -293
  2. package/lib/adapter/cucumber/current.js +203 -195
  3. package/lib/adapter/cucumber/legacy.js +155 -130
  4. package/lib/adapter/cucumber.js +16 -5
  5. package/lib/adapter/cypress-plugin/index.js +105 -91
  6. package/lib/adapter/jasmine.js +53 -54
  7. package/lib/adapter/jest.js +99 -97
  8. package/lib/adapter/mocha.js +141 -112
  9. package/lib/adapter/playwright.js +231 -199
  10. package/lib/adapter/vitest.js +149 -150
  11. package/lib/adapter/webdriver.js +121 -144
  12. package/lib/bin/cli.js +211 -229
  13. package/lib/bin/reportXml.js +52 -51
  14. package/lib/bin/startTest.js +95 -83
  15. package/lib/bin/uploadArtifacts.js +61 -56
  16. package/lib/client.js +465 -424
  17. package/lib/config.js +23 -18
  18. package/lib/constants.js +44 -50
  19. package/lib/data-storage.js +188 -216
  20. package/lib/junit-adapter/adapter.js +20 -17
  21. package/lib/junit-adapter/csharp.js +14 -28
  22. package/lib/junit-adapter/index.js +25 -27
  23. package/lib/junit-adapter/java.js +53 -41
  24. package/lib/junit-adapter/javascript.js +27 -30
  25. package/lib/junit-adapter/python.js +37 -38
  26. package/lib/junit-adapter/ruby.js +8 -11
  27. package/lib/output.js +52 -44
  28. package/lib/pipe/bitbucket.js +230 -223
  29. package/lib/pipe/csv.js +126 -113
  30. package/lib/pipe/debug.js +99 -118
  31. package/lib/pipe/github.js +213 -218
  32. package/lib/pipe/gitlab.js +206 -183
  33. package/lib/pipe/html.js +321 -258
  34. package/lib/pipe/index.js +66 -94
  35. package/lib/pipe/testomatio.js +474 -429
  36. package/lib/reporter-functions.js +26 -28
  37. package/lib/reporter.js +29 -34
  38. package/lib/services/artifacts.js +51 -55
  39. package/lib/services/index.js +12 -14
  40. package/lib/services/key-values.js +53 -56
  41. package/lib/services/logger.js +245 -226
  42. package/lib/template/testomatio.hbs +1366 -1026
  43. package/lib/uploader.js +364 -295
  44. package/lib/utils/pipe_utils.js +85 -89
  45. package/lib/utils/utils.js +307 -398
  46. package/lib/xmlReader.js +532 -525
  47. package/package.json +21 -64
  48. package/lib/adapter/codecept.d.ts +0 -2
  49. package/lib/adapter/cucumber/current.d.ts +0 -14
  50. package/lib/adapter/cucumber/legacy.d.ts +0 -0
  51. package/lib/adapter/cucumber.d.ts +0 -2
  52. package/lib/adapter/cypress-plugin/index.d.ts +0 -2
  53. package/lib/adapter/jasmine.d.ts +0 -11
  54. package/lib/adapter/jest.d.ts +0 -13
  55. package/lib/adapter/mocha.d.ts +0 -2
  56. package/lib/adapter/nightwatch.d.ts +0 -4
  57. package/lib/adapter/nightwatch.js +0 -80
  58. package/lib/adapter/playwright.d.ts +0 -14
  59. package/lib/adapter/vitest.d.ts +0 -35
  60. package/lib/adapter/webdriver.d.ts +0 -24
  61. package/lib/bin/cli.d.ts +0 -2
  62. package/lib/bin/reportXml.d.ts +0 -2
  63. package/lib/bin/startTest.d.ts +0 -2
  64. package/lib/bin/uploadArtifacts.d.ts +0 -2
  65. package/lib/client.d.ts +0 -76
  66. package/lib/config.d.ts +0 -1
  67. package/lib/constants.d.ts +0 -25
  68. package/lib/data-storage.d.ts +0 -34
  69. package/lib/junit-adapter/adapter.d.ts +0 -9
  70. package/lib/junit-adapter/csharp.d.ts +0 -5
  71. package/lib/junit-adapter/index.d.ts +0 -3
  72. package/lib/junit-adapter/java.d.ts +0 -5
  73. package/lib/junit-adapter/javascript.d.ts +0 -4
  74. package/lib/junit-adapter/python.d.ts +0 -5
  75. package/lib/junit-adapter/ruby.d.ts +0 -4
  76. package/lib/output.d.ts +0 -11
  77. package/lib/package.json +0 -3
  78. package/lib/pipe/bitbucket.d.ts +0 -25
  79. package/lib/pipe/csv.d.ts +0 -47
  80. package/lib/pipe/debug.d.ts +0 -29
  81. package/lib/pipe/github.d.ts +0 -30
  82. package/lib/pipe/gitlab.d.ts +0 -25
  83. package/lib/pipe/html.d.ts +0 -35
  84. package/lib/pipe/index.d.ts +0 -1
  85. package/lib/pipe/testomatio.d.ts +0 -71
  86. package/lib/replay.d.ts +0 -31
  87. package/lib/replay.js +0 -237
  88. package/lib/reporter-functions.d.ts +0 -34
  89. package/lib/reporter.d.ts +0 -232
  90. package/lib/services/artifacts.d.ts +0 -33
  91. package/lib/services/index.d.ts +0 -9
  92. package/lib/services/key-values.d.ts +0 -27
  93. package/lib/services/logger.d.ts +0 -64
  94. package/lib/uploader.d.ts +0 -60
  95. package/lib/utils/pipe_utils.d.ts +0 -41
  96. package/lib/utils/utils.d.ts +0 -54
  97. package/lib/xmlReader.d.ts +0 -92
  98. package/src/adapter/codecept.js +0 -373
  99. package/src/adapter/cucumber/current.js +0 -228
  100. package/src/adapter/cucumber/legacy.js +0 -158
  101. package/src/adapter/cucumber.js +0 -4
  102. package/src/adapter/cypress-plugin/index.js +0 -110
  103. package/src/adapter/jasmine.js +0 -60
  104. package/src/adapter/jest.js +0 -107
  105. package/src/adapter/mocha.cjs +0 -2
  106. package/src/adapter/mocha.js +0 -156
  107. package/src/adapter/nightwatch.js +0 -88
  108. package/src/adapter/playwright.js +0 -254
  109. package/src/adapter/vitest.js +0 -183
  110. package/src/adapter/webdriver.js +0 -142
  111. package/src/bin/cli.js +0 -348
  112. package/src/bin/reportXml.js +0 -77
  113. package/src/bin/startTest.js +0 -124
  114. package/src/bin/uploadArtifacts.js +0 -91
  115. package/src/client.js +0 -508
  116. package/src/config.js +0 -30
  117. package/src/constants.js +0 -53
  118. package/src/data-storage.js +0 -204
  119. package/src/junit-adapter/adapter.js +0 -23
  120. package/src/junit-adapter/csharp.js +0 -28
  121. package/src/junit-adapter/index.js +0 -28
  122. package/src/junit-adapter/java.js +0 -58
  123. package/src/junit-adapter/javascript.js +0 -31
  124. package/src/junit-adapter/python.js +0 -42
  125. package/src/junit-adapter/ruby.js +0 -10
  126. package/src/output.js +0 -57
  127. package/src/pipe/bitbucket.js +0 -252
  128. package/src/pipe/csv.js +0 -140
  129. package/src/pipe/debug.js +0 -119
  130. package/src/pipe/github.js +0 -232
  131. package/src/pipe/gitlab.js +0 -247
  132. package/src/pipe/html.js +0 -373
  133. package/src/pipe/index.js +0 -71
  134. package/src/pipe/testomatio.js +0 -504
  135. package/src/replay.js +0 -245
  136. package/src/reporter-functions.js +0 -55
  137. package/src/reporter.cjs_decprecated +0 -21
  138. package/src/reporter.js +0 -33
  139. package/src/services/artifacts.js +0 -59
  140. package/src/services/index.js +0 -13
  141. package/src/services/key-values.js +0 -59
  142. package/src/services/logger.js +0 -315
  143. package/src/template/emptyData.svg +0 -23
  144. package/src/template/testomatio.hbs +0 -1081
  145. package/src/uploader.js +0 -376
  146. package/src/utils/pipe_utils.js +0 -119
  147. package/src/utils/utils.js +0 -416
  148. package/src/xmlReader.js +0 -614
@@ -1,223 +1,255 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const picocolors_1 = __importDefault(require("picocolors"));
7
- const crypto_1 = __importDefault(require("crypto"));
8
- const os_1 = __importDefault(require("os"));
9
- const path_1 = __importDefault(require("path"));
10
- const uuid_1 = require("uuid");
11
- const fs_1 = __importDefault(require("fs"));
12
- const constants_js_1 = require("../constants.js");
13
- const client_js_1 = __importDefault(require("../client.js"));
14
- const utils_js_1 = require("../utils/utils.js");
15
- const index_js_1 = require("../services/index.js");
16
- const data_storage_js_1 = require("../data-storage.js");
1
+ const chalk = require('chalk');
2
+ const crypto = require('crypto');
3
+ const os = require('os');
4
+ const path = require('path');
5
+ const { v4: uuidv4 } = require('uuid');
6
+ const fs = require('fs');
7
+ const { APP_PREFIX, STATUS: Status, TESTOMAT_TMP_STORAGE_DIR } = require('../constants');
8
+ const TestomatioClient = require('../client');
9
+ const { getTestomatIdFromTestTitle, fileSystem } = require('../utils/utils');
10
+ // const debug = require('debug')('@testomatio/reporter:adapter:playwright');
11
+ const { services } = require('../services');
12
+ const { dataStorage } = require('../data-storage');
13
+
17
14
  const reportTestPromises = [];
15
+
18
16
  class PlaywrightReporter {
19
- constructor(config = {}) {
20
- this.client = new client_js_1.default({ apiKey: config?.apiKey });
21
- this.uploads = [];
17
+ constructor(config = {}) {
18
+ this.client = new TestomatioClient({ apiKey: config?.apiKey });
19
+
20
+ this.uploads = [];
21
+ }
22
+
23
+ onBegin(config, suite) {
24
+ // clean data storage
25
+ fileSystem.clearDir(TESTOMAT_TMP_STORAGE_DIR);
26
+ if (!this.client) return;
27
+ this.suite = suite;
28
+ this.config = config;
29
+ this.client.createRun();
30
+ }
31
+
32
+ onTestBegin(testInfo) {
33
+ const fullTestTitle = getTestContextName(testInfo);
34
+ dataStorage.setContext(fullTestTitle);
35
+ }
36
+
37
+ onTestEnd(test, result) {
38
+ if (!this.client) return;
39
+
40
+ const { title } = test;
41
+ const { error, duration } = result;
42
+ const suite_title = test.parent ? test.parent?.title : path.basename(test?.location?.file);
43
+
44
+ const steps = [];
45
+ for (const step of result.steps) {
46
+ const appendedStep = appendStep(step);
47
+ if (appendedStep) {
48
+ steps.push(appendedStep);
49
+ }
22
50
  }
23
- onBegin(config, suite) {
24
- // clean data storage
25
- utils_js_1.fileSystem.clearDir(constants_js_1.TESTOMAT_TMP_STORAGE_DIR);
26
- if (!this.client)
27
- return;
28
- this.suite = suite;
29
- this.config = config;
30
- this.client.createRun();
51
+
52
+ const fullTestTitle = getTestContextName(test);
53
+ let logs = '';
54
+ if (result.stderr.length || result.stdout.length) {
55
+ logs = `\n\n${chalk.bold('Logs:')}\n${chalk.red(result.stderr.join(''))}\n${result.stdout.join('')}`;
31
56
  }
32
- onTestBegin(testInfo) {
33
- const fullTestTitle = getTestContextName(testInfo);
34
- data_storage_js_1.dataStorage.setContext(fullTestTitle);
35
- }
36
- onTestEnd(test, result) {
37
- // test.parent.project().__projectId
38
- if (!this.client)
39
- return;
40
- const { title } = test;
41
- const { error, duration } = result;
42
- const suite_title = test.parent ? test.parent?.title : path_1.default.basename(test?.location?.file);
43
- const steps = [];
44
- for (const step of result.steps) {
45
- const appendedStep = appendStep(step);
46
- if (appendedStep) {
47
- steps.push(appendedStep);
48
- }
49
- }
50
- const fullTestTitle = getTestContextName(test);
51
- let logs = '';
52
- if (result.stderr.length || result.stdout.length) {
53
- logs = `\n\n${picocolors_1.default.bold('Logs:')}\n${picocolors_1.default.red(result.stderr.join(''))}\n${result.stdout.join('')}`;
54
- }
55
- const manuallyAttachedArtifacts = index_js_1.services.artifacts.get(fullTestTitle);
56
- const testMeta = index_js_1.services.keyValues.get(fullTestTitle);
57
- const rid = test.id || test.testId || (0, uuid_1.v4)();
58
- /**
59
- * @type {{
60
- * browser?: string,
61
- * dependencies: string[],
62
- * isMobile?: boolean
63
- * metadata: Record<string, any>,
64
- * name: string,
65
- * }}
66
- */
67
- const project = {
68
- browser: test.parent.project().use.defaultBrowserType,
69
- dependencies: test.parent.project().dependencies,
70
- isMobile: test.parent.project().use.isMobile,
71
- metadata: test.parent.project().metadata,
72
- name: test.parent.project().name,
73
- };
74
- let status = result.status;
75
- // process test.fail() annotation
76
- if (test.expectedStatus === 'failed') {
77
- // actual status = expected
78
- if (result.status === 'failed')
79
- status = 'passed';
80
- // actual status != expected
81
- if (result.status === 'passed')
82
- status = 'failed';
83
- }
84
- const reportTestPromise = this.client.addTestRun(checkStatus(status), {
85
- rid: `${rid}-${project.name}`,
86
- error,
87
- test_id: (0, utils_js_1.getTestomatIdFromTestTitle)(`${title} ${test.tags?.join(' ')}`),
88
- suite_title,
89
- title,
90
- steps: steps.length ? steps : undefined,
91
- time: duration,
92
- logs,
93
- manuallyAttachedArtifacts,
94
- meta: {
95
- browser: project.browser,
96
- isMobile: project.isMobile,
97
- project: project.name,
98
- projectDependencies: project.dependencies?.length ? project.dependencies : null,
99
- ...testMeta,
100
- ...project.metadata, // metadata has any type (in playwright), but we will stringify it in client.js
101
- ...test.annotations?.reduce((acc, annotation) => {
102
- acc[annotation.type] = annotation.description;
103
- return acc;
104
- }, {}),
105
- },
106
- file: test.location?.file,
107
- });
108
- this.uploads.push({
109
- rid: `${rid}-${project.name}`,
110
- title: test.title,
111
- files: result.attachments.filter(a => a.body || a.path),
112
- file: test.location?.file,
113
- });
114
- // remove empty uploads
115
- this.uploads = this.uploads.filter(anUpload => anUpload.files.length);
116
- reportTestPromises.push(reportTestPromise);
57
+ const manuallyAttachedArtifacts = services.artifacts.get(fullTestTitle);
58
+ const testMeta = services.keyValues.get(fullTestTitle);
59
+ const rid = test.id || test.testId || uuidv4();
60
+
61
+ /**
62
+ * @type {{
63
+ * browser?: string,
64
+ * dependencies: string[],
65
+ * isMobile?: boolean
66
+ * metadata: Record<string, any>,
67
+ * name: string,
68
+ * }}
69
+ */
70
+ const project = {
71
+ browser: test.parent.project().use.defaultBrowserType,
72
+ dependencies: test.parent.project().dependencies,
73
+ isMobile: test.parent.project().use.isMobile,
74
+ metadata: test.parent.project().metadata,
75
+ name: test.parent.project().name,
76
+ };
77
+
78
+ const reportTestPromise = this.client.addTestRun(checkStatus(result.status), {
79
+ rid: `${rid}-${project.name}`,
80
+ error,
81
+ test_id: getTestomatIdFromTestTitle(`${title} ${test.tags?.join(' ')}`),
82
+ suite_title,
83
+ title,
84
+ steps: steps.length ? steps : undefined,
85
+ time: duration,
86
+ logs,
87
+ manuallyAttachedArtifacts,
88
+ meta: {
89
+ browser: project.browser,
90
+ isMobile: project.isMobile,
91
+ project: project.name,
92
+ projectDependencies: project.dependencies?.length ? project.dependencies : null,
93
+ ...testMeta,
94
+ ...project.metadata, // metadata has any type (in playwright), but we will stringify it in client.js
95
+ },
96
+ file: test.location?.file,
97
+ });
98
+
99
+ this.uploads.push({
100
+ rid: `${rid}-${project.name}`,
101
+ title: test.title,
102
+ files: result.attachments.filter(a => a.body || a.path),
103
+ file: test.location?.file,
104
+ });
105
+ // remove empty uploads
106
+ this.uploads = this.uploads.filter(upload => upload.files.length);
107
+
108
+ reportTestPromises.push(reportTestPromise);
109
+ }
110
+
111
+ #getArtifactPath(artifact) {
112
+ if (artifact.path) {
113
+ if (path.isAbsolute(artifact.path)) return artifact.path;
114
+
115
+ return path.join(this.config.outputDir || this.config.projects[0].outputDir, artifact.path);
117
116
  }
118
- #getArtifactPath(artifact) {
119
- if (artifact.path) {
120
- if (path_1.default.isAbsolute(artifact.path))
121
- return artifact.path;
122
- return path_1.default.join(this.config.outputDir || this.config.projects[0].outputDir, artifact.path);
123
- }
124
- if (artifact.body) {
125
- let filePath = generateTmpFilepath(artifact.name);
126
- const extension = artifact.contentType?.split('/')[1]?.replace('jpeg', 'jpg');
127
- if (extension)
128
- filePath += `.${extension}`;
129
- fs_1.default.writeFileSync(filePath, artifact.body);
130
- return filePath;
131
- }
132
- return null;
117
+
118
+ if (artifact.body) {
119
+ let filePath = generateTmpFilepath(artifact.name);
120
+
121
+ const extension = artifact.contentType?.split('/')[1]?.replace('jpeg', 'jpg');
122
+ if (extension) filePath += `.${extension}`;
123
+
124
+ fs.writeFileSync(filePath, artifact.body);
125
+ return filePath;
133
126
  }
134
- async onEnd(result) {
135
- if (!this.client)
136
- return;
137
- await Promise.all(reportTestPromises);
138
- if (this.uploads.length) {
139
- if (this.client.uploader.isEnabled)
140
- console.log(constants_js_1.APP_PREFIX, `🎞️ Uploading ${this.uploads.length} files...`);
141
- const promises = [];
142
- // ? possible move to addTestRun (needs investigation if files are ready)
143
- for (const upload of this.uploads) {
144
- const { rid, file, title } = upload;
145
- const files = upload.files.map(attachment => ({
146
- path: this.#getArtifactPath(attachment),
147
- title,
148
- type: attachment.contentType,
149
- }));
150
- if (!this.client.uploader.isEnabled) {
151
- files.forEach(f => this.client.uploader.storeUploadedFile(f, this.client.runId, rid, false));
152
- continue;
153
- }
154
- promises.push(this.client.addTestRun(undefined, {
155
- rid,
156
- title,
157
- files,
158
- file,
159
- }));
160
- }
161
- await Promise.all(promises);
127
+
128
+ return null;
129
+ }
130
+
131
+ async onEnd(result) {
132
+ if (!this.client) return;
133
+
134
+ await Promise.all(reportTestPromises);
135
+
136
+ if (this.uploads.length) {
137
+ if (this.client.uploader.isEnabled) console.log(APP_PREFIX, `🎞️ Uploading ${this.uploads.length} files...`);
138
+
139
+ const promises = [];
140
+
141
+ // ? possible move to addTestRun (needs investigation if files are ready)
142
+ for (const upload of this.uploads) {
143
+ const { rid, file, title } = upload;
144
+
145
+ const files = upload.files.map(attachment => ({
146
+ path: this.#getArtifactPath(attachment),
147
+ title,
148
+ type: attachment.contentType,
149
+ }));
150
+
151
+ if (!this.client.uploader.isEnabled) {
152
+ files.forEach(f => this.client.uploader.storeUploadedFile(f, this.client.runId, rid, false));
153
+ continue;
162
154
  }
163
- await this.client.updateRunStatus(checkStatus(result.status));
155
+
156
+ promises.push(
157
+ this.client.addTestRun(undefined, {
158
+ rid,
159
+ title,
160
+ files,
161
+ file,
162
+ }),
163
+ );
164
+ }
165
+ await Promise.all(promises);
164
166
  }
167
+
168
+ await this.client.updateRunStatus(checkStatus(result.status));
169
+ }
165
170
  }
171
+
166
172
  function checkStatus(status) {
167
- return ({
168
- skipped: constants_js_1.STATUS.SKIPPED,
169
- timedOut: constants_js_1.STATUS.FAILED,
170
- passed: constants_js_1.STATUS.PASSED,
171
- }[status] || constants_js_1.STATUS.FAILED);
173
+ return (
174
+ {
175
+ skipped: Status.SKIPPED,
176
+ timedOut: Status.FAILED,
177
+ passed: Status.PASSED,
178
+ }[status] || Status.FAILED
179
+ );
172
180
  }
181
+
173
182
  function appendStep(step, shift = 0) {
174
- // nesting too deep, ignore those steps
175
- if (shift >= 10)
176
- return;
177
- let newCategory = step.category;
178
- switch (newCategory) {
179
- case 'test.step':
180
- newCategory = 'user';
181
- break;
182
- case 'hook':
183
- newCategory = 'hook';
184
- break;
185
- case 'attach':
186
- return null; // Skip steps with category 'attach'
187
- default:
188
- newCategory = 'framework';
189
- }
190
- const formattedSteps = [];
191
- for (const child of step.steps || []) {
192
- const appendedChild = appendStep(child, shift + 2);
193
- if (appendedChild) {
194
- formattedSteps.push(appendedChild);
195
- }
183
+ // nesting too deep, ignore those steps
184
+ if (shift >= 10) return;
185
+
186
+ let newCategory = step.category;
187
+ switch (newCategory) {
188
+ case 'test.step':
189
+ newCategory = 'user';
190
+ break;
191
+ case 'hook':
192
+ newCategory = 'hook';
193
+ break;
194
+ case 'attach':
195
+ return null; // Skip steps with category 'attach'
196
+ default:
197
+ newCategory = 'framework';
198
+ }
199
+
200
+ const formattedSteps = [];
201
+ for (const child of step.steps || []) {
202
+ const appendedChild = appendStep(child, shift + 2);
203
+ if (appendedChild) {
204
+ formattedSteps.push(appendedChild);
196
205
  }
197
- const resultStep = {
198
- category: newCategory,
199
- title: step.title,
200
- duration: step.duration,
201
- };
202
- if (formattedSteps.length) {
203
- resultStep.steps = formattedSteps.filter(s => !!s);
204
- }
205
- if (step.error !== undefined) {
206
- resultStep.error = step.error;
207
- }
208
- return resultStep;
206
+ }
207
+
208
+ const resultStep = {
209
+ category: newCategory,
210
+ title: step.title,
211
+ duration: step.duration,
212
+ };
213
+
214
+ if (formattedSteps.length) {
215
+ resultStep.steps = formattedSteps.filter(s => !!s);
216
+ }
217
+
218
+ if (step.error !== undefined) {
219
+ resultStep.error = step.error;
220
+ }
221
+
222
+ return resultStep;
209
223
  }
224
+
210
225
  function generateTmpFilepath(filename = '') {
211
- filename = filename || `tmp.${crypto_1.default.randomBytes(16).toString('hex')}`;
212
- const tmpdir = os_1.default.tmpdir();
213
- return path_1.default.join(tmpdir, filename);
226
+ filename = filename || `tmp.${crypto.randomBytes(16).toString('hex')}`;
227
+ const tmpdir = os.tmpdir();
228
+ return path.join(tmpdir, filename);
214
229
  }
230
+
215
231
  /**
216
232
  * Returns filename + test title
217
233
  * @param {*} test - testInfo object from Playwright
218
234
  * @returns
219
235
  */
220
236
  function getTestContextName(test) {
221
- return `${test._requireFile || ''}_${test.title}`;
237
+ return `${test._requireFile || ''}_${test.title}`;
238
+ }
239
+
240
+ function initPlaywrightForStorage() {
241
+ try {
242
+ // @ts-ignore-next-line
243
+ // eslint-disable-next-line import/no-unresolved
244
+ const { test } = require('@playwright/test');
245
+ // eslint-disable-next-line no-empty-pattern
246
+ test.beforeEach(async ({}, testInfo) => {
247
+ global.testomatioTestTitle = `${testInfo.file || ''}_${testInfo.title}`;
248
+ });
249
+ } catch (e) {
250
+ // ignore
251
+ }
222
252
  }
253
+
223
254
  module.exports = PlaywrightReporter;
255
+ module.exports.initPlaywrightForStorage = initPlaywrightForStorage;