From 714e7258db2339fe41c3c50d9ec9a182e96e6ae2 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Wed, 15 Jan 2025 14:01:23 +0100 Subject: [PATCH 1/4] feat(api): add onBrowserInit event --- docs/advanced/api/reporters.md | 8 ++++++++ packages/vitest/src/node/project.ts | 1 + packages/vitest/src/node/types/reporter.ts | 6 ++++++ test/browser/specs/runner.test.ts | 16 +++++++++++++++- 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/docs/advanced/api/reporters.md b/docs/advanced/api/reporters.md index 7978a1d813f8..06ebd06ae83e 100644 --- a/docs/advanced/api/reporters.md +++ b/docs/advanced/api/reporters.md @@ -81,6 +81,14 @@ export default new MyReporter() ``` ::: +## onBrowserInit experimental {#onbrowserinit} + +```ts +function onBrowserInit(project: TestProject): Awaitable +``` + +This method is called when the browser instance is initiated. It receives an instance of the project for which the browser is initiated. `project.browser` will always be defined when this method is called. + ## onTestRunStart ```ts diff --git a/packages/vitest/src/node/project.ts b/packages/vitest/src/node/project.ts index 081404e40cdb..62e3f905a861 100644 --- a/packages/vitest/src/node/project.ts +++ b/packages/vitest/src/node/project.ts @@ -531,6 +531,7 @@ export class TestProject { if (!this.browser && this._parent?._parentBrowser) { this.browser = this._parent._parentBrowser.spawn(this) + await this.vitest.report('onBrowserInit', this) } }) diff --git a/packages/vitest/src/node/types/reporter.ts b/packages/vitest/src/node/types/reporter.ts index 54708e842acf..cb24aa57caa3 100644 --- a/packages/vitest/src/node/types/reporter.ts +++ b/packages/vitest/src/node/types/reporter.ts @@ -3,6 +3,7 @@ import type { SerializedError } from '@vitest/utils' import type { SerializedTestSpecification } from '../../runtime/types/utils' import type { Awaitable, UserConsoleLog } from '../../types/general' import type { Vitest } from '../core' +import type { TestProject } from '../project' import type { ReportedHookContext, TestCase, TestModule, TestSuite } from '../reporters/reported-tasks' import type { TestSpecification } from '../spec' @@ -10,6 +11,11 @@ export type TestRunEndReason = 'passed' | 'interrupted' | 'failed' export interface Reporter { onInit?: (vitest: Vitest) => void + /** + * Called when the project initiated the browser instance. + * project.browser will always be defined. + */ + onBrowserInit?: (project: TestProject) => Awaitable /** * @deprecated use `onTestRunStart` instead */ diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index d0f72ec1cd6d..8d60ceea9def 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -11,13 +11,22 @@ describe('running browser tests', async () => { let passedTests: any[] let failedTests: any[] let vitest: Vitest + const events: string[] = [] beforeAll(async () => { ({ stderr, stdout, ctx: vitest, - } = await runBrowserTests()) + } = await runBrowserTests({ + reporters: [ + { + onBrowserInit(project) { + events.push(`onBrowserInit ${project.name}`) + }, + }, + ], + })) const browserResult = await readFile('./browser.json', 'utf-8') browserResultJson = JSON.parse(browserResult) @@ -34,6 +43,11 @@ describe('running browser tests', async () => { const testFiles = browserResultJson.testResults.map(t => t.name) + vitest.projects.forEach((project) => { + // the order is non-deterministic + expect(events).toContain(`onBrowserInit ${project.name}`) + }) + // test files are optimized automatically expect(vitest.projects.map(p => p.browser?.vite.config.optimizeDeps.entries)) .toEqual(vitest.projects.map(() => expect.arrayContaining(testFiles))) From 71e23696f16bd589b4c4d19d3c4f3fefadf9b2d2 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Wed, 15 Jan 2025 14:01:41 +0100 Subject: [PATCH 2/4] chore: mark experimental --- packages/vitest/src/node/types/reporter.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vitest/src/node/types/reporter.ts b/packages/vitest/src/node/types/reporter.ts index cb24aa57caa3..3c4e19088d95 100644 --- a/packages/vitest/src/node/types/reporter.ts +++ b/packages/vitest/src/node/types/reporter.ts @@ -14,6 +14,7 @@ export interface Reporter { /** * Called when the project initiated the browser instance. * project.browser will always be defined. + * @experimental */ onBrowserInit?: (project: TestProject) => Awaitable /** From 6b160a25cdc7806c405811406b8c73d5b0f39ea4 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Wed, 15 Jan 2025 14:34:32 +0100 Subject: [PATCH 3/4] test: fix browser test --- test/browser/specs/runner.test.ts | 15 +++++++++++++++ test/browser/vitest.config.mts | 12 ------------ test/core/test/injector-mock.test.ts | 26 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index 8d60ceea9def..949147f054f6 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -1,6 +1,7 @@ import type { Vitest } from 'vitest/node' import type { JsonTestResults } from 'vitest/reporters' import { readFile } from 'node:fs/promises' +import { noop } from '@vitest/utils' import { beforeAll, describe, expect, onTestFailed, test } from 'vitest' import { instances, provider, runBrowserTests } from './utils' @@ -25,6 +26,20 @@ describe('running browser tests', async () => { events.push(`onBrowserInit ${project.name}`) }, }, + 'json', + { + onInit: noop, + onPathsCollected: noop, + onCollected: noop, + onFinished: noop, + onTaskUpdate: noop, + onTestRemoved: noop, + onWatcherStart: noop, + onWatcherRerun: noop, + onServerRestart: noop, + onUserConsoleLog: noop, + }, + 'default', ], })) diff --git a/test/browser/vitest.config.mts b/test/browser/vitest.config.mts index 82562c4625f7..e92e95105460 100644 --- a/test/browser/vitest.config.mts +++ b/test/browser/vitest.config.mts @@ -106,18 +106,6 @@ export default defineConfig({ html: './html/index.html', json: './browser.json', }, - reporters: ['json', { - onInit: noop, - onPathsCollected: noop, - onCollected: noop, - onFinished: noop, - onTaskUpdate: noop, - onTestRemoved: noop, - onWatcherStart: noop, - onWatcherRerun: noop, - onServerRestart: noop, - onUserConsoleLog: noop, - }, 'default'], env: { BROWSER: browser, }, diff --git a/test/core/test/injector-mock.test.ts b/test/core/test/injector-mock.test.ts index b0b9fd4ae4af..aa9e6ae3521d 100644 --- a/test/core/test/injector-mock.test.ts +++ b/test/core/test/injector-mock.test.ts @@ -27,6 +27,32 @@ function hoistSimpleCode(code: string) { return hoistMocks(code, '/test.js', parse, hoistMocksOptions)?.code.trim() } +test.only('ttt', () => { + console.log(hoistSimpleCode(` +vi.hoisted(() => { + if(!globalThis.__NUXT_VITEST_MOCKS){ + vi.stubGlobal("__NUXT_VITEST_MOCKS", {}) + } + }); +import { vi } from "vitest";vi.mock("/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts", async (importOriginal) => { + const mocks = globalThis.__NUXT_VITEST_MOCKS + if (!mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"]) { + mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"] = { ...await importOriginal("/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts") } + } + mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"]["useAutoImportSetupMocked"] = await (() => vi.fn(() => { + return "mocked in setup"; + }))(); + mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"]["useAutoImportSetupOverridenMocked"] = await (() => vi.fn(() => { + return "mocked in setup"; + }))(); + return mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"] +}); + +import { mockNuxtImport } from "@nuxt/test-utils/runtime"; +vi.resetModules(); + `)) +}) + test('hoists mock, unmock, hoisted', () => { expect(hoistSimpleCode(` vi.mock('path', () => {}) From 99c439bc498a34fa18c6f4bf0128b0e8a9737f73 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Wed, 15 Jan 2025 14:38:07 +0100 Subject: [PATCH 4/4] chore: oops --- test/browser/specs/runner.test.ts | 3 ++- test/browser/vitest.config.mts | 2 -- test/core/test/injector-mock.test.ts | 26 -------------------------- 3 files changed, 2 insertions(+), 29 deletions(-) diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index 949147f054f6..95a6d1f442ab 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -1,10 +1,11 @@ import type { Vitest } from 'vitest/node' import type { JsonTestResults } from 'vitest/reporters' import { readFile } from 'node:fs/promises' -import { noop } from '@vitest/utils' import { beforeAll, describe, expect, onTestFailed, test } from 'vitest' import { instances, provider, runBrowserTests } from './utils' +function noop() {} + describe('running browser tests', async () => { let stderr: string let stdout: string diff --git a/test/browser/vitest.config.mts b/test/browser/vitest.config.mts index e92e95105460..89331be8c974 100644 --- a/test/browser/vitest.config.mts +++ b/test/browser/vitest.config.mts @@ -6,8 +6,6 @@ import { defineConfig } from 'vitest/config' const dir = dirname(fileURLToPath(import.meta.url)) -function noop() {} - const provider = process.env.PROVIDER || 'playwright' const browser = process.env.BROWSER || (provider === 'playwright' ? 'chromium' : 'chrome') diff --git a/test/core/test/injector-mock.test.ts b/test/core/test/injector-mock.test.ts index aa9e6ae3521d..b0b9fd4ae4af 100644 --- a/test/core/test/injector-mock.test.ts +++ b/test/core/test/injector-mock.test.ts @@ -27,32 +27,6 @@ function hoistSimpleCode(code: string) { return hoistMocks(code, '/test.js', parse, hoistMocksOptions)?.code.trim() } -test.only('ttt', () => { - console.log(hoistSimpleCode(` -vi.hoisted(() => { - if(!globalThis.__NUXT_VITEST_MOCKS){ - vi.stubGlobal("__NUXT_VITEST_MOCKS", {}) - } - }); -import { vi } from "vitest";vi.mock("/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts", async (importOriginal) => { - const mocks = globalThis.__NUXT_VITEST_MOCKS - if (!mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"]) { - mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"] = { ...await importOriginal("/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts") } - } - mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"]["useAutoImportSetupMocked"] = await (() => vi.fn(() => { - return "mocked in setup"; - }))(); - mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"]["useAutoImportSetupOverridenMocked"] = await (() => vi.fn(() => { - return "mocked in setup"; - }))(); - return mocks["/Users/vladimir/Projects/test-utils/examples/app-vitest-full/composables/auto-import-mock.ts"] -}); - -import { mockNuxtImport } from "@nuxt/test-utils/runtime"; -vi.resetModules(); - `)) -}) - test('hoists mock, unmock, hoisted', () => { expect(hoistSimpleCode(` vi.mock('path', () => {})