From 7b15e84667d1546369f3b1b7c97b17020fdd2c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=B8=85?= Date: Mon, 30 Mar 2020 14:41:51 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20dependency:=20remove=20pup?= =?UTF-8?q?peteer=20in=20dependencies=20(#6204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✂️ 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 --- jest.config.js | 3 ++- package.json | 7 +++--- src/e2e/baseLayout.e2e.js | 24 +++++++++---------- src/e2e/getBrowser.js | 16 ------------- src/e2e/topMenu.e2e.js | 36 ---------------------------- tests/PuppeteerEnvironment.js | 41 +++++++++++++++++++++++++++++++ tests/beforeTest.js | 39 ++++++++++++++++++++++++++++++ tests/getBrowser.js | 45 +++++++++++++++++++++++++++++++++++ tests/setupTests.js | 22 ----------------- 9 files changed, 142 insertions(+), 91 deletions(-) delete mode 100644 src/e2e/getBrowser.js delete mode 100644 src/e2e/topMenu.e2e.js create mode 100644 tests/PuppeteerEnvironment.js create mode 100644 tests/beforeTest.js create mode 100644 tests/getBrowser.js delete mode 100644 tests/setupTests.js diff --git a/jest.config.js b/jest.config.js index c82d7f10..4c4eeaf7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,7 @@ module.exports = { testURL: 'http://localhost:8000', - extraSetupFiles: ['./tests/setupTests.js'], + testEnvironment: './tests/PuppeteerEnvironment', + verbose: false, globals: { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false, localStorage: null, diff --git a/package.json b/package.json index 09ba791b..befb7f62 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "start:no-ui": "cross-env UMI_UI=none umi dev", "start:pre": "cross-env REACT_APP_ENV=pre umi dev", "start:test": "cross-env REACT_APP_ENV=test MOCK=none umi dev", + "pretest": "node ./tests/beforeTest", "test": "umi test", "test:all": "node ./tests/run-tests.js", "test:component": "umi test ./src/components", @@ -89,9 +90,11 @@ "@umijs/preset-ant-design-pro": "^1.0.1", "@umijs/preset-react": "^1.4.8", "@umijs/preset-ui": "^2.0.9", + "carlo": "^0.9.46", "chalk": "^3.0.0", "cross-env": "^7.0.0", "cross-port-killer": "^1.1.1", + "detect-installer": "^1.0.1", "enzyme": "^3.11.0", "eslint": "^6.8.0", "express": "^4.17.1", @@ -102,11 +105,9 @@ "mockjs": "^1.0.1-beta3", "prettier": "^2.0.1", "pro-download": "1.0.1", + "puppeteer-core": "^2.1.1", "stylelint": "^13.0.0" }, - "optionalDependencies": { - "puppeteer": "^2.0.0" - }, "engines": { "node": ">=10.0.0" }, diff --git a/src/e2e/baseLayout.e2e.js b/src/e2e/baseLayout.e2e.js index e8a79354..f328adac 100644 --- a/src/e2e/baseLayout.e2e.js +++ b/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 getBrowser = require('./getBrowser'); - function formatter(routes, parentPath = '') { const fixedParentPath = parentPath.replace(/\/{1,}/g, '/'); let result = []; @@ -21,15 +19,7 @@ function formatter(routes, parentPath = '') { return uniq(result.filter((item) => !!item)); } -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"]'); @@ -52,8 +42,16 @@ describe('Ant Design Pro E2E test', () => { routers.forEach((route) => { it(`test pages ${route}`, testPage(route)); }); -}); -afterAll(() => { - browser.close(); + 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(); + }); }); diff --git a/src/e2e/getBrowser.js b/src/e2e/getBrowser.js deleted file mode 100644 index f6eb1f41..00000000 --- a/src/e2e/getBrowser.js +++ /dev/null @@ -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; diff --git a/src/e2e/topMenu.e2e.js b/src/e2e/topMenu.e2e.js deleted file mode 100644 index fe5b472c..00000000 --- a/src/e2e/topMenu.e2e.js +++ /dev/null @@ -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(); -}); diff --git a/tests/PuppeteerEnvironment.js b/tests/PuppeteerEnvironment.js new file mode 100644 index 00000000..13409be1 --- /dev/null +++ b/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; diff --git a/tests/beforeTest.js b/tests/beforeTest.js new file mode 100644 index 00000000..93022394 --- /dev/null +++ b/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(); diff --git a/tests/getBrowser.js b/tests/getBrowser.js new file mode 100644 index 00000000..3b4ef331 --- /dev/null +++ b/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; diff --git a/tests/setupTests.js b/tests/setupTests.js deleted file mode 100644 index 30e7dd12..00000000 --- a/tests/setupTests.js +++ /dev/null @@ -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, -});