Skip to content

Commit bdd15dd

Browse files
authoredOct 22, 2024··
fix(browser): user event cleanup on retry (#6764)
1 parent b82584c commit bdd15dd

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed
 

‎packages/browser/src/client/tester/runner.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,12 @@ export function createBrowserRunner(
4040
this.config = options.config
4141
}
4242

43-
onAfterRunTask = async (task: Task) => {
43+
onBeforeTryTask: VitestRunner['onBeforeTryTask'] = async (...args) => {
4444
await userEvent.cleanup()
45+
await super.onBeforeTryTask?.(...args)
46+
}
47+
48+
onAfterRunTask = async (task: Task) => {
4549
await super.onAfterRunTask?.(task)
4650

4751
if (this.config.bail && task.result?.state === 'fail') {

‎packages/browser/src/client/tester/tester.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { SpyModule, collectTests, setupCommonEnv, startCoverageInsideWorker, startTests, stopCoverageInsideWorker } from 'vitest/browser'
2-
import { page } from '@vitest/browser/context'
2+
import { page, userEvent } from '@vitest/browser/context'
33
import type { IframeMockEvent, IframeMockInvalidateEvent, IframeUnmockEvent } from '@vitest/browser/client'
44
import { channel, client, onCancel, waitForChannel } from '@vitest/browser/client'
55
import { executor, getBrowserState, getConfig, getWorkerState } from '../utils'
@@ -168,6 +168,9 @@ async function executeTests(method: 'run' | 'collect', files: string[]) {
168168
if (cleanupSymbol in page) {
169169
(page[cleanupSymbol] as any)()
170170
}
171+
// need to cleanup for each tester
172+
// since playwright keybaord API is stateful on page instance level
173+
await userEvent.cleanup()
171174
}
172175
catch (error: any) {
173176
await client.rpc.onUnhandledError({
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { expect, onTestFinished, test } from 'vitest'
2+
import { userEvent } from '@vitest/browser/context'
3+
4+
test('cleanup retry', { retry: 1 }, async (ctx) => {
5+
let logs: any[] = [];
6+
function handler(e: KeyboardEvent) {
7+
logs.push([e.key, e.altKey]);
8+
};
9+
document.addEventListener('keydown', handler)
10+
onTestFinished(() => {
11+
document.removeEventListener('keydown', handler);
12+
})
13+
14+
await userEvent.keyboard('{Tab}')
15+
await userEvent.keyboard("{Alt>}")
16+
if (ctx.task.result.retryCount === 0) {
17+
throw new Error("test retry")
18+
}
19+
expect(logs).toEqual(
20+
[
21+
[
22+
"Tab",
23+
false,
24+
],
25+
[
26+
"Alt",
27+
true,
28+
],
29+
]
30+
)
31+
})

‎test/browser/specs/runner.test.ts

+1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ test('user-event', async () => {
144144
})
145145
expect(Object.fromEntries(ctx.state.getFiles().map(f => [f.name, f.result.state]))).toMatchInlineSnapshot(`
146146
{
147+
"cleanup-retry.test.ts": "pass",
147148
"cleanup1.test.ts": "pass",
148149
"cleanup2.test.ts": "pass",
149150
}

0 commit comments

Comments
 (0)
Please sign in to comment.