11/* global document, jest, expect, beforeAll, afterAll */
22import React from 'react'
33import Enzyme from 'enzyme'
4+ import PropTypes from 'prop-types'
45import Adapter from 'enzyme-adapter-react-16'
56import { Swipeable , useSwipeable , LEFT , RIGHT , UP , DOWN } from '../index'
67import { createTouchEventObject as cte , createMouseEventObject as cme } from './helpers/events'
@@ -55,14 +56,22 @@ function mockListenersSetup(el) {
5556 */
5657function SwipeableUsingHook ( props ) {
5758 const eventHandlers = useSwipeable ( props )
59+ const Elem = props . nodeName
5860 // Use innerRef prop to access the mounted div for testing.
5961 const ref = el => ( props . innerRef && props . innerRef ( el ) , eventHandlers . ref ( el ) ) // eslint-disable-line
6062 return (
61- < div { ...eventHandlers } ref = { ref } >
63+ < Elem { ...eventHandlers } ref = { ref } >
6264 { props . children }
63- </ div >
65+ </ Elem >
6466 )
6567}
68+ SwipeableUsingHook . propTypes = {
69+ nodeName : PropTypes . string
70+ }
71+
72+ SwipeableUsingHook . defaultProps = {
73+ nodeName : 'div'
74+ }
6675
6776function setupGetMountedComponent ( TYPE , mockListeners = mockListenersSetup ) {
6877 return props => {
@@ -387,7 +396,7 @@ function setupGetMountedComponent(TYPE, mockListeners = mockListenersSetup) {
387396 } )
388397 } )
389398
390- it ( 'Cleans up and re-attaches touch event listeners' , ( ) => {
399+ it ( 'Cleans up and re-attaches touch event listeners if trackTouch changes ' , ( ) => {
391400 let spies
392401 const mockListeners = el => {
393402 // already spying
@@ -413,6 +422,32 @@ function setupGetMountedComponent(TYPE, mockListeners = mockListenersSetup) {
413422 expect ( spies . addEventListener ) . toHaveBeenCalledTimes ( 6 )
414423 expect ( spies . removeEventListener ) . toHaveBeenCalledTimes ( 3 )
415424 } )
425+
426+ it ( 'Cleans up and re-attaches touch event listeners if the DOM element changes' , ( ) => {
427+ let spies
428+ const mockListeners = el => {
429+ // already spying
430+ if ( spies ) return
431+ spies = { }
432+ spies . addEventListener = jest . spyOn ( el , 'addEventListener' )
433+ spies . removeEventListener = jest . spyOn ( el , 'removeEventListener' )
434+ }
435+ const { wrapper } = setupGetMountedComponent ( TYPE , mockListeners ) ( { } )
436+
437+ expect ( spies . addEventListener ) . toHaveBeenCalledTimes ( 3 )
438+ expect ( spies . removeEventListener ) . not . toHaveBeenCalled ( )
439+
440+ wrapper . setProps ( { nodeName : 'p' } )
441+
442+ expect ( spies . addEventListener ) . toHaveBeenCalledTimes ( 3 )
443+ expect ( spies . removeEventListener ) . toHaveBeenCalledTimes ( 3 )
444+ // VERIFY REMOVED HANDLERS ARE THE SAME ONES THAT WERE ADDED!
445+ expect ( spies . addEventListener . mock . calls . length ) . toBe ( 3 )
446+ spies . addEventListener . mock . calls . forEach ( ( call , idx ) => {
447+ expect ( spies . removeEventListener . mock . calls [ idx ] [ 0 ] ) . toBe ( call [ 0 ] )
448+ expect ( spies . removeEventListener . mock . calls [ idx ] [ 1 ] ) . toBe ( call [ 1 ] )
449+ } )
450+ } )
416451 } )
417452
418453 it ( `${ TYPE } handles updated prop swipe callbacks` , ( ) => {
@@ -423,15 +458,22 @@ function setupGetMountedComponent(TYPE, mockListeners = mockListenersSetup) {
423458 }
424459 const onSwipedLeft = jest . fn ( )
425460
461+ function TestHookComponent ( { next } ) {
462+ const handlers = useSwipeable ( { onSwipedLeft : next } )
463+ // Use innerRef to access the mounted div for testing.
464+ const ref = el => ( innerRef ( el ) , handlers . ref ( el ) )
465+ return < div { ...handlers } ref = { ref } />
466+ }
467+ TestHookComponent . propTypes = {
468+ next : PropTypes . func . isRequired
469+ }
470+
426471 function TestComponent ( ) {
427472 const [ page , setPage ] = React . useState ( 0 )
428473 const next = ( ) => ( setPage ( page + 1 ) , onSwipedLeft ( page + 1 ) )
429474
430475 if ( TYPE === USESWIPEABLE ) {
431- const handlers = useSwipeable ( { onSwipedLeft : next } )
432- // Use innerRef to access the mounted div for testing.
433- const ref = el => ( innerRef ( el ) , handlers . ref ( el ) )
434- return < div { ...handlers } ref = { ref } />
476+ return < TestHookComponent next = { next } />
435477 }
436478 if ( TYPE === SWIPEABLE ) {
437479 // Use innerRef to access the mounted div for testing.
0 commit comments