testing-library / user-event

🐕 Simulate user events
https://testing-library.com/user-event
MIT License
2.19k stars 249 forks source link

Clipboard stub state is not reset in Vitest (or any runner without globals) #1232

Open mcous opened 3 months ago

mcous commented 3 months ago

Reproduction example

https://codesandbox.io/p/github/mcous/user-event-clipboard-leak/main?import=true

Prerequisites

  1. Configure Vitest in non-globals mode (the default)
  2. Call userEvent.setup() in a test
  3. Copy something to the clipboard in a test
  4. Inspect the clipboard in a later test

Expected behavior

Clipboard state should be reset between tests, or there should be a documented way to add that clipboard cleanup to one's suite.

Without globals mode, I see a couple possible solutions. Adding one or both of these would be appropriate, I think:

  1. The module should export cleanup functions from the root (like other @testing-library modules) so a user can add cleanup to their test hooks manually
  2. Calling userEvent.setup should reset clipboard stub state

Actual behavior

User-event version

14.5.2

Environment

No response

Additional context

Let me know if you need any assistance resolving this bug! I maintain @testing-library/svelte and I'm happy to jump in here, too, if it's helpful

As a workaround - since I'm not willing to enable globals mode - I am currently adding this to my global test setup file. It's not pretty, obvious, nor documented, so it would be nice if user-event could provide a blessed way to do this in Vitest

import { afterAll, afterEach } from 'vitest';
import {
  detachClipboardStubFromView,
  resetClipboardStubOnView,
} from '@testing-library/user-event/dist/esm/utils/dataTransfer/Clipboard.js';

afterEach(() => {
  resetClipboardStubOnView(window);
});

afterAll(() => {
  detachClipboardStubFromView(window);
});