Browse Source

️ dependency: remove puppeteer in dependencies (#6204)

* ✂️ dependency:remove puppeteer in dependencies

* fix lint error

* remove catch install

* ️ performance: use detectInstaller package mange

* 📝 docs: add some comment

* finish set test

* Modify the order and increase the search speed

* auto close browser
pull/6255/head
陈帅 6 years ago
committed by GitHub
parent
commit
7b15e84667
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      jest.config.js
  2. 7
      package.json
  3. 24
      src/e2e/baseLayout.e2e.js
  4. 16
      src/e2e/getBrowser.js
  5. 36
      src/e2e/topMenu.e2e.js
  6. 41
      tests/PuppeteerEnvironment.js
  7. 39
      tests/beforeTest.js
  8. 45
      tests/getBrowser.js
  9. 22
      tests/setupTests.js

3
jest.config.js

@ -1,6 +1,7 @@
module.exports = { module.exports = {
testURL: 'http://localhost:8000', testURL: 'http://localhost:8000',
extraSetupFiles: ['./tests/setupTests.js'], testEnvironment: './tests/PuppeteerEnvironment',
verbose: false,
globals: { globals: {
ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false, ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false,
localStorage: null, localStorage: null,

7
package.json

@ -33,6 +33,7 @@
"start:no-ui": "cross-env UMI_UI=none umi dev", "start:no-ui": "cross-env UMI_UI=none umi dev",
"start:pre": "cross-env REACT_APP_ENV=pre umi dev", "start:pre": "cross-env REACT_APP_ENV=pre umi dev",
"start:test": "cross-env REACT_APP_ENV=test MOCK=none umi dev", "start:test": "cross-env REACT_APP_ENV=test MOCK=none umi dev",
"pretest": "node ./tests/beforeTest",
"test": "umi test", "test": "umi test",
"test:all": "node ./tests/run-tests.js", "test:all": "node ./tests/run-tests.js",
"test:component": "umi test ./src/components", "test:component": "umi test ./src/components",
@ -89,9 +90,11 @@
"@umijs/preset-ant-design-pro": "^1.0.1", "@umijs/preset-ant-design-pro": "^1.0.1",
"@umijs/preset-react": "^1.4.8", "@umijs/preset-react": "^1.4.8",
"@umijs/preset-ui": "^2.0.9", "@umijs/preset-ui": "^2.0.9",
"carlo": "^0.9.46",
"chalk": "^3.0.0", "chalk": "^3.0.0",
"cross-env": "^7.0.0", "cross-env": "^7.0.0",
"cross-port-killer": "^1.1.1", "cross-port-killer": "^1.1.1",
"detect-installer": "^1.0.1",
"enzyme": "^3.11.0", "enzyme": "^3.11.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"express": "^4.17.1", "express": "^4.17.1",
@ -102,11 +105,9 @@
"mockjs": "^1.0.1-beta3", "mockjs": "^1.0.1-beta3",
"prettier": "^2.0.1", "prettier": "^2.0.1",
"pro-download": "1.0.1", "pro-download": "1.0.1",
"puppeteer-core": "^2.1.1",
"stylelint": "^13.0.0" "stylelint": "^13.0.0"
}, },
"optionalDependencies": {
"puppeteer": "^2.0.0"
},
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
}, },

24
src/e2e/baseLayout.e2e.js

@ -3,8 +3,6 @@ const RouterConfig = require('../../config/config').default.routes;
const BASE_URL = `http://localhost:${process.env.PORT || 8000}`; const BASE_URL = `http://localhost:${process.env.PORT || 8000}`;
const getBrowser = require('./getBrowser');
function formatter(routes, parentPath = '') { function formatter(routes, parentPath = '') {
const fixedParentPath = parentPath.replace(/\/{1,}/g, '/'); const fixedParentPath = parentPath.replace(/\/{1,}/g, '/');
let result = []; let result = [];
@ -21,15 +19,7 @@ function formatter(routes, parentPath = '') {
return uniq(result.filter((item) => !!item)); return uniq(result.filter((item) => !!item));
} }
let browser;
let page;
beforeAll(async () => {
browser = await getBrowser();
});
beforeEach(async () => { beforeEach(async () => {
page = await browser.newPage();
await page.goto(`${BASE_URL}`); await page.goto(`${BASE_URL}`);
await page.evaluate(() => { await page.evaluate(() => {
localStorage.setItem('antd-pro-authority', '["admin"]'); localStorage.setItem('antd-pro-authority', '["admin"]');
@ -52,8 +42,16 @@ describe('Ant Design Pro E2E test', () => {
routers.forEach((route) => { routers.forEach((route) => {
it(`test pages ${route}`, testPage(route)); it(`test pages ${route}`, testPage(route));
}); });
});
afterAll(() => { it('topmenu should have footer', async () => {
browser.close(); const params = '?navTheme=light&layout=topmenu';
await page.goto(`${BASE_URL}${params}`);
await page.waitForSelector('footer', {
timeout: 2000,
});
const haveFooter = await page.evaluate(
() => document.getElementsByTagName('footer').length > 0,
);
expect(haveFooter).toBeTruthy();
});
}); });

16
src/e2e/getBrowser.js

@ -1,16 +0,0 @@
import puppeteer from 'puppeteer';
const getBrowser = async () => {
const browser = await puppeteer.launch({
args: [
'--disable-gpu',
'--disable-dev-shm-usage',
'--no-first-run',
'--no-zygote',
'--no-sandbox',
],
});
return browser;
};
module.exports = getBrowser;

36
src/e2e/topMenu.e2e.js

@ -1,36 +0,0 @@
const getBrowser = require('./getBrowser');
const BASE_URL = `http://localhost:${process.env.PORT || 8000}`;
let browser;
let page;
beforeAll(async () => {
browser = await getBrowser();
});
beforeEach(async () => {
page = await browser.newPage();
await page.goto(`${BASE_URL}`);
await page.evaluate(() => {
localStorage.setItem('antd-pro-authority', '["admin"]');
});
});
describe('Homepage', () => {
it('topmenu should have footer', async () => {
const params = '?navTheme=light&layout=topmenu';
await page.goto(`${BASE_URL}${params}`);
await page.waitForSelector('footer', {
timeout: 2000,
});
const haveFooter = await page.evaluate(
() => document.getElementsByTagName('footer').length > 0,
);
expect(haveFooter).toBeTruthy();
});
});
afterAll(() => {
browser.close();
});

41
tests/PuppeteerEnvironment.js

@ -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

@ -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();

45
tests/getBrowser.js

@ -0,0 +1,45 @@
/* 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) {
// console.log(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;

22
tests/setupTests.js

@ -1,22 +0,0 @@
import 'jsdom-global/register';
// browserMocks.js
const localStorageMock = (() => {
let store = {};
return {
getItem(key) {
return store[key] || null;
},
setItem(key, value) {
store[key] = value.toString();
},
clear() {
store = {};
},
};
})();
Object.defineProperty(window, 'localStorage', {
value: localStorageMock,
});
Loading…
Cancel
Save