creevey 0.10.0-beta.43 → 0.10.0-beta.44
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 +10 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/master/api.d.ts +15 -5
- package/dist/server/master/api.js +89 -27
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/handlers/capture-handler.d.ts +2 -0
- package/dist/server/master/handlers/capture-handler.js +35 -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 +7 -0
- package/dist/server/master/handlers/ping-handler.js.map +1 -0
- package/dist/server/master/handlers/static-handler.d.ts +2 -0
- package/dist/server/master/handlers/static-handler.js +32 -0
- package/dist/server/master/handlers/static-handler.js.map +1 -0
- package/dist/server/master/handlers/stories-handler.d.ts +2 -0
- package/dist/server/master/handlers/stories-handler.js +38 -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 +77 -87
- 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/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 +9 -13
- 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 +11 -4
- package/src/server/master/api.ts +95 -26
- package/src/server/master/handlers/capture-handler.ts +39 -0
- package/src/server/master/handlers/index.ts +4 -0
- package/src/server/master/handlers/ping-handler.ts +5 -0
- package/src/server/master/handlers/static-handler.ts +29 -0
- package/src/server/master/handlers/stories-handler.ts +48 -0
- package/src/server/master/master.ts +10 -27
- package/src/server/master/runner.ts +38 -132
- package/src/server/master/server.ts +93 -97
- package/src/server/master/start.ts +17 -41
- package/src/server/master/testsManager.ts +315 -0
- 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
@@ -6,38 +6,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.start = start;
|
7
7
|
const path_1 = __importDefault(require("path"));
|
8
8
|
const fs_1 = require("fs");
|
9
|
-
const url_1 = require("url");
|
10
|
-
const promises_1 = require("fs/promises");
|
11
9
|
const master_js_1 = __importDefault(require("./master.js"));
|
12
|
-
const api_js_1 =
|
10
|
+
const api_js_1 = require("./api.js");
|
13
11
|
const types_js_1 = require("../../types.js");
|
14
12
|
const utils_js_1 = require("../utils.js");
|
15
13
|
const messages_js_1 = require("../messages.js");
|
16
14
|
const logger_js_1 = require("../logger.js");
|
17
15
|
const telemetry_js_1 = require("../telemetry.js");
|
18
|
-
const
|
19
|
-
async function copyStatics(reportDir) {
|
20
|
-
const clientDir = path_1.default.join(path_1.default.dirname((0, url_1.fileURLToPath)(importMetaUrl)), '../../../dist/client/web');
|
21
|
-
const assets = (await (0, promises_1.readdir)(path_1.default.join(clientDir, 'assets'), { withFileTypes: true }))
|
22
|
-
.filter((dirent) => dirent.isFile())
|
23
|
-
.map((dirent) => dirent.name);
|
24
|
-
await (0, promises_1.mkdir)(path_1.default.join(reportDir, 'assets'), { recursive: true });
|
25
|
-
await (0, promises_1.copyFile)(path_1.default.join(clientDir, 'index.html'), path_1.default.join(reportDir, 'index.html'));
|
26
|
-
for (const asset of assets) {
|
27
|
-
await (0, promises_1.copyFile)(path_1.default.join(clientDir, 'assets', asset), path_1.default.join(reportDir, 'assets', asset));
|
28
|
-
}
|
29
|
-
}
|
30
|
-
function reportDataModule(data) {
|
31
|
-
return `
|
32
|
-
(function (root, factory) {
|
33
|
-
if (typeof module === 'object' && module.exports) {
|
34
|
-
module.exports = factory();
|
35
|
-
} else {
|
36
|
-
root.__CREEVEY_DATA__ = factory();
|
37
|
-
}
|
38
|
-
}(this, function () { return ${JSON.stringify(data)} }));
|
39
|
-
`;
|
40
|
-
}
|
16
|
+
const server_js_1 = require("./server.js");
|
41
17
|
function outputUnnecessaryImages(imagesDir, images) {
|
42
18
|
if (!(0, fs_1.existsSync)(imagesDir))
|
43
19
|
return;
|
@@ -48,7 +24,8 @@ function outputUnnecessaryImages(imagesDir, images) {
|
|
48
24
|
(0, logger_js_1.logger)().warn('We found unnecessary screenshot images, those can be safely removed:\n', unnecessaryImages.join('\n'));
|
49
25
|
}
|
50
26
|
}
|
51
|
-
async function start(gridUrl, config, options
|
27
|
+
async function start(gridUrl, config, options) {
|
28
|
+
const resolveApi = (0, server_js_1.start)(config.reportDir, options.port, options.ui);
|
52
29
|
let runner = null;
|
53
30
|
if (config.hooks.before) {
|
54
31
|
await config.hooks.before();
|
@@ -70,10 +47,15 @@ async function start(gridUrl, config, options, resolveApi) {
|
|
70
47
|
});
|
71
48
|
runner = await (0, master_js_1.default)(config, gridUrl);
|
72
49
|
runner.on('stop', () => {
|
73
|
-
void copyStatics(config.reportDir).then(() =>
|
50
|
+
void (0, utils_js_1.copyStatics)(config.reportDir).then(() => runner.testsManager.saveTestData());
|
74
51
|
});
|
75
52
|
if (options.ui) {
|
76
|
-
|
53
|
+
// Initialize TestsManager
|
54
|
+
const testsManager = runner.testsManager;
|
55
|
+
// Create the CreeveyApi instance using the existing runner
|
56
|
+
const api = new api_js_1.CreeveyApi(testsManager, runner);
|
57
|
+
// Resolve the API for the server
|
58
|
+
resolveApi(api);
|
77
59
|
(0, logger_js_1.logger)().info(`Started on http://localhost:${options.port}`);
|
78
60
|
}
|
79
61
|
else {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/server/master/start.ts"],"names":[],"mappings":";;;;;
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/server/master/start.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import EventEmitter from 'events';
|
2
|
+
import { ServerTest, TestResult, TestStatus, CreeveyUpdate, ApprovePayload, CreeveyStatus } from '../../types.js';
|
3
|
+
/**
|
4
|
+
* TestsManager is responsible for all operations related to test data management
|
5
|
+
* including loading, saving, merging, and updating test data.
|
6
|
+
* It extends EventEmitter to emit update events that can be subscribed to.
|
7
|
+
*/
|
8
|
+
export declare class TestsManager extends EventEmitter {
|
9
|
+
private tests;
|
10
|
+
private screenDir;
|
11
|
+
private reportDir;
|
12
|
+
/**
|
13
|
+
* Creates a new TestsManager instance
|
14
|
+
* @param screenDir Directory for storing reference images
|
15
|
+
* @param reportDir Directory for storing reports and screenshots
|
16
|
+
*/
|
17
|
+
constructor(screenDir: string, reportDir: string);
|
18
|
+
/**
|
19
|
+
* Get a copy of all tests
|
20
|
+
* @returns all tests
|
21
|
+
*/
|
22
|
+
getTests(): Partial<Record<string, ServerTest>>;
|
23
|
+
/**
|
24
|
+
* Get a test by ID
|
25
|
+
* @param id Test ID
|
26
|
+
* @returns Test data
|
27
|
+
*/
|
28
|
+
getTest(id: string): ServerTest | undefined;
|
29
|
+
/**
|
30
|
+
* Get test data in a format suitable for status reporting
|
31
|
+
* @returns Test data in the format needed for status
|
32
|
+
*/
|
33
|
+
getTestsData(): CreeveyStatus['tests'];
|
34
|
+
/**
|
35
|
+
* Load tests from a report file
|
36
|
+
*/
|
37
|
+
loadTestsFromReport(): Partial<Record<string, ServerTest>>;
|
38
|
+
/**
|
39
|
+
* Merge tests from report with tests from stories
|
40
|
+
*/
|
41
|
+
private mergeTests;
|
42
|
+
loadAndMergeTests(testsFromStories: Partial<Record<string, ServerTest>>): Partial<Record<string, ServerTest>>;
|
43
|
+
/**
|
44
|
+
* Update tests with incremental changes
|
45
|
+
* @param testsDiff Tests to update or remove
|
46
|
+
*/
|
47
|
+
updateTests(testsDiff: Partial<Record<string, ServerTest>>): CreeveyUpdate | null;
|
48
|
+
/**
|
49
|
+
* Update test result
|
50
|
+
* @param id Test ID
|
51
|
+
* @param status New test status
|
52
|
+
* @param result Optional test result
|
53
|
+
*/
|
54
|
+
updateTestStatus(id: string, status: TestStatus, result?: TestResult): CreeveyUpdate | null;
|
55
|
+
/**
|
56
|
+
* Save tests to JSON file
|
57
|
+
* @param reportDir Directory to save the JSON file
|
58
|
+
*/
|
59
|
+
saveTestsToJson(): void;
|
60
|
+
/**
|
61
|
+
* Save test data to a module
|
62
|
+
* @param data Test data to include in the module
|
63
|
+
*/
|
64
|
+
saveTestData(data?: CreeveyStatus['tests']): Promise<void>;
|
65
|
+
/**
|
66
|
+
* Copy image for approval
|
67
|
+
* @param test Test data
|
68
|
+
* @param image Image name
|
69
|
+
* @param actual Actual image path
|
70
|
+
*/
|
71
|
+
private copyImage;
|
72
|
+
/**
|
73
|
+
* Approve a specific test
|
74
|
+
* @param payload Approval payload with test ID, retry index, and image name
|
75
|
+
*/
|
76
|
+
approve({ id, retry, image }: ApprovePayload): Promise<CreeveyUpdate | null>;
|
77
|
+
/**
|
78
|
+
* Approve all failed tests
|
79
|
+
*/
|
80
|
+
approveAll(): Promise<CreeveyUpdate>;
|
81
|
+
}
|
@@ -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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"}
|
@@ -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
|
+
}
|