@testing-library/react-native 12.1.1 → 12.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.DS_Store +0 -0
- package/.codecov.yml +9 -0
- package/.eslintcache +1 -0
- package/.eslintignore +2 -0
- package/.eslintrc +19 -0
- package/.flowconfig +63 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
- package/.github/ISSUE_TEMPLATE/question.md +9 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
- package/.github/actions/setup-deps/action.yml +22 -0
- package/.github/actions/setup-website-deps/action.yml +22 -0
- package/.github/dependabot.yml +10 -0
- package/.github/workflows/deploy-website.yml +36 -0
- package/.github/workflows/example-apps.yml +25 -0
- package/.github/workflows/main.yml +103 -0
- package/.gitignore +11 -0
- package/.prettierrc.js +5 -0
- package/CODE_OF_CONDUCT.md +73 -0
- package/CONTRIBUTING.md +64 -0
- package/README.md +8 -7
- package/babel.config.js +22 -0
- package/build/act.js.map +1 -1
- package/build/cleanup.js.map +1 -1
- package/build/config.d.ts +1 -0
- package/build/config.js.map +1 -1
- package/build/fireEvent.d.ts +13 -5
- package/build/fireEvent.js +57 -48
- package/build/fireEvent.js.map +1 -1
- package/build/flush-micro-tasks.d.ts +19 -0
- package/build/flush-micro-tasks.js +36 -0
- package/build/flush-micro-tasks.js.map +1 -0
- package/build/helpers/accessiblity.js +3 -1
- package/build/helpers/accessiblity.js.map +1 -1
- package/build/helpers/component-tree.d.ts +0 -15
- package/build/helpers/component-tree.js +0 -45
- package/build/helpers/component-tree.js.map +1 -1
- package/build/helpers/deprecation.d.ts +1 -0
- package/build/helpers/deprecation.js +16 -0
- package/build/helpers/deprecation.js.map +1 -1
- package/build/helpers/errors.d.ts +0 -4
- package/build/helpers/errors.js +1 -25
- package/build/helpers/errors.js.map +1 -1
- package/build/helpers/findAll.js.map +1 -1
- package/build/helpers/format-default.js.map +1 -1
- package/build/helpers/format.js.map +1 -1
- package/build/helpers/host-component-names.js +4 -1
- package/build/helpers/host-component-names.js.map +1 -1
- package/build/helpers/matchers/matchLabelText.js.map +1 -1
- package/build/helpers/pointer-events.d.ts +9 -0
- package/build/helpers/pointer-events.js +25 -0
- package/build/helpers/pointer-events.js.map +1 -0
- package/build/helpers/stringValidation.js.map +1 -1
- package/build/helpers/timers.js.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/build/matches.js.map +1 -1
- package/build/pure.d.ts +1 -1
- package/build/pure.js.map +1 -1
- package/build/queries/a11yState.js.map +1 -1
- package/build/queries/a11yValue.js.map +1 -1
- package/build/queries/displayValue.js.map +1 -1
- package/build/queries/hintText.js.map +1 -1
- package/build/queries/labelText.js.map +1 -1
- package/build/queries/makeQueries.js.map +1 -1
- package/build/queries/placeholderText.js.map +1 -1
- package/build/queries/role.js.map +1 -1
- package/build/queries/testId.js.map +1 -1
- package/build/queries/text.js.map +1 -1
- package/build/queries/unsafeProps.js.map +1 -1
- package/build/render.d.ts +171 -12
- package/build/render.js +11 -4
- package/build/render.js.map +1 -1
- package/build/renderHook.d.ts +3 -6
- package/build/renderHook.js +4 -3
- package/build/renderHook.js.map +1 -1
- package/build/shallow.js.map +1 -1
- package/build/test-utils/events.d.ts +10 -0
- package/build/test-utils/events.js +27 -0
- package/build/test-utils/events.js.map +1 -0
- package/build/test-utils/index.d.ts +1 -0
- package/build/test-utils/index.js +17 -0
- package/build/test-utils/index.js.map +1 -0
- package/build/user-event/event-builder/common.d.ts +45 -0
- package/build/user-event/event-builder/common.js +58 -0
- package/build/user-event/event-builder/common.js.map +1 -0
- package/build/user-event/event-builder/index.d.ts +32 -0
- package/build/user-event/event-builder/index.js +12 -0
- package/build/user-event/event-builder/index.js.map +1 -0
- package/build/user-event/index.d.ts +9 -0
- package/build/user-event/index.js +16 -0
- package/build/user-event/index.js.map +1 -0
- package/build/user-event/press/constants.d.ts +2 -0
- package/build/user-event/press/constants.js +16 -0
- package/build/user-event/press/constants.js.map +1 -0
- package/build/user-event/press/index.d.ts +1 -0
- package/build/user-event/press/index.js +19 -0
- package/build/user-event/press/index.js.map +1 -0
- package/build/user-event/press/press.d.ts +7 -0
- package/build/user-event/press/press.js +106 -0
- package/build/user-event/press/press.js.map +1 -0
- package/build/user-event/press/utils/warnAboutRealTimers.d.ts +1 -0
- package/build/user-event/press/utils/warnAboutRealTimers.js +14 -0
- package/build/user-event/press/utils/warnAboutRealTimers.js.map +1 -0
- package/build/user-event/setup/index.d.ts +2 -0
- package/build/user-event/setup/index.js +13 -0
- package/build/user-event/setup/index.js.map +1 -0
- package/build/user-event/setup/setup.d.ts +39 -0
- package/build/user-event/setup/setup.js +56 -0
- package/build/user-event/setup/setup.js.map +1 -0
- package/build/user-event/type/index.d.ts +1 -0
- package/build/user-event/type/index.js +13 -0
- package/build/user-event/type/index.js.map +1 -0
- package/build/user-event/type/type.d.ts +3 -0
- package/build/user-event/type/type.js +18 -0
- package/build/user-event/type/type.js.map +1 -0
- package/build/user-event/utils/events.d.ts +9 -0
- package/build/user-event/utils/events.js +44 -0
- package/build/user-event/utils/events.js.map +1 -0
- package/build/user-event/utils/index.d.ts +2 -0
- package/build/user-event/utils/index.js +28 -0
- package/build/user-event/utils/index.js.map +1 -0
- package/build/user-event/utils/wait.d.ts +2 -0
- package/build/user-event/utils/wait.js +14 -0
- package/build/user-event/utils/wait.js.map +1 -0
- package/build/waitFor.js +3 -3
- package/build/waitFor.js.map +1 -1
- package/build/waitForElementToBeRemoved.js.map +1 -1
- package/examples/basic/.expo-shared/assets.json +4 -0
- package/examples/basic/.gitignore +14 -0
- package/examples/basic/App.tsx +20 -0
- package/examples/basic/README.md +11 -0
- package/examples/basic/__tests__/App.test.tsx +119 -0
- package/examples/basic/app.json +31 -0
- package/examples/basic/assets/adaptive-icon.png +0 -0
- package/examples/basic/assets/favicon.png +0 -0
- package/examples/basic/assets/icon.png +0 -0
- package/examples/basic/assets/splash.png +0 -0
- package/examples/basic/babel.config.js +6 -0
- package/examples/basic/components/Home.tsx +28 -0
- package/examples/basic/components/LoginForm.tsx +138 -0
- package/examples/basic/jest-setup.ts +7 -0
- package/examples/basic/jest.config.js +5 -0
- package/examples/basic/package.json +30 -0
- package/examples/basic/tsconfig.json +7 -0
- package/examples/react-navigation/README.md +14 -0
- package/examples/react-navigation/babel.config.js +4 -0
- package/examples/react-navigation/jest-setup.js +11 -0
- package/examples/react-navigation/jest.config.js +10 -0
- package/examples/react-navigation/package.json +31 -0
- package/examples/react-navigation/src/App.js +21 -0
- package/examples/react-navigation/src/DrawerNavigator.js +15 -0
- package/examples/react-navigation/src/DrawerNavigator.test.js +42 -0
- package/examples/react-navigation/src/NativeStackNavigator.js +15 -0
- package/examples/react-navigation/src/NativeStackNavigator.test.js +34 -0
- package/examples/react-navigation/src/StackNavigator.js +15 -0
- package/examples/react-navigation/src/StackNavigator.test.js +34 -0
- package/examples/react-navigation/src/TabNavigator.js +15 -0
- package/examples/react-navigation/src/TabNavigator.test.js +21 -0
- package/examples/react-navigation/src/screens/DetailsScreen.js +43 -0
- package/examples/react-navigation/src/screens/DetailsScreen.test.js +27 -0
- package/examples/react-navigation/src/screens/DrawerHomeScreen.js +26 -0
- package/examples/react-navigation/src/screens/HomeScreen.js +48 -0
- package/examples/react-navigation/src/screens/SettingsScreen.js +20 -0
- package/examples/react-navigation/src/test-utils.js +12 -0
- package/examples/redux/App.js +27 -0
- package/examples/redux/actions/todoActions.js +25 -0
- package/examples/redux/babel.config.js +6 -0
- package/examples/redux/components/AddTodo.js +73 -0
- package/examples/redux/components/AddTodo.test.js +27 -0
- package/examples/redux/components/TodoElem.js +25 -0
- package/examples/redux/components/TodoList.js +29 -0
- package/examples/redux/components/TodoList.test.js +34 -0
- package/examples/redux/index.js +8 -0
- package/examples/redux/jest-setup.js +2 -0
- package/examples/redux/jest.config.js +4 -0
- package/examples/redux/package.json +23 -0
- package/examples/redux/reducers/index.js +6 -0
- package/examples/redux/reducers/todoReducer.js +27 -0
- package/examples/redux/store.js +10 -0
- package/examples/redux/test-utils.js +11 -0
- package/experiments-app/.expo/README.md +15 -0
- package/experiments-app/.expo/devices.json +3 -0
- package/experiments-app/.expo/packager-info.json +9 -0
- package/experiments-app/.expo/settings.json +9 -0
- package/experiments-app/.gitignore +17 -0
- package/experiments-app/.prettierrc.js +5 -0
- package/experiments-app/app.json +30 -0
- package/experiments-app/assets/adaptive-icon.png +0 -0
- package/experiments-app/assets/favicon.png +0 -0
- package/experiments-app/assets/icon.png +0 -0
- package/experiments-app/assets/splash.png +0 -0
- package/experiments-app/babel.config.js +6 -0
- package/experiments-app/index.js +4 -0
- package/experiments-app/package.json +31 -0
- package/experiments-app/src/App.tsx +31 -0
- package/experiments-app/src/MainScreen.tsx +51 -0
- package/experiments-app/src/experiments.ts +17 -0
- package/experiments-app/src/screens/TextInputEventPropagation.tsx +54 -0
- package/experiments-app/src/screens/TextInputEvents.tsx +50 -0
- package/experiments-app/src/utils/helpers.ts +8 -0
- package/experiments-app/tsconfig.json +6 -0
- package/experiments-app/yarn.lock +6913 -0
- package/flow-typed/npm/jest_v26.x.x.js +1218 -0
- package/flow-typed/npm/react-test-renderer_v16.x.x.js +81 -0
- package/jest-setup.ts +10 -0
- package/package.json +6 -6
- package/renovate.json +19 -0
- package/scripts/test_react_17 +12 -0
- package/src/__tests__/__snapshots__/render-debug.test.tsx.snap +548 -0
- package/src/__tests__/__snapshots__/render.test.tsx.snap +39 -0
- package/src/__tests__/act.test.tsx +52 -0
- package/src/__tests__/auto-cleanup-skip.test.tsx +39 -0
- package/src/__tests__/auto-cleanup.test.tsx +50 -0
- package/src/__tests__/cleanup.test.tsx +26 -0
- package/src/__tests__/config.test.ts +55 -0
- package/src/__tests__/fireEvent-textInput.test.tsx +154 -0
- package/src/__tests__/fireEvent.test.tsx +485 -0
- package/src/__tests__/host-component-names.test.tsx +109 -0
- package/src/__tests__/host-text-nesting.test.tsx +90 -0
- package/src/__tests__/jest-native.test.tsx +84 -0
- package/src/__tests__/questionsBoard.test.tsx +62 -0
- package/src/__tests__/react-native-api.test.tsx +126 -0
- package/src/__tests__/render-debug.test.tsx +207 -0
- package/src/__tests__/render-stringValidation.test.tsx +157 -0
- package/src/__tests__/render.test.tsx +256 -0
- package/src/__tests__/renderHook.test.tsx +114 -0
- package/src/__tests__/screen.test.tsx +66 -0
- package/src/__tests__/timerUtils.ts +7 -0
- package/src/__tests__/timers.test.ts +27 -0
- package/src/__tests__/waitFor.test.tsx +327 -0
- package/src/__tests__/waitForElementToBeRemoved.test.tsx +151 -0
- package/src/__tests__/within.test.tsx +96 -0
- package/src/act.ts +86 -0
- package/src/cleanup.ts +15 -0
- package/src/config.ts +72 -0
- package/src/fireEvent.ts +163 -0
- package/src/flush-micro-tasks.ts +30 -0
- package/src/helpers/__tests__/accessiblity.test.tsx +373 -0
- package/src/helpers/__tests__/component-tree.test.tsx +226 -0
- package/src/helpers/__tests__/format-default.tsx +114 -0
- package/src/helpers/__tests__/getTextContent.test.tsx +49 -0
- package/src/helpers/__tests__/includeHiddenElements.test.tsx +39 -0
- package/src/helpers/__tests__/query-name.test.ts +10 -0
- package/src/helpers/__tests__/timers.test.ts +8 -0
- package/src/helpers/accessiblity.ts +108 -0
- package/src/helpers/component-tree.ts +89 -0
- package/src/helpers/debugDeep.ts +27 -0
- package/src/helpers/debugShallow.ts +22 -0
- package/src/helpers/deprecation.ts +53 -0
- package/src/helpers/errors.ts +66 -0
- package/src/helpers/filterNodeByType.ts +7 -0
- package/src/helpers/findAll.ts +68 -0
- package/src/helpers/format-default.ts +72 -0
- package/src/helpers/format.ts +47 -0
- package/src/helpers/getTextContent.ts +20 -0
- package/src/helpers/host-component-names.tsx +67 -0
- package/src/helpers/matchers/__tests__/matchArrayValue.test.ts +34 -0
- package/src/helpers/matchers/__tests__/matchObject.test.ts +37 -0
- package/src/helpers/matchers/__tests__/matchStringValue.test.ts +15 -0
- package/src/helpers/matchers/accessibilityState.ts +48 -0
- package/src/helpers/matchers/accessibilityValue.ts +24 -0
- package/src/helpers/matchers/matchArrayProp.ts +21 -0
- package/src/helpers/matchers/matchLabelText.ts +51 -0
- package/src/helpers/matchers/matchObjectProp.ts +25 -0
- package/src/helpers/matchers/matchStringProp.ts +23 -0
- package/src/helpers/matchers/matchTextContent.ts +20 -0
- package/src/helpers/pointer-events.ts +27 -0
- package/src/helpers/query-name.ts +4 -0
- package/src/helpers/stringValidation.ts +36 -0
- package/src/helpers/timers.ts +98 -0
- package/src/index.ts +33 -0
- package/src/matches.ts +49 -0
- package/src/pure.ts +25 -0
- package/src/queries/__tests__/a11yState.test.tsx +439 -0
- package/src/queries/__tests__/a11yValue.test.tsx +309 -0
- package/src/queries/__tests__/displayValue.test.tsx +221 -0
- package/src/queries/__tests__/hintText.test.tsx +177 -0
- package/src/queries/__tests__/labelText.test.tsx +242 -0
- package/src/queries/__tests__/makeQueries.test.tsx +235 -0
- package/src/queries/__tests__/placeholderText.test.tsx +136 -0
- package/src/queries/__tests__/role-value.test.tsx +176 -0
- package/src/queries/__tests__/role.test.tsx +824 -0
- package/src/queries/__tests__/testId.test.tsx +200 -0
- package/src/queries/__tests__/text.test.tsx +556 -0
- package/src/queries/a11yState.ts +131 -0
- package/src/queries/a11yValue.ts +131 -0
- package/src/queries/displayValue.ts +78 -0
- package/src/queries/hintText.ts +112 -0
- package/src/queries/labelText.ts +59 -0
- package/src/queries/makeQueries.ts +255 -0
- package/src/queries/options.ts +14 -0
- package/src/queries/placeholderText.ts +79 -0
- package/src/queries/role.ts +132 -0
- package/src/queries/testId.ts +71 -0
- package/src/queries/text.ts +66 -0
- package/src/queries/unsafeProps.ts +76 -0
- package/src/queries/unsafeType.ts +73 -0
- package/src/react-versions.ts +11 -0
- package/src/render-act.ts +19 -0
- package/src/render.tsx +183 -0
- package/src/renderHook.tsx +56 -0
- package/src/screen.ts +123 -0
- package/src/shallow.ts +18 -0
- package/src/test-utils/events.ts +24 -0
- package/src/test-utils/index.ts +1 -0
- package/src/user-event/event-builder/common.ts +50 -0
- package/src/user-event/event-builder/index.ts +5 -0
- package/src/user-event/index.ts +14 -0
- package/src/user-event/press/__tests__/longPress.real-timers.test.tsx +115 -0
- package/src/user-event/press/__tests__/longPress.test.tsx +157 -0
- package/src/user-event/press/__tests__/press.real-timers.test.tsx +318 -0
- package/src/user-event/press/__tests__/press.test.tsx +422 -0
- package/src/user-event/press/constants.ts +7 -0
- package/src/user-event/press/index.ts +1 -0
- package/src/user-event/press/press.ts +134 -0
- package/src/user-event/press/utils/warnAboutRealTimers.ts +6 -0
- package/src/user-event/setup/index.ts +2 -0
- package/src/user-event/setup/setup.ts +93 -0
- package/src/user-event/type/__tests__/__snapshots__/type.test.tsx.snap +26 -0
- package/src/user-event/type/__tests__/type.test.tsx +63 -0
- package/src/user-event/type/index.ts +1 -0
- package/src/user-event/type/type.ts +20 -0
- package/src/user-event/utils/__tests__/wait.test.ts +63 -0
- package/src/user-event/utils/events.ts +54 -0
- package/src/user-event/utils/index.ts +2 -0
- package/src/user-event/utils/wait.ts +15 -0
- package/src/waitFor.ts +228 -0
- package/src/waitForElementToBeRemoved.ts +42 -0
- package/src/within.ts +30 -0
- package/tsconfig.json +17 -0
- package/tsconfig.release.json +8 -0
- package/website/.gitignore +20 -0
- package/website/README.md +33 -0
- package/website/docker/.dockerignore +3 -0
- package/website/docker/Dockerfile +9 -0
- package/website/docker/docker-compose.yml +11 -0
- package/website/docs/API.md +946 -0
- package/website/docs/EslintPLluginTestingLibrary.md +28 -0
- package/website/docs/FAQ.md +44 -0
- package/website/docs/GettingStarted.md +100 -0
- package/website/docs/HowShouldIQuery.md +21 -0
- package/website/docs/MigrationV11.md +64 -0
- package/website/docs/MigrationV12.md +67 -0
- package/website/docs/MigrationV2.md +126 -0
- package/website/docs/MigrationV7.md +119 -0
- package/website/docs/MigrationV9.md +67 -0
- package/website/docs/Queries.md +567 -0
- package/website/docs/ReactNavigation.md +371 -0
- package/website/docs/ReduxIntegration.md +137 -0
- package/website/docs/TestingEnvironment.md +154 -0
- package/website/docs/Troubleshooting.md +44 -0
- package/website/docs/UnderstandingAct.md +227 -0
- package/website/docs/UserEvent.md +66 -0
- package/website/docusaurus.config.js +114 -0
- package/website/package.json +31 -0
- package/website/sidebars.js +20 -0
- package/website/src/components/Feature.js +31 -0
- package/website/src/css/custom.css +13 -0
- package/website/src/css/index.module.css +77 -0
- package/website/src/pages/index.js +82 -0
- package/website/static/.nojekyll +0 -0
- package/website/static/css/custom.css +28 -0
- package/website/static/img/hit.png +0 -0
- package/website/static/img/locomotive.png +0 -0
- package/website/static/img/owl.png +0 -0
- package/website/static/img/tools.png +0 -0
- package/website/yarn.lock +7669 -0
- package/yarn.lock +7765 -0
- package/build/flushMicroTasks.d.ts +0 -5
- package/build/flushMicroTasks.js +0 -17
- package/build/flushMicroTasks.js.map +0 -1
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: api-queries
|
|
3
|
+
title: Queries
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
### Table of contents:
|
|
7
|
+
|
|
8
|
+
- [Variants](#variants)
|
|
9
|
+
- [getBy](#getby)
|
|
10
|
+
- [getAllBy](#getallby)
|
|
11
|
+
- [queryBy](#queryby)
|
|
12
|
+
- [queryAllBy](#queryallby)
|
|
13
|
+
- [findBy](#findby)
|
|
14
|
+
- [findAllBy](#findallby)
|
|
15
|
+
- [Queries](#queries)
|
|
16
|
+
- [Options](#options)
|
|
17
|
+
- [`ByText`](#bytext)
|
|
18
|
+
- [`ByPlaceholderText`](#byplaceholdertext)
|
|
19
|
+
- [`ByDisplayValue`](#bydisplayvalue)
|
|
20
|
+
- [`ByTestId`](#bytestid)
|
|
21
|
+
- [`ByLabelText`](#bylabeltext)
|
|
22
|
+
- [`ByHintText`, `ByA11yHint`, `ByAccessibilityHint`](#byhinttext-bya11yhint-byaccessibilityhint)
|
|
23
|
+
- [`ByRole`](#byrole)
|
|
24
|
+
- [Options](#options-1)
|
|
25
|
+
- [`ByA11yState`, `ByAccessibilityState` (deprecated)](#bya11ystate-byaccessibilitystate-deprecated)
|
|
26
|
+
- [Default state for: `disabled`, `selected`, and `busy` keys](#default-state-for-disabled-selected-and-busy-keys)
|
|
27
|
+
- [Default state for: `checked` and `expanded` keys](#default-state-for-checked-and-expanded-keys)
|
|
28
|
+
- [`ByA11yValue`, `ByAccessibilityValue` (deprecated)](#bya11yvalue-byaccessibilityvalue-deprecated)
|
|
29
|
+
- [Common options](#common-options)
|
|
30
|
+
- [`includeHiddenElements` option](#includehiddenelements-option)
|
|
31
|
+
- [TextMatch](#textmatch)
|
|
32
|
+
- [Examples](#examples)
|
|
33
|
+
- [Precision](#precision)
|
|
34
|
+
- [Normalization](#normalization)
|
|
35
|
+
- [Normalization Examples](#normalization-examples)
|
|
36
|
+
- [Unit testing helpers](#unit-testing-helpers)
|
|
37
|
+
- [`UNSAFE_ByType`](#unsafe_bytype)
|
|
38
|
+
- [`UNSAFE_ByProps`](#unsafe_byprops)
|
|
39
|
+
|
|
40
|
+
## Variants
|
|
41
|
+
|
|
42
|
+
> `getBy*` queries are shown by default in the [query documentation](#queries)
|
|
43
|
+
> below.
|
|
44
|
+
|
|
45
|
+
### getBy
|
|
46
|
+
|
|
47
|
+
`getBy*` queries return the first matching node for a query, and throw an error if no elements match or if more than one match is found. If you need to find more than one element, then use `getAllBy`.
|
|
48
|
+
|
|
49
|
+
### getAllBy
|
|
50
|
+
|
|
51
|
+
`getAllBy*` queries return an array of all matching nodes for a query, and throw an error if no elements match.
|
|
52
|
+
|
|
53
|
+
### queryBy
|
|
54
|
+
|
|
55
|
+
`queryBy*` queries return the first matching node for a query, and return `null` if no elements match. This is useful for asserting an element that is not present. This throws if more than one match is found (use `queryAllBy` instead).
|
|
56
|
+
|
|
57
|
+
### queryAllBy
|
|
58
|
+
|
|
59
|
+
`queryAllBy*` queries return an array of all matching nodes for a query, and return an empty array (`[]`) when no elements match.
|
|
60
|
+
|
|
61
|
+
### findBy
|
|
62
|
+
|
|
63
|
+
`findBy*` queries return a promise which resolves when a matching element is found. The promise is rejected if no elements match or if more than one match is found after a default timeout of 1000 ms. If you need to find more than one element, then use `findAllBy*`.
|
|
64
|
+
|
|
65
|
+
### findAllBy
|
|
66
|
+
|
|
67
|
+
`findAllBy*` queries return a promise which resolves to an array of matching elements. The promise is rejected if no elements match after a default timeout of 1000 ms.
|
|
68
|
+
|
|
69
|
+
:::info
|
|
70
|
+
`findBy*` and `findAllBy*` queries accept optional `waitForOptions` object argument which can contain `timeout`, `interval` and `onTimeout` properies which have the same meaning as respective options for [`waitFor`](api#waitfor) function.
|
|
71
|
+
:::
|
|
72
|
+
|
|
73
|
+
:::info
|
|
74
|
+
In cases when your `findBy*` and `findAllBy*` queries throw when not able to find matching elements it is useful to pass `onTimeout: () => { screen.debug(); }` callback using `waitForOptions` parameter.
|
|
75
|
+
:::
|
|
76
|
+
|
|
77
|
+
:::info
|
|
78
|
+
In order to properly use `findBy*` and `findAllBy*` queries you need at least React >=16.9.0 (featuring async `act`) or React Native >=0.61 (which comes with React >=16.9.0).
|
|
79
|
+
:::
|
|
80
|
+
|
|
81
|
+
## Queries
|
|
82
|
+
|
|
83
|
+
_Note: most methods like this one return a [`ReactTestInstance`](https://reactjs.org/docs/test-renderer.html#testinstance) with following properties that you may be interested in:_
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
type ReactTestInstance = {
|
|
87
|
+
type: string | Function;
|
|
88
|
+
props: { [propName: string]: any };
|
|
89
|
+
parent: ReactTestInstance | null;
|
|
90
|
+
children: Array<ReactTestInstance | string>;
|
|
91
|
+
};
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Options
|
|
95
|
+
|
|
96
|
+
Usually query first argument can be a **string** or a **regex**. All queries take at least the [`hidden`](#hidden-option) option as an optionnal second argument and some queries accept more options which change string matching behaviour. See [TextMatch](#textmatch) for more info.
|
|
97
|
+
|
|
98
|
+
### `ByText`
|
|
99
|
+
|
|
100
|
+
> getByText, getAllByText, queryByText, queryAllByText, findByText, findAllByText
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
getByText(
|
|
104
|
+
text: TextMatch,
|
|
105
|
+
options?: {
|
|
106
|
+
exact?: boolean;
|
|
107
|
+
normalizer?: (text: string) => string;
|
|
108
|
+
includeHiddenElements?: boolean;
|
|
109
|
+
}
|
|
110
|
+
): ReactTestInstance;
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Returns a `ReactTestInstance` with matching text – may be a string or regular expression.
|
|
114
|
+
|
|
115
|
+
This method will join `<Text>` siblings to find matches, similarly to [how React Native handles these components](https://reactnative.dev/docs/text#containers). This will allow for querying for strings that will be visually rendered together, but may be semantically separate React components.
|
|
116
|
+
|
|
117
|
+
```jsx
|
|
118
|
+
import { render, screen } from '@testing-library/react-native';
|
|
119
|
+
|
|
120
|
+
render(<MyComponent />);
|
|
121
|
+
const element = screen.getByText('banana');
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### `ByPlaceholderText`
|
|
125
|
+
|
|
126
|
+
> getByPlaceholderText, getAllByPlaceholderText, queryByPlaceholderText, queryAllByPlaceholderText, findByPlaceholderText, findAllByPlaceholderText
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
getByPlaceholderText(
|
|
130
|
+
text: TextMatch,
|
|
131
|
+
options?: {
|
|
132
|
+
exact?: boolean;
|
|
133
|
+
normalizer?: (text: string) => string;
|
|
134
|
+
includeHiddenElements?: boolean;
|
|
135
|
+
}
|
|
136
|
+
): ReactTestInstance;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Returns a `ReactTestInstance` for a `TextInput` with a matching placeholder – may be a string or regular expression.
|
|
140
|
+
|
|
141
|
+
```jsx
|
|
142
|
+
import { render, screen } from '@testing-library/react-native';
|
|
143
|
+
|
|
144
|
+
render(<MyComponent />);
|
|
145
|
+
const element = screen.getByPlaceholderText('username');
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### `ByDisplayValue`
|
|
149
|
+
|
|
150
|
+
> getByDisplayValue, getAllByDisplayValue, queryByDisplayValue, queryAllByDisplayValue, findByDisplayValue, findAllByDisplayValue
|
|
151
|
+
|
|
152
|
+
```ts
|
|
153
|
+
getByDisplayValue(
|
|
154
|
+
value: TextMatch,
|
|
155
|
+
options?: {
|
|
156
|
+
exact?: boolean;
|
|
157
|
+
normalizer?: (text: string) => string;
|
|
158
|
+
includeHiddenElements?: boolean;
|
|
159
|
+
}
|
|
160
|
+
): ReactTestInstance;
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Returns a `ReactTestInstance` for a `TextInput` with a matching display value – may be a string or regular expression.
|
|
164
|
+
|
|
165
|
+
```jsx
|
|
166
|
+
import { render, screen } from '@testing-library/react-native';
|
|
167
|
+
|
|
168
|
+
render(<MyComponent />);
|
|
169
|
+
const element = screen.getByDisplayValue('username');
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### `ByTestId`
|
|
173
|
+
|
|
174
|
+
> getByTestId, getAllByTestId, queryByTestId, queryAllByTestId, findByTestId, findAllByTestId
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
getByTestId(
|
|
178
|
+
testId: TextMatch,
|
|
179
|
+
options?: {
|
|
180
|
+
exact?: boolean;
|
|
181
|
+
normalizer?: (text: string) => string;
|
|
182
|
+
includeHiddenElements?: boolean;
|
|
183
|
+
}
|
|
184
|
+
): ReactTestInstance;
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Returns a `ReactTestInstance` with matching `testID` prop. `testID` – may be a string or a regular expression.
|
|
188
|
+
|
|
189
|
+
```jsx
|
|
190
|
+
import { render, screen } from '@testing-library/react-native';
|
|
191
|
+
|
|
192
|
+
render(<MyComponent />);
|
|
193
|
+
const element = screen.getByTestId('unique-id');
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
:::info
|
|
197
|
+
In the spirit of [the guiding principles](https://testing-library.com/docs/guiding-principles), it is recommended to use this only after the other queries don't work for your use case. Using `testID` attributes do not resemble how your software is used and should be avoided if possible. However, they are particularly useful for end-to-end testing on real devices, e.g. using Detox and it's an encouraged technique to use there. Learn more from the blog post ["Making your UI tests resilient to change"](https://kentcdodds.com/blog/making-your-ui-tests-resilient-to-change).
|
|
198
|
+
:::
|
|
199
|
+
|
|
200
|
+
### `ByLabelText`
|
|
201
|
+
|
|
202
|
+
> getByLabelText, getAllByLabelText, queryByLabelText, queryAllByLabelText, findByLabelText, findAllByLabelText
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
getByLabelText(
|
|
206
|
+
text: TextMatch,
|
|
207
|
+
options?: {
|
|
208
|
+
exact?: boolean;
|
|
209
|
+
normalizer?: (text: string) => string;
|
|
210
|
+
includeHiddenElements?: boolean;
|
|
211
|
+
}
|
|
212
|
+
): ReactTestInstance;
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Returns a `ReactTestInstance` with matching label:
|
|
216
|
+
- either by matching [`accessibilityLabel`](https://reactnative.dev/docs/accessibility#accessibilitylabel) prop
|
|
217
|
+
- or by matching text content of view referenced by [`accessibilityLabelledBy`](https://reactnative.dev/docs/accessibility#accessibilitylabelledby-android) prop
|
|
218
|
+
|
|
219
|
+
```jsx
|
|
220
|
+
import { render, screen } from '@testing-library/react-native';
|
|
221
|
+
|
|
222
|
+
render(<MyComponent />);
|
|
223
|
+
const element = screen.getByLabelText('my-label');
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### `ByHintText`, `ByA11yHint`, `ByAccessibilityHint`
|
|
227
|
+
|
|
228
|
+
> getByA11yHint, getAllByA11yHint, queryByA11yHint, queryAllByA11yHint, findByA11yHint, findAllByA11yHint
|
|
229
|
+
> getByAccessibilityHint, getAllByAccessibilityHint, queryByAccessibilityHint, queryAllByAccessibilityHint, findByAccessibilityHint, findAllByAccessibilityHint
|
|
230
|
+
> getByHintText, getAllByHintText, queryByHintText, queryAllByHintText, findByHintText, findAllByHintText
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
getByHintText(
|
|
234
|
+
hint: TextMatch,
|
|
235
|
+
options?: {
|
|
236
|
+
exact?: boolean;
|
|
237
|
+
normalizer?: (text: string) => string;
|
|
238
|
+
includeHiddenElements?: boolean;
|
|
239
|
+
}
|
|
240
|
+
): ReactTestInstance;
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Returns a `ReactTestInstance` with matching `accessibilityHint` prop.
|
|
244
|
+
|
|
245
|
+
```jsx
|
|
246
|
+
import { render, screen } from '@testing-library/react-native';
|
|
247
|
+
|
|
248
|
+
render(<MyComponent />);
|
|
249
|
+
const element = screen.getByHintText('Plays a song');
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
:::info
|
|
253
|
+
Please consult [Apple guidelines on how `accessibilityHint` should be used](https://developer.apple.com/documentation/objectivec/nsobject/1615093-accessibilityhint).
|
|
254
|
+
:::
|
|
255
|
+
|
|
256
|
+
### `ByRole`
|
|
257
|
+
|
|
258
|
+
> getByRole, getAllByRole, queryByRole, queryAllByRole, findByRole, findAllByRole
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
getByRole(
|
|
262
|
+
role: TextMatch,
|
|
263
|
+
options?: {
|
|
264
|
+
name?: TextMatch
|
|
265
|
+
disabled?: boolean,
|
|
266
|
+
selected?: boolean,
|
|
267
|
+
checked?: boolean | 'mixed',
|
|
268
|
+
busy?: boolean,
|
|
269
|
+
expanded?: boolean,
|
|
270
|
+
value: {
|
|
271
|
+
min?: number;
|
|
272
|
+
max?: number;
|
|
273
|
+
now?: number;
|
|
274
|
+
text?: TextMatch;
|
|
275
|
+
},
|
|
276
|
+
includeHiddenElements?: boolean;
|
|
277
|
+
}
|
|
278
|
+
): ReactTestInstance;
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Returns a `ReactTestInstance` with matching `accessibilityRole` prop.
|
|
282
|
+
|
|
283
|
+
```jsx
|
|
284
|
+
import { render, screen } from '@testing-library/react-native';
|
|
285
|
+
|
|
286
|
+
render(
|
|
287
|
+
<Pressable accessibilityRole="button" disabled>
|
|
288
|
+
<Text>Hello</Text>
|
|
289
|
+
</Pressable>
|
|
290
|
+
);
|
|
291
|
+
const element = screen.getByRole('button');
|
|
292
|
+
const element2 = screen.getByRole('button', { name: 'Hello' });
|
|
293
|
+
const element3 = screen.getByRole('button', { name: 'Hello', disabled: true });
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
#### Options
|
|
297
|
+
|
|
298
|
+
`name`: Finds an element with given `accessibilityRole` and an accessible name (equivalent to `byText` or `byLabelText` query).
|
|
299
|
+
|
|
300
|
+
`disabled`: You can filter elements by their disabled state. The possible values are `true` or `false`. Querying `disabled: false` will also match elements with `disabled: undefined` (see the [wiki](https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State) for more details). See [React Native's accessibilityState](https://reactnative.dev/docs/accessibility#accessibilitystate) docs to learn more about the `disabled` state.
|
|
301
|
+
|
|
302
|
+
`selected`: You can filter elements by their selected state. The possible values are `true` or `false`. Querying `selected: false` will also match elements with `selected: undefined` (see the [wiki](https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State) for more details). See [React Native's accessibilityState](https://reactnative.dev/docs/accessibility#accessibilitystate) docs to learn more about the `selected` state.
|
|
303
|
+
|
|
304
|
+
`checked`: You can filter elements by their checked state. The possible values are `true`, `false`, or `"mixed"`. See [React Native's accessibilityState](https://reactnative.dev/docs/accessibility#accessibilitystate) docs to learn more about the `checked` state.
|
|
305
|
+
|
|
306
|
+
`busy`: You can filter elements by their busy state. The possible values are `true` or `false`. Querying `busy: false` will also match elements with `busy: undefined` (see the [wiki](https://github.com/callstack/react-native-testing-library/wiki/Accessibility:-State) for more details). See [React Native's accessibilityState](https://reactnative.dev/docs/accessibility#accessibilitystate) docs to learn more about the `busy` state.
|
|
307
|
+
|
|
308
|
+
`expanded`: You can filter elements by their expanded state. The possible values are `true` or `false`. See [React Native's accessibilityState](https://reactnative.dev/docs/accessibility#accessibilitystate) docs to learn more about the `expanded` state.
|
|
309
|
+
|
|
310
|
+
`value`: Filter elements by their accessibility, available value entries include numeric `min`, `max` & `now`, as well as string or regex `text` key. See React Native [accessibilityValue](https://reactnative.dev/docs/accessibility#accessibilityvalue) docs to learn more about this prop.
|
|
311
|
+
|
|
312
|
+
### `ByA11yState`, `ByAccessibilityState` (deprecated)
|
|
313
|
+
|
|
314
|
+
:::caution
|
|
315
|
+
This query has been marked deprecated, as is typically too general to give meaningful results. Therefore, it's better to use one of following options:
|
|
316
|
+
* [`*ByRole`](#byrole) query with relevant state options: `disabled`, `selected`, `checked`, `expanded` and `busy`
|
|
317
|
+
* [`toHaveAccessibilityState()`](https://github.com/testing-library/jest-native#tohaveaccessibilitystate) Jest matcher to check the state of element found using some other query
|
|
318
|
+
:::
|
|
319
|
+
|
|
320
|
+
> getByA11yState, getAllByA11yState, queryByA11yState, queryAllByA11yState, findByA11yState, findAllByA11yState
|
|
321
|
+
> getByAccessibilityState, getAllByAccessibilityState, queryByAccessibilityState, queryAllByAccessibilityState, findByAccessibilityState, findAllByAccessibilityState
|
|
322
|
+
|
|
323
|
+
```ts
|
|
324
|
+
getByA11yState(
|
|
325
|
+
state: {
|
|
326
|
+
disabled?: boolean,
|
|
327
|
+
selected?: boolean,
|
|
328
|
+
checked?: boolean | 'mixed',
|
|
329
|
+
expanded?: boolean,
|
|
330
|
+
busy?: boolean,
|
|
331
|
+
},
|
|
332
|
+
options?: {
|
|
333
|
+
includeHiddenElements?: boolean;
|
|
334
|
+
}
|
|
335
|
+
): ReactTestInstance;
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Returns a `ReactTestInstance` with matching `accessibilityState` prop.
|
|
339
|
+
|
|
340
|
+
```jsx
|
|
341
|
+
import { render, screen } from '@testing-library/react-native';
|
|
342
|
+
|
|
343
|
+
render(<Component />);
|
|
344
|
+
const element = screen.getByA11yState({ disabled: true });
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
:::note
|
|
348
|
+
|
|
349
|
+
#### Default state for: `disabled`, `selected`, and `busy` keys
|
|
350
|
+
|
|
351
|
+
Passing `false` matcher value will match both elements with explicit `false` state value and without explicit state value.
|
|
352
|
+
|
|
353
|
+
For instance, `getByA11yState({ disabled: false })` will match elements with following props:
|
|
354
|
+
|
|
355
|
+
- `accessibilityState={{ disabled: false, ... }}`
|
|
356
|
+
- no `disabled` key under `accessibilityState` prop, e.g. `accessibilityState={{}}`
|
|
357
|
+
- no `accessibilityState` prop at all
|
|
358
|
+
|
|
359
|
+
#### Default state for: `checked` and `expanded` keys
|
|
360
|
+
|
|
361
|
+
Passing `false` matcher value will only match elements with explicit `false` state value.
|
|
362
|
+
|
|
363
|
+
For instance, `getByA11yState({ checked: false })` will only match elements with:
|
|
364
|
+
|
|
365
|
+
- `accessibilityState={{ checked: false, ... }}`
|
|
366
|
+
|
|
367
|
+
but will not match elements with following props:
|
|
368
|
+
|
|
369
|
+
- no `checked` key under `accessibilityState` prop, e.g. `accessibilityState={{}}`
|
|
370
|
+
- no `accessibilityState` prop at all
|
|
371
|
+
|
|
372
|
+
The difference in handling default values is made to reflect observed accessibility behaviour on iOS and Android platforms.
|
|
373
|
+
:::
|
|
374
|
+
|
|
375
|
+
### `ByA11yValue`, `ByAccessibilityValue` (deprecated)
|
|
376
|
+
|
|
377
|
+
:::caution
|
|
378
|
+
This query has been marked deprecated, as is typically too general to give meaningful results. Therefore, it's better to use one of following options:
|
|
379
|
+
* [`toHaveAccessibilityValue()`](https://github.com/testing-library/jest-native#tohaveaccessibilityvalue) Jest matcher to check the state of element found using some other query
|
|
380
|
+
* [`*ByRole`](#byrole) query with `value` option
|
|
381
|
+
:::
|
|
382
|
+
|
|
383
|
+
> getByA11yValue, getAllByA11yValue, queryByA11yValue, queryAllByA11yValue, findByA11yValue, findAllByA11yValue
|
|
384
|
+
> getByAccessibilityValue, getAllByAccessibilityValue, queryByAccessibilityValue, queryAllByAccessibilityValue, findByAccessibilityValue, findAllByAccessibilityValue
|
|
385
|
+
|
|
386
|
+
```ts
|
|
387
|
+
getByA11yValue(
|
|
388
|
+
value: {
|
|
389
|
+
min?: number;
|
|
390
|
+
max?: number;
|
|
391
|
+
now?: number;
|
|
392
|
+
text?: TextMatch;
|
|
393
|
+
},
|
|
394
|
+
options?: {
|
|
395
|
+
includeHiddenElements?: boolean;
|
|
396
|
+
}
|
|
397
|
+
): ReactTestInstance;
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Returns a host element with matching `accessibilityValue` prop entries. Only entires provided to the query will be used to match elements. Element might have additional accessibility value entries and still be matched.
|
|
401
|
+
|
|
402
|
+
When querying by `text` entry a string or regex might be used.
|
|
403
|
+
|
|
404
|
+
```jsx
|
|
405
|
+
import { render, screen } from '@testing-library/react-native';
|
|
406
|
+
|
|
407
|
+
render(
|
|
408
|
+
<View accessibilityValue={{ min: 0, max: 100, now: 25, text: '25%' }} />
|
|
409
|
+
);
|
|
410
|
+
const element = screen.getByA11yValue({ now: 25 });
|
|
411
|
+
const element2 = screen.getByA11yValue({ text: /25/ });
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Common options
|
|
415
|
+
|
|
416
|
+
### `includeHiddenElements` option
|
|
417
|
+
|
|
418
|
+
All queries have the `includeHiddenElements` option which affects whether [elements hidden from accessibility](./API.md#ishiddenfromaccessibility) are matched by the query. By default queries will not match hidden elements, because the users of the app would not be able to see such elements.
|
|
419
|
+
|
|
420
|
+
You can configure the default value with the [`configure` function](API.md#configure).
|
|
421
|
+
|
|
422
|
+
This option is also available as `hidden` alias for compatibility with [React Testing Library](https://testing-library.com/docs/queries/byrole#hidden).
|
|
423
|
+
|
|
424
|
+
**Examples**
|
|
425
|
+
|
|
426
|
+
```tsx
|
|
427
|
+
render(<Text style={{ display: 'none' }}>Hidden from accessibility</Text>);
|
|
428
|
+
|
|
429
|
+
// Exclude hidden elements
|
|
430
|
+
expect(
|
|
431
|
+
screen.queryByText('Hidden from accessibility', { includeHiddenElements: false })
|
|
432
|
+
).not.toBeOnTheScreen();
|
|
433
|
+
|
|
434
|
+
// Include hidden elements
|
|
435
|
+
expect(screen.getByText('Hidden from accessibility')).toBeOnTheScreen();
|
|
436
|
+
expect(
|
|
437
|
+
screen.getByText('Hidden from accessibility', { includeHiddenElements: true })
|
|
438
|
+
).toBeOnTheScreen();
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## TextMatch
|
|
442
|
+
|
|
443
|
+
```ts
|
|
444
|
+
type TextMatch = string | RegExp;
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
Most of the query APIs take a `TextMatch` as an argument, which means the argument can be either a _string_ or _regex_.
|
|
448
|
+
|
|
449
|
+
### Examples
|
|
450
|
+
|
|
451
|
+
Given the following render:
|
|
452
|
+
|
|
453
|
+
```jsx
|
|
454
|
+
render(<Text>Hello World</Text>);
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
Will **find a match**:
|
|
458
|
+
|
|
459
|
+
```js
|
|
460
|
+
// Matching a string:
|
|
461
|
+
screen.getByText('Hello World'); // full string match
|
|
462
|
+
screen.getByText('llo Worl', { exact: false }); // substring match
|
|
463
|
+
screen.getByText('hello world', { exact: false }); // ignore case-sensitivity
|
|
464
|
+
|
|
465
|
+
// Matching a regex:
|
|
466
|
+
screen.getByText(/World/); // substring match
|
|
467
|
+
screen.getByText(/world/i); // substring match, ignore case
|
|
468
|
+
screen.getByText(/^hello world$/i); // full string match, ignore case-sensitivity
|
|
469
|
+
screen.getByText(/Hello W?oRlD/i); // advanced regex
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Will **NOT find a match**
|
|
473
|
+
|
|
474
|
+
```js
|
|
475
|
+
// substring does not match
|
|
476
|
+
screen.getByText('llo Worl');
|
|
477
|
+
// full string does not match
|
|
478
|
+
screen.getByText('Goodbye World');
|
|
479
|
+
|
|
480
|
+
// case-sensitive regex with different case
|
|
481
|
+
screen.getByText(/hello world/);
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Precision
|
|
485
|
+
|
|
486
|
+
```typescript
|
|
487
|
+
type TextMatchOptions = {
|
|
488
|
+
exact?: boolean;
|
|
489
|
+
normalizer?: (text: string) => string;
|
|
490
|
+
};
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
Queries that take a `TextMatch` also accept an object as the second argument that can contain options that affect the precision of string matching:
|
|
494
|
+
|
|
495
|
+
- `exact`: Defaults to `true`; matches full strings, case-sensitive. When false, matches substrings and is not case-sensitive.
|
|
496
|
+
- `exact` has no effect on regex argument.
|
|
497
|
+
- In most cases using a `regex` instead of a string gives you more control over fuzzy matching and should be preferred over `{ exact: false }`.
|
|
498
|
+
- `normalizer`: An optional function which overrides normalization behavior. See [Normalization](#normalization).
|
|
499
|
+
|
|
500
|
+
`exact` option defaults to `true` but if you want to search for a text slice or make text matching case-insensitive you can override it. That being said we advise you to use regex in more complex scenarios.
|
|
501
|
+
|
|
502
|
+
### Normalization
|
|
503
|
+
|
|
504
|
+
Before running any matching logic against text, it is automatically normalized. By default, normalization consists of trimming whitespace from the start and end of text, and collapsing multiple adjacent whitespace characters into a single space.
|
|
505
|
+
|
|
506
|
+
If you want to prevent that normalization, or provide alternative normalization (e.g. to remove Unicode control characters), you can provide a `normalizer` function in the options object. This function will be given a string and is expected to return a normalized version of that string.
|
|
507
|
+
|
|
508
|
+
:::info
|
|
509
|
+
Specifying a value for `normalizer` replaces the built-in normalization, but you can call `getDefaultNormalizer` to obtain a built-in normalizer, either to adjust that normalization or to call it from your own normalizer.
|
|
510
|
+
:::
|
|
511
|
+
|
|
512
|
+
`getDefaultNormalizer` take options object which allows the selection of behaviour:
|
|
513
|
+
|
|
514
|
+
- `trim`: Defaults to `true`. Trims leading and trailing whitespace.
|
|
515
|
+
- `collapseWhitespace`: Defaults to `true`. Collapses inner whitespace (newlines, tabs repeated spaces) into a single space.
|
|
516
|
+
|
|
517
|
+
#### Normalization Examples
|
|
518
|
+
|
|
519
|
+
To perform a match against text without trimming:
|
|
520
|
+
|
|
521
|
+
```typescript
|
|
522
|
+
screen.getByText(node, 'text', {
|
|
523
|
+
normalizer: getDefaultNormalizer({ trim: false }),
|
|
524
|
+
});
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
To override normalization to remove some Unicode characters whilst keeping some (but not all) of the built-in normalization behavior:
|
|
528
|
+
|
|
529
|
+
```typescript
|
|
530
|
+
screen.getByText(node, 'text', {
|
|
531
|
+
normalizer: (str) =>
|
|
532
|
+
getDefaultNormalizer({ trim: false })(str).replace(/[\u200E-\u200F]*/g, ''),
|
|
533
|
+
});
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
## Unit testing helpers
|
|
537
|
+
|
|
538
|
+
> Use sparingly and responsibly, escape hatches here
|
|
539
|
+
|
|
540
|
+
`render` from `@testing-library/react-native` exposes additional queries that **should not be used in component integration testing**, but some users (like component library creators) interested in unit testing some components may find helpful.
|
|
541
|
+
|
|
542
|
+
<details>
|
|
543
|
+
<summary>Queries helpful in unit testing</summary>
|
|
544
|
+
|
|
545
|
+
The interface is the same as for other queries, but we won't provide full names so that they're harder to find by search engines.
|
|
546
|
+
|
|
547
|
+
### `UNSAFE_ByType`
|
|
548
|
+
|
|
549
|
+
> UNSAFE_getByType, UNSAFE_getAllByType, UNSAFE_queryByType, UNSAFE_queryAllByType
|
|
550
|
+
|
|
551
|
+
Returns a `ReactTestInstance` with matching a React component type.
|
|
552
|
+
|
|
553
|
+
:::caution
|
|
554
|
+
This query has been marked unsafe, since it requires knowledge about implementation details of the component. Use responsibly.
|
|
555
|
+
:::
|
|
556
|
+
|
|
557
|
+
### `UNSAFE_ByProps`
|
|
558
|
+
|
|
559
|
+
> UNSAFE_getByProps, UNSAFE_getAllByProps, UNSAFE_queryByProps, UNSAFE_queryAllByProps
|
|
560
|
+
|
|
561
|
+
Returns a `ReactTestInstance` with matching props object.
|
|
562
|
+
|
|
563
|
+
:::caution
|
|
564
|
+
This query has been marked unsafe, since it requires knowledge about implementation details of the component. Use responsibly.
|
|
565
|
+
:::
|
|
566
|
+
|
|
567
|
+
</details>
|