diff --git a/test/basic-custom-app-store.test.ts b/test/basic-custom-app-store.test.ts index 4e63202d0..9cb02c439 100644 --- a/test/basic-custom-app-store.test.ts +++ b/test/basic-custom-app-store.test.ts @@ -10,9 +10,13 @@ buildFixture(example); test('open /', async () => { const res = await setupBrowser({ example }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$$text('h2')).toStrictEqual(['Header', 'HOME']); expect(await page.$$text('div>span')).toStrictEqual(['0']); await page.click('button'); expect(await page.$$text('div>span')).toStrictEqual(['1']); -}) +}); + +afterAll(async () => { + await browser.close(); +}); diff --git a/test/basic-mpa.test.ts b/test/basic-mpa.test.ts index 6696180eb..a9aa72d5e 100644 --- a/test/basic-mpa.test.ts +++ b/test/basic-mpa.test.ts @@ -11,20 +11,24 @@ buildFixture(example); test('open /dashboard', async () => { const res = await setupBrowser({ example, defaultHtml: 'dashboard.html' }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$$text('h2')).toStrictEqual(['Dashboard Page...']); + await browser.close(); }); test('open /detail', async () => { const res = await setupBrowser({ example, defaultHtml: 'detail.html' }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$$text('h2')).toStrictEqual(['Detail Page']); + await browser.close(); }); test('open /home', async () => { const res = await setupBrowser({ example, defaultHtml: 'home.html' }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$$text('h2')).toStrictEqual(['Home Page']); + await browser.close(); }); + diff --git a/test/basic-nested-store.test.ts b/test/basic-nested-store.test.ts index 7a9bc136c..7fa2e11d0 100644 --- a/test/basic-nested-store.test.ts +++ b/test/basic-nested-store.test.ts @@ -10,7 +10,7 @@ buildFixture(example); test('open /', async () => { const res = await setupBrowser({ example }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$$text('h2')).toStrictEqual(['Header', 'Index Page...']); expect(await page.$$text('a')).toStrictEqual(['About']); }) @@ -40,3 +40,7 @@ test('open /about', async () => { expect(await page.html()).toContain('taobao'); expect(await page.html()).toContain('123'); }) + +afterAll(async () => { + await browser.close(); +}); diff --git a/test/basic-spa.test.ts b/test/basic-spa.test.ts index 5ee68d8ec..505b01f78 100644 --- a/test/basic-spa.test.ts +++ b/test/basic-spa.test.ts @@ -1,28 +1,49 @@ import { buildFixture, setupBrowser } from './utils/build'; +import { startFixture, setupStartBrowser } from './utils/start'; import { IPage } from './utils/browser'; const example = 'basic-spa'; -let page: IPage = null; -let browser = null; -buildFixture(example); +describe(`build ${example}`, () => { + let page: IPage = null; + let browser = null; -test('open /', async () => { - const res = await setupBrowser({ example }); - page = res.page; - browser = res.page; - expect(await page.$$text('h2')).toStrictEqual(['SPA', 'Home Page...1']); + buildFixture(example); + + test('open /', async () => { + const res = await setupBrowser({ example }); + page = res.page; + browser = res.browser; + expect(await page.$$text('h2')).toStrictEqual(['SPA', 'Home Page...1']); + }); + + test('open /dashboard', async () => { + await page.push('#/dashboard'); + // lazy load + expect(await page.html()).toContain('加载中...'); + // wait for render + await page.waitForFunction(`document.getElementsByTagName('h2').length > 1`); + expect(await page.$$text('h2')).toStrictEqual(['SPA', 'Dashboard Page...']); + }); + + afterAll(async () => { + await browser.close(); + }); }); -test('open /dashboard', async () => { - await page.push('#/dashboard'); - // lazy load - expect(await page.html()).toContain('加载中...'); - // wait for render - await page.waitForFunction(`document.getElementsByTagName('h2').length > 1`); - expect(await page.$$text('h2')).toStrictEqual(['SPA', 'Dashboard Page...']); -}); +describe(`start ${example}`, () => { + let page: IPage = null; + let browser = null; -afterAll(async () => { - await browser.close(); + test('setup devServer', async () => { + const { devServer, port } = await startFixture(example); + const res = await setupStartBrowser({ server: devServer, port }); + page = res.page; + browser = res.browser; + expect(await page.$$text('h2')).toStrictEqual(['SPA', 'Home Page...1']); + }, 120000); + + afterAll(async () => { + await browser.close(); + }); }); diff --git a/test/basic-store.test.ts b/test/basic-store.test.ts index b391484f5..4ee399bed 100644 --- a/test/basic-store.test.ts +++ b/test/basic-store.test.ts @@ -10,7 +10,7 @@ buildFixture(example); test('open /', async () => { const res = await setupBrowser({ example }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$$text('h2')).toStrictEqual(['Header', 'basic store', 'Home Page']); expect(await page.$$text('div>span')).toStrictEqual(['0']); await page.click('button'); diff --git a/test/utils/browser.ts b/test/utils/browser.ts index bdc4ec7c1..c3dbc39d4 100644 --- a/test/utils/browser.ts +++ b/test/utils/browser.ts @@ -13,13 +13,25 @@ export interface IPage extends puppeteer.Page { push?: (url: string, options?: puppeteer.DirectNavigationOptions) => Promise; } +interface IBrowserOptions { + cwd?: string; + port?: number; + server?: http.Server; +} + export default class Browser { private server: http.Server; private browser: puppeteer.Browser; private baseUrl: string; - constructor (cwd: string, port: number) { - this.server = this.createServer(cwd, port); + constructor (options: IBrowserOptions) { + const { server } = options; + if (server) { + this.server = server; + } else { + const { cwd, port } = options; + this.server = this.createServer(cwd, port); + } } createServer(cwd: string, port: number) { diff --git a/test/utils/build.ts b/test/utils/build.ts index 4a4a188f0..2f9d4911d 100644 --- a/test/utils/build.ts +++ b/test/utils/build.ts @@ -40,7 +40,7 @@ export const setupBrowser: ISetupBrowser = async (options) => { const { example, outputDir = 'build', defaultHtml = 'index.html' } = options; const rootDir = path.join(__dirname, `../../examples/${example}`); const port = await getPort(); - const browser = new Browser(path.join(rootDir, outputDir), port); + const browser = new Browser({ cwd: path.join(rootDir, outputDir), port }); await browser.start(); const page = await browser.page(`http://127.0.0.1:${port}/${defaultHtml}`); return { diff --git a/test/utils/start.ts b/test/utils/start.ts new file mode 100644 index 000000000..9c7938a18 --- /dev/null +++ b/test/utils/start.ts @@ -0,0 +1,49 @@ +import * as path from 'path'; +import { start } from '@alib/build-scripts'; +import * as getPort from 'get-port'; +import Browser, { IPage } from './browser'; +import { Server } from 'http'; +import getBuiltInPlugins = require('../../packages/icejs/src/getBuiltInPlugins'); + +interface ISetupBrowser { + (options: { port: number; defaultPath?: string; server: Server; }): Promise; +} + +interface IReturn { + page: IPage; + browser: Browser; +} + +// get builtIn plugins +export const startFixture = async function (example: string) { + const port = await getPort(); + const rootDir = path.join(__dirname, `../../examples/${example}`); + const processCwdSpy = jest.spyOn(process, 'cwd'); + processCwdSpy.mockReturnValue(rootDir); + const devServer: Server = await start({ + args: { + config: path.join(rootDir, 'build.json'), + port, + disableOpen: true + }, + rootDir, + getBuiltInPlugins: (userConfig) => { + return getBuiltInPlugins(userConfig).concat(require.resolve('./test-plugin')); + }, + }); + return { + port, + devServer + }; +}; + +export const setupStartBrowser: ISetupBrowser = async (options) => { + const { port, server, defaultPath = '' } = options; + const browser = new Browser({ server }); + await browser.start(); + const page = await browser.page(`http://127.0.0.1:${port}/${defaultPath}`); + return { + browser, + page, + }; +}; \ No newline at end of file diff --git a/test/utils/test-plugin.ts b/test/utils/test-plugin.ts index 026895aee..20fcec3d4 100644 --- a/test/utils/test-plugin.ts +++ b/test/utils/test-plugin.ts @@ -1,4 +1,6 @@ export default ({ modifyUserConfig }) => { // disable minify to speed-up fixture builds modifyUserConfig('minify', false); + // disable sourceMap to speed-up fixture start + modifyUserConfig('sourceMap', false); } \ No newline at end of file diff --git a/test/without-react-router.test.ts b/test/without-react-router.test.ts index 362c573dc..0fd34c028 100644 --- a/test/without-react-router.test.ts +++ b/test/without-react-router.test.ts @@ -10,6 +10,10 @@ buildFixture(example); test('open /', async () => { const res = await setupBrowser({ example, defaultHtml: 'home.html' }); page = res.page; - browser = res.page; + browser = res.browser; expect(await page.$text('h2')).toStrictEqual('Home Page'); }); + +afterAll(async () => { + await browser.close(); +});