UNPKG

3.89 kBJavaScriptView Raw
1"use strict";
2var __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};
11Object.defineProperty(exports, "__esModule", { value: true });
12exports.puppeteerTest = void 0;
13const node_logger_1 = require("@storybook/node-logger");
14const url_1 = require("./url");
15const config_1 = require("./config");
16exports.puppeteerTest = (customConfig = {}) => {
17 const { storybookUrl, chromeExecutablePath, getGotoOptions, customizePage, getCustomBrowser, testBody, setupTimeout, testTimeout, } = Object.assign(Object.assign({}, config_1.defaultPuppeteerTestConfig), customConfig);
18 let browser; // holds ref to browser. (ie. Chrome)
19 let page; // Hold ref to the page to screenshot.
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 // Skip tests since RN is not a browser environment.
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 // eslint-disable-next-line global-require
66 const puppeteer = require('puppeteer');
67 // add some options "no-sandbox" to make it work properly on some Linux systems as proposed here: https://github.com/Googlechrome/puppeteer/issues/290#issuecomment-322851507
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};