creevey 0.10.0-beta.4 → 0.10.0-beta.40
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/README.md +19 -41
- package/dist/client/addon/components/Addon.js +17 -7
- 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/Tools.js +17 -7
- package/dist/client/addon/components/Tools.js.map +1 -1
- package/dist/client/addon/withCreevey.d.ts +2 -1
- package/dist/client/addon/withCreevey.js +11 -1
- 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 +17 -7
- package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.js +17 -7
- 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 +17 -7
- 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 +29 -7
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.js +20 -8
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/client/shared/components/ResultsPage.d.ts +1 -1
- package/dist/client/shared/components/ResultsPage.js +43 -13
- package/dist/client/shared/components/ResultsPage.js.map +1 -1
- package/dist/client/shared/creeveyClientApi.js +8 -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.js +42 -14
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +5 -0
- package/dist/client/web/CreeveyContext.js +20 -7
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyLoader.js +2 -2
- package/dist/client/web/CreeveyLoader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.js +19 -9
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +18 -7
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +60 -7
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +17 -7
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +18 -10
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +18 -10
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
- package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
- package/dist/client/web/KeyboardEventsContext.js +79 -64
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/index-B0Xv0lOY.js +802 -0
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +17 -7
- 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.js +16 -9
- package/dist/creevey.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/server/config.d.ts +1 -1
- package/dist/server/config.js +27 -5
- 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 +56 -32
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.js +64 -11
- package/dist/server/index.js.map +1 -1
- package/dist/server/logger.d.ts +2 -1
- package/dist/server/logger.js +7 -3
- package/dist/server/logger.js.map +1 -1
- package/dist/server/master/api.js +1 -1
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/pool.d.ts +4 -3
- package/dist/server/master/pool.js +13 -66
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/queue.d.ts +13 -0
- package/dist/server/master/queue.js +71 -0
- package/dist/server/master/queue.js.map +1 -0
- package/dist/server/master/runner.d.ts +3 -0
- package/dist/server/master/runner.js +76 -10
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.js +1 -1
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.js +13 -11
- package/dist/server/master/start.js.map +1 -1
- package/dist/server/playwright/docker-file.d.ts +1 -1
- package/dist/server/playwright/docker-file.js +15 -6
- 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 +6 -6
- package/dist/server/playwright/internal.js +143 -91
- package/dist/server/playwright/internal.js.map +1 -1
- package/dist/server/playwright/webdriver.d.ts +1 -1
- package/dist/server/playwright/webdriver.js +5 -8
- package/dist/server/playwright/webdriver.js.map +1 -1
- package/dist/server/providers/browser.js +6 -4
- package/dist/server/providers/browser.js.map +1 -1
- package/dist/server/providers/hybrid.js +1 -1
- package/dist/server/providers/hybrid.js.map +1 -1
- package/dist/server/reporter.d.ts +4 -19
- package/dist/server/reporter.js +30 -21
- package/dist/server/reporter.js.map +1 -1
- package/dist/server/selenium/internal.d.ts +3 -4
- package/dist/server/selenium/internal.js +127 -108
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +8 -6
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/selenium/webdriver.d.ts +1 -1
- package/dist/server/selenium/webdriver.js +5 -9
- package/dist/server/selenium/webdriver.js.map +1 -1
- package/dist/server/telemetry.js +2 -2
- package/dist/server/testsFiles/parser.js +45 -5
- package/dist/server/testsFiles/parser.js.map +1 -1
- package/dist/server/utils.d.ts +19 -1
- package/dist/server/utils.js +87 -8
- package/dist/server/utils.js.map +1 -1
- package/dist/server/webdriver.d.ts +5 -4
- package/dist/server/webdriver.js +23 -10
- package/dist/server/webdriver.js.map +1 -1
- package/dist/server/worker/chai-image.d.ts +1 -2
- package/dist/server/worker/chai-image.js +4 -3
- package/dist/server/worker/chai-image.js.map +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 +4 -4
- package/dist/server/worker/match-image.js +7 -4
- package/dist/server/worker/match-image.js.map +1 -1
- package/dist/server/worker/start.js +45 -73
- package/dist/server/worker/start.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/types.d.ts +40 -8
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/docs/cli.md +12 -0
- package/docs/config.md +179 -165
- package/docs/storybook.md +60 -0
- package/docs/tests.md +50 -45
- package/package.json +64 -63
- package/src/client/addon/components/Panel.tsx +2 -2
- package/src/client/addon/withCreevey.ts +10 -2
- package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
- package/src/client/shared/components/PageHeader/PageHeader.tsx +4 -2
- package/src/client/shared/components/ResultsPage.tsx +31 -8
- package/src/client/shared/creeveyClientApi.ts +9 -1
- package/src/client/shared/helpers.ts +4 -24
- package/src/client/web/CreeveyApp.tsx +27 -8
- package/src/client/web/CreeveyContext.tsx +9 -0
- package/src/client/web/CreeveyLoader.tsx +1 -1
- package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +1 -0
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
- package/src/client/web/KeyboardEventsContext.tsx +61 -73
- package/src/client/web/themes.ts +24 -0
- package/src/creevey.ts +16 -10
- package/src/server/config.ts +28 -6
- package/src/server/connection.ts +26 -0
- package/src/server/docker.ts +63 -34
- package/src/server/index.ts +72 -14
- package/src/server/logger.ts +6 -2
- package/src/server/master/api.ts +1 -1
- package/src/server/master/pool.ts +23 -59
- package/src/server/master/queue.ts +77 -0
- package/src/server/master/runner.ts +94 -10
- package/src/server/master/server.ts +1 -1
- package/src/server/master/start.ts +16 -11
- package/src/server/playwright/docker-file.ts +18 -6
- package/src/server/playwright/docker.ts +16 -3
- package/src/server/playwright/index-source.mjs +16 -0
- package/src/server/playwright/internal.ts +182 -111
- package/src/server/playwright/webdriver.ts +6 -9
- package/src/server/providers/browser.ts +6 -4
- package/src/server/providers/hybrid.ts +1 -1
- package/src/server/reporter.ts +37 -34
- package/src/server/selenium/internal.ts +131 -116
- package/src/server/selenium/selenoid.ts +8 -6
- package/src/server/selenium/webdriver.ts +6 -10
- package/src/server/telemetry.ts +2 -2
- package/src/server/testsFiles/parser.ts +52 -4
- package/src/server/utils.ts +97 -9
- package/src/server/webdriver.ts +24 -16
- package/src/server/worker/chai-image.ts +4 -4
- package/src/server/worker/context.ts +14 -0
- package/src/server/worker/match-image.ts +12 -8
- package/src/server/worker/start.ts +49 -86
- package/src/shared/index.ts +1 -1
- package/src/types.ts +44 -8
- package/types/global.d.ts +1 -0
- package/.yarnrc.yml +0 -1
- package/chromatic.config.json +0 -5
- package/dist/client/web/assets/index-DkmZfG9C.js +0 -591
@@ -1,18 +1,12 @@
|
|
1
1
|
import chai from 'chai';
|
2
|
-
import chalk from 'chalk';
|
3
|
-
import Logger from 'loglevel';
|
4
|
-
import EventEmitter from 'events';
|
5
2
|
import {
|
6
3
|
BaseCreeveyTestContext,
|
7
4
|
Config,
|
8
5
|
CreeveyWebdriver,
|
9
|
-
FakeSuite,
|
10
|
-
FakeTest,
|
11
|
-
Images,
|
12
6
|
Options,
|
13
7
|
ServerTest,
|
14
|
-
TEST_EVENTS,
|
15
8
|
TestMessage,
|
9
|
+
TestResult,
|
16
10
|
isDefined,
|
17
11
|
isImageError,
|
18
12
|
} from '../../types.js';
|
@@ -47,9 +41,10 @@ async function getTestsFromStories(
|
|
47
41
|
return testsById;
|
48
42
|
}
|
49
43
|
|
50
|
-
function runHandler(browserName: string,
|
44
|
+
function runHandler(browserName: string, result: Omit<TestResult, 'status'>, error?: unknown): void {
|
51
45
|
// TODO How handle browser corruption?
|
52
|
-
|
46
|
+
const { images } = result;
|
47
|
+
if (images != null && isImageError(error)) {
|
53
48
|
if (typeof error.images == 'string') {
|
54
49
|
const image = images[browserName];
|
55
50
|
if (image) image.error = error.images;
|
@@ -62,31 +57,37 @@ function runHandler(browserName: string, images: Partial<Record<string, Images>>
|
|
62
57
|
}
|
63
58
|
}
|
64
59
|
|
65
|
-
if (error || Object.values(images).some((image) => image?.error != null)) {
|
66
|
-
|
60
|
+
if (error || (images != null && Object.values(images).some((image) => image?.error != null))) {
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
62
|
+
const errorMessage = result.error!;
|
67
63
|
|
68
64
|
const isUnexpectedError =
|
69
65
|
hasTimeout(errorMessage) ||
|
70
66
|
hasDisconnected(errorMessage) ||
|
71
|
-
Object.values(images).some((image) => hasTimeout(image?.error));
|
67
|
+
(images != null && Object.values(images).some((image) => hasTimeout(image?.error)));
|
72
68
|
if (isUnexpectedError) emitWorkerMessage({ type: 'error', payload: { subtype: 'unknown', error: errorMessage } });
|
73
69
|
else
|
74
70
|
emitTestMessage({
|
75
71
|
type: 'end',
|
76
72
|
payload: {
|
77
73
|
status: 'failed',
|
78
|
-
|
79
|
-
error: errorMessage,
|
74
|
+
...result,
|
80
75
|
},
|
81
76
|
});
|
82
77
|
} else {
|
83
|
-
emitTestMessage({
|
78
|
+
emitTestMessage({
|
79
|
+
type: 'end',
|
80
|
+
payload: {
|
81
|
+
status: 'success',
|
82
|
+
...result,
|
83
|
+
},
|
84
|
+
});
|
84
85
|
}
|
85
86
|
}
|
86
87
|
|
87
88
|
async function setupWebdriver(webdriver: CreeveyWebdriver): Promise<[string, CreeveyWebdriver] | undefined> {
|
88
89
|
if ((await webdriver.openBrowser(true)) == null) {
|
89
|
-
logger.error('Failed to start browser');
|
90
|
+
logger().error('Failed to start browser');
|
90
91
|
emitWorkerMessage({
|
91
92
|
type: 'error',
|
92
93
|
payload: { subtype: 'browser', error: 'Failed to start browser' },
|
@@ -114,7 +115,6 @@ function hasTimeout(str: string | null | undefined): boolean {
|
|
114
115
|
}
|
115
116
|
|
116
117
|
export async function start(browser: string, gridUrl: string, config: Config, options: Options): Promise<void> {
|
117
|
-
let retries = 0;
|
118
118
|
const imagesContext: ImageContext = {
|
119
119
|
attachments: [],
|
120
120
|
testFullPath: [],
|
@@ -125,38 +125,16 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
125
125
|
|
126
126
|
if (!webdriver || !sessionId) return;
|
127
127
|
|
128
|
-
const workerLogger = Logger.getLogger(`${browser}:${chalk.gray(sessionId)}`);
|
129
|
-
|
130
|
-
const reporterOptions = {
|
131
|
-
...config.reporterOptions,
|
132
|
-
creevey: {
|
133
|
-
sessionId,
|
134
|
-
reportDir: config.reportDir,
|
135
|
-
browserName: browser,
|
136
|
-
get willRetry() {
|
137
|
-
return retries < config.maxRetries;
|
138
|
-
},
|
139
|
-
get images() {
|
140
|
-
return imagesContext.images;
|
141
|
-
},
|
142
|
-
},
|
143
|
-
};
|
144
|
-
|
145
|
-
class FakeRunner extends EventEmitter {}
|
146
|
-
const runner = new FakeRunner();
|
147
|
-
const Reporter = config.reporter;
|
148
|
-
new Reporter(runner, { reporterOptions });
|
149
|
-
|
150
128
|
const { matchImage, matchImages } = options.odiff
|
151
129
|
? getOdiffMatchers(imagesContext, config)
|
152
130
|
: await getMatchers(imagesContext, config);
|
153
|
-
chai.use(chaiImage(matchImage, matchImages
|
131
|
+
chai.use(chaiImage(matchImage, matchImages));
|
154
132
|
|
155
133
|
const tests = await (async () => {
|
156
134
|
try {
|
157
135
|
return await getTestsFromStories(config, browser, webdriver);
|
158
136
|
} catch (error) {
|
159
|
-
|
137
|
+
logger().error('Failed to get tests from stories:', error);
|
160
138
|
emitWorkerMessage({
|
161
139
|
type: 'error',
|
162
140
|
payload: { subtype: 'browser', error: serializeError(error) },
|
@@ -174,7 +152,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
174
152
|
|
175
153
|
if (!test) {
|
176
154
|
const error = `Test with id ${message.payload.id} not found`;
|
177
|
-
|
155
|
+
logger().error(error);
|
178
156
|
emitWorkerMessage({
|
179
157
|
type: 'error',
|
180
158
|
payload: { subtype: 'test', error },
|
@@ -200,68 +178,53 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
200
178
|
imagesContext.testFullPath = getTestPath(test);
|
201
179
|
imagesContext.images = {};
|
202
180
|
|
203
|
-
retries = message.payload.retries;
|
204
181
|
let error = undefined;
|
205
182
|
|
206
|
-
const fakeSuite: FakeSuite = {
|
207
|
-
title: test.storyPath.slice(0, -1).join('/'),
|
208
|
-
fullTitle: () => fakeSuite.title,
|
209
|
-
titlePath: () => [fakeSuite.title],
|
210
|
-
tests: [],
|
211
|
-
};
|
212
|
-
|
213
|
-
const fakeTest: FakeTest = {
|
214
|
-
parent: fakeSuite,
|
215
|
-
title: [test.story.name, test.testName, test.browser].filter(isDefined).join('/'),
|
216
|
-
fullTitle: () => getTestPath(test).join('/'),
|
217
|
-
titlePath: () => getTestPath(test),
|
218
|
-
currentRetry: () => retries,
|
219
|
-
retires: () => config.maxRetries,
|
220
|
-
slow: () => 1000,
|
221
|
-
};
|
222
|
-
|
223
|
-
fakeSuite.tests.push(fakeTest);
|
224
|
-
|
225
183
|
void (async () => {
|
226
|
-
|
227
|
-
|
228
|
-
|
184
|
+
let timeout;
|
185
|
+
let isRejected = false;
|
229
186
|
const start = Date.now();
|
230
187
|
try {
|
231
188
|
await Promise.race([
|
232
|
-
new Promise(
|
233
|
-
|
234
|
-
|
235
|
-
|
189
|
+
new Promise(
|
190
|
+
(_, reject) =>
|
191
|
+
(timeout = setTimeout(() => {
|
192
|
+
isRejected = true;
|
193
|
+
reject(new Error(`Timeout of ${config.testTimeout}ms exceeded`));
|
194
|
+
}, config.testTimeout)),
|
236
195
|
),
|
237
196
|
(async () => {
|
238
|
-
const context = await webdriver.switchStory(test.story, baseContext
|
197
|
+
const context = await webdriver.switchStory(test.story, baseContext);
|
239
198
|
await test.fn(context);
|
240
199
|
})(),
|
241
200
|
]);
|
242
201
|
} catch (testError) {
|
243
202
|
error = testError;
|
244
|
-
fakeTest.err = error;
|
245
203
|
}
|
246
204
|
const duration = Date.now() - start;
|
247
|
-
|
248
|
-
fakeTest.state = error ? 'failed' : 'passed';
|
249
|
-
fakeTest.duration = duration;
|
250
|
-
fakeTest.speed = duration > fakeTest.slow() ? 'slow' : duration / 2 > fakeTest.slow() ? 'medium' : 'fast';
|
251
|
-
|
252
|
-
if (error) {
|
253
|
-
runner.emit(TEST_EVENTS.TEST_FAIL, fakeTest, error);
|
254
|
-
} else {
|
255
|
-
runner.emit(TEST_EVENTS.TEST_PASS, fakeTest);
|
256
|
-
}
|
257
|
-
runner.emit(TEST_EVENTS.TEST_END, fakeTest);
|
258
|
-
runner.emit(TEST_EVENTS.RUN_END);
|
205
|
+
clearTimeout(timeout);
|
259
206
|
|
260
207
|
await webdriver.afterTest(test);
|
261
208
|
|
262
|
-
|
209
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
210
|
+
if (isRejected) {
|
211
|
+
emitWorkerMessage({
|
212
|
+
type: 'error',
|
213
|
+
payload: { subtype: 'unknown', error: serializeError(error) },
|
214
|
+
});
|
215
|
+
} else {
|
216
|
+
const result = {
|
217
|
+
sessionId,
|
218
|
+
images: imagesContext.images,
|
219
|
+
error: serializeError(error),
|
220
|
+
duration,
|
221
|
+
attachments: imagesContext.attachments,
|
222
|
+
retries: message.payload.retries,
|
223
|
+
};
|
224
|
+
runHandler(baseContext.browserName, result, error);
|
225
|
+
}
|
263
226
|
})().catch((error: unknown) => {
|
264
|
-
|
227
|
+
logger().error('Unexpected error:', error);
|
265
228
|
emitWorkerMessage({
|
266
229
|
type: 'error',
|
267
230
|
payload: { subtype: 'test', error: serializeError(error) },
|
@@ -269,7 +232,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
269
232
|
});
|
270
233
|
});
|
271
234
|
|
272
|
-
|
235
|
+
logger().info('Browser is ready');
|
273
236
|
|
274
237
|
emitWorkerMessage({ type: 'ready' });
|
275
238
|
}
|
package/src/shared/index.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import _ from 'lodash';
|
2
|
-
import { Parameters } from '@storybook/
|
2
|
+
import type { Parameters } from '@storybook/types';
|
3
3
|
import { SetStoriesData, StoriesRaw, CreeveyStoryParams, StoryInput } from '../types.js';
|
4
4
|
import { deserializeRegExp, isSerializedRegExp, isRegExp, serializeRegExp } from './serializeRegExp.js';
|
5
5
|
|
package/src/types.ts
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
import type { StoryContextForEnhancers, DecoratorFunction } from '@storybook/
|
1
|
+
import type { StoryContextForEnhancers, DecoratorFunction } from '@storybook/types';
|
2
2
|
import type { Worker as ClusterWorker } from 'cluster';
|
3
3
|
import type Pixelmatch from 'pixelmatch';
|
4
4
|
import type { ODiffOptions } from 'odiff-bin';
|
5
5
|
import type { expect } from 'chai';
|
6
6
|
import type EventEmitter from 'events';
|
7
|
-
import type
|
8
|
-
import { LaunchOptions } from 'playwright-core';
|
7
|
+
import type { LaunchOptions } from 'playwright-core';
|
9
8
|
// import type { Browser } from 'playwright-core';
|
10
9
|
|
11
10
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
@@ -103,6 +102,7 @@ export class ChromeConfig {
|
|
103
102
|
}
|
104
103
|
*/
|
105
104
|
export interface BrowserConfigObject {
|
105
|
+
// TODO Restrict browser names for playwright images
|
106
106
|
browserName: string;
|
107
107
|
// customizeBuilder?: (builder: Builder) => Builder;
|
108
108
|
limit?: number;
|
@@ -145,7 +145,13 @@ export interface BrowserConfigObject {
|
|
145
145
|
[name: string]: unknown;
|
146
146
|
};
|
147
147
|
|
148
|
-
playwrightOptions?: Omit<LaunchOptions, 'logger'
|
148
|
+
playwrightOptions?: Omit<LaunchOptions, 'logger'> & {
|
149
|
+
trace?: {
|
150
|
+
screenshots?: boolean;
|
151
|
+
snapshots?: boolean;
|
152
|
+
sources?: boolean;
|
153
|
+
};
|
154
|
+
};
|
149
155
|
}
|
150
156
|
|
151
157
|
export type StorybookGlobals = Record<string, unknown>;
|
@@ -164,7 +170,7 @@ export interface CreeveyWebdriver {
|
|
164
170
|
openBrowser(fresh?: boolean): Promise<CreeveyWebdriver | null>;
|
165
171
|
closeBrowser(): Promise<void>;
|
166
172
|
loadStoriesFromBrowser(): Promise<StoriesRaw>;
|
167
|
-
switchStory(story: StoryInput, context: BaseCreeveyTestContext
|
173
|
+
switchStory(story: StoryInput, context: BaseCreeveyTestContext): Promise<CreeveyTestContext>;
|
168
174
|
afterTest(test: ServerTest): Promise<void>;
|
169
175
|
}
|
170
176
|
|
@@ -200,6 +206,11 @@ export interface Config {
|
|
200
206
|
* Url where storybook hosted on
|
201
207
|
*/
|
202
208
|
resolveStorybookUrl?: () => Promise<string>;
|
209
|
+
/**
|
210
|
+
* Command to automatically start Storybook if it is not running.
|
211
|
+
* For example, `npm run storybook`, `yarn run storybook` etc.
|
212
|
+
*/
|
213
|
+
storybookAutorunCmd?: string;
|
203
214
|
/**
|
204
215
|
* Absolute path to directory with reference images
|
205
216
|
* @default path.join(process.cwd(), './images')
|
@@ -307,6 +318,11 @@ export interface Config {
|
|
307
318
|
* The `--ui` CLI option ignores this option
|
308
319
|
*/
|
309
320
|
failFast: boolean;
|
321
|
+
/**
|
322
|
+
* Start workers in sequential queue
|
323
|
+
* @default false
|
324
|
+
*/
|
325
|
+
useWorkerQueue: boolean;
|
310
326
|
/**
|
311
327
|
* Specify platform for docker images
|
312
328
|
*/
|
@@ -348,9 +364,13 @@ export interface Options {
|
|
348
364
|
screenDir?: string;
|
349
365
|
reportDir?: string;
|
350
366
|
gridUrl?: string;
|
367
|
+
storybookStart?: boolean | string;
|
351
368
|
storybookUrl?: string;
|
369
|
+
storybookPort?: string;
|
370
|
+
storybookAutorunCmd?: string;
|
352
371
|
failFast?: boolean;
|
353
372
|
odiff?: boolean;
|
373
|
+
noDocker?: boolean;
|
354
374
|
}
|
355
375
|
|
356
376
|
export type WorkerError = 'browser' | 'test' | 'unknown';
|
@@ -399,10 +419,15 @@ export type TestStatus = 'unknown' | 'pending' | 'running' | 'failed' | 'approve
|
|
399
419
|
|
400
420
|
export interface TestResult {
|
401
421
|
status: 'failed' | 'success';
|
422
|
+
retries: number;
|
402
423
|
// TODO Remove checks `name == browser` in TestResultsView
|
403
424
|
// images?: Partial<{ [name: string]: Images }> | Images;
|
404
425
|
images?: Partial<Record<string, Images>>;
|
405
426
|
error?: string;
|
427
|
+
// Test metadata for reporting
|
428
|
+
duration?: number;
|
429
|
+
attachments?: string[];
|
430
|
+
sessionId?: string;
|
406
431
|
}
|
407
432
|
|
408
433
|
export class ImagesError extends Error {
|
@@ -437,8 +462,8 @@ export interface BaseCreeveyTestContext {
|
|
437
462
|
* @internal
|
438
463
|
*/
|
439
464
|
screenshots: { imageName?: string; screenshot: Buffer }[];
|
440
|
-
matchImage: (image: Buffer, imageName?: string) => Promise<void>;
|
441
|
-
matchImages: (images: Record<string, Buffer>) => Promise<void>;
|
465
|
+
matchImage: (image: Buffer | string, imageName?: string) => Promise<void>;
|
466
|
+
matchImages: (images: Record<string, Buffer | string>) => Promise<void>;
|
442
467
|
}
|
443
468
|
|
444
469
|
export interface CreeveyTestContext extends BaseCreeveyTestContext {
|
@@ -450,6 +475,8 @@ export interface CreeveyTestContext extends BaseCreeveyTestContext {
|
|
450
475
|
export enum TEST_EVENTS {
|
451
476
|
RUN_BEGIN = 'start',
|
452
477
|
RUN_END = 'end',
|
478
|
+
SUITE_BEGIN = 'suite',
|
479
|
+
SUITE_END = 'suite end',
|
453
480
|
TEST_BEGIN = 'test',
|
454
481
|
TEST_END = 'test end',
|
455
482
|
TEST_FAIL = 'fail',
|
@@ -474,7 +501,7 @@ export interface FakeTest {
|
|
474
501
|
title: string;
|
475
502
|
fullTitle: () => string;
|
476
503
|
titlePath: () => string[];
|
477
|
-
currentRetry: () => number;
|
504
|
+
currentRetry: () => number | undefined;
|
478
505
|
retires: () => number;
|
479
506
|
slow: () => number;
|
480
507
|
duration?: number;
|
@@ -484,6 +511,15 @@ export interface FakeTest {
|
|
484
511
|
err?: unknown;
|
485
512
|
// NOTE: image files
|
486
513
|
attachments?: string[];
|
514
|
+
|
515
|
+
// NOTE: Creevey specific fields
|
516
|
+
creevey: {
|
517
|
+
reportDir: string;
|
518
|
+
sessionId: string;
|
519
|
+
browserName: string;
|
520
|
+
willRetry: boolean;
|
521
|
+
images: Partial<Record<string, Partial<Images>>>;
|
522
|
+
};
|
487
523
|
}
|
488
524
|
|
489
525
|
export interface CreeveyStatus {
|
package/types/global.d.ts
CHANGED
package/.yarnrc.yml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
nodeLinker: node-modules
|