Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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')
})