{"record":{"id":"6c9a9d1f1f8b05a2","repo":"vitest-dev/vitest","slug":"the-preview-provider-doesn-t-support-userevent","errorCode":null,"errorMessage":"The \"preview\" provider doesn't support 'userEvent.dragAndDrop'","messagePattern":"The \"preview\" provider doesn't support 'userEvent\\.dragAndDrop'","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/browser/src/client/tester/context.ts","lineNumber":225,"sourceCode":"          basename: string\n          mime: string\n        }>('__vitest_fileInfo', [file, 'base64'])\n\n        const fileInstance = fetch(`data:${mime};base64,${base64}`)\n          .then(r => r.blob())\n          .then(blob => new File([blob], basename, { type: mime }))\n        return fileInstance\n      })\n      const uploadFiles = await Promise.all(uploadPromise)\n      return userEvent.upload(toElement(element) as HTMLElement, uploadFiles)\n    },\n\n    async fill(element, text) {\n      await userEvent.clear(toElement(element))\n      return userEvent.type(toElement(element), text)\n    },\n    async dragAndDrop() {\n      throw new Error(`The \"preview\" provider doesn't support 'userEvent.dragAndDrop'`)\n    },\n\n    async type(element, text, options) {\n      await userEvent.type(toElement(element), text, options)\n    },\n    async tab(options) {\n      await userEvent.tab(options)\n    },\n    async keyboard(text: string) {\n      await userEvent.keyboard(text)\n    },\n\n    async copy() {\n      clipboardData = await userEvent.copy()\n    },\n    async cut() {\n      clipboardData = await userEvent.cut()\n    },","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/vitest-dev/vitest/blob/1fa9837ec26533512fdcad8baebf249771bd340a/packages/browser/src/client/tester/context.ts#L207-L243","documentation":"Vitest's built-in preview user-event provider (the default, lightweight DOM-event-based provider) deliberately omits dragAndDrop because true drag-and-drop requires richer input simulation than the preview provider offers. The dragAndDrop method is stubbed to throw immediately so users discover the limitation rather than get silent no-ops. To use dragAndDrop you must switch to the Playwright or WebDriverIO browser provider.","triggerScenarios":"Calling await page.userEvent.dragAndDrop(source, target) (or expect.dragAndDrop) while browser.provider is 'preview' (the default). Running browser tests with @vitest/browser without configuring provider: 'playwright' or provider: 'webdriverio'.","commonSituations":"Default Vitest browser config that does not set a provider; copying example code from docs that assumes a full provider; CI where only the preview provider is installed; upgrading from a version where the call silently failed.","solutions":["Set tester.provider to 'playwright' (or 'webdriverio') in vitest.config under test.browser, and install @vitest/browser-provider-playwright.","Replace the dragAndDrop call with a manual sequence of pointer events via dispatchEvent on the preview provider, if you must stay on preview.","Confirm the provider is actually applied by logging getBrowserState().provider in a test."],"exampleFix":"// before (vitest.config.ts)\nexport default defineConfig({ test: { browser: { enabled: true, provider: 'preview' } } })\n// after\nexport default defineConfig({ test: { browser: { enabled: true, provider: 'playwright' } } })","handlingStrategy":"validation","validationCode":"const provider = getBrowserState().provider\nif (provider === 'preview' && typeof page.userEvent.dragAndDrop === 'function') {\n  // will throw — pick a different approach\n  await dispatchDragSequence(source, target)\n} else {\n  await page.userEvent.dragAndDrop(source, target)\n}","typeGuard":"function supportsDragAndDrop(): boolean {\n  return getBrowserState().provider !== 'preview'\n}","tryCatchPattern":null,"preventionTips":["Pin test.browser.provider to 'playwright' or 'webdriverio' when tests rely on dragAndDrop.","Document provider capabilities in the test README so contributors do not assume preview supports all actions.","Run a smoke test that lists getBrowserState().provider in CI logs."],"tags":["browser","user-event","provider","preview","drag-and-drop"],"backgroundTag":null,"analyzedSha":"1fa9837ec26533512fdcad8baebf249771bd340a","analyzedAt":"2026-08-11T16:11:39.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}