Initial commit
This commit is contained in:
41
tests/PuppeteerEnvironment.js
Normal file
41
tests/PuppeteerEnvironment.js
Normal file
@ -0,0 +1,41 @@
|
||||
// eslint-disable-next-line
|
||||
const NodeEnvironment = require('jest-environment-node');
|
||||
const getBrowser = require('./getBrowser');
|
||||
|
||||
class PuppeteerEnvironment extends NodeEnvironment {
|
||||
// Jest is not available here, so we have to reverse engineer
|
||||
// the setTimeout function, see https://github.com/facebook/jest/blob/v23.1.0/packages/jest-runtime/src/index.js#L823
|
||||
setTimeout(timeout) {
|
||||
if (this.global.jasmine) {
|
||||
// eslint-disable-next-line no-underscore-dangle
|
||||
this.global.jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout;
|
||||
} else {
|
||||
this.global[Symbol.for('TEST_TIMEOUT_SYMBOL')] = timeout;
|
||||
}
|
||||
}
|
||||
|
||||
async setup() {
|
||||
const browser = await getBrowser();
|
||||
const page = await browser.newPage();
|
||||
this.global.browser = browser;
|
||||
this.global.page = page;
|
||||
}
|
||||
|
||||
async teardown() {
|
||||
const { page, browser } = this.global;
|
||||
|
||||
if (page) {
|
||||
await page.close();
|
||||
}
|
||||
|
||||
if (browser) {
|
||||
await browser.disconnect();
|
||||
}
|
||||
|
||||
if (browser) {
|
||||
await browser.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = PuppeteerEnvironment;
|
39
tests/beforeTest.js
Normal file
39
tests/beforeTest.js
Normal file
@ -0,0 +1,39 @@
|
||||
/* eslint-disable global-require */
|
||||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
const { execSync } = require('child_process');
|
||||
const { join } = require('path');
|
||||
const findChrome = require('carlo/lib/find_chrome');
|
||||
const detectInstaller = require('detect-installer');
|
||||
|
||||
const installPuppeteer = () => {
|
||||
// find can use package manger
|
||||
const packages = detectInstaller(join(__dirname, '../../'));
|
||||
// get installed package manger
|
||||
const packageName = packages.find(detectInstaller.hasPackageCommand) || 'npm';
|
||||
console.log(`🤖 will use ${packageName} install puppeteer`);
|
||||
const command = `${packageName} ${packageName.includes('yarn') ? 'add' : 'i'} puppeteer`;
|
||||
execSync(command, {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
};
|
||||
|
||||
const initPuppeteer = async () => {
|
||||
try {
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
const findChromePath = await findChrome({});
|
||||
const { executablePath } = findChromePath;
|
||||
console.log(`🧲 find you browser in ${executablePath}`);
|
||||
return;
|
||||
} catch (error) {
|
||||
console.log('🧲 no find chrome');
|
||||
}
|
||||
|
||||
try {
|
||||
require.resolve('puppeteer');
|
||||
} catch (error) {
|
||||
// need install puppeteer
|
||||
await installPuppeteer();
|
||||
}
|
||||
};
|
||||
|
||||
initPuppeteer();
|
44
tests/getBrowser.js
Normal file
44
tests/getBrowser.js
Normal file
@ -0,0 +1,44 @@
|
||||
/* eslint-disable global-require */
|
||||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
const findChrome = require('carlo/lib/find_chrome');
|
||||
|
||||
const getBrowser = async () => {
|
||||
try {
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
const puppeteer = require('puppeteer');
|
||||
const browser = await puppeteer.launch({
|
||||
args: [
|
||||
'--disable-gpu',
|
||||
'--disable-dev-shm-usage',
|
||||
'--no-first-run',
|
||||
'--no-zygote',
|
||||
'--no-sandbox',
|
||||
],
|
||||
});
|
||||
return browser;
|
||||
} catch (error) {
|
||||
}
|
||||
|
||||
try {
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
const puppeteer = require('puppeteer-core');
|
||||
const findChromePath = await findChrome({});
|
||||
const { executablePath } = findChromePath;
|
||||
const browser = await puppeteer.launch({
|
||||
executablePath,
|
||||
args: [
|
||||
'--disable-gpu',
|
||||
'--disable-dev-shm-usage',
|
||||
'--no-first-run',
|
||||
'--no-zygote',
|
||||
'--no-sandbox',
|
||||
],
|
||||
});
|
||||
return browser;
|
||||
} catch (error) {
|
||||
console.log('🧲 no find chrome');
|
||||
}
|
||||
throw new Error('no find puppeteer');
|
||||
};
|
||||
|
||||
module.exports = getBrowser;
|
52
tests/run-tests.js
Normal file
52
tests/run-tests.js
Normal file
@ -0,0 +1,52 @@
|
||||
/* eslint-disable eslint-comments/disable-enable-pair */
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
/* eslint-disable eslint-comments/no-unlimited-disable */
|
||||
const { spawn } = require('child_process');
|
||||
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||
const { kill } = require('cross-port-killer');
|
||||
|
||||
const env = Object.create(process.env);
|
||||
env.BROWSER = 'none';
|
||||
env.TEST = true;
|
||||
env.UMI_UI = 'none';
|
||||
env.PROGRESS = 'none';
|
||||
// flag to prevent multiple test
|
||||
let once = false;
|
||||
|
||||
const startServer = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['start'], {
|
||||
env,
|
||||
});
|
||||
|
||||
startServer.stderr.on('data', (data) => {
|
||||
// eslint-disable-next-line
|
||||
console.log(data.toString());
|
||||
});
|
||||
|
||||
startServer.on('exit', () => {
|
||||
kill(process.env.PORT || 8000);
|
||||
});
|
||||
|
||||
console.log('Starting development server for e2e tests...');
|
||||
startServer.stdout.on('data', (data) => {
|
||||
console.log(data.toString());
|
||||
// hack code , wait umi
|
||||
if (
|
||||
(!once && data.toString().indexOf('Compiled successfully') >= 0) ||
|
||||
data.toString().indexOf('Theme generated successfully') >= 0
|
||||
) {
|
||||
// eslint-disable-next-line
|
||||
once = true;
|
||||
console.log('Development server is started, ready to run tests.');
|
||||
const testCmd = spawn(
|
||||
/^win/.test(process.platform) ? 'npm.cmd' : 'npm',
|
||||
['test', '--', '--maxWorkers=1', '--runInBand'],
|
||||
{
|
||||
stdio: 'inherit',
|
||||
},
|
||||
);
|
||||
testCmd.on('exit', (code) => {
|
||||
startServer.kill();
|
||||
process.exit(code);
|
||||
});
|
||||
}
|
||||
});
|
Reference in New Issue
Block a user