Forward press handlers as `testOnly_*` in `PressableWithTouchable` (#4416)
## Description
Fixes #4417.
Since 3.2.0, `Pressable` dispatches between two engines:
`StatefulPressable` when one of the
relation props (`simultaneousWith` / `requireToFail` / `block`) is
passed, and
`PressableWithTouchable` otherwise — the common case.
Only `StatefulPressable` sets `testOnly_onPress` / `testOnly_onPressIn`
/ `testOnly_onPressOut` /
`testOnly_onLongPress` on the button. `PressableWithTouchable` doesn't,
so for a plain
`<Pressable onPress={...}>` React Native Testing Library finds no
handler and
`fireEvent(element, 'press')` silently does nothing.
The press state machine runs natively, so in a test environment those
props are the only way to
reach the handlers. This makes the regression silent and fairly
wide-reaching: no error is
thrown, tests just stop observing presses. On 3.1.0 the single v3
`Pressable` always forwarded
them, so this is a 3.1.0 → 3.2.0 regression for any app whose Jest suite
drives a `Pressable`.
The fix forwards the four handlers from `PressableWithTouchable` too,
guarded by `isTestEnv()`,
exactly as `StatefulPressable` does. `Touchable` spreads its remaining
props onto
`GestureHandlerButton`, which already declares them in `ButtonProps`, so
nothing else needed to
change and the props stay stripped outside a test environment.
Note this is unrelated to #4414, which fixed the `testOnly_pressed`
display state.
## Test plan
Added a regression test in `src/__tests__/mocks.test.tsx` asserting the
four `testOnly_*` props
are wired on the button for a relation-free `Pressable`. It fails on
`main` and passes with the
fix.
The test asserts the props rather than calling `fireEvent(element,
'press')` because this repo is
on `@testing-library/react-native@12.9`, which predates the `testOnly_*`
handler lookup (added in
v13). Asserting the props keeps the test meaningful on the pinned
version and independent of the
RNTL version.
In `packages/react-native-gesture-handler`:
- `yarn test` — 16 suites, 135 tests passing
- `yarn ts-check` — clean
- `yarn lint:js` — 0 errors
- `yarn format:js` — clean
Also verified end-to-end in a real app (Expo 57 / RN 0.86, RNTL 14.0.1)
that had ~3 suites broken
by the 3.1.0 → 3.2.0 bump: with this change applied as a patch, the full
suite is green again
(136 suites, 1663 tests, 73 snapshots).
Co-authored-by: Claude Opus 5 <noreply@anthropic.com> H
Hugo Extrat committed
4bc2decf8b587c3b7f08503fc5b7b81928bc5d03
Parent: 18dcb3f
Committed by GitHub <noreply@github.com>
on 8/14/2026, 8:22:10 AM