mirror of
https://github.com/hanzoai/vitest.git
synced 2026-09-24 17:04:25 +00:00
87 lines
2.8 KiB
TypeScript
87 lines
2.8 KiB
TypeScript
import { describe, test, vi } from 'vitest'
|
|
import { userEvent, page } from 'vitest/browser'
|
|
|
|
describe.for([
|
|
'userEvent',
|
|
'locator'
|
|
] as const)('`%s`', (testType) => {
|
|
test.for([
|
|
['up', { deltaX: 0, deltaY: -100 }],
|
|
['down', { deltaX: 0, deltaY: 100 }],
|
|
['left', { deltaX: -100, deltaY: 0 }],
|
|
['right', { deltaX: 100, deltaY: 0 }]
|
|
] as const)('scrolls %s with default delta of 100', async ([direction, { deltaX, deltaY }], { expect }) => {
|
|
document.body.innerHTML = `
|
|
<div style="padding: 1rem;">
|
|
<button>Scroll Me</button>
|
|
</div>
|
|
`;
|
|
|
|
const wheel = vi.fn<(event: WheelEvent) => void>()
|
|
document.body.querySelector('button').addEventListener('wheel', wheel, { passive: true })
|
|
|
|
const options = { direction }
|
|
const selector = page.getByRole("button")
|
|
|
|
await (testType === 'userEvent' ? userEvent.wheel(selector, options) : selector.wheel(options))
|
|
|
|
await expect.poll(() => wheel).toHaveBeenCalledOnce()
|
|
expect(wheel.mock.calls[0][0].deltaX).toBe(deltaX)
|
|
expect(wheel.mock.calls[0][0].deltaY).toBe(deltaY)
|
|
})
|
|
|
|
test.for([
|
|
{ deltaX: 0, deltaY: -50 },
|
|
{ deltaX: 0, deltaY: 50 },
|
|
{ deltaX: -50, deltaY: 0 },
|
|
{ deltaX: 50, deltaY: 0 }
|
|
] as const)('scrolls with custom delta values %o', async ({ deltaX, deltaY }, { expect }) => {
|
|
document.body.innerHTML = `
|
|
<div style="padding: 1rem;">
|
|
<button>Scroll Me</button>
|
|
</div>
|
|
`;
|
|
|
|
const wheel = vi.fn<(event: WheelEvent) => void>()
|
|
document.body.querySelector('button').addEventListener('wheel', wheel, { passive: true })
|
|
|
|
const options = {
|
|
delta: {
|
|
x: deltaX,
|
|
y: deltaY,
|
|
},
|
|
}
|
|
const selector = page.getByRole("button")
|
|
|
|
await (testType === 'userEvent' ? userEvent.wheel(selector, options) : selector.wheel(options))
|
|
|
|
// the browser dispatches the event asynchronously, poll like the tests above
|
|
await expect.poll(() => wheel).toHaveBeenCalledOnce()
|
|
expect(wheel.mock.calls[0][0].deltaX).toBe(deltaX)
|
|
expect(wheel.mock.calls[0][0].deltaY).toBe(deltaY)
|
|
})
|
|
|
|
test("fires wheel event multiple times when `times` option is set", { retry: 5 }, async ({ expect }) => {
|
|
document.body.innerHTML = `
|
|
<div style="padding: 1rem;">
|
|
<button>Scroll Me</button>
|
|
</div>
|
|
`;
|
|
|
|
const wheel = vi.fn<(event: WheelEvent) => void>()
|
|
document.body.querySelector('button').addEventListener('wheel', wheel, { passive: true })
|
|
|
|
const options = { direction: 'down', times: 5 } as const
|
|
const selector = page.getByRole("button")
|
|
|
|
await (testType === 'userEvent' ? userEvent.wheel(selector, options) : selector.wheel(options))
|
|
|
|
expect(wheel).toHaveBeenCalledTimes(5)
|
|
|
|
for (const call of wheel.mock.calls) {
|
|
expect(call[0].deltaX).toBe(0)
|
|
expect(call[0].deltaY).toBe(100)
|
|
}
|
|
})
|
|
})
|