From 7d6e4b236b695f93f38804ad3ef4c06f59aa72f8 Mon Sep 17 00:00:00 2001 From: Younes Jaaidi Date: Thu, 30 Oct 2025 22:52:44 +0100 Subject: [PATCH 1/4] test(browser): add failing test for re-evaluating setupFiles on each run with isolate false --- .../fixtures/isolate-and-setup-file/a.test.ts | 7 +++++++ .../fixtures/isolate-and-setup-file/b.test.ts | 7 +++++++ .../isolate-and-setup-file/browser-setup.ts | 4 ++++ .../fixtures/isolate-and-setup-file/counter.ts | 6 ++++++ .../isolate-and-setup-file/vitest.config.ts | 17 +++++++++++++++++ test/browser/specs/runner.test.ts | 7 +++++++ 6 files changed, 48 insertions(+) create mode 100644 test/browser/fixtures/isolate-and-setup-file/a.test.ts create mode 100644 test/browser/fixtures/isolate-and-setup-file/b.test.ts create mode 100644 test/browser/fixtures/isolate-and-setup-file/browser-setup.ts create mode 100644 test/browser/fixtures/isolate-and-setup-file/counter.ts create mode 100644 test/browser/fixtures/isolate-and-setup-file/vitest.config.ts diff --git a/test/browser/fixtures/isolate-and-setup-file/a.test.ts b/test/browser/fixtures/isolate-and-setup-file/a.test.ts new file mode 100644 index 000000000000..f64e76edcfe3 --- /dev/null +++ b/test/browser/fixtures/isolate-and-setup-file/a.test.ts @@ -0,0 +1,7 @@ +import { expect, test } from 'vitest' +import { counter } from './counter' + +test('increment counter', () => { + counter.increment() + expect(counter.get()).toBe(1) +}); diff --git a/test/browser/fixtures/isolate-and-setup-file/b.test.ts b/test/browser/fixtures/isolate-and-setup-file/b.test.ts new file mode 100644 index 000000000000..ae17dd60aa58 --- /dev/null +++ b/test/browser/fixtures/isolate-and-setup-file/b.test.ts @@ -0,0 +1,7 @@ +import { expect, test } from 'vitest' +import { counter } from './counter' + +test('make sure the counter is reset by the setup file beforeEach hook', () => { + counter.increment() + expect(counter.get()).toBe(1) +}); diff --git a/test/browser/fixtures/isolate-and-setup-file/browser-setup.ts b/test/browser/fixtures/isolate-and-setup-file/browser-setup.ts new file mode 100644 index 000000000000..97b846db59c0 --- /dev/null +++ b/test/browser/fixtures/isolate-and-setup-file/browser-setup.ts @@ -0,0 +1,4 @@ +import { beforeEach } from 'vitest' +import { counter } from './counter' + +beforeEach(() => counter.reset()) diff --git a/test/browser/fixtures/isolate-and-setup-file/counter.ts b/test/browser/fixtures/isolate-and-setup-file/counter.ts new file mode 100644 index 000000000000..26a5c8484df6 --- /dev/null +++ b/test/browser/fixtures/isolate-and-setup-file/counter.ts @@ -0,0 +1,6 @@ +const g = globalThis as unknown as { counter: number }; +export const counter = { + get: () => g.counter, + increment: () => g.counter++, + reset: () => (g.counter = 0), +}; diff --git a/test/browser/fixtures/isolate-and-setup-file/vitest.config.ts b/test/browser/fixtures/isolate-and-setup-file/vitest.config.ts new file mode 100644 index 000000000000..dffd1c4e44e9 --- /dev/null +++ b/test/browser/fixtures/isolate-and-setup-file/vitest.config.ts @@ -0,0 +1,17 @@ +import { fileURLToPath } from 'node:url' +import { defineConfig } from 'vitest/config' +import { instances, provider } from '../../settings' + +export default defineConfig({ + cacheDir: fileURLToPath(new URL("./node_modules/.vite", import.meta.url)), + test: { + setupFiles: ['./browser-setup.ts'], + browser: { + enabled: true, + isolate: false, + provider, + instances, + headless: false, + }, + }, +}) diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index 1a0eb73a0894..f1a6a40b8250 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -290,6 +290,13 @@ test('in-source tests run correctly when filtered', async () => { expect(stdout).toContain(`Tests ${instances.length} passed`) }) +test.fails('re-evaluate setupFiles on each test run even when isolate is false', async () => { + const { exitCode } = await runBrowserTests({ + root: './fixtures/isolate-and-setup-file', + }) + expect(exitCode).toBe(0) +}) + test.runIf(provider.name === 'playwright')('timeout hooks', async ({ onTestFailed }) => { const { stderr } = await runBrowserTests({ root: './fixtures/timeout-hooks', From 298884dae816f3c66e1c1223718c07f5268e968a Mon Sep 17 00:00:00 2001 From: Younes Jaaidi Date: Thu, 30 Oct 2025 23:00:16 +0100 Subject: [PATCH 2/4] fix(browser): ensure setup files are re-evaluated on each test run (fixes #8883) --- packages/browser/src/client/tester/runner.ts | 4 +++- test/browser/specs/runner.test.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/browser/src/client/tester/runner.ts b/packages/browser/src/client/tester/runner.ts index d02eea215409..38ad263260f5 100644 --- a/packages/browser/src/client/tester/runner.ts +++ b/packages/browser/src/client/tester/runner.ts @@ -257,7 +257,9 @@ export function createBrowserRunner( importFile = async (filepath: string, mode: 'collect' | 'setup') => { let hash = this.hashMap.get(filepath) - if (!hash) { + + // if the mode is setup, we need to re-evaluate the setup file on each test run + if (mode === 'setup' || !hash) { hash = Date.now().toString() this.hashMap.set(filepath, hash) } diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index f1a6a40b8250..7a63aef5ebfa 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -290,7 +290,7 @@ test('in-source tests run correctly when filtered', async () => { expect(stdout).toContain(`Tests ${instances.length} passed`) }) -test.fails('re-evaluate setupFiles on each test run even when isolate is false', async () => { +test('re-evaluate setupFiles on each test run even when isolate is false', async () => { const { exitCode } = await runBrowserTests({ root: './fixtures/isolate-and-setup-file', }) From 8c377f423ac4c88ca2dde310fa652877370c18a6 Mon Sep 17 00:00:00 2001 From: Younes Jaaidi Date: Fri, 31 Oct 2025 11:20:39 +0100 Subject: [PATCH 3/4] test(browser): enhance test by checking output --- test/browser/specs/runner.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index 7a63aef5ebfa..44e8ba7fb7e9 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -291,10 +291,16 @@ test('in-source tests run correctly when filtered', async () => { }) test('re-evaluate setupFiles on each test run even when isolate is false', async () => { - const { exitCode } = await runBrowserTests({ + const { exitCode, stderr, stdout } = await runBrowserTests({ root: './fixtures/isolate-and-setup-file', }) + expect(exitCode).toBe(0) + expect(stderr).toBe('') + instances.forEach(({ browser }) => { + expect(stdout).toReportPassedTest('a.test.ts', browser) + expect(stdout).toReportPassedTest('b.test.ts', browser) + }) }) test.runIf(provider.name === 'playwright')('timeout hooks', async ({ onTestFailed }) => { From 0593aded77b50cee084a02775a69fddae942b2a2 Mon Sep 17 00:00:00 2001 From: Younes Jaaidi Date: Fri, 31 Oct 2025 11:39:30 +0100 Subject: [PATCH 4/4] test(browser): reorder expectations in runner test for debug clarity --- test/browser/specs/runner.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index 44e8ba7fb7e9..0a27004862a7 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -295,8 +295,8 @@ test('re-evaluate setupFiles on each test run even when isolate is false', async root: './fixtures/isolate-and-setup-file', }) - expect(exitCode).toBe(0) expect(stderr).toBe('') + expect(exitCode).toBe(0) instances.forEach(({ browser }) => { expect(stdout).toReportPassedTest('a.test.ts', browser) expect(stdout).toReportPassedTest('b.test.ts', browser)