feat(nuxi)!: setup nuxt globally with nuxt test (#4578)

This commit is contained in:
Anthony Fu 2022-11-10 22:55:47 +08:00 committed by GitHub
parent 3dd9271c09
commit b4d7d62287
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 66 additions and 14 deletions

View File

@ -5,7 +5,7 @@
"build": "nuxi build", "build": "nuxi build",
"dev": "nuxi dev", "dev": "nuxi dev",
"start": "nuxi preview", "start": "nuxi preview",
"test": "vitest run" "test": "nuxi test"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/test-utils": "^3.0.0-rc.13", "@nuxt/test-utils": "^3.0.0-rc.13",

View File

@ -1,13 +1,7 @@
import { fileURLToPath } from 'node:url'
import { describe, expect, it } from 'vitest' import { describe, expect, it } from 'vitest'
import { setup, $fetch, isDev } from '@nuxt/test-utils' import { $fetch, isDev } from '@nuxt/test-utils'
describe('example', async () => {
await setup({
rootDir: fileURLToPath(new URL('..', import.meta.url)),
server: true
})
describe('example', () => {
it('Renders Hello Nuxt', async () => { it('Renders Hello Nuxt', async () => {
expect(await $fetch('/')).toMatch('Hello Nuxt!') expect(await $fetch('/')).toMatch('Hello Nuxt!')
}) })

View File

@ -33,7 +33,9 @@ async function importTestUtils (): Promise<typeof import('@nuxt/test-utils')> {
throw new Error('Invalid version of `@nuxt/test-utils` is installed!') throw new Error('Invalid version of `@nuxt/test-utils` is installed!')
} }
return exports return exports
} catch (_err) { err = _err } } catch (_err) {
err = _err
}
} }
console.error(err) console.error(err)
throw new Error('`@nuxt/test-utils-edge` seems missing. Run `npm i -D @nuxt/test-utils-edge` or `yarn add -D @nuxt/test-utils-edge` to install.') throw new Error('`@nuxt/test-utils-edge` seems missing. Run `npm i -D @nuxt/test-utils-edge` or `yarn add -D @nuxt/test-utils-edge` to install.')

View File

@ -3,7 +3,8 @@ import { defineBuildConfig } from 'unbuild'
export default defineBuildConfig({ export default defineBuildConfig({
declaration: true, declaration: true,
entries: [ entries: [
'src/index' 'src/index',
{ input: 'src/runtime/', outDir: 'dist/runtime', format: 'esm' }
], ],
externals: [ externals: [
'vitest', 'vitest',

View File

@ -20,7 +20,8 @@
"execa": "^6.1.0", "execa": "^6.1.0",
"get-port-please": "^2.6.1", "get-port-please": "^2.6.1",
"jiti": "^1.16.0", "jiti": "^1.16.0",
"ohmyfetch": "^0.4.21" "ohmyfetch": "^0.4.21",
"pathe": "^0.3.8"
}, },
"devDependencies": { "devDependencies": {
"playwright": "^1.27.1", "playwright": "^1.27.1",

View File

@ -28,6 +28,7 @@ export function createTestContext (options: Partial<TestOptions>): TestContext {
} }
export function useTestContext (): TestContext { export function useTestContext (): TestContext {
recoverContextFromEnv()
if (!currentContext) { if (!currentContext) {
throw new Error('No context is available. (Forgot calling setup or createContext?)') throw new Error('No context is available. (Forgot calling setup or createContext?)')
} }
@ -45,3 +46,14 @@ export function isDev () {
const ctx = useTestContext() const ctx = useTestContext()
return ctx.options.dev return ctx.options.dev
} }
export function recoverContextFromEnv () {
if (!currentContext && process.env.NUXT_TEST_CONTEXT) {
setTestContext(JSON.parse(process.env.NUXT_TEST_CONTEXT || '{}'))
}
}
export function exposeContextToEnv () {
const { options, browser, url } = currentContext!
process.env.NUXT_TEST_CONTEXT = JSON.stringify({ options, browser, url })
}

View File

@ -0,0 +1,5 @@
import { fileURLToPath } from 'node:url'
import { dirname, resolve } from 'pathe'
export const distDir = dirname(fileURLToPath(import.meta.url))
export const pkgDir = resolve(distDir, '..')

View File

@ -5,3 +5,4 @@ export * from './nuxt'
export * from './server' export * from './server'
export * from './setup' export * from './setup'
export * from './run' export * from './run'
export * from './types'

View File

@ -1,12 +1,17 @@
import { resolve } from 'pathe'
import { distDir } from './dirs'
export interface RunTestOptions { export interface RunTestOptions {
rootDir: string, rootDir: string,
dev?: boolean, dev?: boolean,
watch?: boolean watch?: boolean
runner?: 'vitest' runner?: 'vitest'
globalSetup?: boolean
} }
const RunTestDefaults: Partial<RunTestOptions> = { const RunTestDefaults: Partial<RunTestOptions> = {
runner: 'vitest' runner: 'vitest',
globalSetup: true
} }
export async function runTests (opts: RunTestOptions) { export async function runTests (opts: RunTestOptions) {
@ -21,6 +26,9 @@ export async function runTests (opts: RunTestOptions) {
process.env.NUXT_TEST_DEV = 'true' process.env.NUXT_TEST_DEV = 'true'
} }
// Consumed by recoverContextFromEnv()
process.env.NUXT_TEST_OPTIONS = JSON.stringify(opts)
const { startVitest } = await import('vitest/node') const { startVitest } = await import('vitest/node')
const succeeded = await startVitest( const succeeded = await startVitest(
'test', 'test',
@ -37,6 +45,20 @@ export async function runTests (opts: RunTestOptions) {
{ {
esbuild: { esbuild: {
tsconfigRaw: '{}' tsconfigRaw: '{}'
},
test: {
dir: opts.rootDir,
deps: {
inline: [
distDir,
'@nuxt/test-utils',
'@nuxt/test-utils-edge'
]
},
globals: true,
globalSetup: [
...opts.globalSetup ? [resolve(distDir, './runtime/global-setup')] : []
]
} }
} }
) )

View File

@ -0,0 +1,12 @@
import { createTest, exposeContextToEnv } from '@nuxt/test-utils'
const hooks = createTest(JSON.parse(process.env.NUXT_TEST_OPTIONS || '{}'))
export const setup = async () => {
await hooks.setup()
exposeContextToEnv()
}
export const teardown = async () => {
await hooks.afterAll()
}

View File

@ -67,7 +67,7 @@ export function createTest (options: Partial<TestOptions>): TestHooks {
} }
} }
export async function setup (options: Partial<TestOptions>) { export async function setup (options: Partial<TestOptions> = {}) {
const hooks = createTest(options) const hooks = createTest(options)
const setupFn = setupMaps[hooks.ctx.options.runner] const setupFn = setupMaps[hooks.ctx.options.runner]

View File

@ -557,6 +557,7 @@ importers:
get-port-please: ^2.6.1 get-port-please: ^2.6.1
jiti: ^1.16.0 jiti: ^1.16.0
ohmyfetch: ^0.4.21 ohmyfetch: ^0.4.21
pathe: ^0.3.8
playwright: ^1.27.1 playwright: ^1.27.1
unbuild: ^0.9.4 unbuild: ^0.9.4
vitest: ^0.25.1 vitest: ^0.25.1
@ -569,6 +570,7 @@ importers:
get-port-please: 2.6.1 get-port-please: 2.6.1
jiti: 1.16.0 jiti: 1.16.0
ohmyfetch: 0.4.21 ohmyfetch: 0.4.21
pathe: 0.3.9
devDependencies: devDependencies:
playwright: 1.27.1 playwright: 1.27.1
unbuild: 0.9.4 unbuild: 0.9.4