@testing-library/react-native 12.1.2 → 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/fireEvent.d.ts +9 -1
- package/build/fireEvent.js +9 -15
- 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 +2 -2
- package/build/helpers/accessiblity.js.map +1 -1
- package/build/helpers/component-tree.js.map +1 -1
- package/build/helpers/deprecation.js.map +1 -1
- 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.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,556 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Image,
|
|
5
|
+
Text,
|
|
6
|
+
TextInput,
|
|
7
|
+
TouchableOpacity,
|
|
8
|
+
View,
|
|
9
|
+
} from 'react-native';
|
|
10
|
+
import { getDefaultNormalizer, render, within } from '../..';
|
|
11
|
+
|
|
12
|
+
test('byText matches simple text', () => {
|
|
13
|
+
const { getByText } = render(<Text testID="text">Hello World</Text>);
|
|
14
|
+
expect(getByText('Hello World').props.testID).toBe('text');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('byText matches inner nested text', () => {
|
|
18
|
+
const { getByText } = render(
|
|
19
|
+
<Text testID="outer">
|
|
20
|
+
<Text testID="inner">Hello World</Text>
|
|
21
|
+
</Text>
|
|
22
|
+
);
|
|
23
|
+
expect(getByText('Hello World').props.testID).toBe('inner');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('byText matches accross multiple texts', () => {
|
|
27
|
+
const { getByText } = render(
|
|
28
|
+
<Text testID="outer">
|
|
29
|
+
<Text testID="inner-1">Hello</Text> <Text testID="inner-2">World</Text>
|
|
30
|
+
</Text>
|
|
31
|
+
);
|
|
32
|
+
expect(getByText('Hello World').props.testID).toBe('outer');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
type MyButtonProps = {
|
|
36
|
+
children: React.ReactNode;
|
|
37
|
+
onPress: () => void;
|
|
38
|
+
};
|
|
39
|
+
const MyButton = ({ children, onPress }: MyButtonProps) => (
|
|
40
|
+
<TouchableOpacity onPress={onPress}>
|
|
41
|
+
<Text>{children}</Text>
|
|
42
|
+
</TouchableOpacity>
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const Banana = () => {
|
|
46
|
+
const test = 0;
|
|
47
|
+
return (
|
|
48
|
+
<View>
|
|
49
|
+
<Text>Is the banana fresh?</Text>
|
|
50
|
+
<Text testID="bananaFresh">not fresh</Text>
|
|
51
|
+
|
|
52
|
+
<MyButton onPress={jest.fn()}>Change freshness!</MyButton>
|
|
53
|
+
<Text testID="duplicateText">First Text</Text>
|
|
54
|
+
<Text testID="duplicateText">Second Text</Text>
|
|
55
|
+
<Text>{test}</Text>
|
|
56
|
+
</View>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
type ChildrenProps = { children: React.ReactNode };
|
|
61
|
+
|
|
62
|
+
test('getByText, queryByText', () => {
|
|
63
|
+
const { getByText, queryByText } = render(<Banana />);
|
|
64
|
+
const button = getByText(/change/i);
|
|
65
|
+
|
|
66
|
+
expect(button.props.children).toBe('Change freshness!');
|
|
67
|
+
|
|
68
|
+
const sameButton = getByText('not fresh');
|
|
69
|
+
|
|
70
|
+
expect(sameButton.props.children).toBe('not fresh');
|
|
71
|
+
expect(() => getByText('InExistent')).toThrow(
|
|
72
|
+
'Unable to find an element with text: InExistent'
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const zeroText = getByText('0');
|
|
76
|
+
|
|
77
|
+
expect(queryByText(/change/i)).toBe(button);
|
|
78
|
+
expect(queryByText('InExistent')).toBeNull();
|
|
79
|
+
expect(() => queryByText(/fresh/)).toThrow(
|
|
80
|
+
'Found multiple elements with text: /fresh/'
|
|
81
|
+
);
|
|
82
|
+
expect(queryByText('0')).toBe(zeroText);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('getByText, queryByText with children as Array', () => {
|
|
86
|
+
type BananaCounterProps = { numBananas: number };
|
|
87
|
+
const BananaCounter = ({ numBananas }: BananaCounterProps) => (
|
|
88
|
+
<Text>There are {numBananas} bananas in the bunch</Text>
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const BananaStore = () => (
|
|
92
|
+
<View>
|
|
93
|
+
<BananaCounter numBananas={3} />
|
|
94
|
+
<BananaCounter numBananas={6} />
|
|
95
|
+
<BananaCounter numBananas={5} />
|
|
96
|
+
</View>
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const { getByText } = render(<BananaStore />);
|
|
100
|
+
|
|
101
|
+
const threeBananaBunch = getByText('There are 3 bananas in the bunch');
|
|
102
|
+
expect(threeBananaBunch.props.children).toEqual([
|
|
103
|
+
'There are ',
|
|
104
|
+
3,
|
|
105
|
+
' bananas in the bunch',
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('getAllByText, queryAllByText', () => {
|
|
110
|
+
const { getAllByText, queryAllByText } = render(<Banana />);
|
|
111
|
+
const buttons = getAllByText(/fresh/i);
|
|
112
|
+
|
|
113
|
+
expect(buttons).toHaveLength(3);
|
|
114
|
+
expect(() => getAllByText('InExistent')).toThrow(
|
|
115
|
+
'Unable to find an element with text: InExistent'
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
expect(queryAllByText(/fresh/i)).toEqual(buttons);
|
|
119
|
+
expect(queryAllByText('InExistent')).toHaveLength(0);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('findByText queries work asynchronously', async () => {
|
|
123
|
+
const options = { timeout: 10 }; // Short timeout so that this test runs quickly
|
|
124
|
+
const { rerender, findByText, findAllByText } = render(<View />);
|
|
125
|
+
await expect(findByText('Some Text', {}, options)).rejects.toBeTruthy();
|
|
126
|
+
await expect(findAllByText('Some Text', {}, options)).rejects.toBeTruthy();
|
|
127
|
+
|
|
128
|
+
setTimeout(
|
|
129
|
+
() =>
|
|
130
|
+
rerender(
|
|
131
|
+
<View>
|
|
132
|
+
<Text>Some Text</Text>
|
|
133
|
+
</View>
|
|
134
|
+
),
|
|
135
|
+
20
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
await expect(findByText('Some Text')).resolves.toBeTruthy();
|
|
139
|
+
await expect(findAllByText('Some Text')).resolves.toHaveLength(1);
|
|
140
|
+
}, 20000);
|
|
141
|
+
|
|
142
|
+
test('getByText works properly with custom text component', () => {
|
|
143
|
+
function BoldText({ children }: ChildrenProps) {
|
|
144
|
+
return <Text>{children}</Text>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
expect(
|
|
148
|
+
render(
|
|
149
|
+
<Text>
|
|
150
|
+
<BoldText>Hello</BoldText>
|
|
151
|
+
</Text>
|
|
152
|
+
).getByText('Hello')
|
|
153
|
+
).toBeTruthy();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test('getByText works properly with custom text container', () => {
|
|
157
|
+
function MyText({ children }: ChildrenProps) {
|
|
158
|
+
return <Text>{children}</Text>;
|
|
159
|
+
}
|
|
160
|
+
function BoldText({ children }: ChildrenProps) {
|
|
161
|
+
return <Text>{children}</Text>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
expect(
|
|
165
|
+
render(
|
|
166
|
+
<MyText>
|
|
167
|
+
<BoldText>Hello</BoldText>
|
|
168
|
+
</MyText>
|
|
169
|
+
).getByText('Hello')
|
|
170
|
+
).toBeTruthy();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('queryByText nested <Image> in <Text> at start', () => {
|
|
174
|
+
expect(
|
|
175
|
+
render(
|
|
176
|
+
<Text>
|
|
177
|
+
<Image source={{}} />
|
|
178
|
+
Hello
|
|
179
|
+
</Text>
|
|
180
|
+
).queryByText('Hello')
|
|
181
|
+
).toBeTruthy();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('queryByText nested <Image> in <Text> at end', () => {
|
|
185
|
+
expect(
|
|
186
|
+
render(
|
|
187
|
+
<Text>
|
|
188
|
+
Hello
|
|
189
|
+
<Image source={{}} />
|
|
190
|
+
</Text>
|
|
191
|
+
).queryByText('Hello')
|
|
192
|
+
).toBeTruthy();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('queryByText nested <Image> in <Text> in middle', () => {
|
|
196
|
+
expect(
|
|
197
|
+
render(
|
|
198
|
+
<Text>
|
|
199
|
+
Hello
|
|
200
|
+
<Image source={{}} />
|
|
201
|
+
World
|
|
202
|
+
</Text>
|
|
203
|
+
).queryByText('HelloWorld')
|
|
204
|
+
).toBeTruthy();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('queryByText not found', () => {
|
|
208
|
+
expect(
|
|
209
|
+
render(
|
|
210
|
+
<Text>
|
|
211
|
+
Hello
|
|
212
|
+
<Image source={{}} />
|
|
213
|
+
</Text>
|
|
214
|
+
).queryByText('SomethingElse')
|
|
215
|
+
).toBeFalsy();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('*ByText matches text across multiple nested Text', () => {
|
|
219
|
+
const { getByText } = render(
|
|
220
|
+
<Text nativeID="1">
|
|
221
|
+
Hello{' '}
|
|
222
|
+
<Text nativeID="2">
|
|
223
|
+
World
|
|
224
|
+
<Text>!{true}</Text>
|
|
225
|
+
</Text>
|
|
226
|
+
</Text>
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
expect(getByText('Hello World!')).toBeTruthy();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test('queryByText with nested Text components return the closest Text', () => {
|
|
233
|
+
const NestedTexts = () => (
|
|
234
|
+
<Text nativeID="1">
|
|
235
|
+
<Text nativeID="2">My text</Text>
|
|
236
|
+
</Text>
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
const { queryByText } = render(<NestedTexts />);
|
|
240
|
+
expect(queryByText('My text', { exact: false })?.props.nativeID).toBe('2');
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test('queryByText with nested Text components each with text return the lowest one', () => {
|
|
244
|
+
const NestedTexts = () => (
|
|
245
|
+
<Text nativeID="1">
|
|
246
|
+
bob
|
|
247
|
+
<Text nativeID="2">My text</Text>
|
|
248
|
+
</Text>
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
const { queryByText } = render(<NestedTexts />);
|
|
252
|
+
|
|
253
|
+
expect(queryByText('My text', { exact: false })?.props.nativeID).toBe('2');
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test('queryByText nested deep <CustomText> in <Text>', () => {
|
|
257
|
+
const CustomText = ({ children }: ChildrenProps) => {
|
|
258
|
+
return <Text>{children}</Text>;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
expect(
|
|
262
|
+
render(
|
|
263
|
+
<Text>
|
|
264
|
+
<CustomText>Hello</CustomText> <CustomText>World!</CustomText>
|
|
265
|
+
</Text>
|
|
266
|
+
).getByText('Hello World!')
|
|
267
|
+
).toBeTruthy();
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test('queryByText with nested Text components: not-exact text match returns the most deeply nested common component', () => {
|
|
271
|
+
const { queryByText: queryByTextFirstCase } = render(
|
|
272
|
+
<Text nativeID="1">
|
|
273
|
+
bob
|
|
274
|
+
<Text nativeID="2">My </Text>
|
|
275
|
+
<Text nativeID="3">text</Text>
|
|
276
|
+
</Text>
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
const { queryByText: queryByTextSecondCase } = render(
|
|
280
|
+
<Text nativeID="1">
|
|
281
|
+
bob
|
|
282
|
+
<Text nativeID="2">My text for test</Text>
|
|
283
|
+
</Text>
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
expect(queryByTextFirstCase('My text')).toBe(null);
|
|
287
|
+
expect(
|
|
288
|
+
queryByTextSecondCase('My text', { exact: false })?.props.nativeID
|
|
289
|
+
).toBe('2');
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
test('queryAllByText does not match several times the same text', () => {
|
|
293
|
+
const allMatched = render(
|
|
294
|
+
<Text nativeID="1">
|
|
295
|
+
Start
|
|
296
|
+
<Text nativeID="2">This is a long text</Text>
|
|
297
|
+
</Text>
|
|
298
|
+
).queryAllByText('long text', { exact: false });
|
|
299
|
+
expect(allMatched.length).toBe(1);
|
|
300
|
+
expect(allMatched[0].props.nativeID).toBe('2');
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
test('queryAllByText matches all the matching nodes', () => {
|
|
304
|
+
const allMatched = render(
|
|
305
|
+
<Text nativeID="1">
|
|
306
|
+
Start
|
|
307
|
+
<Text nativeID="2">This is a long text</Text>
|
|
308
|
+
<Text nativeID="3">This is another long text</Text>
|
|
309
|
+
</Text>
|
|
310
|
+
).queryAllByText('long text', { exact: false });
|
|
311
|
+
expect(allMatched.length).toBe(2);
|
|
312
|
+
expect(allMatched.map((node) => node.props.nativeID)).toEqual(['2', '3']);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
describe('supports TextMatch options', () => {
|
|
316
|
+
test('getByText, getAllByText', () => {
|
|
317
|
+
const { getByText, getAllByText } = render(
|
|
318
|
+
<View>
|
|
319
|
+
<Text testID="text">Text and details</Text>
|
|
320
|
+
<Button
|
|
321
|
+
testID="button"
|
|
322
|
+
title="Button and a detail"
|
|
323
|
+
onPress={jest.fn()}
|
|
324
|
+
/>
|
|
325
|
+
</View>
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
expect(getByText('details', { exact: false })).toBeTruthy();
|
|
329
|
+
expect(getAllByText('detail', { exact: false })).toHaveLength(2);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test('getByPlaceholderText, getAllByPlaceholderText', () => {
|
|
333
|
+
const { getByPlaceholderText, getAllByPlaceholderText } = render(
|
|
334
|
+
<View>
|
|
335
|
+
<TextInput placeholder={'Placeholder with details'} />
|
|
336
|
+
<TextInput placeholder={'Placeholder with a DETAIL'} />
|
|
337
|
+
</View>
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
expect(getByPlaceholderText('details', { exact: false })).toBeTruthy();
|
|
341
|
+
expect(getAllByPlaceholderText('detail', { exact: false })).toHaveLength(2);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
test('getByDisplayValue, getAllByDisplayValue', () => {
|
|
345
|
+
const { getByDisplayValue, getAllByDisplayValue } = render(
|
|
346
|
+
<View>
|
|
347
|
+
<TextInput value={'Value with details'} />
|
|
348
|
+
<TextInput value={'Value with a detail'} />
|
|
349
|
+
</View>
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
expect(getByDisplayValue('details', { exact: false })).toBeTruthy();
|
|
353
|
+
expect(getAllByDisplayValue('detail', { exact: false })).toHaveLength(2);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
test('getByTestId, getAllByTestId', () => {
|
|
357
|
+
const { getByTestId, getAllByTestId } = render(
|
|
358
|
+
<View>
|
|
359
|
+
<View testID="test" />
|
|
360
|
+
<View testID="tests id" />
|
|
361
|
+
</View>
|
|
362
|
+
);
|
|
363
|
+
expect(getByTestId('id', { exact: false })).toBeTruthy();
|
|
364
|
+
expect(getAllByTestId('test', { exact: false })).toHaveLength(2);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test('with TextMatch option exact === false text search is NOT case sensitive', () => {
|
|
368
|
+
const { getByText, getAllByText } = render(
|
|
369
|
+
<View>
|
|
370
|
+
<Text testID="text">Text and details</Text>
|
|
371
|
+
<Button
|
|
372
|
+
testID="button"
|
|
373
|
+
title="Button and a DeTAil"
|
|
374
|
+
onPress={jest.fn()}
|
|
375
|
+
/>
|
|
376
|
+
</View>
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
expect(getByText('DeTaIlS', { exact: false })).toBeTruthy();
|
|
380
|
+
expect(getAllByText('detail', { exact: false })).toHaveLength(2);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
describe('Supports normalization', () => {
|
|
385
|
+
test('trims and collapses whitespace by default', () => {
|
|
386
|
+
const { getByText } = render(
|
|
387
|
+
<View>
|
|
388
|
+
<Text>{` Text and
|
|
389
|
+
|
|
390
|
+
whitespace`}</Text>
|
|
391
|
+
</View>
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
expect(getByText('Text and whitespace')).toBeTruthy();
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
test('trim and collapseWhitespace is customizable by getDefaultNormalizer param', () => {
|
|
398
|
+
const testTextWithWhitespace = ` Text and
|
|
399
|
+
|
|
400
|
+
whitespace`;
|
|
401
|
+
const { getByText } = render(
|
|
402
|
+
<View>
|
|
403
|
+
<Text>{testTextWithWhitespace}</Text>
|
|
404
|
+
</View>
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
expect(
|
|
408
|
+
getByText(testTextWithWhitespace, {
|
|
409
|
+
normalizer: getDefaultNormalizer({
|
|
410
|
+
trim: false,
|
|
411
|
+
collapseWhitespace: false,
|
|
412
|
+
}),
|
|
413
|
+
})
|
|
414
|
+
).toBeTruthy();
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
test('normalizer function is customisable', () => {
|
|
418
|
+
const testText = 'A TO REMOVE text';
|
|
419
|
+
const normalizerFn = (textToNormalize: string) =>
|
|
420
|
+
textToNormalize.replace('TO REMOVE ', '');
|
|
421
|
+
const { getByText } = render(
|
|
422
|
+
<View>
|
|
423
|
+
<Text>{testText}</Text>
|
|
424
|
+
</View>
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
expect(getByText('A text', { normalizer: normalizerFn })).toBeTruthy();
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
test('getByText and queryByText work properly with text nested in React.Fragment', () => {
|
|
432
|
+
const { getByText, queryByText } = render(
|
|
433
|
+
<Text>
|
|
434
|
+
<>Hello</>
|
|
435
|
+
</Text>
|
|
436
|
+
);
|
|
437
|
+
expect(getByText('Hello')).toBeTruthy();
|
|
438
|
+
expect(queryByText('Hello')).not.toBeNull();
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
test('getByText and queryByText work properly with text partially nested in React.Fragment', () => {
|
|
442
|
+
const { getByText, queryByText } = render(
|
|
443
|
+
<Text>
|
|
444
|
+
He<>llo</>
|
|
445
|
+
</Text>
|
|
446
|
+
);
|
|
447
|
+
expect(getByText('Hello')).toBeTruthy();
|
|
448
|
+
expect(queryByText('Hello')).not.toBeNull();
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
test('getByText and queryByText work properly with multiple nested fragments', () => {
|
|
452
|
+
const { getByText, queryByText } = render(
|
|
453
|
+
<Text>
|
|
454
|
+
He
|
|
455
|
+
<>
|
|
456
|
+
l<>l</>o
|
|
457
|
+
</>
|
|
458
|
+
</Text>
|
|
459
|
+
);
|
|
460
|
+
expect(getByText('Hello')).toBeTruthy();
|
|
461
|
+
expect(queryByText('Hello')).not.toBeNull();
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
test('getByText and queryByText work with newlines', () => {
|
|
465
|
+
const textWithNewLines = 'Line 1\nLine 2';
|
|
466
|
+
const { getByText, queryByText } = render(<Text>{textWithNewLines}</Text>);
|
|
467
|
+
expect(getByText(textWithNewLines)).toBeTruthy();
|
|
468
|
+
expect(queryByText(textWithNewLines)).toBeTruthy();
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test('getByText and queryByText work with tabs', () => {
|
|
472
|
+
const textWithTabs = 'Line 1\tLine 2';
|
|
473
|
+
const { getByText, queryByText } = render(<Text>{textWithTabs}</Text>);
|
|
474
|
+
expect(getByText(textWithTabs)).toBeTruthy();
|
|
475
|
+
expect(queryByText(textWithTabs)).toBeTruthy();
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
test('getByText searches for text within itself', () => {
|
|
479
|
+
const { getByText } = render(<Text testID="subject">Hello</Text>);
|
|
480
|
+
const textNode = within(getByText('Hello'));
|
|
481
|
+
expect(textNode.getByText('Hello')).toBeTruthy();
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
test('getByText searches for text within self host element', () => {
|
|
485
|
+
const { getByTestId } = render(<Text testID="subject">Hello</Text>);
|
|
486
|
+
const textNode = within(getByTestId('subject'));
|
|
487
|
+
expect(textNode.getByText('Hello')).toBeTruthy();
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
test('byText support hidden option', () => {
|
|
491
|
+
const { getByText, queryByText } = render(
|
|
492
|
+
<Text style={{ display: 'none' }}>Hidden from accessibility</Text>
|
|
493
|
+
);
|
|
494
|
+
|
|
495
|
+
expect(getByText(/hidden/i, { includeHiddenElements: true })).toBeTruthy();
|
|
496
|
+
|
|
497
|
+
expect(queryByText(/hidden/i)).toBeFalsy();
|
|
498
|
+
expect(queryByText(/hidden/i, { includeHiddenElements: false })).toBeFalsy();
|
|
499
|
+
expect(() => getByText(/hidden/i, { includeHiddenElements: false }))
|
|
500
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
501
|
+
"Unable to find an element with text: /hidden/i
|
|
502
|
+
|
|
503
|
+
<Text
|
|
504
|
+
style={
|
|
505
|
+
{
|
|
506
|
+
"display": "none",
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
>
|
|
510
|
+
Hidden from accessibility
|
|
511
|
+
</Text>"
|
|
512
|
+
`);
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
test('error message renders the element tree, preserving only helpful props', async () => {
|
|
516
|
+
const view = render(<View accessibilityViewIsModal key="this is filtered" />);
|
|
517
|
+
|
|
518
|
+
expect(() => view.getByText(/foo/)).toThrowErrorMatchingInlineSnapshot(`
|
|
519
|
+
"Unable to find an element with text: /foo/
|
|
520
|
+
|
|
521
|
+
<View
|
|
522
|
+
accessibilityViewIsModal={true}
|
|
523
|
+
/>"
|
|
524
|
+
`);
|
|
525
|
+
|
|
526
|
+
expect(() => view.getAllByText(/foo/)).toThrowErrorMatchingInlineSnapshot(`
|
|
527
|
+
"Unable to find an element with text: /foo/
|
|
528
|
+
|
|
529
|
+
<View
|
|
530
|
+
accessibilityViewIsModal={true}
|
|
531
|
+
/>"
|
|
532
|
+
`);
|
|
533
|
+
|
|
534
|
+
await expect(view.findByText(/foo/)).rejects
|
|
535
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
536
|
+
"Unable to find an element with text: /foo/
|
|
537
|
+
|
|
538
|
+
<View
|
|
539
|
+
accessibilityViewIsModal={true}
|
|
540
|
+
/>"
|
|
541
|
+
`);
|
|
542
|
+
|
|
543
|
+
await expect(view.findAllByText(/foo/)).rejects
|
|
544
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
545
|
+
"Unable to find an element with text: /foo/
|
|
546
|
+
|
|
547
|
+
<View
|
|
548
|
+
accessibilityViewIsModal={true}
|
|
549
|
+
/>"
|
|
550
|
+
`);
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
test('byText should return host component', () => {
|
|
554
|
+
const { getByText } = render(<Text>hello</Text>);
|
|
555
|
+
expect(getByText('hello').type).toBe('Text');
|
|
556
|
+
});
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { ReactTestInstance } from 'react-test-renderer';
|
|
2
|
+
import { accessibilityStateKeys } from '../helpers/accessiblity';
|
|
3
|
+
import { deprecateQueries } from '../helpers/deprecation';
|
|
4
|
+
import { findAll } from '../helpers/findAll';
|
|
5
|
+
import {
|
|
6
|
+
AccessibilityStateMatcher,
|
|
7
|
+
matchAccessibilityState,
|
|
8
|
+
} from '../helpers/matchers/accessibilityState';
|
|
9
|
+
import { makeQueries } from './makeQueries';
|
|
10
|
+
import type {
|
|
11
|
+
FindAllByQuery,
|
|
12
|
+
FindByQuery,
|
|
13
|
+
GetAllByQuery,
|
|
14
|
+
GetByQuery,
|
|
15
|
+
QueryAllByQuery,
|
|
16
|
+
QueryByQuery,
|
|
17
|
+
} from './makeQueries';
|
|
18
|
+
import { CommonQueryOptions } from './options';
|
|
19
|
+
|
|
20
|
+
const queryAllByA11yState = (
|
|
21
|
+
instance: ReactTestInstance
|
|
22
|
+
): ((
|
|
23
|
+
matcher: AccessibilityStateMatcher,
|
|
24
|
+
queryOptions?: CommonQueryOptions
|
|
25
|
+
) => Array<ReactTestInstance>) =>
|
|
26
|
+
function queryAllByA11yStateFn(matcher, queryOptions) {
|
|
27
|
+
return findAll(
|
|
28
|
+
instance,
|
|
29
|
+
(node) =>
|
|
30
|
+
typeof node.type === 'string' && matchAccessibilityState(node, matcher),
|
|
31
|
+
queryOptions
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const buildErrorMessage = (state: AccessibilityStateMatcher = {}) => {
|
|
36
|
+
const errors: string[] = [];
|
|
37
|
+
|
|
38
|
+
accessibilityStateKeys.forEach((stateKey) => {
|
|
39
|
+
if (state[stateKey] !== undefined) {
|
|
40
|
+
errors.push(`${stateKey} state: ${state[stateKey]}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return errors.join(', ');
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const getMultipleError = (state: AccessibilityStateMatcher) =>
|
|
48
|
+
`Found multiple elements with ${buildErrorMessage(state)}`;
|
|
49
|
+
|
|
50
|
+
const getMissingError = (state: AccessibilityStateMatcher) =>
|
|
51
|
+
`Unable to find an element with ${buildErrorMessage(state)}`;
|
|
52
|
+
|
|
53
|
+
const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
|
|
54
|
+
queryAllByA11yState,
|
|
55
|
+
getMissingError,
|
|
56
|
+
getMultipleError
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
export type ByA11yStateQueries = {
|
|
60
|
+
getByA11yState: GetByQuery<AccessibilityStateMatcher, CommonQueryOptions>;
|
|
61
|
+
getAllByA11yState: GetAllByQuery<
|
|
62
|
+
AccessibilityStateMatcher,
|
|
63
|
+
CommonQueryOptions
|
|
64
|
+
>;
|
|
65
|
+
queryByA11yState: QueryByQuery<AccessibilityStateMatcher, CommonQueryOptions>;
|
|
66
|
+
queryAllByA11yState: QueryAllByQuery<
|
|
67
|
+
AccessibilityStateMatcher,
|
|
68
|
+
CommonQueryOptions
|
|
69
|
+
>;
|
|
70
|
+
findByA11yState: FindByQuery<AccessibilityStateMatcher, CommonQueryOptions>;
|
|
71
|
+
findAllByA11yState: FindAllByQuery<
|
|
72
|
+
AccessibilityStateMatcher,
|
|
73
|
+
CommonQueryOptions
|
|
74
|
+
>;
|
|
75
|
+
|
|
76
|
+
getByAccessibilityState: GetByQuery<
|
|
77
|
+
AccessibilityStateMatcher,
|
|
78
|
+
CommonQueryOptions
|
|
79
|
+
>;
|
|
80
|
+
getAllByAccessibilityState: GetAllByQuery<
|
|
81
|
+
AccessibilityStateMatcher,
|
|
82
|
+
CommonQueryOptions
|
|
83
|
+
>;
|
|
84
|
+
queryByAccessibilityState: QueryByQuery<
|
|
85
|
+
AccessibilityStateMatcher,
|
|
86
|
+
CommonQueryOptions
|
|
87
|
+
>;
|
|
88
|
+
queryAllByAccessibilityState: QueryAllByQuery<
|
|
89
|
+
AccessibilityStateMatcher,
|
|
90
|
+
CommonQueryOptions
|
|
91
|
+
>;
|
|
92
|
+
findByAccessibilityState: FindByQuery<
|
|
93
|
+
AccessibilityStateMatcher,
|
|
94
|
+
CommonQueryOptions
|
|
95
|
+
>;
|
|
96
|
+
findAllByAccessibilityState: FindAllByQuery<
|
|
97
|
+
AccessibilityStateMatcher,
|
|
98
|
+
CommonQueryOptions
|
|
99
|
+
>;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export const bindByA11yStateQueries = (
|
|
103
|
+
instance: ReactTestInstance
|
|
104
|
+
): ByA11yStateQueries => {
|
|
105
|
+
const getByA11yState = getBy(instance);
|
|
106
|
+
const getAllByA11yState = getAllBy(instance);
|
|
107
|
+
const queryByA11yState = queryBy(instance);
|
|
108
|
+
const queryAllByA11yState = queryAllBy(instance);
|
|
109
|
+
const findByA11yState = findBy(instance);
|
|
110
|
+
const findAllByA11yState = findAllBy(instance);
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
...deprecateQueries(
|
|
114
|
+
{
|
|
115
|
+
getByA11yState,
|
|
116
|
+
getAllByA11yState,
|
|
117
|
+
queryByA11yState,
|
|
118
|
+
queryAllByA11yState,
|
|
119
|
+
findByA11yState,
|
|
120
|
+
findAllByA11yState,
|
|
121
|
+
getByAccessibilityState: getByA11yState,
|
|
122
|
+
getAllByAccessibilityState: getAllByA11yState,
|
|
123
|
+
queryByAccessibilityState: queryByA11yState,
|
|
124
|
+
queryAllByAccessibilityState: queryAllByA11yState,
|
|
125
|
+
findByAccessibilityState: findByA11yState,
|
|
126
|
+
findAllByAccessibilityState: findAllByA11yState,
|
|
127
|
+
},
|
|
128
|
+
'Use {queryPrefix}ByRole(role, { disabled, selected, checked, busy, expanded }) query or expect(...).toHaveAccessibilityState(...) matcher from "@testing-library/jest-native" package instead.'
|
|
129
|
+
),
|
|
130
|
+
};
|
|
131
|
+
};
|