From 7531c2921c730f2e54f4851381a5d32540d81043 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Mon, 19 Jun 2023 16:19:16 +0800 Subject: [PATCH] feat(reporters): show full test suite when testing 1 spec file at a time (#3543) --- packages/vitest/src/node/reporters/default.ts | 11 ++++ .../fixtures/default/MockReporter.ts | 5 ++ test/reporters/fixtures/default/a.test.ts | 26 +++++++++ test/reporters/fixtures/default/b1.test.ts | 26 +++++++++ test/reporters/fixtures/default/b2.test.ts | 26 +++++++++ .../fixtures/default/vitest.config.ts | 10 ++++ test/reporters/tests/default.test.ts | 57 +++++++++++++++++++ 7 files changed, 161 insertions(+) create mode 100644 test/reporters/fixtures/default/MockReporter.ts create mode 100644 test/reporters/fixtures/default/a.test.ts create mode 100644 test/reporters/fixtures/default/b1.test.ts create mode 100644 test/reporters/fixtures/default/b2.test.ts create mode 100644 test/reporters/fixtures/default/vitest.config.ts create mode 100644 test/reporters/tests/default.test.ts diff --git a/packages/vitest/src/node/reporters/default.ts b/packages/vitest/src/node/reporters/default.ts index 97d0c37a00e7..a32fffe7a0ad 100644 --- a/packages/vitest/src/node/reporters/default.ts +++ b/packages/vitest/src/node/reporters/default.ts @@ -7,6 +7,17 @@ import { createListRenderer } from './renderers/listRenderer' export class DefaultReporter extends BaseReporter { renderer?: ReturnType rendererOptions: ListRendererOptions = {} as any + private renderSucceedDefault?: boolean + + onPathsCollected(paths: string[] = []) { + if (this.isTTY) { + if (this.renderSucceedDefault === undefined) + this.renderSucceedDefault = !!this.rendererOptions.renderSucceed + + if (this.renderSucceedDefault !== true) + this.rendererOptions.renderSucceed = paths.length <= 1 + } + } async onTestRemoved(trigger?: string) { await this.stopListRender() diff --git a/test/reporters/fixtures/default/MockReporter.ts b/test/reporters/fixtures/default/MockReporter.ts new file mode 100644 index 000000000000..75bf9000a2e2 --- /dev/null +++ b/test/reporters/fixtures/default/MockReporter.ts @@ -0,0 +1,5 @@ +import { DefaultReporter } from '../../../../packages/vitest/src/node/reporters/default' + +export default class MockDefaultReporter extends DefaultReporter { + isTTY = true +} diff --git a/test/reporters/fixtures/default/a.test.ts b/test/reporters/fixtures/default/a.test.ts new file mode 100644 index 000000000000..16cabf106810 --- /dev/null +++ b/test/reporters/fixtures/default/a.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from 'vitest' + +describe('a passed', () => { + test.each([1, 2, 3])('a%d test', (d) => { + expect(d).toBe(d) + }) + describe('nested a', () => { + test.each([1, 2, 3])('nested a%d test', (d) => { + expect(d).toBe(d) + }) + }) +}) + +describe('a failed', () => { + test.each([1, 2, 3])('a failed %d test', (d) => { + expect(d).toBe(d) + }) + test('a failed test', () => { + expect(1).toBe(2) + }) + describe('nested a failed', () => { + test.each([1, 2, 3])('nested a failed %d test', (d) => { + expect(d).toBe(d) + }) + }) +}) diff --git a/test/reporters/fixtures/default/b1.test.ts b/test/reporters/fixtures/default/b1.test.ts new file mode 100644 index 000000000000..53cd9229eadc --- /dev/null +++ b/test/reporters/fixtures/default/b1.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from 'vitest' + +describe('b1 passed', () => { + test.each([1, 2, 3])('b%d test', (d) => { + expect(d).toBe(d) + }) + describe('nested b', () => { + test.each([1, 2, 3])('nested b%d test', (d) => { + expect(d).toBe(d) + }) + }) +}) + +describe('b1 failed', () => { + test.each([1, 2, 3])('b%d test', (d) => { + expect(d).toBe(d) + }) + test('b failed test', () => { + expect(1).toBe(2) + }) + describe('nested b', () => { + test.each([1, 2, 3])('nested b%d test', (d) => { + expect(d).toBe(d) + }) + }) +}) diff --git a/test/reporters/fixtures/default/b2.test.ts b/test/reporters/fixtures/default/b2.test.ts new file mode 100644 index 000000000000..254a3507e45b --- /dev/null +++ b/test/reporters/fixtures/default/b2.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from 'vitest' + +describe('b2 passed', () => { + test.each([1, 2, 3])('b%d test', (d) => { + expect(d).toBe(d) + }) + describe('nested b', () => { + test.each([1, 2, 3])('nested b%d test', (d) => { + expect(d).toBe(d) + }) + }) +}) + +describe('b2 failed', () => { + test.each([1, 2, 3])('b%d test', (d) => { + expect(d).toBe(d) + }) + test('b failed test', () => { + expect(1).toBe(2) + }) + describe('nested b', () => { + test.each([1, 2, 3])('nested b%d test', (d) => { + expect(d).toBe(d) + }) + }) +}) diff --git a/test/reporters/fixtures/default/vitest.config.ts b/test/reporters/fixtures/default/vitest.config.ts new file mode 100644 index 000000000000..a8211e3941fd --- /dev/null +++ b/test/reporters/fixtures/default/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +process.stdin.isTTY = true +process.stdin.setRawMode = () => process.stdin + +export default defineConfig({ + test: { + reporters: './MockReporter', + }, +}) diff --git a/test/reporters/tests/default.test.ts b/test/reporters/tests/default.test.ts new file mode 100644 index 000000000000..f097574061fa --- /dev/null +++ b/test/reporters/tests/default.test.ts @@ -0,0 +1,57 @@ +import path from 'pathe' +import { describe, expect, test } from 'vitest' +import { runVitestCli } from '../../test-utils' + +const resolve = (id = '') => path.resolve(__dirname, '../fixtures/default', id) +async function run(fileFilter: string[], watch = false, ...args: string[]) { + return runVitestCli( + ...fileFilter, + '--root', + resolve(), + watch ? '--watch' : '--run', + ...args, + ) +} + +describe('default reporter', async () => { + test('normal', async () => { + const { stdout } = await run(['b1.test.ts', 'b2.test.ts']) + expect(stdout).contain('✓ b2 test') + expect(stdout).not.contain('✓ nested b1 test') + expect(stdout).contain('× b failed test') + }) + + test('show full test suite when only one file', async () => { + const { stdout } = await run(['a.test.ts']) + expect(stdout).contain('✓ a1 test') + expect(stdout).contain('✓ nested a3 test') + expect(stdout).contain('× a failed test') + expect(stdout).contain('nested a failed 1 test') + }) + + test('rerun should undo', async () => { + const vitest = await run([], true, '-t', 'passed') + + // one file + vitest.write('p') + await vitest.waitForStdout('Input filename pattern') + vitest.write('a\n') + await vitest.waitForStdout('Filename pattern: a') + await vitest.waitForStdout('Waiting for file changes') + expect(vitest.stdout).contain('✓ a1 test') + expect(vitest.stdout).contain('✓ nested a3 test') + + // rerun and two files + vitest.write('p') + await vitest.waitForStdout('Input filename pattern') + vitest.write('b\n') + await vitest.waitForStdout('Filename pattern: b') + await vitest.waitForStdout('PASS Waiting for file changes...') + expect(vitest.stdout).toContain('RERUN') + expect(vitest.stdout).toContain('b1.test.ts') + expect(vitest.stdout).toContain('b2.test.ts') + expect(vitest.stdout).not.toContain('nested b1 test') + expect(vitest.stdout).not.toContain('b1 test') + expect(vitest.stdout).not.toContain('b2 test') + }) +}, 120000)