[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

fix(browser): handle config.base (#4686) (#4692)

Co-authored-by: Vladimir Sheremet <sleuths.slews0s@icloud.com>

authored by

Mike Bland
Vladimir Sheremet
and committed by
GitHub
(Jan 4, 2024, 3:11 PM +0100) 9e34557e b8140fca

+82 -41
+2 -2
packages/browser/src/client/logger.ts
··· 3 3 4 4 const { Date, console } = globalThis 5 5 6 - export async function setupConsoleLogSpy() { 7 - const { stringify, format, inspect } = await importId('vitest/utils') as typeof import('vitest/utils') 6 + export async function setupConsoleLogSpy(basePath: string) { 7 + const { stringify, format, inspect } = await importId('vitest/utils', basePath) as typeof import('vitest/utils') 8 8 const { log, info, error, dir, dirxml, trace, time, timeEnd, timeLog, warn, debug, count, countReset } = console 9 9 const formatInput = (input: unknown) => { 10 10 if (input instanceof Node)
+7 -4
packages/browser/src/client/main.ts
··· 3 3 import type { CancelReason, VitestRunner } from '@vitest/runner' 4 4 import type { VitestExecutor } from '../../../vitest/src/runtime/execute' 5 5 import { createBrowserRunner } from './runner' 6 - import { importId } from './utils' 6 + import { importId as _importId } from './utils' 7 7 import { setupConsoleLogSpy } from './logger' 8 8 import { createSafeRpc, rpc, rpcDone } from './rpc' 9 9 import { setupDialogsSpy } from './dialog' ··· 23 23 const url = new URL(location.href) 24 24 const testId = url.searchParams.get('id') || 'unknown' 25 25 const reloadTries = Number(url.searchParams.get('reloadTries') || '0') 26 + 27 + const basePath = () => config?.base || '/' 28 + const importId = (id: string) => _importId(id, basePath()) 29 + const viteClientPath = () => `${basePath()}@vite/client` 26 30 27 31 function getQueryPaths() { 28 32 return url.searchParams.getAll('path') ··· 181 185 const iFrame = document.getElementById('vitest-ui') as HTMLIFrameElement 182 186 iFrame.setAttribute('src', '/__vitest__/') 183 187 184 - await setupConsoleLogSpy() 188 + await setupConsoleLogSpy(basePath()) 185 189 setupDialogsSpy() 186 190 await runTests(paths, config!) 187 191 }) 188 192 189 193 async function prepareTestEnvironment(config: ResolvedConfig) { 190 194 // need to import it before any other import, otherwise Vite optimizer will hang 191 - const viteClientPath = '/@vite/client' 192 - await import(viteClientPath) 195 + await import(viteClientPath()) 193 196 194 197 const { 195 198 startTests,
+6 -5
packages/browser/src/client/runner.ts
··· 12 12 } 13 13 14 14 export function createBrowserRunner( 15 - original: { new(config: ResolvedConfig): VitestRunner }, 15 + VitestRunner: { new(config: ResolvedConfig): VitestRunner }, 16 16 coverageModule: CoverageHandler | null, 17 17 ): { new(options: BrowserRunnerOptions): VitestRunner } { 18 - return class BrowserTestRunner extends original { 18 + return class BrowserTestRunner extends VitestRunner { 19 19 public config: ResolvedConfig 20 20 hashMap = new Map<string, [test: boolean, timstamp: string]>() 21 21 ··· 69 69 hash = Date.now().toString() 70 70 this.hashMap.set(filepath, [false, hash]) 71 71 } 72 + const base = this.config.base || '/' 72 73 73 74 // on Windows we need the unit to resolve the test file 74 - const importpath = /^\w:/.test(filepath) 75 - ? `/@fs/${filepath}?${test ? 'browserv' : 'v'}=${hash}` 76 - : `${filepath}?${test ? 'browserv' : 'v'}=${hash}` 75 + const prefix = `${base}${/^\w:/.test(filepath) ? '@fs/' : ''}` 76 + const query = `${test ? 'browserv' : 'v'}=${hash}` 77 + const importpath = `${prefix}${filepath}?${query}`.replace(/\/+/g, '/') 77 78 await import(importpath) 78 79 } 79 80 }
+2 -2
packages/browser/src/client/utils.ts
··· 1 - export async function importId(id: string) { 2 - const name = `/@id/${id}` 1 + export async function importId(id: string, basePath: string) { 2 + const name = `${basePath}@id/${id}` 3 3 // @ts-expect-error mocking vitest apis 4 4 return __vi_wrap_module__(import(name)) 5 5 }
+3 -3
test/browser/package.json
··· 4 4 "private": true, 5 5 "scripts": { 6 6 "test": "pnpm run test:webdriverio && pnpm run test:playwright", 7 - "test:webdriverio": "PROVIDER=webdriverio node --test specs/", 8 - "test:playwright": "PROVIDER=playwright node --test specs/", 9 - "test:safaridriver": "PROVIDER=webdriverio BROWSER=safari node --test specs/", 7 + "test:webdriverio": "PROVIDER=webdriverio node --test --test-concurrency=1 specs/", 8 + "test:playwright": "PROVIDER=playwright node --test --test-concurrency=1 specs/", 9 + "test:safaridriver": "PROVIDER=webdriverio BROWSER=safari node --test --test-concurrency=1 specs/", 10 10 "coverage": "vitest --coverage.enabled --coverage.provider=istanbul --browser.headless=yes" 11 11 }, 12 12 "devDependencies": {
+20
test/browser/specs/fix-4686.test.mjs
··· 1 + // fix #4686 2 + 3 + import assert from 'node:assert' 4 + import test from 'node:test' 5 + import runVitest from './run-vitest.mjs' 6 + 7 + const { 8 + stderr, 9 + browserResultJson, 10 + passedTests, 11 + failedTests, 12 + } = await runVitest(['--config', 'vitest.config-basepath.mts', 'basic.test.ts']) 13 + 14 + await test('tests run in presence of config.base', async () => { 15 + assert.ok(browserResultJson.testResults.length === 1, 'Not all the tests have been run') 16 + assert.ok(passedTests.length === 1, 'Some tests failed') 17 + assert.ok(failedTests.length === 0, 'Some tests have passed but should fail') 18 + 19 + assert.doesNotMatch(stderr, /Unhandled Error/, 'doesn\'t have any unhandled errors') 20 + })
+30
test/browser/specs/run-vitest.mjs
··· 1 + import { readFile } from 'node:fs/promises' 2 + import { execa } from 'execa' 3 + 4 + const browser = process.env.BROWSER || (process.env.PROVIDER === 'playwright' ? 'chromium' : 'chrome') 5 + 6 + export default async function runVitest(moreArgs = []) { 7 + const argv = ['vitest', '--run', `--browser.name=${browser}`] 8 + 9 + if (browser !== 'safari') 10 + argv.push('--browser.headless') 11 + 12 + const { stderr, stdout } = await execa('npx', argv.concat(moreArgs), { 13 + env: { 14 + ...process.env, 15 + CI: 'true', 16 + NO_COLOR: 'true', 17 + }, 18 + reject: false, 19 + }) 20 + const browserResult = await readFile('./browser.json', 'utf-8') 21 + const browserResultJson = JSON.parse(browserResult) 22 + 23 + const getPassed = results => results.filter(result => result.status === 'passed') 24 + const getFailed = results => results.filter(result => result.status === 'failed') 25 + 26 + const passedTests = getPassed(browserResultJson.testResults) 27 + const failedTests = getFailed(browserResultJson.testResults) 28 + 29 + return { stderr, stdout, browserResultJson, passedTests, failedTests } 30 + }
+8 -25
test/browser/specs/runner.test.mjs
··· 1 1 import assert from 'node:assert' 2 - import { readFile } from 'node:fs/promises' 3 2 import test from 'node:test' 4 - import { execa } from 'execa' 3 + import runVitest from './run-vitest.mjs' 5 4 6 - const browser = process.env.BROWSER || (process.env.PROVIDER === 'playwright' ? 'chromium' : 'chrome') 7 - const argv = ['vitest', '--run', `--browser.name=${browser}`] 8 - 9 - if (browser !== 'safari') 10 - argv.push('--browser.headless') 11 - 12 - const { stderr, stdout } = await execa('npx', argv, { 13 - env: { 14 - ...process.env, 15 - CI: 'true', 16 - NO_COLOR: 'true', 17 - }, 18 - reject: false, 19 - }) 20 - 21 - const browserResult = await readFile('./browser.json', 'utf-8') 22 - const browserResultJson = JSON.parse(browserResult) 23 - 24 - const getPassed = results => results.filter(result => result.status === 'passed') 25 - const getFailed = results => results.filter(result => result.status === 'failed') 26 - 27 - const passedTests = getPassed(browserResultJson.testResults) 28 - const failedTests = getFailed(browserResultJson.testResults) 5 + const { 6 + stderr, 7 + stdout, 8 + browserResultJson, 9 + passedTests, 10 + failedTests, 11 + } = await runVitest() 29 12 30 13 await test('tests are actually running', async () => { 31 14 assert.ok(browserResultJson.testResults.length === 10, 'Not all the tests have been run')
+4
test/browser/vitest.config-basepath.mts
··· 1 + import { defineConfig, mergeConfig } from 'vitest/config' 2 + import baseConfig from './vitest.config.mjs' 3 + 4 + export default mergeConfig(baseConfig, defineConfig({ base: '/fix-4686' }))