creevey 0.9.1 → 0.10.0-beta.0
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/chromatic.config.json +5 -0
- package/dist/client/addon/components/Addon.d.ts +1 -0
- package/dist/client/addon/components/Addon.js.map +1 -1
- package/dist/client/addon/components/Icons.d.ts +1 -0
- package/dist/client/addon/components/Icons.js.map +1 -1
- package/dist/client/addon/components/Panel.d.ts +1 -0
- package/dist/client/addon/components/Panel.js.map +1 -1
- package/dist/client/addon/components/TestSelect.d.ts +1 -0
- package/dist/client/addon/components/TestSelect.js +4 -3
- package/dist/client/addon/components/TestSelect.js.map +1 -1
- package/dist/client/addon/components/Tools.d.ts +1 -0
- package/dist/client/addon/components/Tools.js +7 -8
- 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.map +1 -1
- package/dist/client/addon/decorator.d.ts +1 -1
- package/dist/client/addon/manager.js +3 -2
- package/dist/client/addon/manager.js.map +1 -1
- package/dist/client/addon/preview.d.ts +1 -1
- package/dist/client/addon/withCreevey.d.ts +6 -8
- package/dist/client/addon/withCreevey.js +21 -19
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/ImagesView/BlendView.d.ts +1 -1
- package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
- package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SlideView.d.ts +1 -1
- package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.d.ts +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
- 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.d.ts +2 -2
- package/dist/client/shared/components/PageFooter/Paging.js +8 -6
- package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
- package/dist/client/shared/components/PageHeader/PageHeader.js +2 -1
- 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.map +1 -1
- package/dist/client/web/CreeveyApp.d.ts +1 -0
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyLoader.d.ts +1 -0
- package/dist/client/web/CreeveyLoader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js +4 -4
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/Search.js +4 -4
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.d.ts +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -7
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +5 -4
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +4 -3
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +3 -7
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +6 -5
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +5 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +15 -8
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +5 -4
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
- package/dist/client/web/KeyboardEventsContext.d.ts +3 -4
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/index-DkmZfG9C.js +591 -0
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +5 -6
- package/dist/client/web/index.js.map +1 -1
- package/dist/creevey.js +21 -9
- package/dist/creevey.js.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/server/config.d.ts +1 -1
- package/dist/server/config.js +9 -5
- package/dist/server/config.js.map +1 -1
- package/dist/server/docker.d.ts +2 -2
- package/dist/server/docker.js +46 -40
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.js +54 -15
- package/dist/server/index.js.map +1 -1
- package/dist/server/master/master.d.ts +1 -5
- package/dist/server/master/master.js +3 -3
- package/dist/server/master/master.js.map +1 -1
- package/dist/server/master/pool.d.ts +2 -1
- package/dist/server/master/pool.js +13 -7
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/runner.d.ts +1 -1
- package/dist/server/master/runner.js +4 -2
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.js +1 -0
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.d.ts +3 -0
- package/dist/server/master/{index.js → start.js} +6 -9
- package/dist/server/master/start.js.map +1 -0
- package/dist/server/messages.d.ts +4 -10
- package/dist/server/messages.js +4 -58
- package/dist/server/messages.js.map +1 -1
- package/dist/server/playwright/docker-file.d.ts +1 -0
- package/dist/server/playwright/docker-file.js +26 -0
- package/dist/server/playwright/docker-file.js.map +1 -0
- package/dist/server/playwright/docker.d.ts +1 -0
- package/dist/server/playwright/docker.js +31 -0
- package/dist/server/playwright/docker.js.map +1 -0
- package/dist/server/playwright/internal.d.ts +25 -0
- package/dist/server/playwright/internal.js +319 -0
- package/dist/server/playwright/internal.js.map +1 -0
- package/dist/server/playwright/webdriver.d.ts +16 -0
- package/dist/server/playwright/webdriver.js +105 -0
- package/dist/server/playwright/webdriver.js.map +1 -0
- package/dist/server/providers/browser.d.ts +2 -0
- package/dist/server/{storybook/providers → providers}/browser.js +6 -7
- package/dist/server/providers/browser.js.map +1 -0
- package/dist/server/providers/hybrid.d.ts +2 -0
- package/dist/server/{storybook/providers → providers}/hybrid.js +8 -8
- package/dist/server/providers/hybrid.js.map +1 -0
- package/dist/server/reporter.d.ts +26 -0
- package/dist/server/{worker/reporter.js → reporter.js} +34 -56
- package/dist/server/reporter.js.map +1 -0
- package/dist/server/selenium/internal.d.ts +31 -0
- package/dist/server/selenium/internal.js +606 -0
- package/dist/server/selenium/internal.js.map +1 -0
- package/dist/server/selenium/selenoid.js +6 -13
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/selenium/webdriver.d.ts +24 -0
- package/dist/server/selenium/webdriver.js +106 -0
- package/dist/server/selenium/webdriver.js.map +1 -0
- package/dist/server/stories.js +16 -9
- package/dist/server/stories.js.map +1 -1
- package/dist/server/telemetry.d.ts +1 -1
- package/dist/server/telemetry.js +4 -4
- package/dist/server/telemetry.js.map +1 -1
- package/dist/server/utils.d.ts +3 -4
- package/dist/server/utils.js +10 -9
- package/dist/server/utils.js.map +1 -1
- package/dist/server/webdriver.d.ts +19 -0
- package/dist/server/webdriver.js +79 -0
- package/dist/server/webdriver.js.map +1 -0
- package/dist/server/worker/chai-image.d.ts +2 -5
- package/dist/server/worker/chai-image.js +14 -102
- package/dist/server/worker/chai-image.js.map +1 -1
- package/dist/server/worker/match-image.d.ts +14 -0
- package/dist/server/worker/match-image.js +231 -0
- package/dist/server/worker/match-image.js.map +1 -0
- package/dist/server/worker/start.d.ts +2 -0
- package/dist/server/worker/start.js +258 -0
- package/dist/server/worker/start.js.map +1 -0
- package/dist/types.d.ts +127 -64
- package/dist/types.js +15 -9
- package/dist/types.js.map +1 -1
- package/package.json +108 -110
- package/src/client/addon/components/Addon.tsx +1 -1
- package/src/client/addon/components/Icons.tsx +1 -1
- package/src/client/addon/components/Panel.tsx +1 -1
- package/src/client/addon/components/TestSelect.tsx +5 -5
- package/src/client/addon/components/Tools.tsx +9 -9
- package/src/client/addon/controller.ts +1 -1
- package/src/client/addon/manager.ts +4 -4
- package/src/client/addon/withCreevey.ts +26 -28
- package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
- package/src/client/shared/components/ImagesView/ImagesView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SideBySideView.tsx +1 -1
- package/src/client/shared/components/ImagesView/SlideView.tsx +1 -1
- package/src/client/shared/components/ImagesView/SwapView.tsx +1 -1
- package/src/client/shared/components/PageFooter/PageFooter.tsx +2 -2
- package/src/client/shared/components/PageFooter/Paging.tsx +13 -13
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
- package/src/client/shared/components/PageHeader/PageHeader.tsx +4 -3
- package/src/client/shared/components/ResultsPage.tsx +1 -1
- package/src/client/web/CreeveyApp.tsx +1 -1
- package/src/client/web/CreeveyLoader.tsx +1 -1
- package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +6 -7
- package/src/client/web/CreeveyView/SideBar/Search.tsx +4 -4
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +3 -10
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +7 -6
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +7 -6
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +8 -6
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -3
- package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +18 -10
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +7 -10
- package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -2
- package/src/client/web/KeyboardEventsContext.tsx +3 -4
- package/src/client/web/index.html +1 -1
- package/src/client/web/index.tsx +4 -3
- package/src/creevey.ts +25 -8
- package/src/index.ts +4 -2
- package/src/server/config.ts +12 -8
- package/src/server/docker.ts +58 -44
- package/src/server/index.ts +57 -18
- package/src/server/master/master.ts +3 -6
- package/src/server/master/pool.ts +25 -9
- package/src/server/master/runner.ts +4 -2
- package/src/server/master/server.ts +1 -0
- package/src/server/master/{index.ts → start.ts} +13 -11
- package/src/server/messages.ts +11 -75
- package/src/server/playwright/docker-file.ts +21 -0
- package/src/server/playwright/docker.ts +41 -0
- package/src/server/playwright/internal.ts +387 -0
- package/src/server/playwright/webdriver.ts +126 -0
- package/src/server/{storybook/providers → providers}/browser.ts +7 -8
- package/src/server/{storybook/providers → providers}/hybrid.ts +19 -19
- package/src/server/{worker/reporter.ts → reporter.ts} +40 -72
- package/src/server/selenium/internal.ts +785 -0
- package/src/server/selenium/selenoid.ts +12 -17
- package/src/server/selenium/webdriver.ts +136 -0
- package/src/server/stories.ts +18 -11
- package/src/server/telemetry.ts +2 -2
- package/src/server/utils.ts +9 -9
- package/src/server/webdriver.ts +127 -0
- package/src/server/worker/chai-image.ts +21 -133
- package/src/server/worker/match-image.ts +303 -0
- package/src/server/worker/start.ts +303 -0
- package/src/types.ts +162 -60
- package/dist/client/web/202.js +0 -1
- package/dist/client/web/270.js +0 -43
- package/dist/client/web/752.js +0 -1
- package/dist/client/web/main.js +0 -79
- package/dist/client/web/main.js.LICENSE.txt +0 -34
- package/dist/server/master/index.d.ts +0 -3
- package/dist/server/master/index.js.map +0 -1
- package/dist/server/selenium/browser.d.ts +0 -19
- package/dist/server/selenium/browser.js +0 -640
- package/dist/server/selenium/browser.js.map +0 -1
- package/dist/server/selenium/index.d.ts +0 -2
- package/dist/server/selenium/index.js +0 -19
- package/dist/server/selenium/index.js.map +0 -1
- package/dist/server/storybook/providers/browser.d.ts +0 -2
- package/dist/server/storybook/providers/browser.js.map +0 -1
- package/dist/server/storybook/providers/hybrid.d.ts +0 -2
- package/dist/server/storybook/providers/hybrid.js.map +0 -1
- package/dist/server/worker/helpers.d.ts +0 -8
- package/dist/server/worker/helpers.js +0 -57
- package/dist/server/worker/helpers.js.map +0 -1
- package/dist/server/worker/index.d.ts +0 -1
- package/dist/server/worker/index.js +0 -6
- package/dist/server/worker/index.js.map +0 -1
- package/dist/server/worker/reporter.d.ts +0 -8
- package/dist/server/worker/reporter.js.map +0 -1
- package/dist/server/worker/worker.d.ts +0 -4
- package/dist/server/worker/worker.js +0 -212
- package/dist/server/worker/worker.js.map +0 -1
- package/src/server/selenium/browser.ts +0 -840
- package/src/server/selenium/index.ts +0 -2
- package/src/server/worker/helpers.ts +0 -61
- package/src/server/worker/index.ts +0 -1
- package/src/server/worker/worker.ts +0 -240
- package/types/mocha.d.ts +0 -20
@@ -0,0 +1,126 @@
|
|
1
|
+
import { Args } from '@storybook/csf';
|
2
|
+
import { Config, Options, StoriesRaw, StoryInput } from '../../types';
|
3
|
+
import { logger } from '../logger';
|
4
|
+
import { subscribeOn } from '../messages';
|
5
|
+
import { CreeveyWebdriverBase } from '../webdriver';
|
6
|
+
import type { InternalBrowser } from './internal';
|
7
|
+
|
8
|
+
export class PlaywrightWebdriver extends CreeveyWebdriverBase {
|
9
|
+
#browser: InternalBrowser | null = null;
|
10
|
+
#browserName: string;
|
11
|
+
#gridUrl: string;
|
12
|
+
#config: Config;
|
13
|
+
#options: Options;
|
14
|
+
constructor(browser: string, gridUrl: string, config: Config, options: Options) {
|
15
|
+
super();
|
16
|
+
|
17
|
+
this.#browserName = browser;
|
18
|
+
this.#gridUrl = gridUrl;
|
19
|
+
this.#config = config;
|
20
|
+
this.#options = options;
|
21
|
+
|
22
|
+
subscribeOn('shutdown', () => {
|
23
|
+
void this.#browser?.closeBrowser().finally(() => process.exit());
|
24
|
+
this.#browser = null;
|
25
|
+
});
|
26
|
+
}
|
27
|
+
|
28
|
+
get browser() {
|
29
|
+
return this.#browser?.browser;
|
30
|
+
}
|
31
|
+
|
32
|
+
getSessionId(): Promise<string> {
|
33
|
+
if (!this.#browser) {
|
34
|
+
// TODO Describe the error
|
35
|
+
throw new Error('Browser is not initialized');
|
36
|
+
}
|
37
|
+
|
38
|
+
return Promise.resolve(this.#browser.sessionId);
|
39
|
+
}
|
40
|
+
|
41
|
+
async openBrowser(fresh = false): Promise<PlaywrightWebdriver | null> {
|
42
|
+
if (this.#browser) {
|
43
|
+
if (fresh) {
|
44
|
+
await this.#browser.closeBrowser();
|
45
|
+
this.#browser = null;
|
46
|
+
} else {
|
47
|
+
return this;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
const internalModule = await (async () => {
|
52
|
+
try {
|
53
|
+
return await import('./internal.js');
|
54
|
+
} catch (error) {
|
55
|
+
logger.error(error);
|
56
|
+
return null;
|
57
|
+
}
|
58
|
+
})();
|
59
|
+
|
60
|
+
if (!internalModule) return null;
|
61
|
+
|
62
|
+
const { InternalBrowser } = internalModule;
|
63
|
+
const browser = await InternalBrowser.getBrowser(this.#browserName, this.#gridUrl, this.#config, this.#options);
|
64
|
+
|
65
|
+
if (!browser) return null;
|
66
|
+
|
67
|
+
this.#browser = browser;
|
68
|
+
|
69
|
+
return this;
|
70
|
+
}
|
71
|
+
|
72
|
+
async closeBrowser(): Promise<void> {
|
73
|
+
if (this.#browser) {
|
74
|
+
await this.#browser.closeBrowser();
|
75
|
+
this.#browser = null;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
async loadStoriesFromBrowser(): Promise<StoriesRaw> {
|
80
|
+
if (!this.#browser) {
|
81
|
+
// TODO Describe the error
|
82
|
+
throw new Error('Browser is not initialized');
|
83
|
+
}
|
84
|
+
|
85
|
+
return this.#browser.loadStoriesFromBrowser();
|
86
|
+
}
|
87
|
+
|
88
|
+
protected async takeScreenshot(
|
89
|
+
captureElement: string | null,
|
90
|
+
ignoreElements?: string | string[] | null,
|
91
|
+
): Promise<Buffer> {
|
92
|
+
if (!this.#browser) {
|
93
|
+
// TODO Describe the error
|
94
|
+
throw new Error('Browser is not initialized');
|
95
|
+
}
|
96
|
+
|
97
|
+
return this.#browser.takeScreenshot(captureElement, ignoreElements);
|
98
|
+
}
|
99
|
+
|
100
|
+
protected waitForComplete(callback: (isCompleted: boolean) => void): void {
|
101
|
+
if (!this.#browser) {
|
102
|
+
// TODO Describe the error
|
103
|
+
throw new Error('Browser is not initialized');
|
104
|
+
}
|
105
|
+
|
106
|
+
this.#browser.waitForComplete(callback);
|
107
|
+
}
|
108
|
+
|
109
|
+
protected async selectStory(id: string, waitForReady?: boolean): Promise<boolean> {
|
110
|
+
if (!this.#browser) {
|
111
|
+
// TODO Describe the error
|
112
|
+
throw new Error('Browser is not initialized');
|
113
|
+
}
|
114
|
+
|
115
|
+
return this.#browser.selectStory(id, waitForReady);
|
116
|
+
}
|
117
|
+
|
118
|
+
protected async updateStoryArgs(story: StoryInput, updatedArgs: Args): Promise<void> {
|
119
|
+
if (!this.#browser) {
|
120
|
+
// TODO Describe the error
|
121
|
+
throw new Error('Browser is not initialized');
|
122
|
+
}
|
123
|
+
|
124
|
+
return this.#browser.updateStoryArgs(story, updatedArgs);
|
125
|
+
}
|
126
|
+
}
|
@@ -1,12 +1,11 @@
|
|
1
1
|
import cluster from 'cluster';
|
2
|
-
import type { CreeveyStory, StoriesProvider, StoriesRaw } from '
|
3
|
-
import {
|
4
|
-
import {
|
5
|
-
import {
|
6
|
-
import {
|
7
|
-
import { deserializeRawStories } from '../../../shared/index.js';
|
2
|
+
import type { CreeveyStory, StoriesProvider, StoriesRaw } from '../../types.js';
|
3
|
+
import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../messages.js';
|
4
|
+
import { isDefined } from '../../types.js';
|
5
|
+
import { logger } from '../logger.js';
|
6
|
+
import { deserializeRawStories } from '../../shared/index.js';
|
8
7
|
|
9
|
-
export const loadStories: StoriesProvider = async (_config,
|
8
|
+
export const loadStories: StoriesProvider = async (_config, storiesListener, webdriver) => {
|
10
9
|
if (cluster.isPrimary) {
|
11
10
|
return new Promise<StoriesRaw>((resolve) => {
|
12
11
|
const worker = Object.values(cluster.workers ?? {})
|
@@ -40,7 +39,7 @@ export const loadStories: StoriesProvider = async (_config, _options, storiesLis
|
|
40
39
|
emitStoriesMessage({ type: 'set', payload: { stories, oldTests: storiesWithOldTests } });
|
41
40
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
42
41
|
});
|
43
|
-
const stories = deserializeRawStories(await loadStoriesFromBrowser());
|
42
|
+
const stories = deserializeRawStories((await webdriver?.loadStoriesFromBrowser()) ?? {});
|
44
43
|
|
45
44
|
const storiesWithOldTests: string[] = [];
|
46
45
|
|
@@ -1,17 +1,13 @@
|
|
1
1
|
import chokidar from 'chokidar';
|
2
2
|
|
3
3
|
import { loadStories as browserProvider } from './browser.js';
|
4
|
-
import type { Config,
|
5
|
-
import { logger } from '
|
6
|
-
import parse, { CreeveyParamsByStoryId } from '
|
7
|
-
import { readDirRecursive } from '
|
8
|
-
import { combineParameters } from '
|
4
|
+
import type { Config, CreeveyStoryParams, CreeveyStory, StoriesProvider } from '../../types.js';
|
5
|
+
import { logger } from '../logger.js';
|
6
|
+
import parse, { CreeveyParamsByStoryId } from '../testsFiles/parser.js';
|
7
|
+
import { readDirRecursive } from '../utils.js';
|
8
|
+
import { combineParameters } from '../../shared/index.js';
|
9
9
|
|
10
|
-
export const loadStories: StoriesProvider = async (
|
11
|
-
_config: Config,
|
12
|
-
_options,
|
13
|
-
storiesListener: (stories: Map<string, StoryInput[]>) => void,
|
14
|
-
) => {
|
10
|
+
export const loadStories: StoriesProvider = async (config, storiesListener, webdriver) => {
|
15
11
|
let creeveyParamsByStoryId: Partial<CreeveyParamsByStoryId> = {};
|
16
12
|
|
17
13
|
const mergeParamsFromTestsToStory = (story: CreeveyStory, creeveyParams: CreeveyStoryParams): void => {
|
@@ -20,18 +16,22 @@ export const loadStories: StoriesProvider = async (
|
|
20
16
|
}
|
21
17
|
};
|
22
18
|
|
23
|
-
const stories = await browserProvider(
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
const stories = await browserProvider(
|
20
|
+
config,
|
21
|
+
(updatedStoriesByFiles) => {
|
22
|
+
Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
|
23
|
+
storiesArray.forEach((story) => {
|
24
|
+
const creeveyParams = creeveyParamsByStoryId[story.id];
|
25
|
+
if (creeveyParams) mergeParamsFromTestsToStory(story, creeveyParams);
|
26
|
+
});
|
28
27
|
});
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
storiesListener(updatedStoriesByFiles);
|
29
|
+
},
|
30
|
+
webdriver,
|
31
|
+
);
|
32
32
|
|
33
33
|
// TODO fix test files hot reloading
|
34
|
-
creeveyParamsByStoryId = await parseParams(
|
34
|
+
creeveyParamsByStoryId = await parseParams(config /*, (data) => console.log(data) */);
|
35
35
|
|
36
36
|
Object.entries(stories).forEach(([storyId, story]) => {
|
37
37
|
const creeveyParams = creeveyParamsByStoryId[storyId];
|
@@ -1,13 +1,13 @@
|
|
1
1
|
import chalk from 'chalk';
|
2
2
|
import Logger from 'loglevel';
|
3
3
|
import prefix from 'loglevel-plugin-prefix';
|
4
|
-
import {
|
5
|
-
import
|
4
|
+
import { FakeTest, Images, isDefined, isImageError, TEST_EVENTS } from '../types.js';
|
5
|
+
import EventEmitter from 'events';
|
6
6
|
|
7
7
|
interface ReporterOptions {
|
8
8
|
reportDir: string;
|
9
9
|
sessionId: string;
|
10
|
-
|
10
|
+
browserName: string;
|
11
11
|
willRetry: boolean;
|
12
12
|
images: Partial<Record<string, Partial<Images>>>;
|
13
13
|
}
|
@@ -18,62 +18,73 @@ const testLevels: Record<string, string> = {
|
|
18
18
|
ERROR: chalk.red('FAIL'),
|
19
19
|
};
|
20
20
|
|
21
|
-
export class CreeveyReporter
|
21
|
+
export class CreeveyReporter {
|
22
22
|
// TODO Output in better way, like vitest, maybe
|
23
|
-
constructor(runner:
|
24
|
-
|
25
|
-
|
26
|
-
const { sessionId, topLevelSuite } = options.reporterOptions as ReporterOptions;
|
27
|
-
const testLogger = Logger.getLogger(topLevelSuite);
|
23
|
+
constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
|
24
|
+
const { sessionId, browserName } = options.reporterOptions.creevey;
|
25
|
+
const testLogger = Logger.getLogger(browserName);
|
28
26
|
|
29
27
|
prefix.apply(testLogger, {
|
30
28
|
format(level) {
|
31
|
-
return `${testLevels[level]} => (${
|
29
|
+
return `${testLevels[level]} => (${browserName}:${chalk.gray(sessionId)})`;
|
32
30
|
},
|
33
31
|
});
|
34
32
|
|
35
|
-
runner.on(
|
33
|
+
runner.on(TEST_EVENTS.TEST_BEGIN, (test: FakeTest) => {
|
36
34
|
testLogger.warn(chalk.cyan(test.titlePath().join('/')));
|
37
35
|
});
|
38
|
-
runner.on(
|
36
|
+
runner.on(TEST_EVENTS.TEST_PASS, (test: FakeTest) => {
|
39
37
|
testLogger.info(chalk.cyan(test.titlePath().join('/')));
|
40
38
|
});
|
41
|
-
runner.on(
|
39
|
+
runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error) => {
|
42
40
|
testLogger.error(
|
43
41
|
chalk.cyan(test.titlePath().join('/')),
|
44
42
|
'\n ',
|
45
|
-
getErrors(
|
43
|
+
this.getErrors(
|
46
44
|
error,
|
47
|
-
(error, imageName) => `${chalk.bold(imageName ??
|
45
|
+
(error, imageName) => `${chalk.bold(imageName ?? browserName)}:${error}`,
|
48
46
|
(error) => error.stack ?? error.message,
|
49
47
|
).join('\n '),
|
50
48
|
);
|
51
49
|
});
|
52
50
|
}
|
51
|
+
private getErrors(
|
52
|
+
error: unknown,
|
53
|
+
imageErrorToString: (error: string, imageName?: string) => string,
|
54
|
+
errorToString: (error: Error) => string,
|
55
|
+
): string[] {
|
56
|
+
const errors = [];
|
57
|
+
if (!(error instanceof Error)) {
|
58
|
+
errors.push(error as string);
|
59
|
+
} else if (!isImageError(error)) {
|
60
|
+
errors.push(errorToString(error));
|
61
|
+
} else if (typeof error.images == 'string') {
|
62
|
+
errors.push(imageErrorToString(error.images));
|
63
|
+
} else {
|
64
|
+
const imageErrors = error.images ?? {};
|
65
|
+
Object.keys(imageErrors).forEach((imageName) => {
|
66
|
+
errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
|
67
|
+
});
|
68
|
+
}
|
69
|
+
return errors;
|
70
|
+
}
|
53
71
|
}
|
54
72
|
|
55
|
-
export class TeamcityReporter
|
56
|
-
constructor(runner:
|
57
|
-
|
58
|
-
|
59
|
-
const topLevelSuite = this.escape((options.reporterOptions as ReporterOptions).topLevelSuite);
|
60
|
-
const reporterOptions = options.reporterOptions as ReporterOptions;
|
61
|
-
|
62
|
-
runner.on('suite', (suite) => {
|
63
|
-
if (suite.root) console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`);
|
64
|
-
else console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`);
|
65
|
-
});
|
73
|
+
export class TeamcityReporter {
|
74
|
+
constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
|
75
|
+
const browserName = this.escape(options.reporterOptions.creevey.browserName);
|
76
|
+
const reporterOptions = options.reporterOptions.creevey;
|
66
77
|
|
67
|
-
runner.on(
|
78
|
+
runner.on(TEST_EVENTS.TEST_BEGIN, (test: FakeTest) => {
|
68
79
|
console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`);
|
69
80
|
});
|
70
81
|
|
71
|
-
runner.on(
|
82
|
+
runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error: Error) => {
|
72
83
|
Object.entries(reporterOptions.images).forEach(([name, image]) => {
|
73
84
|
if (!image) return;
|
74
85
|
const filePath = test
|
75
86
|
.titlePath()
|
76
|
-
.concat(name ==
|
87
|
+
.concat(name == browserName ? [] : [browserName])
|
77
88
|
.map(this.escape)
|
78
89
|
.join('/');
|
79
90
|
|
@@ -104,27 +115,6 @@ export class TeamcityReporter extends reporters.Base {
|
|
104
115
|
)}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`,
|
105
116
|
);
|
106
117
|
});
|
107
|
-
|
108
|
-
runner.on('pending', (test) => {
|
109
|
-
console.log(
|
110
|
-
`##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(
|
111
|
-
typeof test.skipReason == 'boolean' ? test.title : test.skipReason,
|
112
|
-
)}' flowId='${process.pid}']`,
|
113
|
-
);
|
114
|
-
});
|
115
|
-
|
116
|
-
runner.on('test end', (test) => {
|
117
|
-
console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`);
|
118
|
-
});
|
119
|
-
|
120
|
-
runner.on('suite end', (suite) => {
|
121
|
-
if (!suite.root)
|
122
|
-
console.log(`##teamcity[testSuiteFinished name='${this.escape(suite.title)}' flowId='${process.pid}']`);
|
123
|
-
});
|
124
|
-
|
125
|
-
runner.on('end', () => {
|
126
|
-
console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`);
|
127
|
-
});
|
128
118
|
}
|
129
119
|
|
130
120
|
private escape = (str: string): string => {
|
@@ -146,25 +136,3 @@ export class TeamcityReporter extends reporters.Base {
|
|
146
136
|
);
|
147
137
|
};
|
148
138
|
}
|
149
|
-
|
150
|
-
function getErrors(
|
151
|
-
error: unknown,
|
152
|
-
imageErrorToString: (error: string, imageName?: string) => string,
|
153
|
-
errorToString: (error: Error) => string,
|
154
|
-
): string[] {
|
155
|
-
const errors = [];
|
156
|
-
if (!(error instanceof Error)) {
|
157
|
-
errors.push(error as string);
|
158
|
-
} else if (!isImageError(error)) {
|
159
|
-
errors.push(errorToString(error));
|
160
|
-
} else if (typeof error.images == 'string') {
|
161
|
-
errors.push(imageErrorToString(error.images));
|
162
|
-
} else {
|
163
|
-
const imageErrors = error.images;
|
164
|
-
Object.keys(imageErrors).forEach((imageName) => {
|
165
|
-
errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
|
166
|
-
});
|
167
|
-
}
|
168
|
-
|
169
|
-
return errors;
|
170
|
-
}
|