react-longpressable
Version:
Long-press component for React that uses pointer events.
114 lines (99 loc) • 3.39 kB
JavaScript
import React from 'react'
import LongPressable from '../src/index'
import Enzyme, { shallow } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
/**
* Creates a Promise that is resolved after delay.
* Good for using with async/await
*
* @param {number} delay in milliseconds
*/
function timeout(delay) {
return new Promise(resolve => setTimeout(resolve, delay))
}
Enzyme.configure( { adapter: new Adapter() } )
function renderLongPressable(onShortPress, onLongPress, longPressTime,
dragThreshold = 5) {
return shallow(
<LongPressable
onShortPress={onShortPress}
onLongPress={onLongPress}
longPressTime={longPressTime}
dragThreshold={dragThreshold}
/>
)
}
function getDefaultProps() {
return {
onLongPress: jest.fn(),
onShortPress: jest.fn(),
longPressTime: 300
}
}
describe('<LongPressable />', () => {
it('fires onLongPress and not onShortPress when long-pressed', async() => {
const { onLongPress, onShortPress, longPressTime } = getDefaultProps()
const defaultEvent = {
clientX: 0,
clientY: 0
}
const wrapper = renderLongPressable(onShortPress, onLongPress, longPressTime)
wrapper.instance().onPointerDown(defaultEvent)
await timeout(longPressTime + 1)
wrapper.instance().onPointerUp(defaultEvent)
expect(onShortPress).toHaveBeenCalledTimes(0)
expect(onLongPress).toHaveBeenCalledTimes(1)
} )
it('fires onShortPress and not onLongPress when short-pressed', async() => {
const { onLongPress, onShortPress, longPressTime } = getDefaultProps()
const defaultEvent = {
clientX: 0,
clientY: 0
}
const wrapper = renderLongPressable(onShortPress, onLongPress, longPressTime)
wrapper.instance().onPointerDown(defaultEvent)
wrapper.instance().onPointerUp(defaultEvent)
expect(onShortPress).toHaveBeenCalledTimes(1)
expect(onLongPress).toHaveBeenCalledTimes(0)
} )
it('still fires onLongPress if pointer moves less than dragThreshold', async() => {
const { onLongPress, onShortPress, longPressTime } = getDefaultProps()
const dragThreshold = 5
const defaultEvent = {
clientX: 0,
clientY: 0
}
const movedEvent = {
clientX: 1,
clientY: 1
}
const wrapper = renderLongPressable(onShortPress, onLongPress, longPressTime,
dragThreshold)
wrapper.instance().onPointerDown(defaultEvent)
wrapper.instance().onPointerMove(movedEvent)
await timeout(longPressTime + 1)
wrapper.instance().onPointerUp(defaultEvent)
expect(onShortPress).toHaveBeenCalledTimes(0)
expect(onLongPress).toHaveBeenCalledTimes(1)
} )
it('does not fire onLongPress if pointer moves more than dragThreshold', async() => {
const { onLongPress, onShortPress, longPressTime } = getDefaultProps()
const dragThreshold = 5
const defaultEvent = {
clientX: 0,
clientY: 0
}
const movedEvent = {
clientX: 100,
clientY: 100
}
const wrapper = renderLongPressable(onShortPress, onLongPress, longPressTime,
dragThreshold)
wrapper.instance().onPointerDown(defaultEvent)
wrapper.instance().onPointerMove(movedEvent)
await timeout(longPressTime + 1)
wrapper.instance().onPointerUp(defaultEvent)
expect(onShortPress).toHaveBeenCalledTimes(1)
expect(onLongPress).toHaveBeenCalledTimes(0)
} )
} )