Skip to content

Commit

Permalink
fix(runner): fix and simplify Task.suite initialization (#7414)
Browse files Browse the repository at this point in the history
  • Loading branch information
hi-ogawa authored Mar 6, 2025
1 parent 2edc18a commit ca9ffac
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 12 deletions.
8 changes: 0 additions & 8 deletions packages/runner/src/collect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,6 @@ export async function collectTests(

calculateSuiteHash(file)

file.tasks.forEach((task) => {
// task.suite refers to the internal default suite object
// it should not be reported
if (task.suite?.id === '') {
delete task.suite
}
})

const hasOnlyTasks = someTasksAreOnly(file)
interpretTaskModes(
file,
Expand Down
12 changes: 8 additions & 4 deletions packages/runner/src/suite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,10 @@ export function getRunner(): VitestRunner {

function createDefaultSuite(runner: VitestRunner) {
const config = runner.config.sequence
return suite('', { concurrent: config.concurrent }, () => {})
const collector = suite('', { concurrent: config.concurrent }, () => {})
// no parent suite for top-level tests
delete collector.suite
return collector
}

export function clearCollectorContext(
Expand Down Expand Up @@ -295,15 +298,15 @@ function createSuiteCollector(
) {
const tasks: (Test | Suite | SuiteCollector)[] = []

let suite: Suite
let suite!: Suite

initSuite(true)

const task = function (name = '', options: TaskCustomOptions = {}) {
const task: Test = {
id: '',
name,
suite: undefined!,
suite: collectorContext.currentSuite?.suite,
each: options.each,
fails: options.fails,
context: undefined!,
Expand Down Expand Up @@ -394,6 +397,7 @@ function createSuiteCollector(
type: 'collector',
name,
mode,
suite,
options: suiteOptions,
test,
tasks,
Expand All @@ -416,6 +420,7 @@ function createSuiteCollector(
id: '',
type: 'suite',
name,
suite: collectorContext.currentSuite?.suite,
mode,
each,
file: undefined!,
Expand Down Expand Up @@ -463,7 +468,6 @@ function createSuiteCollector(
suite.tasks = allChildren

allChildren.forEach((task) => {
task.suite = suite
task.file = file
})

Expand Down
1 change: 1 addition & 0 deletions packages/runner/src/types/tasks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,7 @@ export interface SuiteCollector<ExtraContext = object> {
| Test<ExtraContext>
| SuiteCollector<ExtraContext>
)[]
suite?: Suite
task: (name: string, options?: TaskCustomOptions) => Test<ExtraContext>
collect: (file: File) => Promise<Suite>
clear: () => void
Expand Down
23 changes: 23 additions & 0 deletions test/cli/fixtures/custom-runner/custom-runner.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import {describe, expect, test as baseTest, type TestAPI} from 'vitest'
import { getSuiteNames } from './utils';

const test = baseTest as TestAPI<{__suiteNames: string[]}>

test("test-a", (ctx) => {
expect(ctx.__suiteNames).toEqual([]);
expect(ctx.__suiteNames).toEqual(getSuiteNames(ctx.task.suite))
})

describe("suite-x", () => {
test("test-b", (ctx) => {
expect(ctx.__suiteNames).toEqual(['suite-x'])
expect(ctx.__suiteNames).toEqual(getSuiteNames(ctx.task.suite))
})

describe("suite-y", () => {
test("test-c", (ctx) => {
expect(ctx.__suiteNames).toEqual(['suite-y', 'suite-x'])
expect(ctx.__suiteNames).toEqual(getSuiteNames(ctx.task.suite))
})
})
})
13 changes: 13 additions & 0 deletions test/cli/fixtures/custom-runner/test-runner.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Suite, TestContext } from '@vitest/runner'
import { VitestTestRunner } from 'vitest/runners'
import { getSuiteNames } from './utils';

class CustomTestRunner extends VitestTestRunner {
extendTaskContext(context: TestContext) {
super.extendTaskContext(context);
(context as any).__suiteNames = getSuiteNames(context.task.suite)
return context
}
}

export default CustomTestRunner
10 changes: 10 additions & 0 deletions test/cli/fixtures/custom-runner/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Suite } from "@vitest/runner"

export function getSuiteNames(suite?: Suite) {
const names = []
while (suite) {
names.push(suite.name)
suite = suite.suite
}
return names
}
7 changes: 7 additions & 0 deletions test/cli/fixtures/custom-runner/vitest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { defineConfig } from 'vitest/config'

export default defineConfig({
test: {
runner: './test-runner.ts',
},
})
11 changes: 11 additions & 0 deletions test/cli/test/custom-runner.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { expect, test } from 'vitest'
import { runVitest } from '../../test-utils'

test('extendTaskContext provides correct context.task.suite', async () => {
const vitest = await runVitest({
root: './fixtures/custom-runner',
reporters: [['default', { isTTY: false }]],
})
expect(vitest.stderr).toBe('')
expect(vitest.stdout).toContain('✓ custom-runner.test.ts')
})

0 comments on commit ca9ffac

Please sign in to comment.