Skip to content

Commit 9f710d3

Browse files
authored
fix(browser): don't hang when ui: true in projects (#10994)
1 parent 66c1cbb commit 9f710d3

3 files changed

Lines changed: 62 additions & 3 deletions

File tree

packages/vitest/src/api/setup.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export function setup(ctx: Vitest, _server?: ViteDevServer): void {
215215
ctx.reporters.push(new WebSocketReporter(ctx, wss, clients))
216216
}
217217

218-
export class WebSocketReporter implements Reporter {
218+
class WebSocketReporter implements Reporter {
219219
private start = 0
220220
private end = 0
221221
constructor(

packages/vitest/src/node/core.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { deepClone, deepMerge, nanoid, noop, toArray } from '@vitest/utils/helpe
2626
import { serializeValue } from '@vitest/utils/serialize'
2727
import { join, normalize, relative } from 'pathe'
2828
import { version } from '../../package.json' with { type: 'json' }
29+
import { setup as wsApiSetup } from '../api/setup'
2930
import { defaultBrowserPort } from '../constants'
3031
import { distDir } from '../paths'
3132
import { createTagsFilter } from '../runtime/runner/utils/tags'
@@ -447,8 +448,22 @@ export class Vitest {
447448
// root-level browser server the API lives on the same shared httpServer and
448449
// is only needed when a UI (Vitest dashboard or browser orchestrator) is served.
449450
const apiNeeded = !this._rootBrowserParent || resolved.ui || resolved.browser.ui
450-
if (resolved.api && resolved.watch && apiNeeded) {
451-
(await import('../api/setup')).setup(this)
451+
const rootApi = resolved.api && resolved.watch && apiNeeded
452+
if (rootApi) {
453+
wsApiSetup(this)
454+
}
455+
456+
const attachedApiServers = new Set([rootApi ? this.vite.httpServer : null])
457+
for (const project of this.projects) {
458+
const browserServer = project.vite
459+
if (
460+
project.config.browser.ui
461+
&& browserServer?.httpServer
462+
&& !attachedApiServers.has(browserServer.httpServer)
463+
) {
464+
attachedApiServers.add(browserServer.httpServer)
465+
wsApiSetup(this, browserServer)
466+
}
452467
}
453468

454469
await this._fsCache.ensureCacheIntegrity()
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { expect, test } from 'vitest'
2+
import { runInlineTests } from '../../test-utils'
3+
import { provider } from '../settings'
4+
5+
test.runIf(provider.name === 'playwright')('browser ui enabled in projects setup (#10993)', async () => {
6+
const { stderr, exitCode, testTree } = await runInlineTests(
7+
{
8+
'basic.test.ts': `
9+
import { expect, test } from 'vitest'
10+
11+
test('works', () => {
12+
expect(1 + 1).toBe(2)
13+
})
14+
`,
15+
},
16+
{
17+
watch: false,
18+
reporters: 'none',
19+
projects: [
20+
{
21+
test: {
22+
browser: {
23+
enabled: true,
24+
headless: true,
25+
ui: true,
26+
provider,
27+
instances: [{ browser: 'chromium' }],
28+
},
29+
},
30+
},
31+
],
32+
},
33+
)
34+
35+
expect(stderr).toBe('')
36+
expect(exitCode).toBe(0)
37+
expect(testTree()).toMatchInlineSnapshot(`
38+
{
39+
"basic.test.ts": {
40+
"works": "passed",
41+
},
42+
}
43+
`)
44+
})

0 commit comments

Comments
 (0)
Sponsor
SponsoredKunjungi sekarang
Promo