1 | "use strict";
|
2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4 | return new (P || (P = Promise))(function (resolve, reject) {
|
5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9 | });
|
10 | };
|
11 | Object.defineProperty(exports, "__esModule", { value: true });
|
12 | exports.puppeteerTest = void 0;
|
13 | const node_logger_1 = require("@storybook/node-logger");
|
14 | const url_1 = require("./url");
|
15 | const config_1 = require("./config");
|
16 | exports.puppeteerTest = (customConfig = {}) => {
|
17 | const { storybookUrl, chromeExecutablePath, getGotoOptions, customizePage, getCustomBrowser, testBody, setupTimeout, testTimeout, } = Object.assign(Object.assign({}, config_1.defaultPuppeteerTestConfig), customConfig);
|
18 | let browser;
|
19 | let page;
|
20 | const testFn = ({ context }) => __awaiter(void 0, void 0, void 0, function* () {
|
21 | const { kind, framework, name, id } = context;
|
22 | if (framework === 'react-native') {
|
23 |
|
24 | node_logger_1.logger.error("It seems you are running puppeteer test on RN app and it's not supported. Skipping test.");
|
25 | return;
|
26 | }
|
27 | const url = url_1.constructUrl(storybookUrl, id);
|
28 | const options = { context, url };
|
29 | if (testBody.filter != null && !testBody.filter(options)) {
|
30 | return;
|
31 | }
|
32 | if (!browser || !page) {
|
33 | node_logger_1.logger.error(`Error when running puppeteer test for ${kind} - ${name} : It seems the headless browser is not running.`);
|
34 | throw new Error('no-headless-browser-running');
|
35 | }
|
36 | try {
|
37 | yield customizePage(page);
|
38 | yield page.goto(url, getGotoOptions(options));
|
39 | }
|
40 | catch (e) {
|
41 | node_logger_1.logger.error(`Error when connecting to ${url}, did you start or build the storybook first? A storybook instance should be running or a static version should be built when using puppeteer test feature.`);
|
42 | throw e;
|
43 | }
|
44 | yield testBody(page, options);
|
45 | });
|
46 | testFn.timeout = testTimeout;
|
47 | const cleanup = () => __awaiter(void 0, void 0, void 0, function* () {
|
48 | if (getCustomBrowser && page) {
|
49 | yield page.close();
|
50 | }
|
51 | else if (browser) {
|
52 | yield browser.close();
|
53 | }
|
54 | });
|
55 | process.on('SIGINT', () => __awaiter(void 0, void 0, void 0, function* () {
|
56 | yield cleanup();
|
57 | process.exit();
|
58 | }));
|
59 | testFn.afterAll = cleanup;
|
60 | const beforeAll = () => __awaiter(void 0, void 0, void 0, function* () {
|
61 | if (getCustomBrowser) {
|
62 | browser = yield getCustomBrowser();
|
63 | }
|
64 | else {
|
65 |
|
66 | const puppeteer = require('puppeteer');
|
67 |
|
68 | browser = yield puppeteer.launch({
|
69 | args: ['--no-sandbox ', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],
|
70 | executablePath: chromeExecutablePath,
|
71 | });
|
72 | }
|
73 | page = yield browser.newPage();
|
74 | });
|
75 | beforeAll.timeout = setupTimeout;
|
76 | testFn.beforeAll = beforeAll;
|
77 | return testFn;
|
78 | };
|