[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

refactor: use vite-node to load globalSetup (#624)

authored by

Dominik G and committed by
GitHub
(Jan 27, 2022, 8:04 AM +0800) 5eebd604 5887fb7a

+59 -37
+9
.editorconfig
··· 1 + root = true 2 + 3 + [*] 4 + charset = utf-8 5 + indent_style = space 6 + indent_size = 2 7 + end_of_line = lf 8 + insert_final_newline = true 9 + trim_trailing_whitespace = true
+1
.gitattributes
··· 1 + * text=auto eol=lf
+1
test/global-setup/index.html
··· 1 + Hello Vitest
+1
test/global-setup/vitest.config.ts
··· 9 9 './setupFiles/default-export.js', 10 10 './setupFiles/named-exports.js', 11 11 './setupFiles/ts-with-imports.ts', 12 + './setupFiles/another-vite-instance.ts', 12 13 ], 13 14 }, 14 15 })
+16
test/global-setup/setupFiles/another-vite-instance.ts
··· 1 + import { createServer } from 'vite' 2 + import { resolve } from 'pathe' 3 + 4 + export async function setup() { 5 + const server = await createServer({ 6 + root: resolve(__dirname, '..'), 7 + server: { 8 + port: 9988, 9 + }, 10 + }) 11 + 12 + await server.listen(9988) 13 + return async() => { 14 + await server.close() 15 + } 16 + }
+8 -12
test/global-setup/test/global-setup.test.ts
··· 1 - import http from 'http' 2 - 3 - async function sendRequest(host: string, port: number) { 4 - return new Promise<string>((resolve) => { 5 - http.request({ host, port }, (res) => { 6 - let data = '' 7 - res.on('data', d => data += d) 8 - res.on('end', () => resolve(data)) 9 - }).end() 10 - }) 11 - } 1 + import fetch from 'node-fetch' 12 2 13 3 test('server running', async() => { 14 - const res = await sendRequest('127.0.0.1', 9876) 4 + const res = await (await fetch('http://localhost:9876')).text() 15 5 expect(res).toBe('Hello Vitest\n') 6 + }) 7 + 8 + test('vite instance running', async() => { 9 + const res = await (await fetch('http://localhost:9988')).text() 10 + expect(res).toContain('<script type="module" src="/@vite/client">') 11 + expect(res).toContain('Hello Vitest\n') 16 12 })
+22 -24
packages/vitest/src/node/plugins/globalSetup.ts
··· 1 - import type { Plugin, ViteDevServer } from 'vite' 1 + import type { Plugin } from 'vite' 2 + import { ViteNodeRunner } from 'vite-node/client' 3 + import type { Vitest } from '../core' 2 4 import { toArray } from '../../utils' 3 5 4 6 interface GlobalSetupFile { ··· 7 9 teardown?: Function 8 10 } 9 11 10 - async function loadGlobalSetupFiles(server: ViteDevServer): Promise<GlobalSetupFile[]> { 12 + async function loadGlobalSetupFiles(ctx: Vitest): Promise<GlobalSetupFile[]> { 13 + const node = ctx.vitenode 14 + const server = ctx.server 15 + const runner = new ViteNodeRunner({ 16 + root: server.config.root, 17 + base: server.config.base, 18 + fetchModule(id) { 19 + return node.fetchModule(id) 20 + }, 21 + resolveId(id, importer) { 22 + return node.resolveId(id, importer) 23 + }, 24 + }) 11 25 const globalSetupFiles = toArray(server.config.test?.globalSetup) 12 - return Promise.all(globalSetupFiles.map(file => loadGlobalSetupFile(file, server))) 26 + return Promise.all(globalSetupFiles.map(file => loadGlobalSetupFile(file, runner))) 13 27 } 14 28 15 - async function loadGlobalSetupFile(file: string, server: ViteDevServer): Promise<GlobalSetupFile> { 16 - const m = await server.ssrLoadModule(file) 29 + async function loadGlobalSetupFile(file: string, runner: ViteNodeRunner): Promise<GlobalSetupFile> { 30 + const m = await runner.executeFile(file) 17 31 for (const exp of ['default', 'setup', 'teardown']) { 18 32 if (m[exp] != null && typeof m[exp] !== 'function') 19 33 throw new Error(`invalid export in globalSetup file ${file}: ${exp} must be a function`) ··· 36 50 } 37 51 } 38 52 39 - export const GlobalSetupPlugin = (): Plugin => { 40 - let server: ViteDevServer 53 + export const GlobalSetupPlugin = (ctx: Vitest): Plugin => { 41 54 let globalSetupFiles: GlobalSetupFile[] 42 55 return { 43 56 name: 'vitest:global-setup-plugin', 44 57 enforce: 'pre', 45 58 46 - // @ts-expect-error ssr is still flagged as alpha 47 - config(config) { 48 - if (config.test?.globalSetup) { 49 - return { 50 - ssr: { 51 - noExternal: true, // needed so ssrLoadModule call doesn't initialize server._ssrExternals 52 - }, 53 - } 54 - } 55 - }, 56 - 57 - configureServer(_server) { 58 - server = _server 59 - }, 60 - 61 59 async buildStart() { 62 - if (!server.config.test?.globalSetup) 60 + if (!ctx.server.config.test?.globalSetup) 63 61 return 64 62 65 - globalSetupFiles = await loadGlobalSetupFiles(server) 63 + globalSetupFiles = await loadGlobalSetupFiles(ctx) 66 64 for (const globalSetupFile of globalSetupFiles) { 67 65 const teardown = await globalSetupFile.setup?.() 68 66 if (teardown == null || !!globalSetupFile.teardown)
+1 -1
packages/vitest/src/node/plugins/index.ts
··· 55 55 }, 56 56 }, 57 57 MocksPlugin(), 58 - GlobalSetupPlugin(), 58 + GlobalSetupPlugin(ctx), 59 59 options.ui 60 60 ? await UIPlugin() 61 61 : null,