creevey 0.10.0-beta.9 → 0.10.0-rc.1
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/AUTHORS +2 -0
- package/CHANGELOG.md +281 -0
- package/README.md +19 -41
- package/dist/client/addon/components/Addon.js +18 -8
- package/dist/client/addon/components/Addon.js.map +1 -1
- package/dist/client/addon/components/Panel.js +2 -2
- package/dist/client/addon/components/Panel.js.map +1 -1
- package/dist/client/addon/components/TestSelect.js +2 -2
- package/dist/client/addon/components/TestSelect.js.map +1 -1
- package/dist/client/addon/components/Tools.js +19 -9
- package/dist/client/addon/components/Tools.js.map +1 -1
- package/dist/client/addon/controller.d.ts +1 -1
- package/dist/client/addon/controller.js +3 -3
- package/dist/client/addon/controller.js.map +1 -1
- package/dist/client/addon/decorator.d.ts +1 -1
- package/dist/client/addon/makeDecorator.d.ts +9 -0
- package/dist/client/addon/makeDecorator.js +48 -0
- package/dist/client/addon/makeDecorator.js.map +1 -0
- package/dist/client/addon/manager.js +38 -39
- package/dist/client/addon/manager.js.map +1 -1
- package/dist/client/addon/preset.d.ts +0 -1
- package/dist/client/addon/preset.js +3 -2
- package/dist/client/addon/preset.js.map +1 -1
- package/dist/client/addon/preview.d.ts +1 -1
- package/dist/client/addon/withCreevey.d.ts +5 -3
- package/dist/client/addon/withCreevey.js +5 -20
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/ImagesView/BlendView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/BlendView.js +18 -8
- package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.js +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SideBySideView.js +19 -9
- package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SlideView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SlideView.js +19 -9
- package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SwapView.js +19 -9
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/common.d.ts +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
- package/dist/client/shared/components/PageFooter/Paging.js +1 -1
- package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +2 -2
- package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.js +34 -13
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/client/shared/components/ResultsPage.d.ts +2 -2
- package/dist/client/shared/components/ResultsPage.js +22 -10
- package/dist/client/shared/components/ResultsPage.js.map +1 -1
- package/dist/client/shared/creeveyClientApi.js +18 -1
- package/dist/client/shared/creeveyClientApi.js.map +1 -1
- package/dist/client/shared/helpers.d.ts +1 -3
- package/dist/client/shared/helpers.js +4 -19
- package/dist/client/shared/helpers.js.map +1 -1
- package/dist/client/web/CreeveyApp.d.ts +1 -0
- package/dist/client/web/CreeveyApp.js +22 -9
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +1 -0
- package/dist/client/web/CreeveyContext.js +18 -7
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyLoader.d.ts +1 -1
- package/dist/client/web/CreeveyLoader.js +3 -3
- package/dist/client/web/CreeveyLoader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -4
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js +36 -6
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.js +18 -8
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +26 -12
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +28 -17
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +32 -12
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +20 -11
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -11
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +3 -2
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.js +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
- package/dist/client/web/KeyboardEventsContext.js +17 -7
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +26 -11
- package/dist/client/web/index.js.map +1 -1
- package/dist/client/web/themes.d.ts +2 -0
- package/dist/client/web/themes.js +22 -0
- package/dist/client/web/themes.js.map +1 -0
- package/dist/creevey.d.ts +1 -1
- package/dist/creevey.js +122 -41
- package/dist/creevey.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/playwright/generator.d.ts +34 -0
- package/dist/playwright/generator.js +267 -0
- package/dist/playwright/generator.js.map +1 -0
- package/dist/playwright/helpers.d.ts +2 -0
- package/dist/playwright/helpers.js +29 -0
- package/dist/playwright/helpers.js.map +1 -0
- package/dist/playwright/reporter.d.ts +83 -0
- package/dist/playwright/reporter.js +334 -0
- package/dist/playwright/reporter.js.map +1 -0
- package/dist/playwright/setup.d.ts +3 -0
- package/dist/playwright/setup.js +72 -0
- package/dist/playwright/setup.js.map +1 -0
- package/dist/playwright.d.ts +1 -0
- package/dist/playwright.js +3 -1
- package/dist/playwright.js.map +1 -1
- package/dist/server/compare.d.ts +18 -0
- package/dist/server/compare.js +182 -0
- package/dist/server/compare.js.map +1 -0
- package/dist/server/config.d.ts +3 -3
- package/dist/server/config.js +75 -8
- package/dist/server/config.js.map +1 -1
- package/dist/server/connection.d.ts +3 -0
- package/dist/server/connection.js +28 -0
- package/dist/server/connection.js.map +1 -0
- package/dist/server/docker.d.ts +1 -1
- package/dist/server/docker.js +54 -32
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +166 -64
- 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 +20 -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/pool.d.ts +1 -0
- package/dist/server/master/pool.js +5 -3
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/queue.d.ts +1 -1
- package/dist/server/master/queue.js +14 -6
- package/dist/server/master/queue.js.map +1 -1
- package/dist/server/master/runner.d.ts +6 -6
- package/dist/server/master/runner.js +98 -130
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.d.ts +1 -1
- package/dist/server/master/server.js +193 -88
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.d.ts +1 -2
- package/dist/server/master/start.js +13 -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 +282 -0
- package/dist/server/master/testsManager.js.map +1 -0
- package/dist/server/playwright/docker-file.d.ts +1 -1
- package/dist/server/playwright/docker-file.js +17 -8
- package/dist/server/playwright/docker-file.js.map +1 -1
- package/dist/server/playwright/docker.d.ts +2 -1
- package/dist/server/playwright/docker.js +10 -2
- package/dist/server/playwright/docker.js.map +1 -1
- package/dist/server/playwright/index-source.mjs +16 -0
- package/dist/server/playwright/internal.d.ts +7 -7
- package/dist/server/playwright/internal.js +137 -79
- package/dist/server/playwright/internal.js.map +1 -1
- package/dist/server/playwright/webdriver.d.ts +3 -3
- package/dist/server/playwright/webdriver.js +0 -6
- package/dist/server/playwright/webdriver.js.map +1 -1
- package/dist/server/providers/browser.js +4 -3
- package/dist/server/providers/browser.js.map +1 -1
- package/dist/server/providers/hybrid.js +2 -2
- package/dist/server/providers/hybrid.js.map +1 -1
- package/dist/server/report.d.ts +10 -0
- package/dist/server/report.js +45 -0
- package/dist/server/report.js.map +1 -0
- package/dist/server/reporters/creevey.d.ts +7 -0
- package/dist/server/reporters/creevey.js +63 -0
- package/dist/server/reporters/creevey.js.map +1 -0
- package/dist/server/reporters/index.d.ts +2 -0
- package/dist/server/reporters/index.js +16 -0
- package/dist/server/reporters/index.js.map +1 -0
- package/dist/server/reporters/junit.d.ts +16 -0
- package/dist/server/reporters/junit.js +167 -0
- package/dist/server/reporters/junit.js.map +1 -0
- package/dist/server/reporters/teamcity.d.ts +7 -0
- package/dist/server/reporters/teamcity.js +60 -0
- package/dist/server/reporters/teamcity.js.map +1 -0
- package/dist/server/selenium/internal.d.ts +3 -3
- package/dist/server/selenium/internal.js +48 -34
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +12 -6
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/selenium/webdriver.d.ts +3 -3
- package/dist/server/selenium/webdriver.js +4 -8
- package/dist/server/selenium/webdriver.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/telemetry.js +3 -3
- package/dist/server/telemetry.js.map +1 -1
- package/dist/server/testsFiles/parser.js +45 -5
- package/dist/server/testsFiles/parser.js.map +1 -1
- package/dist/server/utils.d.ts +23 -0
- package/dist/server/utils.js +113 -13
- package/dist/server/utils.js.map +1 -1
- package/dist/server/webdriver.d.ts +1 -1
- package/dist/server/worker/context.d.ts +3 -0
- package/dist/server/worker/context.js +15 -0
- package/dist/server/worker/context.js.map +1 -0
- package/dist/server/worker/match-image.d.ts +8 -12
- package/dist/server/worker/match-image.js +11 -178
- package/dist/server/worker/match-image.js.map +1 -1
- package/dist/server/worker/start.d.ts +2 -2
- package/dist/server/worker/start.js +27 -63
- package/dist/server/worker/start.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +9 -7
- package/dist/shared/index.js.map +1 -1
- package/dist/types.d.ts +84 -43
- package/dist/types.js +65 -1
- package/dist/types.js.map +1 -1
- package/docs/cli.md +80 -0
- package/docs/config.md +179 -165
- package/docs/examples/playwright-reporer/playwright.config.ts +36 -0
- package/docs/migration-0.9-to-0.10.md +182 -0
- package/docs/playwright-reporter.md +170 -0
- package/docs/storybook.md +60 -0
- package/docs/tests.md +50 -45
- package/package.json +78 -83
- package/playwright.config.mts +46 -0
- package/src/client/addon/components/Addon.tsx +1 -1
- package/src/client/addon/components/Panel.tsx +2 -2
- package/src/client/addon/components/TestSelect.tsx +2 -2
- package/src/client/addon/components/Tools.tsx +2 -2
- package/src/client/addon/controller.ts +4 -4
- package/src/client/addon/makeDecorator.ts +69 -0
- package/src/client/addon/manager.ts +38 -37
- package/src/client/addon/preset.ts +2 -1
- package/src/client/addon/withCreevey.ts +10 -18
- package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
- package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
- package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SwapView.tsx +2 -2
- package/src/client/shared/components/ImagesView/common.ts +1 -1
- package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
- package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
- package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
- package/src/client/shared/components/ResultsPage.tsx +6 -4
- package/src/client/shared/creeveyClientApi.ts +19 -1
- package/src/client/shared/helpers.ts +4 -24
- package/src/client/web/CreeveyApp.tsx +5 -2
- package/src/client/web/CreeveyContext.tsx +2 -0
- package/src/client/web/CreeveyLoader.tsx +2 -2
- package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
- package/src/client/web/CreeveyView/SideBar/Search.tsx +1 -1
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +21 -19
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +10 -8
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +9 -7
- package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
- package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
- package/src/client/web/index.tsx +10 -5
- package/src/client/web/themes.ts +24 -0
- package/src/creevey.ts +92 -38
- package/src/playwright/generator.ts +360 -0
- package/src/playwright/helpers.ts +31 -0
- package/src/playwright/reporter.ts +381 -0
- package/src/playwright/setup.ts +84 -0
- package/src/playwright.ts +1 -0
- package/src/server/compare.ts +260 -0
- package/src/server/config.ts +52 -9
- package/src/server/connection.ts +26 -0
- package/src/server/docker.ts +62 -34
- package/src/server/index.ts +165 -79
- 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 +16 -0
- package/src/server/master/handlers/stories-handler.ts +20 -0
- package/src/server/master/master.ts +10 -27
- package/src/server/master/pool.ts +7 -3
- package/src/server/master/queue.ts +21 -7
- package/src/server/master/runner.ts +123 -134
- package/src/server/master/server.ts +214 -101
- package/src/server/master/start.ts +19 -41
- package/src/server/master/testsManager.ts +316 -0
- package/src/server/playwright/docker-file.ts +20 -8
- package/src/server/playwright/docker.ts +16 -3
- package/src/server/playwright/index-source.mjs +16 -0
- package/src/server/playwright/internal.ts +169 -96
- package/src/server/playwright/webdriver.ts +4 -10
- package/src/server/providers/browser.ts +4 -3
- package/src/server/providers/hybrid.ts +2 -3
- package/src/server/report.ts +51 -0
- package/src/server/reporters/creevey.ts +74 -0
- package/src/server/reporters/index.ts +11 -0
- package/src/server/reporters/junit.ts +207 -0
- package/src/server/reporters/teamcity.ts +74 -0
- package/src/server/selenium/internal.ts +62 -45
- package/src/server/selenium/selenoid.ts +13 -6
- package/src/server/selenium/webdriver.ts +8 -12
- package/src/server/shutdown.ts +19 -0
- package/src/server/stories.ts +1 -12
- package/src/server/telemetry.ts +3 -3
- package/src/server/testsFiles/parser.ts +52 -4
- package/src/server/utils.ts +123 -14
- package/src/server/webdriver.ts +1 -1
- package/src/server/worker/context.ts +14 -0
- package/src/server/worker/match-image.ts +16 -248
- package/src/server/worker/start.ts +32 -75
- package/src/shared/index.ts +10 -8
- package/src/types.ts +91 -58
- package/types/global.d.ts +1 -0
- package/dist/client/web/assets/index-BE9CL5_G.js +0 -591
- package/dist/server/reporter.d.ts +0 -26
- package/dist/server/reporter.js +0 -108
- package/dist/server/reporter.js.map +0 -1
- package/dist/server/update.d.ts +0 -2
- package/dist/server/update.js +0 -53
- package/dist/server/update.js.map +0 -1
- package/src/server/reporter.ts +0 -139
- package/src/server/update.ts +0 -74
@@ -0,0 +1,334 @@
|
|
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 promises_1 = __importDefault(require("fs/promises"));
|
7
|
+
const crypto_1 = require("crypto");
|
8
|
+
const types_js_1 = require("../types.js");
|
9
|
+
const testsManager_js_1 = require("../server/master/testsManager.js");
|
10
|
+
const api_js_1 = require("../server/master/api.js");
|
11
|
+
const utils_js_1 = require("../server/utils.js");
|
12
|
+
const server_js_1 = require("../server/master/server.js");
|
13
|
+
const assert_1 = __importDefault(require("assert"));
|
14
|
+
/**
|
15
|
+
* Simple async queue to handle operations in sequence without returning promises
|
16
|
+
* from reporter methods that should be synchronous
|
17
|
+
*/
|
18
|
+
class AsyncQueue {
|
19
|
+
queue;
|
20
|
+
constructor() {
|
21
|
+
this.queue = Promise.resolve();
|
22
|
+
}
|
23
|
+
/**
|
24
|
+
* Add an async operation to the queue
|
25
|
+
* @param operation Async operation to execute
|
26
|
+
*/
|
27
|
+
enqueue(operation) {
|
28
|
+
this.queue = this.queue.then(operation).catch((error) => {
|
29
|
+
console.error(`Error in async queue: ${error instanceof Error ? error.message : String(error)}`);
|
30
|
+
});
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Wait for all operations in the queue to complete
|
34
|
+
*/
|
35
|
+
async waitForCompletion() {
|
36
|
+
await this.queue;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
/**
|
40
|
+
* CreeveyPlaywrightReporter is a Playwright reporter that integrates with Creevey
|
41
|
+
* to provide visual testing capabilities and use Creevey's UI for reviewing and approving screenshots.
|
42
|
+
*/
|
43
|
+
class CreeveyPlaywrightReporter {
|
44
|
+
testsManager = null;
|
45
|
+
api = null;
|
46
|
+
port;
|
47
|
+
debug;
|
48
|
+
testIdMap = new Map(); // Maps Playwright test IDs to Creevey test IDs
|
49
|
+
asyncQueue = new AsyncQueue();
|
50
|
+
/**
|
51
|
+
* Creates a new instance of the CreeveyPlaywrightReporter
|
52
|
+
* @param options Configuration options for the reporter
|
53
|
+
*/
|
54
|
+
constructor(options) {
|
55
|
+
this.port = options?.port ?? 3000;
|
56
|
+
this.debug = options?.debug ?? !!process.env.PWDEBUG;
|
57
|
+
}
|
58
|
+
/**
|
59
|
+
* Called when the test run starts
|
60
|
+
* @param config Playwright configuration
|
61
|
+
* @param suite Test suite information
|
62
|
+
*/
|
63
|
+
onBegin(config, suite) {
|
64
|
+
this.logDebug('CreeveyPlaywrightReporter started');
|
65
|
+
const [snapshotDir, ...restSnapshotDirs] = [...new Set(config.projects.map((project) => project.snapshotDir))];
|
66
|
+
const [outputDir, ...restOutputDirs] = [...new Set(config.projects.map((project) => project.outputDir))];
|
67
|
+
(0, assert_1.default)(restSnapshotDirs.length === 0, 'Currently multiple snapshot directories are not supported');
|
68
|
+
(0, assert_1.default)(restOutputDirs.length === 0, 'Currently multiple output directories are not supported');
|
69
|
+
// Initialize TestsManager
|
70
|
+
this.testsManager = new testsManager_js_1.TestsManager(snapshotDir, outputDir);
|
71
|
+
// Use the async queue to handle initialization without returning a promise
|
72
|
+
this.asyncQueue.enqueue(async () => {
|
73
|
+
(0, assert_1.default)(this.testsManager, 'TestsManager is not initialized');
|
74
|
+
try {
|
75
|
+
await promises_1.default.mkdir(outputDir, { recursive: true });
|
76
|
+
await (0, utils_js_1.copyStatics)(outputDir);
|
77
|
+
}
|
78
|
+
catch (error) {
|
79
|
+
this.logError(`Failed to initialize report directory: ${error instanceof Error ? error.message : String(error)}`);
|
80
|
+
}
|
81
|
+
// Start server API
|
82
|
+
try {
|
83
|
+
const resolveApi = (0, server_js_1.start)(outputDir, this.port, true);
|
84
|
+
// Create and connect the API
|
85
|
+
this.api = new api_js_1.CreeveyApi(this.testsManager);
|
86
|
+
resolveApi(this.api);
|
87
|
+
const testsList = suite
|
88
|
+
.allTests()
|
89
|
+
.map((test) => {
|
90
|
+
const creeveyTest = this.mapToCreeveyTest(test);
|
91
|
+
if (!creeveyTest)
|
92
|
+
return;
|
93
|
+
this.testIdMap.set(test.id, creeveyTest.id);
|
94
|
+
return creeveyTest;
|
95
|
+
})
|
96
|
+
.filter(types_js_1.isDefined);
|
97
|
+
const tests = {};
|
98
|
+
for (const test of testsList) {
|
99
|
+
tests[test.id] = test;
|
100
|
+
}
|
101
|
+
this.testsManager.updateTests(tests);
|
102
|
+
console.log(`Creevey report server started at http://localhost:${this.port}`);
|
103
|
+
}
|
104
|
+
catch (error) {
|
105
|
+
this.logError(`Could not start Creevey server: ${error instanceof Error ? error.message : String(error)}`);
|
106
|
+
console.log('Screenshots will still be captured but UI will not be available');
|
107
|
+
}
|
108
|
+
});
|
109
|
+
}
|
110
|
+
/**
|
111
|
+
* Called when a test begins
|
112
|
+
* @param test Test case information
|
113
|
+
* @param result Test result (initially empty)
|
114
|
+
*/
|
115
|
+
onTestBegin(test, _result) {
|
116
|
+
try {
|
117
|
+
(0, assert_1.default)(this.testsManager, 'TestsManager is not initialized');
|
118
|
+
const creeveyTestId = this.testIdMap.get(test.id);
|
119
|
+
if (creeveyTestId) {
|
120
|
+
// Update test status to running
|
121
|
+
this.testsManager.updateTestStatus(creeveyTestId, 'running');
|
122
|
+
this.logDebug(`Test started: ${test.title} (${creeveyTestId})`);
|
123
|
+
}
|
124
|
+
}
|
125
|
+
catch (error) {
|
126
|
+
this.logError(`Error in onTestBegin: ${error instanceof Error ? error.message : String(error)}`);
|
127
|
+
}
|
128
|
+
}
|
129
|
+
/**
|
130
|
+
* Called when a test step begins
|
131
|
+
* @param test Test case information
|
132
|
+
* @param result Test result
|
133
|
+
* @param step Test step information
|
134
|
+
*/
|
135
|
+
onStepBegin(test, _result, step) {
|
136
|
+
/*
|
137
|
+
[Creevey Reporter] Step started: browserType.launch in test: 100 X 100 Vs 2000 X 100
|
138
|
+
[Creevey Reporter] Step started: browserType.launch in test: Side By Side
|
139
|
+
[Creevey Reporter] Step started: browserType.launch in test: Full
|
140
|
+
*/
|
141
|
+
if (this.debug) {
|
142
|
+
this.logDebug(`Step started: ${step.title} in test: ${test.title}`);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
/**
|
146
|
+
* Called when a test step ends
|
147
|
+
* @param test Test case information
|
148
|
+
* @param result Test result
|
149
|
+
* @param step Test step information
|
150
|
+
*/
|
151
|
+
onStepEnd(_test, _result, step) {
|
152
|
+
try {
|
153
|
+
// If step has attachments, process them
|
154
|
+
if (step.attachments.length > 0) {
|
155
|
+
this.logDebug(`Processing ${step.attachments.length} attachments from step: ${step.title}`);
|
156
|
+
// We'll process attachments in onTestEnd for simplicity in this initial implementation
|
157
|
+
}
|
158
|
+
}
|
159
|
+
catch (error) {
|
160
|
+
this.logError(`Error in onStepEnd: ${error instanceof Error ? error.message : String(error)}`);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
/**
|
164
|
+
* Called when a test ends
|
165
|
+
* @param test Test case information
|
166
|
+
* @param result Test result
|
167
|
+
*/
|
168
|
+
onTestEnd(test, result) {
|
169
|
+
const creeveyTestId = this.testIdMap.get(test.id);
|
170
|
+
// Use the async queue to handle result processing without returning a promise
|
171
|
+
this.asyncQueue.enqueue(async () => {
|
172
|
+
try {
|
173
|
+
// Process test results and screenshots
|
174
|
+
await this.processTestResult(test, result);
|
175
|
+
if (creeveyTestId) {
|
176
|
+
this.logDebug(`Test ended: ${test.title} (${creeveyTestId}) with status: ${result.status}`);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
catch (error) {
|
180
|
+
this.logError(`Error in onTestEnd: ${error instanceof Error ? error.message : String(error)}`);
|
181
|
+
}
|
182
|
+
});
|
183
|
+
}
|
184
|
+
/**
|
185
|
+
* Called when the test run ends
|
186
|
+
* @param result The overall test run result
|
187
|
+
*/
|
188
|
+
async onEnd(result) {
|
189
|
+
// Use the async queue to handle final operations without returning a promise
|
190
|
+
this.asyncQueue.enqueue(async () => {
|
191
|
+
try {
|
192
|
+
(0, assert_1.default)(this.testsManager, 'TestsManager is not initialized');
|
193
|
+
// Save test data
|
194
|
+
await this.testsManager.saveTestData();
|
195
|
+
this.logDebug(`Test run ended with status: ${result.status}`);
|
196
|
+
// TODO: Tell how to run reporter `yarn creevey update ./report --ui`
|
197
|
+
}
|
198
|
+
catch (error) {
|
199
|
+
this.logError(`Error during reporter cleanup: ${error instanceof Error ? error.message : String(error)}`);
|
200
|
+
}
|
201
|
+
});
|
202
|
+
// Wait for all previous operations to complete
|
203
|
+
await this.asyncQueue.waitForCompletion();
|
204
|
+
}
|
205
|
+
/**
|
206
|
+
* Maps a Playwright test to a Creevey test format
|
207
|
+
* @param test Playwright test case
|
208
|
+
* @returns Creevey test object or null if mapping fails
|
209
|
+
*/
|
210
|
+
mapToCreeveyTest(test) {
|
211
|
+
try {
|
212
|
+
const storyName = test.title;
|
213
|
+
const storyTitle = test.parent.title;
|
214
|
+
const projectName = test.parent.project()?.name ?? 'chromium';
|
215
|
+
const testPath = [storyTitle, storyName, projectName];
|
216
|
+
const { description: storyId } = test.annotations.find((annotation) => annotation.type === 'storyId') ?? {};
|
217
|
+
// Generate a unique test ID
|
218
|
+
const testId = (0, crypto_1.createHash)('sha1').update(testPath.join('/')).digest('hex');
|
219
|
+
// Create the test metadata
|
220
|
+
const testMeta = {
|
221
|
+
id: testId,
|
222
|
+
storyPath: [...storyTitle.split('/').map((x) => x.trim()), storyName],
|
223
|
+
browser: projectName,
|
224
|
+
storyId: storyId ?? '',
|
225
|
+
};
|
226
|
+
// Create a stub ServerTest object
|
227
|
+
// This is missing the story and fn properties which would be used in a real Creevey test
|
228
|
+
// However, for our reporter purposes, we just need the metadata
|
229
|
+
const serverTest = {
|
230
|
+
...testMeta,
|
231
|
+
story: {
|
232
|
+
parameters: {},
|
233
|
+
initialArgs: {},
|
234
|
+
argTypes: {},
|
235
|
+
component: '',
|
236
|
+
componentId: '',
|
237
|
+
name: storyName,
|
238
|
+
tags: [],
|
239
|
+
title: storyTitle,
|
240
|
+
kind: storyTitle,
|
241
|
+
id: storyId ?? '',
|
242
|
+
story: storyName,
|
243
|
+
}, // Placeholder
|
244
|
+
fn: async () => {
|
245
|
+
/* Empty function as placeholder */
|
246
|
+
}, // Placeholder
|
247
|
+
};
|
248
|
+
return serverTest;
|
249
|
+
}
|
250
|
+
catch (error) {
|
251
|
+
this.logError(`Error mapping test to Creevey format: ${error instanceof Error ? error.message : String(error)}`);
|
252
|
+
return null;
|
253
|
+
}
|
254
|
+
}
|
255
|
+
/**
|
256
|
+
* Process a test result and any attachments
|
257
|
+
* @param test Playwright test case
|
258
|
+
* @param result Playwright test result
|
259
|
+
*/
|
260
|
+
async processTestResult(test, result) {
|
261
|
+
const creeveyTestId = this.testIdMap.get(test.id);
|
262
|
+
if (!creeveyTestId) {
|
263
|
+
this.logError(`No Creevey test ID found for test: ${test.title}`);
|
264
|
+
return Promise.resolve();
|
265
|
+
}
|
266
|
+
(0, assert_1.default)(this.testsManager, 'TestsManager is not initialized');
|
267
|
+
// Determine test status
|
268
|
+
let status;
|
269
|
+
switch (result.status) {
|
270
|
+
case 'passed':
|
271
|
+
status = 'success';
|
272
|
+
break;
|
273
|
+
case 'failed':
|
274
|
+
case 'timedOut':
|
275
|
+
status = 'failed';
|
276
|
+
break;
|
277
|
+
default:
|
278
|
+
status = 'unknown';
|
279
|
+
}
|
280
|
+
// Process attachments
|
281
|
+
const images = {};
|
282
|
+
const attachmentPaths = [];
|
283
|
+
const projectName = test.parent.project()?.name ?? 'chromium';
|
284
|
+
for (const attachment of result.attachments) {
|
285
|
+
const { name, path: attachmentPath } = attachment;
|
286
|
+
if (!attachmentPath)
|
287
|
+
continue;
|
288
|
+
attachmentPaths.push(attachmentPath);
|
289
|
+
switch (true) {
|
290
|
+
case name.includes('actual'): {
|
291
|
+
images[projectName] = { ...images[projectName], actual: name };
|
292
|
+
break;
|
293
|
+
}
|
294
|
+
case name.includes('expect'): {
|
295
|
+
images[projectName] = { ...images[projectName], expect: name };
|
296
|
+
break;
|
297
|
+
}
|
298
|
+
case name.includes('diff'): {
|
299
|
+
images[projectName] = { ...images[projectName], diff: name };
|
300
|
+
break;
|
301
|
+
}
|
302
|
+
}
|
303
|
+
}
|
304
|
+
// Update test status and result
|
305
|
+
const testResult = {
|
306
|
+
status: status === 'success' ? 'success' : 'failed',
|
307
|
+
retries: result.retry,
|
308
|
+
images,
|
309
|
+
error: result.error?.message ?? undefined,
|
310
|
+
duration: result.duration,
|
311
|
+
attachments: attachmentPaths,
|
312
|
+
browserName: projectName,
|
313
|
+
};
|
314
|
+
this.testsManager.updateTestStatus(creeveyTestId, status, testResult);
|
315
|
+
}
|
316
|
+
/**
|
317
|
+
* Logs a debug message if debug mode is enabled
|
318
|
+
* @param message Message to log
|
319
|
+
*/
|
320
|
+
logDebug(message) {
|
321
|
+
if (this.debug) {
|
322
|
+
console.log(`[Creevey Reporter] ${message}`);
|
323
|
+
}
|
324
|
+
}
|
325
|
+
/**
|
326
|
+
* Logs an error message
|
327
|
+
* @param message Error message to log
|
328
|
+
*/
|
329
|
+
logError(message) {
|
330
|
+
console.error(`[Creevey Reporter] ERROR: ${message}`);
|
331
|
+
}
|
332
|
+
}
|
333
|
+
exports.default = CreeveyPlaywrightReporter;
|
334
|
+
//# sourceMappingURL=reporter.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/playwright/reporter.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,72 @@
|
|
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 path_1 = __importDefault(require("path"));
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
8
|
+
const promises_1 = require("fs/promises");
|
9
|
+
const test_1 = require("@playwright/test");
|
10
|
+
const utils_1 = require("../server/utils");
|
11
|
+
const webdriver_1 = require("../server/webdriver");
|
12
|
+
const helpers_1 = require("./helpers");
|
13
|
+
// This function will fetch stories and cache them or an error if fetching fails.
|
14
|
+
// It's intended to be called once before tests that depend on stories are defined.
|
15
|
+
async function ensureStoriesFetched(page, storybookUrl) {
|
16
|
+
try {
|
17
|
+
console.log(`Fetching stories from: ${storybookUrl}`);
|
18
|
+
await page.goto((0, webdriver_1.appendIframePath)(storybookUrl), { waitUntil: 'networkidle', timeout: 60000 });
|
19
|
+
await (0, helpers_1.waitForStorybookReady)(page);
|
20
|
+
// TODO: Inline `serializeRawStories` to serialize creevey skip parameters
|
21
|
+
const fetchedStories = await page.evaluate(() => window.__STORYBOOK_PREVIEW__.extract());
|
22
|
+
if (!fetchedStories || Object.keys(fetchedStories).length === 0) {
|
23
|
+
throw new Error('No stories were found or cached from Storybook.');
|
24
|
+
}
|
25
|
+
console.log(`Successfully fetched and cached ${Object.keys(fetchedStories).length} stories.`);
|
26
|
+
return fetchedStories;
|
27
|
+
}
|
28
|
+
catch (error) {
|
29
|
+
console.error('Error fetching stories');
|
30
|
+
throw error;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
const browsers = {
|
34
|
+
chromium: test_1.chromium,
|
35
|
+
firefox: test_1.firefox,
|
36
|
+
webkit: test_1.webkit,
|
37
|
+
};
|
38
|
+
// TODO: Setup should generate test files for each story file (component)
|
39
|
+
// TODO: Add support for multiple storybook urls
|
40
|
+
async function globalSetup(config) {
|
41
|
+
const storybookUrl = config.webServer?.url;
|
42
|
+
const { defaultBrowserType = 'chromium', browserName = defaultBrowserType } = config.projects[0].use;
|
43
|
+
(0, assert_1.default)(storybookUrl, 'Storybook URL is required');
|
44
|
+
const cacheDir = await (0, utils_1.getCreeveyCache)();
|
45
|
+
(0, assert_1.default)(cacheDir, 'Cache directory not found');
|
46
|
+
await (0, promises_1.mkdir)(cacheDir, { recursive: true });
|
47
|
+
process.env.CREEVEY_CACHE_DIR = cacheDir;
|
48
|
+
const browser = await browsers[browserName].launch();
|
49
|
+
const context = await browser.newContext();
|
50
|
+
const page = await context.newPage();
|
51
|
+
if (process.env.PWDEBUG) {
|
52
|
+
await context.tracing.start({ name: 'storybook-setup' });
|
53
|
+
}
|
54
|
+
try {
|
55
|
+
const stories = await ensureStoriesFetched(page, storybookUrl);
|
56
|
+
await (0, promises_1.writeFile)(path_1.default.join(cacheDir, 'stories.json'), JSON.stringify(stories, null, 2));
|
57
|
+
}
|
58
|
+
catch (error) {
|
59
|
+
console.error('Error in globalSetup:', error);
|
60
|
+
if (process.env.PWDEBUG) {
|
61
|
+
const tracePath = path_1.default.join(cacheDir, 'storybook-setup-trace.zip');
|
62
|
+
console.log('Trace is saved to:', tracePath);
|
63
|
+
await context.tracing.stop({ path: tracePath });
|
64
|
+
}
|
65
|
+
throw error;
|
66
|
+
}
|
67
|
+
finally {
|
68
|
+
await browser.close();
|
69
|
+
}
|
70
|
+
}
|
71
|
+
exports.default = globalSetup;
|
72
|
+
//# sourceMappingURL=setup.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/playwright/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/playwright.d.ts
CHANGED
package/dist/playwright.js
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.PlaywrightWebdriver = void 0;
|
3
|
+
exports.definePlaywrightTests = exports.PlaywrightWebdriver = void 0;
|
4
4
|
var webdriver_js_1 = require("./server/playwright/webdriver.js");
|
5
5
|
Object.defineProperty(exports, "PlaywrightWebdriver", { enumerable: true, get: function () { return webdriver_js_1.PlaywrightWebdriver; } });
|
6
|
+
var generator_js_1 = require("./playwright/generator.js");
|
7
|
+
Object.defineProperty(exports, "definePlaywrightTests", { enumerable: true, get: function () { return generator_js_1.definePlaywrightTests; } });
|
6
8
|
//# sourceMappingURL=playwright.js.map
|
package/dist/playwright.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":";;;AAAA,iEAAuE;AAA9D,mHAAA,mBAAmB,OAAA"}
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":";;;AAAA,iEAAuE;AAA9D,mHAAA,mBAAmB,OAAA;AAC5B,0DAAkE;AAAzD,qHAAA,qBAAqB,OAAA"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import type { ODiffOptions } from 'odiff-bin';
|
2
|
+
import type { PixelmatchOptions } from 'pixelmatch';
|
3
|
+
import { Images } from '../types';
|
4
|
+
export interface ImageContext {
|
5
|
+
attachments: string[];
|
6
|
+
testFullPath: string[];
|
7
|
+
images: Partial<Record<string, Images>>;
|
8
|
+
}
|
9
|
+
export declare function getPixelmatchAssert(pixelmatch: typeof import('pixelmatch'), ctx: ImageContext, config: {
|
10
|
+
screenDir: string;
|
11
|
+
reportDir: string;
|
12
|
+
diffOptions: PixelmatchOptions;
|
13
|
+
}): (actual: Buffer, imageName?: string) => Promise<string | undefined>;
|
14
|
+
export declare function getOdiffAssert(compare: (typeof import('odiff-bin'))['compare'], ctx: ImageContext, config: {
|
15
|
+
screenDir: string;
|
16
|
+
reportDir: string;
|
17
|
+
odiffOptions?: ODiffOptions;
|
18
|
+
}): (image: Buffer, imageName?: string) => Promise<string | undefined>;
|
@@ -0,0 +1,182 @@
|
|
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.getPixelmatchAssert = getPixelmatchAssert;
|
7
|
+
exports.getOdiffAssert = getOdiffAssert;
|
8
|
+
const path_1 = __importDefault(require("path"));
|
9
|
+
const assert_1 = __importDefault(require("assert"));
|
10
|
+
const pngjs_1 = require("pngjs");
|
11
|
+
const promises_1 = require("fs/promises");
|
12
|
+
async function getStat(filePath) {
|
13
|
+
try {
|
14
|
+
return await (0, promises_1.stat)(filePath);
|
15
|
+
}
|
16
|
+
catch (error) {
|
17
|
+
if (typeof error == 'object' && error && error.code === 'ENOENT') {
|
18
|
+
return null;
|
19
|
+
}
|
20
|
+
throw error;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
async function getLastImageNumber(imageDir, imageName) {
|
24
|
+
const actualImagesRegexp = new RegExp(`${imageName}-actual-(\\d+)\\.png`);
|
25
|
+
try {
|
26
|
+
return ((await (0, promises_1.readdir)(imageDir))
|
27
|
+
.map((filename) => filename.replace(actualImagesRegexp, '$1'))
|
28
|
+
.map(Number)
|
29
|
+
.filter((x) => !isNaN(x))
|
30
|
+
.sort((a, b) => b - a)[0] ?? 0);
|
31
|
+
}
|
32
|
+
catch (_error) {
|
33
|
+
return 0;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
async function readExpected(expectImageDir, imageName) {
|
37
|
+
const expected = await (0, promises_1.readFile)(path_1.default.join(expectImageDir, `${imageName}.png`));
|
38
|
+
return expected;
|
39
|
+
}
|
40
|
+
async function saveImages(imageDir, images) {
|
41
|
+
const files = [];
|
42
|
+
await (0, promises_1.mkdir)(imageDir, { recursive: true });
|
43
|
+
for (const { name, data } of images) {
|
44
|
+
const filePath = path_1.default.join(imageDir, name);
|
45
|
+
await (0, promises_1.writeFile)(filePath, data);
|
46
|
+
files.push(filePath);
|
47
|
+
}
|
48
|
+
return files;
|
49
|
+
}
|
50
|
+
async function getImagePaths(config, testFullPath, assertImageName) {
|
51
|
+
const testPath = [...testFullPath];
|
52
|
+
const imageName = assertImageName ?? testPath.pop();
|
53
|
+
(0, assert_1.default)(typeof imageName === 'string', `Can't get image name from empty test scope`);
|
54
|
+
const expectImageDir = path_1.default.join(config.screenDir, ...testPath);
|
55
|
+
const reportImageDir = path_1.default.join(config.reportDir, ...testPath);
|
56
|
+
const imageNumber = (await getLastImageNumber(reportImageDir, imageName)) + 1;
|
57
|
+
const actualImageName = `${imageName}-actual-${imageNumber}.png`;
|
58
|
+
const expectImageName = `${imageName}-expect-${imageNumber}.png`;
|
59
|
+
const diffImageName = `${imageName}-diff-${imageNumber}.png`;
|
60
|
+
return { imageName, actualImageName, expectImageName, diffImageName, expectImageDir, reportImageDir };
|
61
|
+
}
|
62
|
+
async function getExpected(ctx, { imageName, actualImageName, expectImageName, diffImageName, expectImageDir, reportImageDir }) {
|
63
|
+
const onCompare = async (actual, expect, diff) => {
|
64
|
+
const imagesMeta = [];
|
65
|
+
const image = (ctx.images[imageName] = ctx.images[imageName] ?? { actual: actualImageName });
|
66
|
+
imagesMeta.push({ name: image.actual, data: actual });
|
67
|
+
if (diff && expect) {
|
68
|
+
image.expect = expectImageName;
|
69
|
+
image.diff = diffImageName;
|
70
|
+
imagesMeta.push({ name: image.expect, data: expect });
|
71
|
+
imagesMeta.push({ name: image.diff, data: diff });
|
72
|
+
}
|
73
|
+
ctx.attachments = await saveImages(reportImageDir, imagesMeta);
|
74
|
+
};
|
75
|
+
const expectImageStat = await getStat(path_1.default.join(expectImageDir, `${imageName}.png`));
|
76
|
+
if (!expectImageStat)
|
77
|
+
return { expected: null, onCompare };
|
78
|
+
const expected = await readExpected(expectImageDir, imageName);
|
79
|
+
return { expected, onCompare };
|
80
|
+
}
|
81
|
+
async function getOdiffExpected(ctx, actual, { imageName, actualImageName, expectImageName, diffImageName, expectImageDir, reportImageDir }) {
|
82
|
+
const expected = await readExpected(expectImageDir, imageName);
|
83
|
+
const image = (ctx.images[imageName] = ctx.images[imageName] ?? { actual: actualImageName });
|
84
|
+
image.expect = expectImageName;
|
85
|
+
image.diff = diffImageName;
|
86
|
+
const imagesMeta = [
|
87
|
+
{ name: image.actual, data: actual },
|
88
|
+
{ name: expectImageName, data: expected },
|
89
|
+
];
|
90
|
+
ctx.attachments = await saveImages(reportImageDir, imagesMeta);
|
91
|
+
return {
|
92
|
+
actual: path_1.default.join(reportImageDir, actualImageName),
|
93
|
+
expect: path_1.default.join(reportImageDir, expectImageName),
|
94
|
+
diff: path_1.default.join(reportImageDir, diffImageName),
|
95
|
+
};
|
96
|
+
}
|
97
|
+
function normalizeImageSize(image, width, height) {
|
98
|
+
const normalizedImage = Buffer.alloc(4 * width * height);
|
99
|
+
for (let y = 0; y < height; y++) {
|
100
|
+
for (let x = 0; x < width; x++) {
|
101
|
+
const i = (y * width + x) * 4;
|
102
|
+
if (x < image.width && y < image.height) {
|
103
|
+
const j = (y * image.width + x) * 4;
|
104
|
+
normalizedImage[i + 0] = image.data[j + 0];
|
105
|
+
normalizedImage[i + 1] = image.data[j + 1];
|
106
|
+
normalizedImage[i + 2] = image.data[j + 2];
|
107
|
+
normalizedImage[i + 3] = image.data[j + 3];
|
108
|
+
}
|
109
|
+
else {
|
110
|
+
normalizedImage[i + 0] = 0;
|
111
|
+
normalizedImage[i + 1] = 0;
|
112
|
+
normalizedImage[i + 2] = 0;
|
113
|
+
normalizedImage[i + 3] = 0;
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
return normalizedImage;
|
118
|
+
}
|
119
|
+
function hasDiffPixels(diff) {
|
120
|
+
for (let i = 0; i < diff.length; i += 4) {
|
121
|
+
if (diff[i + 0] == 255 && diff[i + 1] == 0 && diff[i + 2] == 0 && diff[i + 3] == 255)
|
122
|
+
return true;
|
123
|
+
}
|
124
|
+
return false;
|
125
|
+
}
|
126
|
+
function compareImages(expect, actual, pixelmatch, diffOptions) {
|
127
|
+
const expectImage = pngjs_1.PNG.sync.read(expect);
|
128
|
+
const actualImage = pngjs_1.PNG.sync.read(actual);
|
129
|
+
const width = Math.max(actualImage.width, expectImage.width);
|
130
|
+
const height = Math.max(actualImage.height, expectImage.height);
|
131
|
+
const diffImage = new pngjs_1.PNG({ width, height });
|
132
|
+
let actualImageData = actualImage.data;
|
133
|
+
if (actualImage.width < width || actualImage.height < height) {
|
134
|
+
actualImageData = normalizeImageSize(actualImage, width, height);
|
135
|
+
}
|
136
|
+
let expectImageData = expectImage.data;
|
137
|
+
if (expectImage.width < width || expectImage.height < height) {
|
138
|
+
expectImageData = normalizeImageSize(expectImage, width, height);
|
139
|
+
}
|
140
|
+
pixelmatch(expectImageData, actualImageData, diffImage.data, width, height, diffOptions);
|
141
|
+
return {
|
142
|
+
isEqual: !hasDiffPixels(diffImage.data),
|
143
|
+
diff: pngjs_1.PNG.sync.write(diffImage),
|
144
|
+
};
|
145
|
+
}
|
146
|
+
function getPixelmatchAssert(pixelmatch, ctx, config) {
|
147
|
+
return async function assertImagePixelmatch(actual, imageName) {
|
148
|
+
const { expected, onCompare } = await getExpected(ctx, await getImagePaths(config, ctx.testFullPath, imageName));
|
149
|
+
if (expected == null) {
|
150
|
+
await onCompare(actual);
|
151
|
+
return imageName ? `Expected image '${imageName}' does not exists` : 'Expected image does not exists';
|
152
|
+
}
|
153
|
+
if (actual.equals(expected)) {
|
154
|
+
await onCompare(actual);
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
const { isEqual, diff } = compareImages(expected, actual, pixelmatch, config.diffOptions);
|
158
|
+
if (isEqual) {
|
159
|
+
await onCompare(actual);
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
await onCompare(actual, expected, diff);
|
163
|
+
return imageName ? `Expected image '${imageName}' to match` : 'Expected image to match';
|
164
|
+
};
|
165
|
+
}
|
166
|
+
function getOdiffAssert(compare, ctx, config) {
|
167
|
+
const diffOptions = {
|
168
|
+
...config.odiffOptions,
|
169
|
+
noFailOnFsErrors: true,
|
170
|
+
};
|
171
|
+
return async function assertImage(image, imageName) {
|
172
|
+
const { actual, expect, diff } = await getOdiffExpected(ctx, image, await getImagePaths(config, ctx.testFullPath, imageName));
|
173
|
+
const result = await compare(actual, expect, diff, diffOptions);
|
174
|
+
if (!result.match) {
|
175
|
+
if (result.reason == 'file-not-exists') {
|
176
|
+
return imageName ? `Expected image '${imageName}' does not exists` : 'Expected image does not exists';
|
177
|
+
}
|
178
|
+
return imageName ? `Expected image '${imageName}' to match` : 'Expected image to match';
|
179
|
+
}
|
180
|
+
};
|
181
|
+
}
|
182
|
+
//# sourceMappingURL=compare.js.map
|