Skip to content

Commit 1e7915b

Browse files
DevJoaoLopesAriPerkkio
andauthoredJan 15, 2025··
fix(browser): add instance validation to resolve coverage error (#7231)
Co-authored-by: Ari Perkkiö <ari.perkkio@gmail.com>
1 parent 0ad2860 commit 1e7915b

File tree

5 files changed

+142
-12
lines changed

5 files changed

+142
-12
lines changed
 

‎docs/guide/debugging.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ export default defineConfig({
5858
inspectBrk: true,
5959
fileParallelism: false,
6060
browser: {
61-
name: 'chromium',
6261
provider: 'playwright',
62+
instances: [{ browser: 'chromium' }]
6363
},
6464
},
6565
})

‎packages/vitest/src/node/config/resolveConfig.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -251,14 +251,22 @@ export function resolveConfig(
251251
}
252252
}
253253

254+
const playwrightChromiumOnly = browser.provider === 'playwright' && (browser.name === 'chromium' || browser.instances?.every(i => i.browser === 'chromium'))
255+
254256
// Browser-mode "Playwright + Chromium" only features:
255-
if (browser.enabled && !(browser.provider === 'playwright' && browser.name === 'chromium')) {
256-
const browserConfig = { browser: { provider: browser.provider, name: browser.name } }
257+
if (browser.enabled && !playwrightChromiumOnly) {
258+
const browserConfig = {
259+
browser: {
260+
provider: browser.provider,
261+
name: browser.name,
262+
instances: browser.instances,
263+
},
264+
}
257265

258266
if (resolved.coverage.enabled && resolved.coverage.provider === 'v8') {
259267
throw new Error(
260268
`@vitest/coverage-v8 does not work with\n${JSON.stringify(browserConfig, null, 2)}\n`
261-
+ `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', name: 'chromium' } }, null, 2)}`
269+
+ `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] } }, null, 2)}`
262270
+ `\n\n...or change your coverage provider to:\n${JSON.stringify({ coverage: { provider: 'istanbul' } }, null, 2)}\n`,
263271
)
264272
}
@@ -268,7 +276,7 @@ export function resolveConfig(
268276

269277
throw new Error(
270278
`${inspectOption} does not work with\n${JSON.stringify(browserConfig, null, 2)}\n`
271-
+ `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', name: 'chromium' } }, null, 2)}`
279+
+ `\nUse either:\n${JSON.stringify({ browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] } }, null, 2)}`
272280
+ `\n\n...or disable ${inspectOption}\n`,
273281
)
274282
}

‎packages/vitest/src/node/types/browser.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export interface BrowserConfigOptions {
9393

9494
/**
9595
* Name of the browser
96-
* @deprecated use `configs` instead. if both are defined, this will filter `configs` by name.
96+
* @deprecated use `instances` instead. if both are defined, this will filter `instances` by name.
9797
*/
9898
name?: string
9999

@@ -118,7 +118,7 @@ export interface BrowserConfigOptions {
118118
*
119119
* @example
120120
* { playwright: { launch: { devtools: true } }
121-
* @deprecated use `configs` instead
121+
* @deprecated use `instances` instead
122122
*/
123123
providerOptions?: BrowserProviderOptions
124124

‎test/config/fixtures/workspace/browser/workspace-with-browser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default defineWorkspace([
77
browser: {
88
enabled: true,
99
provider: 'webdriverio',
10-
name: 'chrome',
10+
instances: [{ browser: 'chrome' }]
1111
},
1212
}
1313
}

‎test/config/test/failures.test.ts

+126-4
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ Use either:
111111
{
112112
"browser": {
113113
"provider": "playwright",
114-
"name": "chromium"
114+
"instances": [
115+
{
116+
"browser": "chromium"
117+
}
118+
]
115119
}
116120
}
117121
@@ -122,7 +126,7 @@ Use either:
122126
}
123127
})
124128

125-
test('v8 coverage provider throws when not playwright + chromium', async () => {
129+
test('v8 coverage provider throws when not playwright + chromium (browser.name)', async () => {
126130
for (const { provider, name } of browsers) {
127131
if (provider === 'playwright' && name === 'chromium') {
128132
continue
@@ -152,7 +156,64 @@ Use either:
152156
{
153157
"browser": {
154158
"provider": "playwright",
155-
"name": "chromium"
159+
"instances": [
160+
{
161+
"browser": "chromium"
162+
}
163+
]
164+
}
165+
}
166+
167+
...or change your coverage provider to:
168+
{
169+
"coverage": {
170+
"provider": "istanbul"
171+
}
172+
}
173+
`,
174+
)
175+
}
176+
})
177+
178+
test('v8 coverage provider throws when not playwright + chromium (browser.instances)', async () => {
179+
for (const { provider, name } of browsers) {
180+
if (provider === 'playwright' && name === 'chromium') {
181+
continue
182+
}
183+
184+
const { stderr } = await runVitest({
185+
coverage: {
186+
enabled: true,
187+
},
188+
browser: {
189+
enabled: true,
190+
provider,
191+
instances: [{ browser: name }],
192+
},
193+
})
194+
195+
expect(stderr).toMatch(
196+
`Error: @vitest/coverage-v8 does not work with
197+
{
198+
"browser": {
199+
"provider": "${provider}",
200+
"instances": [
201+
{
202+
"browser": "${name}"
203+
}
204+
]
205+
}
206+
}
207+
208+
Use either:
209+
{
210+
"browser": {
211+
"provider": "playwright",
212+
"instances": [
213+
{
214+
"browser": "chromium"
215+
}
216+
]
156217
}
157218
}
158219
@@ -167,14 +228,75 @@ Use either:
167228
}
168229
})
169230

231+
test('v8 coverage provider throws when using chromium and other non-chromium browser', async () => {
232+
const { stderr } = await runVitest({
233+
coverage: {
234+
enabled: true,
235+
},
236+
browser: {
237+
enabled: true,
238+
headless: true,
239+
provider: 'playwright',
240+
instances: [
241+
{ browser: 'chromium' },
242+
{ browser: 'firefox' },
243+
{ browser: 'webkit' },
244+
],
245+
},
246+
})
247+
248+
expect(stderr).toMatch(
249+
`Error: @vitest/coverage-v8 does not work with
250+
{
251+
"browser": {
252+
"provider": "playwright",
253+
"instances": [
254+
{
255+
"browser": "chromium"
256+
},
257+
{
258+
"browser": "firefox"
259+
},
260+
{
261+
"browser": "webkit"
262+
}
263+
]
264+
}
265+
}
266+
267+
Use either:
268+
{
269+
"browser": {
270+
"provider": "playwright",
271+
"instances": [
272+
{
273+
"browser": "chromium"
274+
}
275+
]
276+
}
277+
}
278+
279+
...or change your coverage provider to:
280+
{
281+
"coverage": {
282+
"provider": "istanbul"
283+
}
284+
}`,
285+
)
286+
})
287+
170288
test('v8 coverage provider cannot be used in workspace without playwright + chromium', async () => {
171289
const { stderr } = await runVitest({ coverage: { enabled: true }, workspace: './fixtures/workspace/browser/workspace-with-browser.ts' })
172290
expect(stderr).toMatch(
173291
`Error: @vitest/coverage-v8 does not work with
174292
{
175293
"browser": {
176294
"provider": "webdriverio",
177-
"name": "chrome"
295+
"instances": [
296+
{
297+
"browser": "chrome"
298+
}
299+
]
178300
}
179301
}`,
180302
)

0 commit comments

Comments
 (0)
Please sign in to comment.