Skip to content

Commit

Permalink
updated implementation for the controller to listen gracefully to taps
Browse files Browse the repository at this point in the history
  • Loading branch information
ylkhayat committed Sep 20, 2021
1 parent e696411 commit 987c5e6
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 29 deletions.
4 changes: 2 additions & 2 deletions __tests__/Container.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { render, fireEvent } from '@testing-library/react-native'
import React from 'react'
import { Pressable, View } from 'react-native'
import Container from '../src/Container'
import { tap } from '../src/utils'
import { events } from '../src/utils'

describe("Container testing suite | handling different use cases of the Container's behavior.", () => {
test('Container renders a single child', () => {
Expand Down Expand Up @@ -34,7 +34,7 @@ describe("Container testing suite | handling different use cases of the Containe
<View />
</Container>
)
tap(getByTestId('container'))
events.tap(getByTestId('container'))
expect(onPress).toHaveBeenCalled()
})

Expand Down
76 changes: 59 additions & 17 deletions __tests__/Controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
getLength,
reset
} from '../src/ref'
import { tap } from '../src/utils'
import { events } from '../src/utils'

describe('Controller testing suite | handling different use cases of the Controller behavior.', () => {
afterEach(() => {
Expand All @@ -20,17 +20,17 @@ describe('Controller testing suite | handling different use cases of the Control

describe('Rendering Related', () => {
test('Container renders a single controller child', () => {
const { getAllByTestId } = render(
const { getByTestId } = render(
<Container>
<Controller isFocusable={false}>
<View testID='child' />
</Controller>
</Container>
)
expect(getAllByTestId('child')).toBeDefined()
expect(getByTestId('child')).toBeDefined()
})
test('Container renders multiple controllers', () => {
const { getAllByTestId } = render(
const { getByTestId } = render(
<Container>
<Controller isFocusable={false}>
<View testID='child#1' />
Expand All @@ -40,8 +40,50 @@ describe('Controller testing suite | handling different use cases of the Control
</Controller>
</Container>
)
expect(getAllByTestId('child#1')).toBeDefined()
expect(getAllByTestId('child#2')).toBeDefined()
expect(getByTestId('child#1')).toBeDefined()
expect(getByTestId('child#2')).toBeDefined()
})
})

describe('Handling Touches', () => {
test("Controller presses does not trigger Container's", () => {
const onContainerPress = jest.fn(() => {})
const onControllerPress = jest.fn(() => {})

const { getByTestId } = render(
<Container testID='cntr#1' onPress={onContainerPress}>
<Controller
isFocusable={false}
testID='ctrlr#1'
onPress={onControllerPress}
>
<View />
</Controller>
</Container>
)
events.tap(getByTestId('ctrlr#1'))
expect(onControllerPress).toHaveBeenCalled()
expect(onContainerPress).toHaveBeenCalledTimes(0)
})

test("Container presses does not trigger Controller's", () => {
const onContainerPress = jest.fn(() => {})
const onControllerPress = jest.fn(() => {})

const { getByTestId } = render(
<Container testID='cntr#1' onPress={onContainerPress}>
<Controller
isFocusable={false}
testID='ctrlr#1'
onPress={onControllerPress}
>
<View />
</Controller>
</Container>
)
events.tap(getByTestId('cntr#1'))
expect(onContainerPress).toHaveBeenCalled()
expect(onControllerPress).toHaveBeenCalledTimes(0)
})
})

Expand Down Expand Up @@ -115,7 +157,7 @@ describe('Controller testing suite | handling different use cases of the Control
)

expect(getFocused()).toBeUndefined()
tap(getByTestId('ctrlr'))
events.tap(getByTestId('ctrlr'))
expect(onFocus).toHaveBeenCalled()
expect(getFocused()).toBeDefined()
})
Expand All @@ -130,7 +172,7 @@ describe('Controller testing suite | handling different use cases of the Control
)

expect(getFocused()).toBeUndefined()
tap(getByTestId('ctrlr'))
events.tap(getByTestId('ctrlr'))
expect(getFocused()).toBeUndefined()
})
})
Expand All @@ -157,7 +199,7 @@ describe('Controller testing suite | handling different use cases of the Control
</Container>
)
expect(getFocused()).toBeUndefined()
tap(getByTestId('ctrlr'))
events.tap(getByTestId('ctrlr'))
expect(onContainerPress).toHaveBeenCalledTimes(0)
expect(onControllerFocus).toHaveBeenCalled()
expect(onCustomTextInputFocus).toHaveBeenCalled()
Expand All @@ -172,9 +214,9 @@ describe('Controller testing suite | handling different use cases of the Control
</Controller>
</Container>
)
tap(getByTestId('ctrlr'))
events.tap(getByTestId('ctrlr'))
expect(getFocused()).toBeDefined()
tap(getByTestId('ctnr'))
events.tap(getByTestId('ctnr'))
expect(getFocused()).toBeUndefined()
})

Expand All @@ -191,9 +233,9 @@ describe('Controller testing suite | handling different use cases of the Control
</Controller>
</Container>
)
tap(getByTestId('ctrlr'))
events.tap(getByTestId('ctrlr'))
expect(getFocused()).toBeDefined()
tap(getByTestId('ctnr'))
events.tap(getByTestId('ctnr'))
expect(getFocused()).toBeDefined()
})
test('Focused Controller gets blurred properly once clicking on another Controller when onBlur returns true', () => {
Expand All @@ -212,10 +254,10 @@ describe('Controller testing suite | handling different use cases of the Control
</Controller>
</Container>
)
tap(getByTestId('ctrlr#1'))
events.tap(getByTestId('ctrlr#1'))
expect(getFocused()).toBeDefined()
const focused1 = getFocusedId()
tap(getByTestId('ctrlr#2'))
events.tap(getByTestId('ctrlr#2'))
expect(getFocused()).toBeDefined()
const focused2 = getFocusedId()
expect(focused1).not.toEqual(focused2)
Expand All @@ -236,10 +278,10 @@ describe('Controller testing suite | handling different use cases of the Control
</Controller>
</Container>
)
tap(getByTestId('ctrlr#1'))
events.tap(getByTestId('ctrlr#1'))
expect(getFocused()).toBeDefined()
const focused1 = getFocusedId()
tap(getByTestId('ctrlr#2'))
events.tap(getByTestId('ctrlr#2'))
expect(getFocused()).toBeDefined()
const focused2 = getFocusedId()
expect(focused1).not.toEqual(focused2)
Expand Down
8 changes: 1 addition & 7 deletions src/Container.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ type Props = ViewProps & {
onPress?: () => void
}

const _onStartShouldSetResponder = () => true

const Container = ({ children, onPress, ...props }: Props) => {
const onContainerPress = useCallback(
(_: GestureResponderEvent) => {
Expand All @@ -20,11 +18,7 @@ const Container = ({ children, onPress, ...props }: Props) => {
)

return (
<View
{...props}
onStartShouldSetResponder={_onStartShouldSetResponder}
onResponderRelease={onContainerPress}
>
<View {...props} onResponderRelease={onContainerPress}>
{children}
</View>
)
Expand Down
2 changes: 1 addition & 1 deletion src/Controller.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ function Controller<C>({
return (
<View
{...props}
onStartShouldSetResponderCapture={_onStartShouldSetResponderCapture}
onStartShouldSetResponder={_onStartShouldSetResponderCapture}
onResponderRelease={onPress}
>
{React.cloneElement(children as any, { ref: refSetter })}
Expand Down
15 changes: 13 additions & 2 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
import { fireEvent } from '@testing-library/react-native'

/**
* Simulate a `onResponderRelease` event through `fireEvent`
* @param node
*/
const tap = (node: any) => {
fireEvent(node, 'onResponderRelease')
const memoizedProps = Object.keys(node._fiber.memoizedProps)
if (memoizedProps.includes('onResponderRelease'))
fireEvent(node, 'onResponderRelease')
if (memoizedProps.includes('onPress')) fireEvent.press(node)
}

export { tap }
const events = {
tap
}

export { events }

0 comments on commit 987c5e6

Please sign in to comment.