Skip to content

Commit ca9ffac

Browse files
authored
fix(runner): fix and simplify Task.suite initialization (#7414)
1 parent 2edc18a commit ca9ffac

File tree

8 files changed

+73
-12
lines changed

8 files changed

+73
-12
lines changed

packages/runner/src/collect.ts

-8
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,6 @@ export async function collectTests(
8989

9090
calculateSuiteHash(file)
9191

92-
file.tasks.forEach((task) => {
93-
// task.suite refers to the internal default suite object
94-
// it should not be reported
95-
if (task.suite?.id === '') {
96-
delete task.suite
97-
}
98-
})
99-
10092
const hasOnlyTasks = someTasksAreOnly(file)
10193
interpretTaskModes(
10294
file,

packages/runner/src/suite.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,10 @@ export function getRunner(): VitestRunner {
205205

206206
function createDefaultSuite(runner: VitestRunner) {
207207
const config = runner.config.sequence
208-
return suite('', { concurrent: config.concurrent }, () => {})
208+
const collector = suite('', { concurrent: config.concurrent }, () => {})
209+
// no parent suite for top-level tests
210+
delete collector.suite
211+
return collector
209212
}
210213

211214
export function clearCollectorContext(
@@ -295,15 +298,15 @@ function createSuiteCollector(
295298
) {
296299
const tasks: (Test | Suite | SuiteCollector)[] = []
297300

298-
let suite: Suite
301+
let suite!: Suite
299302

300303
initSuite(true)
301304

302305
const task = function (name = '', options: TaskCustomOptions = {}) {
303306
const task: Test = {
304307
id: '',
305308
name,
306-
suite: undefined!,
309+
suite: collectorContext.currentSuite?.suite,
307310
each: options.each,
308311
fails: options.fails,
309312
context: undefined!,
@@ -394,6 +397,7 @@ function createSuiteCollector(
394397
type: 'collector',
395398
name,
396399
mode,
400+
suite,
397401
options: suiteOptions,
398402
test,
399403
tasks,
@@ -416,6 +420,7 @@ function createSuiteCollector(
416420
id: '',
417421
type: 'suite',
418422
name,
423+
suite: collectorContext.currentSuite?.suite,
419424
mode,
420425
each,
421426
file: undefined!,
@@ -463,7 +468,6 @@ function createSuiteCollector(
463468
suite.tasks = allChildren
464469

465470
allChildren.forEach((task) => {
466-
task.suite = suite
467471
task.file = file
468472
})
469473

packages/runner/src/types/tasks.ts

+1
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,7 @@ export interface SuiteCollector<ExtraContext = object> {
612612
| Test<ExtraContext>
613613
| SuiteCollector<ExtraContext>
614614
)[]
615+
suite?: Suite
615616
task: (name: string, options?: TaskCustomOptions) => Test<ExtraContext>
616617
collect: (file: File) => Promise<Suite>
617618
clear: () => void
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {describe, expect, test as baseTest, type TestAPI} from 'vitest'
2+
import { getSuiteNames } from './utils';
3+
4+
const test = baseTest as TestAPI<{__suiteNames: string[]}>
5+
6+
test("test-a", (ctx) => {
7+
expect(ctx.__suiteNames).toEqual([]);
8+
expect(ctx.__suiteNames).toEqual(getSuiteNames(ctx.task.suite))
9+
})
10+
11+
describe("suite-x", () => {
12+
test("test-b", (ctx) => {
13+
expect(ctx.__suiteNames).toEqual(['suite-x'])
14+
expect(ctx.__suiteNames).toEqual(getSuiteNames(ctx.task.suite))
15+
})
16+
17+
describe("suite-y", () => {
18+
test("test-c", (ctx) => {
19+
expect(ctx.__suiteNames).toEqual(['suite-y', 'suite-x'])
20+
expect(ctx.__suiteNames).toEqual(getSuiteNames(ctx.task.suite))
21+
})
22+
})
23+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type { Suite, TestContext } from '@vitest/runner'
2+
import { VitestTestRunner } from 'vitest/runners'
3+
import { getSuiteNames } from './utils';
4+
5+
class CustomTestRunner extends VitestTestRunner {
6+
extendTaskContext(context: TestContext) {
7+
super.extendTaskContext(context);
8+
(context as any).__suiteNames = getSuiteNames(context.task.suite)
9+
return context
10+
}
11+
}
12+
13+
export default CustomTestRunner
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Suite } from "@vitest/runner"
2+
3+
export function getSuiteNames(suite?: Suite) {
4+
const names = []
5+
while (suite) {
6+
names.push(suite.name)
7+
suite = suite.suite
8+
}
9+
return names
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { defineConfig } from 'vitest/config'
2+
3+
export default defineConfig({
4+
test: {
5+
runner: './test-runner.ts',
6+
},
7+
})

test/cli/test/custom-runner.test.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { expect, test } from 'vitest'
2+
import { runVitest } from '../../test-utils'
3+
4+
test('extendTaskContext provides correct context.task.suite', async () => {
5+
const vitest = await runVitest({
6+
root: './fixtures/custom-runner',
7+
reporters: [['default', { isTTY: false }]],
8+
})
9+
expect(vitest.stderr).toBe('')
10+
expect(vitest.stdout).toContain('✓ custom-runner.test.ts')
11+
})

0 commit comments

Comments
 (0)