Skip to content

Commit

Permalink
refactor: correctly override isolate flag
Browse files Browse the repository at this point in the history
  • Loading branch information
sheremet-va committed Dec 19, 2023
1 parent 1cff30d commit f751de3
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 9 deletions.
1 change: 1 addition & 0 deletions packages/vitest/src/defaults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export const fakeTimersDefaults = {

const config = {
allowOnly: !isCI,
isolate: true,
watch: !isCI,
globals: false,
environment: 'node' as const,
Expand Down
9 changes: 0 additions & 9 deletions packages/vitest/src/node/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,15 +123,6 @@ export function resolveConfig(
}
}

if (resolved.isolate) {
resolved.poolOptions ??= {}
resolved.poolOptions.threads ??= {}
// prefer CLI arguments
resolved.poolOptions.threads.isolate = options.poolOptions?.threads?.isolate ?? options.isolate ?? resolved.poolOptions.threads.isolate ?? resolved.isolate
resolved.poolOptions.forks ??= {}
resolved.poolOptions.forks.isolate ??= options.poolOptions?.forks?.isolate ?? options.isolate ?? resolved.poolOptions.forks.isolate ?? resolved.isolate
}

// @ts-expect-error -- check for removed API option
if (resolved.coverage.provider === 'c8')
throw new Error('"coverage.provider: c8" is not supported anymore. Use "coverage.provider: v8" instead')
Expand Down
10 changes: 10 additions & 0 deletions packages/vitest/src/node/plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
)
testConfig.api = resolveApiServerConfig(testConfig)

testConfig.poolOptions ??= {}
testConfig.poolOptions.threads ??= {}
testConfig.poolOptions.forks ??= {}
// prefer --poolOptions.{name}.isolate CLI arguments over --isolate, but still respect config value
testConfig.poolOptions.threads.isolate = options.poolOptions?.threads?.isolate ?? options.isolate ?? testConfig.poolOptions.threads.isolate ?? viteConfig.test?.isolate
testConfig.poolOptions.forks.isolate = options.poolOptions?.forks?.isolate ?? options.isolate ?? testConfig.poolOptions.forks.isolate ?? viteConfig.test?.isolate

// store defines for globalThis to make them
// reassignable when running in worker in src/runtime/setup.ts
const defines: Record<string, any> = deleteDefineConfig(viteConfig)
Expand Down Expand Up @@ -91,6 +98,9 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
allow: resolveFsAllow(getRoot(), testConfig.config),
},
},
test: {
poolOptions: testConfig.poolOptions,
},
}

// chokidar fsevents is unstable on macos when emitting "ready" event
Expand Down
104 changes: 104 additions & 0 deletions test/config/test/resolution.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import type { UserConfig } from 'vitest'
import { describe, expect, it } from 'vitest'
import { createVitest } from 'vitest/node'

async function config(cliOptions: UserConfig, configValue: UserConfig = {}) {
const vitest = await createVitest('test', { ...cliOptions, watch: false }, { test: configValue })
return vitest.config
}

describe('correctly defines isolated flags', async () => {
it('prefers CLI poolOptions flags over config', async () => {
const c = await config({
isolate: true,
poolOptions: {
threads: {
isolate: false,
},
forks: {
isolate: false,
},
},
})
expect(c.poolOptions?.threads?.isolate).toBe(false)
expect(c.poolOptions?.forks?.isolate).toBe(false)
expect(c.isolate).toBe(true)
})

it('override CLI poolOptions flags over isolate', async () => {
const c = await config({
isolate: false,
poolOptions: {
threads: {
isolate: true,
},
forks: {
isolate: true,
},
},
}, {
poolOptions: {
threads: {
isolate: false,
},
forks: {
isolate: false,
},
},
})
expect(c.poolOptions?.threads?.isolate).toBe(true)
expect(c.poolOptions?.forks?.isolate).toBe(true)
expect(c.isolate).toBe(false)
})

it('override CLI isolate flag if poolOptions is not set via CLI', async () => {
const c = await config({
isolate: true,
}, {
poolOptions: {
threads: {
isolate: false,
},
forks: {
isolate: false,
},
},
})
expect(c.poolOptions?.threads?.isolate).toBe(true)
expect(c.poolOptions?.forks?.isolate).toBe(true)
expect(c.isolate).toBe(true)
})

it('keeps user configured poolOptions if no CLI flag is provided', async () => {
const c = await config({}, {
poolOptions: {
threads: {
isolate: false,
},
forks: {
isolate: false,
},
},
})
expect(c.poolOptions?.threads?.isolate).toBe(false)
expect(c.poolOptions?.forks?.isolate).toBe(false)
expect(c.isolate).toBe(true)
})

it('isolate config value overrides poolOptions defaults', async () => {
const c = await config({}, {
isolate: false,
})
expect(c.poolOptions?.threads?.isolate).toBe(false)
expect(c.poolOptions?.forks?.isolate).toBe(false)
expect(c.isolate).toBe(false)
})

it('if no isolation is defined in the config, fallback ot undefined', async () => {
const c = await config({}, {})
expect(c.poolOptions?.threads?.isolate).toBe(undefined)
expect(c.poolOptions?.forks?.isolate).toBe(undefined)
// set in configDefaults, so it's always defined
expect(c.isolate).toBe(true)
})
})

0 comments on commit f751de3

Please sign in to comment.