creevey 0.10.0-beta.43 → 0.10.0-beta.45
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/CHANGELOG.md +282 -0
- package/dist/client/addon/controller.js +1 -1
- package/dist/client/addon/controller.js.map +1 -1
- package/dist/client/addon/withCreevey.js +1 -18
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.js +13 -4
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/client/shared/creeveyClientApi.js +10 -0
- package/dist/client/shared/creeveyClientApi.js.map +1 -1
- package/dist/client/web/CreeveyApp.d.ts +1 -0
- package/dist/client/web/CreeveyApp.js +1 -0
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +1 -0
- package/dist/client/web/CreeveyContext.js +1 -0
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +9 -8
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +13 -3
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +2 -3
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +2 -3
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +1 -0
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
- package/dist/client/web/assets/{index-C47njyZV.js → index-BU4jjKVC.js} +68 -68
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +8 -3
- package/dist/client/web/index.js.map +1 -1
- package/dist/creevey.d.ts +1 -1
- package/dist/creevey.js +1 -22
- package/dist/creevey.js.map +1 -1
- package/dist/playwright-reporter.d.ts +2 -0
- package/dist/playwright-reporter.js +5 -0
- package/dist/playwright-reporter.js.map +1 -0
- package/dist/playwright.d.ts +1 -1
- package/dist/server/config.js +8 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/index.js +12 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/master/api.d.ts +11 -6
- package/dist/server/master/api.js +88 -25
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/handlers/capture-handler.d.ts +5 -0
- package/dist/server/master/handlers/capture-handler.js +25 -0
- package/dist/server/master/handlers/capture-handler.js.map +1 -0
- package/dist/server/master/handlers/index.d.ts +4 -0
- package/dist/server/master/handlers/index.js +21 -0
- package/dist/server/master/handlers/index.js.map +1 -0
- package/dist/server/master/handlers/ping-handler.d.ts +2 -0
- package/dist/server/master/handlers/ping-handler.js +8 -0
- package/dist/server/master/handlers/ping-handler.js.map +1 -0
- package/dist/server/master/handlers/static-handler.d.ts +1 -0
- package/dist/server/master/handlers/static-handler.js +22 -0
- package/dist/server/master/handlers/static-handler.js.map +1 -0
- package/dist/server/master/handlers/stories-handler.d.ts +4 -0
- package/dist/server/master/handlers/stories-handler.js +24 -0
- package/dist/server/master/handlers/stories-handler.js.map +1 -0
- package/dist/server/master/master.js +7 -24
- package/dist/server/master/master.js.map +1 -1
- package/dist/server/master/runner.d.ts +4 -6
- package/dist/server/master/runner.js +30 -127
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.js +191 -89
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.d.ts +1 -2
- package/dist/server/master/start.js +11 -29
- package/dist/server/master/start.js.map +1 -1
- package/dist/server/master/testsManager.d.ts +81 -0
- package/dist/server/master/testsManager.js +281 -0
- package/dist/server/master/testsManager.js.map +1 -0
- package/dist/server/playwright/docker-file.js +2 -2
- package/dist/server/playwright/docker-file.js.map +1 -1
- package/dist/server/playwright/reporter.d.ts +87 -0
- package/dist/server/playwright/reporter.js +351 -0
- package/dist/server/playwright/reporter.js.map +1 -0
- package/dist/server/selenium/internal.js +20 -2
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +4 -0
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/shutdown.d.ts +1 -0
- package/dist/server/shutdown.js +23 -0
- package/dist/server/shutdown.js.map +1 -0
- package/dist/server/stories.d.ts +0 -1
- package/dist/server/stories.js +0 -12
- package/dist/server/stories.js.map +1 -1
- package/dist/server/ui-update.d.ts +10 -0
- package/dist/server/ui-update.js +39 -0
- package/dist/server/ui-update.js.map +1 -0
- package/dist/server/utils.d.ts +6 -0
- package/dist/server/utils.js +39 -8
- package/dist/server/utils.js.map +1 -1
- package/dist/server/worker/start.js +1 -1
- package/dist/server/worker/start.js.map +1 -1
- package/dist/types.d.ts +14 -8
- package/dist/types.js.map +1 -1
- package/docs/examples/playwright-reporter-example.ts +202 -0
- package/docs/migration-0.9-to-0.10.md +144 -0
- package/docs/playwright-reporter.md +357 -0
- package/package.json +10 -14
- package/src/client/addon/controller.ts +1 -1
- package/src/client/addon/withCreevey.ts +2 -16
- package/src/client/shared/components/PageHeader/PageHeader.tsx +18 -4
- package/src/client/shared/creeveyClientApi.ts +10 -0
- package/src/client/web/CreeveyApp.tsx +2 -0
- package/src/client/web/CreeveyContext.tsx +2 -0
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +19 -17
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +18 -3
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +9 -7
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -6
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +1 -0
- package/src/client/web/index.tsx +8 -3
- package/src/creevey.ts +1 -24
- package/src/playwright-reporter.ts +3 -0
- package/src/server/config.ts +9 -1
- package/src/server/index.ts +13 -6
- package/src/server/master/api.ts +94 -28
- package/src/server/master/handlers/capture-handler.ts +20 -0
- package/src/server/master/handlers/index.ts +4 -0
- package/src/server/master/handlers/ping-handler.ts +6 -0
- package/src/server/master/handlers/static-handler.ts +18 -0
- package/src/server/master/handlers/stories-handler.ts +20 -0
- package/src/server/master/master.ts +10 -27
- package/src/server/master/runner.ts +38 -132
- package/src/server/master/server.ts +210 -98
- package/src/server/master/start.ts +17 -41
- package/src/server/master/testsManager.ts +315 -0
- package/src/server/playwright/docker-file.ts +2 -2
- package/src/server/playwright/reporter.ts +386 -0
- package/src/server/selenium/internal.ts +23 -3
- package/src/server/selenium/selenoid.ts +5 -0
- package/src/server/shutdown.ts +19 -0
- package/src/server/stories.ts +1 -12
- package/src/server/ui-update.ts +46 -0
- package/src/server/utils.ts +40 -9
- package/src/server/worker/start.ts +1 -1
- package/src/types.ts +14 -8
@@ -0,0 +1,281 @@
|
|
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
|
+
exports.TestsManager = void 0;
|
7
|
+
const path_1 = __importDefault(require("path"));
|
8
|
+
const fs_1 = require("fs");
|
9
|
+
const events_1 = __importDefault(require("events"));
|
10
|
+
const types_js_1 = require("../../types.js");
|
11
|
+
const utils_js_1 = require("../utils.js");
|
12
|
+
const promises_1 = require("fs/promises");
|
13
|
+
/**
|
14
|
+
* TestsManager is responsible for all operations related to test data management
|
15
|
+
* including loading, saving, merging, and updating test data.
|
16
|
+
* It extends EventEmitter to emit update events that can be subscribed to.
|
17
|
+
*/
|
18
|
+
class TestsManager extends events_1.default {
|
19
|
+
tests = {};
|
20
|
+
screenDir;
|
21
|
+
reportDir;
|
22
|
+
/**
|
23
|
+
* Creates a new TestsManager instance
|
24
|
+
* @param screenDir Directory for storing reference images
|
25
|
+
* @param reportDir Directory for storing reports and screenshots
|
26
|
+
*/
|
27
|
+
constructor(screenDir, reportDir) {
|
28
|
+
super();
|
29
|
+
this.screenDir = screenDir;
|
30
|
+
this.reportDir = reportDir;
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Get a copy of all tests
|
34
|
+
* @returns all tests
|
35
|
+
*/
|
36
|
+
getTests() {
|
37
|
+
return this.tests;
|
38
|
+
}
|
39
|
+
/**
|
40
|
+
* Get a test by ID
|
41
|
+
* @param id Test ID
|
42
|
+
* @returns Test data
|
43
|
+
*/
|
44
|
+
getTest(id) {
|
45
|
+
return this.tests[id];
|
46
|
+
}
|
47
|
+
/**
|
48
|
+
* Get test data in a format suitable for status reporting
|
49
|
+
* @returns Test data in the format needed for status
|
50
|
+
*/
|
51
|
+
getTestsData() {
|
52
|
+
const testsData = {};
|
53
|
+
Object.entries(this.tests).forEach(([id, test]) => {
|
54
|
+
if (!test)
|
55
|
+
return;
|
56
|
+
const { story: _, fn: __, ...testData } = test;
|
57
|
+
testsData[id] = testData;
|
58
|
+
});
|
59
|
+
return testsData;
|
60
|
+
}
|
61
|
+
/**
|
62
|
+
* Load tests from a report file
|
63
|
+
*/
|
64
|
+
loadTestsFromReport() {
|
65
|
+
const reportDataPath = path_1.default.join(this.reportDir, 'data.js');
|
66
|
+
const testsFromReport = (0, utils_js_1.tryToLoadTestsData)(reportDataPath) ?? {};
|
67
|
+
return testsFromReport;
|
68
|
+
}
|
69
|
+
/**
|
70
|
+
* Merge tests from report with tests from stories
|
71
|
+
*/
|
72
|
+
mergeTests(testsWithReports, testsFromStories) {
|
73
|
+
Object.values(testsFromStories)
|
74
|
+
.filter(types_js_1.isDefined)
|
75
|
+
.forEach((test) => {
|
76
|
+
const testWithReport = testsWithReports[test.id];
|
77
|
+
if (!testWithReport)
|
78
|
+
return;
|
79
|
+
test.retries = testWithReport.retries;
|
80
|
+
if (testWithReport.status === 'success' || testWithReport.status === 'failed') {
|
81
|
+
test.status = testWithReport.status;
|
82
|
+
}
|
83
|
+
test.results = testWithReport.results;
|
84
|
+
test.approved = testWithReport.approved;
|
85
|
+
});
|
86
|
+
return testsFromStories;
|
87
|
+
}
|
88
|
+
loadAndMergeTests(testsFromStories) {
|
89
|
+
const testsFromReport = this.loadTestsFromReport();
|
90
|
+
return this.mergeTests(testsFromReport, testsFromStories);
|
91
|
+
}
|
92
|
+
/**
|
93
|
+
* Update tests with incremental changes
|
94
|
+
* @param testsDiff Tests to update or remove
|
95
|
+
*/
|
96
|
+
updateTests(testsDiff) {
|
97
|
+
const tests = {};
|
98
|
+
const removedTests = [];
|
99
|
+
Object.entries(testsDiff).forEach(([id, newTest]) => {
|
100
|
+
if (newTest) {
|
101
|
+
if (this.tests[id]) {
|
102
|
+
this.tests[id] = {
|
103
|
+
...newTest,
|
104
|
+
retries: this.tests[id].retries,
|
105
|
+
results: this.tests[id].results,
|
106
|
+
approved: this.tests[id].approved,
|
107
|
+
};
|
108
|
+
}
|
109
|
+
else {
|
110
|
+
this.tests[id] = newTest;
|
111
|
+
}
|
112
|
+
const { story: _, fn: __, ...restTest } = newTest;
|
113
|
+
tests[id] = { ...restTest, status: 'unknown' };
|
114
|
+
}
|
115
|
+
else if (this.tests[id]) {
|
116
|
+
const { id: testId, browser, testName, storyPath, storyId } = this.tests[id];
|
117
|
+
removedTests.push({ id: testId, browser, testName, storyPath, storyId });
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
119
|
+
delete this.tests[id];
|
120
|
+
}
|
121
|
+
});
|
122
|
+
this.saveTestsToJson();
|
123
|
+
const update = { tests, removedTests };
|
124
|
+
this.emit('update', update);
|
125
|
+
return update;
|
126
|
+
}
|
127
|
+
/**
|
128
|
+
* Update test result
|
129
|
+
* @param id Test ID
|
130
|
+
* @param status New test status
|
131
|
+
* @param result Optional test result
|
132
|
+
*/
|
133
|
+
updateTestStatus(id, status, result) {
|
134
|
+
// TODO Handle 'retrying' status
|
135
|
+
const test = this.tests[id];
|
136
|
+
if (!test)
|
137
|
+
return null;
|
138
|
+
const { browser, testName, storyPath, storyId } = test;
|
139
|
+
test.status = status === 'retrying' ? 'failed' : status;
|
140
|
+
if (!result) {
|
141
|
+
// NOTE: Running status
|
142
|
+
const update = { tests: { [id]: { id, browser, testName, storyPath, status, storyId } } };
|
143
|
+
this.emit('update', update);
|
144
|
+
return update;
|
145
|
+
}
|
146
|
+
test.results ??= [];
|
147
|
+
test.results.push(result);
|
148
|
+
if (status === 'failed') {
|
149
|
+
test.approved = null;
|
150
|
+
}
|
151
|
+
const update = {
|
152
|
+
tests: {
|
153
|
+
[id]: {
|
154
|
+
id,
|
155
|
+
browser,
|
156
|
+
testName,
|
157
|
+
storyPath,
|
158
|
+
status,
|
159
|
+
approved: test.approved,
|
160
|
+
results: [result],
|
161
|
+
storyId,
|
162
|
+
},
|
163
|
+
},
|
164
|
+
};
|
165
|
+
this.emit('update', update);
|
166
|
+
return update;
|
167
|
+
}
|
168
|
+
/**
|
169
|
+
* Save tests to JSON file
|
170
|
+
* @param reportDir Directory to save the JSON file
|
171
|
+
*/
|
172
|
+
saveTestsToJson() {
|
173
|
+
(0, fs_1.mkdirSync)(this.reportDir, { recursive: true });
|
174
|
+
(0, fs_1.writeFileSync)(path_1.default.join(this.reportDir, 'tests.json'),
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
176
|
+
JSON.stringify(this.tests, (_, value) => ((0, types_js_1.isFunction)(value) ? value.toString() : value), 2));
|
177
|
+
}
|
178
|
+
/**
|
179
|
+
* Save test data to a module
|
180
|
+
* @param data Test data to include in the module
|
181
|
+
*/
|
182
|
+
async saveTestData(data = this.getTestsData()) {
|
183
|
+
const dataModule = `
|
184
|
+
(function (root, factory) {
|
185
|
+
if (typeof module === 'object' && module.exports) {
|
186
|
+
module.exports = factory();
|
187
|
+
} else {
|
188
|
+
root.__CREEVEY_DATA__ = factory();
|
189
|
+
}
|
190
|
+
}(this, function () { return ${JSON.stringify(data)} }));
|
191
|
+
`;
|
192
|
+
await (0, promises_1.writeFile)(path_1.default.join(this.reportDir, 'data.js'), dataModule);
|
193
|
+
}
|
194
|
+
/**
|
195
|
+
* Copy image for approval
|
196
|
+
* @param test Test data
|
197
|
+
* @param image Image name
|
198
|
+
* @param actual Actual image path
|
199
|
+
*/
|
200
|
+
async copyImage(test, image, actual) {
|
201
|
+
const { browser, testName, storyPath } = test;
|
202
|
+
const restPath = [...storyPath, testName].filter(types_js_1.isDefined);
|
203
|
+
const testPath = path_1.default.join(...restPath, image == browser ? '' : browser);
|
204
|
+
const srcImagePath = path_1.default.join(this.reportDir, testPath, actual);
|
205
|
+
const dstImagePath = path_1.default.join(this.screenDir, testPath, `${image}.png`);
|
206
|
+
await (0, promises_1.mkdir)(path_1.default.join(this.screenDir, testPath), { recursive: true });
|
207
|
+
await (0, promises_1.copyFile)(srcImagePath, dstImagePath);
|
208
|
+
}
|
209
|
+
/**
|
210
|
+
* Approve a specific test
|
211
|
+
* @param payload Approval payload with test ID, retry index, and image name
|
212
|
+
*/
|
213
|
+
async approve({ id, retry, image }) {
|
214
|
+
const test = this.tests[id];
|
215
|
+
if (!test?.results)
|
216
|
+
return null;
|
217
|
+
const result = test.results[retry];
|
218
|
+
if (!result.images)
|
219
|
+
return null;
|
220
|
+
const images = result.images[image];
|
221
|
+
if (!images)
|
222
|
+
return null;
|
223
|
+
test.approved ??= {};
|
224
|
+
const { browser, testName, storyPath, storyId } = test;
|
225
|
+
await this.copyImage(test, image, images.actual);
|
226
|
+
test.approved[image] = retry;
|
227
|
+
if (Object.keys(result.images).every((name) => typeof test.approved?.[name] == 'number')) {
|
228
|
+
test.status = 'approved';
|
229
|
+
}
|
230
|
+
const update = {
|
231
|
+
tests: {
|
232
|
+
[id]: {
|
233
|
+
id,
|
234
|
+
browser,
|
235
|
+
testName,
|
236
|
+
storyPath,
|
237
|
+
status: test.status,
|
238
|
+
approved: test.approved,
|
239
|
+
storyId,
|
240
|
+
},
|
241
|
+
},
|
242
|
+
};
|
243
|
+
this.emit('update', update);
|
244
|
+
return update;
|
245
|
+
}
|
246
|
+
/**
|
247
|
+
* Approve all failed tests
|
248
|
+
*/
|
249
|
+
async approveAll() {
|
250
|
+
const updatedTests = {};
|
251
|
+
for (const test of Object.values(this.tests)) {
|
252
|
+
if (!test?.results)
|
253
|
+
continue;
|
254
|
+
const retry = test.results.length - 1;
|
255
|
+
const { images, status } = test.results.at(retry) ?? {};
|
256
|
+
if (!images || status != 'failed')
|
257
|
+
continue;
|
258
|
+
for (const [name, image] of Object.entries(images)) {
|
259
|
+
if (!image)
|
260
|
+
continue;
|
261
|
+
await this.copyImage(test, name, image.actual);
|
262
|
+
test.approved ??= {};
|
263
|
+
test.approved[name] = retry;
|
264
|
+
test.status = 'approved';
|
265
|
+
updatedTests[test.id] = {
|
266
|
+
id: test.id,
|
267
|
+
browser: test.browser,
|
268
|
+
storyPath: test.storyPath,
|
269
|
+
storyId: test.storyId,
|
270
|
+
status: test.status,
|
271
|
+
approved: { [name]: retry },
|
272
|
+
};
|
273
|
+
}
|
274
|
+
}
|
275
|
+
const result = { tests: updatedTests };
|
276
|
+
this.emit('update', result);
|
277
|
+
return result;
|
278
|
+
}
|
279
|
+
}
|
280
|
+
exports.TestsManager = TestsManager;
|
281
|
+
//# sourceMappingURL=testsManager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"testsManager.js","sourceRoot":"","sources":["../../../src/server/master/testsManager.ts"],"names":[],"mappings":"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"}
|
@@ -7,14 +7,14 @@ exports.playwrightDockerFile = playwrightDockerFile;
|
|
7
7
|
const promises_1 = require("fs/promises");
|
8
8
|
const url_1 = require("url");
|
9
9
|
const semver_1 = __importDefault(require("semver"));
|
10
|
-
const shelljs_1 = require("shelljs");
|
10
|
+
const shelljs_1 = __importDefault(require("shelljs"));
|
11
11
|
const importMetaUrl = (0, url_1.pathToFileURL)(__filename).href;
|
12
12
|
// TODO Support custom docker images
|
13
13
|
async function playwrightDockerFile(browser, version) {
|
14
14
|
const sv = semver_1.default.coerce(version);
|
15
15
|
let npmRegistry;
|
16
16
|
try {
|
17
|
-
npmRegistry =
|
17
|
+
npmRegistry = shelljs_1.default.exec('npm config get registry', { silent: true }).stdout.trim();
|
18
18
|
}
|
19
19
|
catch {
|
20
20
|
/* noop */
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"docker-file.js","sourceRoot":"","sources":["../../../src/server/playwright/docker-file.ts"],"names":[],"mappings":";;;;;AAQA,oDAqCC;AA7CD,0CAAuC;AACvC,6BAAoC;AACpC,oDAA4B;AAC5B,
|
1
|
+
{"version":3,"file":"docker-file.js","sourceRoot":"","sources":["../../../src/server/playwright/docker-file.ts"],"names":[],"mappings":";;;;;AAQA,oDAqCC;AA7CD,0CAAuC;AACvC,6BAAoC;AACpC,oDAA4B;AAC5B,sDAAyB;AAEzB,MAAM,aAAa,GAAG,IAAA,mBAAa,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AAErD,oCAAoC;AAC7B,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAe;IACzE,MAAM,EAAE,GAAG,gBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,WAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,iBAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtF,MAAM,UAAU,GAAG;;;;;;EAMnB,OAAO;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC;MAEP,WAAW;QACT,CAAC,CAAC;qBACW,WAAW,kBAAkB;QAC1C,CAAC,CAAC,EACN;2BACuB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;uBAC/B,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,wBAAwB,OAAO;;;;;CAKhF,CAAC;IAEA,OAAO,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
@@ -0,0 +1,87 @@
|
|
1
|
+
import type { Reporter, FullConfig, Suite, TestCase, TestResult, TestStep } from '@playwright/test/reporter';
|
2
|
+
/**
|
3
|
+
* CreeveyPlaywrightReporter is a Playwright reporter that integrates with Creevey
|
4
|
+
* to provide visual testing capabilities and use Creevey's UI for reviewing and approving screenshots.
|
5
|
+
*/
|
6
|
+
export declare class CreeveyPlaywrightReporter implements Reporter {
|
7
|
+
private testsManager;
|
8
|
+
private api;
|
9
|
+
private reportDir;
|
10
|
+
private screenDir;
|
11
|
+
private port;
|
12
|
+
private debug;
|
13
|
+
private startServer;
|
14
|
+
private testIdMap;
|
15
|
+
private asyncQueue;
|
16
|
+
/**
|
17
|
+
* Creates a new instance of the CreeveyPlaywrightReporter
|
18
|
+
* @param options Configuration options for the reporter
|
19
|
+
*/
|
20
|
+
constructor(options?: {
|
21
|
+
reportDir?: string;
|
22
|
+
screenDir?: string;
|
23
|
+
port?: number;
|
24
|
+
debug?: boolean;
|
25
|
+
});
|
26
|
+
/**
|
27
|
+
* Called when the test run starts
|
28
|
+
* @param config Playwright configuration
|
29
|
+
* @param suite Test suite information
|
30
|
+
*/
|
31
|
+
onBegin(_config: FullConfig, _suite: Suite): void;
|
32
|
+
/**
|
33
|
+
* Called when a test begins
|
34
|
+
* @param test Test case information
|
35
|
+
* @param result Test result (initially empty)
|
36
|
+
*/
|
37
|
+
onTestBegin(test: TestCase, _result: TestResult): void;
|
38
|
+
/**
|
39
|
+
* Called when a test step begins
|
40
|
+
* @param test Test case information
|
41
|
+
* @param result Test result
|
42
|
+
* @param step Test step information
|
43
|
+
*/
|
44
|
+
onStepBegin(test: TestCase, _result: TestResult, step: TestStep): void;
|
45
|
+
/**
|
46
|
+
* Called when a test step ends
|
47
|
+
* @param test Test case information
|
48
|
+
* @param result Test result
|
49
|
+
* @param step Test step information
|
50
|
+
*/
|
51
|
+
onStepEnd(_test: TestCase, _result: TestResult, step: TestStep): void;
|
52
|
+
/**
|
53
|
+
* Called when a test ends
|
54
|
+
* @param test Test case information
|
55
|
+
* @param result Test result
|
56
|
+
*/
|
57
|
+
onTestEnd(test: TestCase, result: TestResult): void;
|
58
|
+
/**
|
59
|
+
* Called when the test run ends
|
60
|
+
* @param result The overall test run result
|
61
|
+
*/
|
62
|
+
onEnd(result: {
|
63
|
+
status: 'passed' | 'failed' | 'timedout' | 'interrupted';
|
64
|
+
}): void;
|
65
|
+
/**
|
66
|
+
* Maps a Playwright test to a Creevey test format
|
67
|
+
* @param test Playwright test case
|
68
|
+
* @returns Creevey test object or null if mapping fails
|
69
|
+
*/
|
70
|
+
private mapToCreeveyTest;
|
71
|
+
/**
|
72
|
+
* Process a test result and any attachments
|
73
|
+
* @param test Playwright test case
|
74
|
+
* @param result Playwright test result
|
75
|
+
*/
|
76
|
+
private processTestResult;
|
77
|
+
/**
|
78
|
+
* Logs a debug message if debug mode is enabled
|
79
|
+
* @param message Message to log
|
80
|
+
*/
|
81
|
+
private logDebug;
|
82
|
+
/**
|
83
|
+
* Logs an error message
|
84
|
+
* @param message Error message to log
|
85
|
+
*/
|
86
|
+
private logError;
|
87
|
+
}
|