@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,309 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { View, Text, TouchableOpacity } from 'react-native';
|
|
4
|
+
import { render } from '../..';
|
|
5
|
+
|
|
6
|
+
type ConsoleLogMock = jest.Mock<typeof console.log>;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
jest.spyOn(console, 'warn').mockImplementation(() => {});
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const TEXT_LABEL = 'cool text';
|
|
13
|
+
|
|
14
|
+
const Typography = ({ children, ...rest }: any) => {
|
|
15
|
+
return <Text {...rest}>{children}</Text>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const Button = ({ children }: { children: React.ReactNode }) => (
|
|
19
|
+
<TouchableOpacity>
|
|
20
|
+
<Typography accessibilityValue={{ min: 40, max: 60 }}>
|
|
21
|
+
{children}
|
|
22
|
+
</Typography>
|
|
23
|
+
</TouchableOpacity>
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const Section = () => (
|
|
27
|
+
<>
|
|
28
|
+
<Typography accessibilityValue={{ max: 60 }}>Title</Typography>
|
|
29
|
+
<Button>{TEXT_LABEL}</Button>
|
|
30
|
+
</>
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
test('getByA11yValue, queryByA11yValue, findByA11yValue', async () => {
|
|
34
|
+
const { getByA11yValue, queryByA11yValue, findByA11yValue } = render(
|
|
35
|
+
<Section />
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
expect(getByA11yValue({ min: 40 }).props.accessibilityValue).toEqual({
|
|
39
|
+
min: 40,
|
|
40
|
+
max: 60,
|
|
41
|
+
});
|
|
42
|
+
expect(queryByA11yValue({ min: 40 })?.props.accessibilityValue).toEqual({
|
|
43
|
+
min: 40,
|
|
44
|
+
max: 60,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
expect(() => getByA11yValue({ min: 50 })).toThrow(
|
|
48
|
+
'Unable to find an element with min value: 50'
|
|
49
|
+
);
|
|
50
|
+
expect(queryByA11yValue({ min: 50 })).toEqual(null);
|
|
51
|
+
|
|
52
|
+
expect(() => getByA11yValue({ max: 60 })).toThrow(
|
|
53
|
+
'Found multiple elements with max value: 60'
|
|
54
|
+
);
|
|
55
|
+
expect(() => queryByA11yValue({ max: 60 })).toThrow(
|
|
56
|
+
'Found multiple elements with max value: 60'
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const asyncElement = await findByA11yValue({ min: 40 });
|
|
60
|
+
expect(asyncElement.props.accessibilityValue).toEqual({
|
|
61
|
+
min: 40,
|
|
62
|
+
max: 60,
|
|
63
|
+
});
|
|
64
|
+
await expect(findByA11yValue({ min: 50 })).rejects.toThrow(
|
|
65
|
+
'Unable to find an element with min value: 50'
|
|
66
|
+
);
|
|
67
|
+
await expect(findByA11yValue({ max: 60 })).rejects.toThrow(
|
|
68
|
+
'Found multiple elements with max value: 60'
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('getAllByA11yValue, queryAllByA11yValue, findAllByA11yValue', async () => {
|
|
73
|
+
const { getAllByA11yValue, queryAllByA11yValue, findAllByA11yValue } = render(
|
|
74
|
+
<Section />
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
expect(getAllByA11yValue({ min: 40 })).toHaveLength(1);
|
|
78
|
+
expect(queryAllByA11yValue({ min: 40 })).toHaveLength(1);
|
|
79
|
+
|
|
80
|
+
expect(() => getAllByA11yValue({ min: 50 })).toThrow(
|
|
81
|
+
'Unable to find an element with min value: 50'
|
|
82
|
+
);
|
|
83
|
+
expect(queryAllByA11yValue({ min: 50 })).toEqual([]);
|
|
84
|
+
|
|
85
|
+
expect(queryAllByA11yValue({ max: 60 })).toHaveLength(2);
|
|
86
|
+
expect(getAllByA11yValue({ max: 60 })).toHaveLength(2);
|
|
87
|
+
|
|
88
|
+
await expect(findAllByA11yValue({ min: 40 })).resolves.toHaveLength(1);
|
|
89
|
+
await expect(findAllByA11yValue({ min: 50 })).rejects.toThrow(
|
|
90
|
+
'Unable to find an element with min value: 50'
|
|
91
|
+
);
|
|
92
|
+
await expect(findAllByA11yValue({ max: 60 })).resolves.toHaveLength(2);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('byA11yValue queries support hidden option', () => {
|
|
96
|
+
const { getByA11yValue, queryByA11yValue } = render(
|
|
97
|
+
<Text accessibilityValue={{ max: 10 }} style={{ display: 'none' }}>
|
|
98
|
+
Hidden from accessibility
|
|
99
|
+
</Text>
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
expect(
|
|
103
|
+
getByA11yValue({ max: 10 }, { includeHiddenElements: true })
|
|
104
|
+
).toBeTruthy();
|
|
105
|
+
|
|
106
|
+
expect(queryByA11yValue({ max: 10 })).toBeFalsy();
|
|
107
|
+
expect(
|
|
108
|
+
queryByA11yValue({ max: 10 }, { includeHiddenElements: false })
|
|
109
|
+
).toBeFalsy();
|
|
110
|
+
expect(() => getByA11yValue({ max: 10 }, { includeHiddenElements: false }))
|
|
111
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
112
|
+
"Unable to find an element with max value: 10
|
|
113
|
+
|
|
114
|
+
<Text
|
|
115
|
+
accessibilityValue={
|
|
116
|
+
{
|
|
117
|
+
"max": 10,
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
style={
|
|
121
|
+
{
|
|
122
|
+
"display": "none",
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
>
|
|
126
|
+
Hidden from accessibility
|
|
127
|
+
</Text>"
|
|
128
|
+
`);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('byA11yValue error messages', () => {
|
|
132
|
+
const { getByA11yValue } = render(<View />);
|
|
133
|
+
expect(() => getByA11yValue({ min: 10, max: 10 }))
|
|
134
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
135
|
+
"Unable to find an element with min value: 10, max value: 10
|
|
136
|
+
|
|
137
|
+
<View />"
|
|
138
|
+
`);
|
|
139
|
+
expect(() => getByA11yValue({ max: 20, now: 5 }))
|
|
140
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
141
|
+
"Unable to find an element with max value: 20, now value: 5
|
|
142
|
+
|
|
143
|
+
<View />"
|
|
144
|
+
`);
|
|
145
|
+
expect(() => getByA11yValue({ min: 1, max: 2, now: 3 }))
|
|
146
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
147
|
+
"Unable to find an element with min value: 1, max value: 2, now value: 3
|
|
148
|
+
|
|
149
|
+
<View />"
|
|
150
|
+
`);
|
|
151
|
+
expect(() => getByA11yValue({ min: 1, max: 2, now: 3, text: /foo/i }))
|
|
152
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
153
|
+
"Unable to find an element with min value: 1, max value: 2, now value: 3, text value: /foo/i
|
|
154
|
+
|
|
155
|
+
<View />"
|
|
156
|
+
`);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('*ByA11yValue deprecation warnings', () => {
|
|
160
|
+
const mockCalls = (console.warn as ConsoleLogMock).mock.calls;
|
|
161
|
+
const view = render(<View accessibilityValue={{ min: 10 }} />);
|
|
162
|
+
|
|
163
|
+
view.getByA11yValue({ min: 10 });
|
|
164
|
+
expect(mockCalls[0][0]).toMatchInlineSnapshot(`
|
|
165
|
+
"getByA11yValue(...) is deprecated and will be removed in the future.
|
|
166
|
+
|
|
167
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or getByRole(role, { value: ... }) query instead."
|
|
168
|
+
`);
|
|
169
|
+
|
|
170
|
+
view.getAllByA11yValue({ min: 10 });
|
|
171
|
+
expect(mockCalls[1][0]).toMatchInlineSnapshot(`
|
|
172
|
+
"getAllByA11yValue(...) is deprecated and will be removed in the future.
|
|
173
|
+
|
|
174
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or getAllByRole(role, { value: ... }) query instead."
|
|
175
|
+
`);
|
|
176
|
+
|
|
177
|
+
view.queryByA11yValue({ min: 10 });
|
|
178
|
+
expect(mockCalls[2][0]).toMatchInlineSnapshot(`
|
|
179
|
+
"queryByA11yValue(...) is deprecated and will be removed in the future.
|
|
180
|
+
|
|
181
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or queryByRole(role, { value: ... }) query instead."
|
|
182
|
+
`);
|
|
183
|
+
|
|
184
|
+
view.queryAllByA11yValue({ min: 10 });
|
|
185
|
+
expect(mockCalls[3][0]).toMatchInlineSnapshot(`
|
|
186
|
+
"queryAllByA11yValue(...) is deprecated and will be removed in the future.
|
|
187
|
+
|
|
188
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or queryAllByRole(role, { value: ... }) query instead."
|
|
189
|
+
`);
|
|
190
|
+
|
|
191
|
+
view.findByA11yValue({ min: 10 });
|
|
192
|
+
expect(mockCalls[4][0]).toMatchInlineSnapshot(`
|
|
193
|
+
"findByA11yValue(...) is deprecated and will be removed in the future.
|
|
194
|
+
|
|
195
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or findByRole(role, { value: ... }) query instead."
|
|
196
|
+
`);
|
|
197
|
+
|
|
198
|
+
view.findAllByA11yValue({ min: 10 });
|
|
199
|
+
expect(mockCalls[5][0]).toMatchInlineSnapshot(`
|
|
200
|
+
"findAllByA11yValue(...) is deprecated and will be removed in the future.
|
|
201
|
+
|
|
202
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or findAllByRole(role, { value: ... }) query instead."
|
|
203
|
+
`);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test('*ByAccessibilityValue deprecation warnings', () => {
|
|
207
|
+
const mockCalls = (console.warn as ConsoleLogMock).mock.calls;
|
|
208
|
+
const view = render(<View accessibilityValue={{ min: 10 }} />);
|
|
209
|
+
|
|
210
|
+
view.getByAccessibilityValue({ min: 10 });
|
|
211
|
+
expect(mockCalls[0][0]).toMatchInlineSnapshot(`
|
|
212
|
+
"getByAccessibilityValue(...) is deprecated and will be removed in the future.
|
|
213
|
+
|
|
214
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or getByRole(role, { value: ... }) query instead."
|
|
215
|
+
`);
|
|
216
|
+
|
|
217
|
+
view.getAllByAccessibilityValue({ min: 10 });
|
|
218
|
+
expect(mockCalls[1][0]).toMatchInlineSnapshot(`
|
|
219
|
+
"getAllByAccessibilityValue(...) is deprecated and will be removed in the future.
|
|
220
|
+
|
|
221
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or getAllByRole(role, { value: ... }) query instead."
|
|
222
|
+
`);
|
|
223
|
+
|
|
224
|
+
view.queryByAccessibilityValue({ min: 10 });
|
|
225
|
+
expect(mockCalls[2][0]).toMatchInlineSnapshot(`
|
|
226
|
+
"queryByAccessibilityValue(...) is deprecated and will be removed in the future.
|
|
227
|
+
|
|
228
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or queryByRole(role, { value: ... }) query instead."
|
|
229
|
+
`);
|
|
230
|
+
|
|
231
|
+
view.queryAllByAccessibilityValue({ min: 10 });
|
|
232
|
+
expect(mockCalls[3][0]).toMatchInlineSnapshot(`
|
|
233
|
+
"queryAllByAccessibilityValue(...) is deprecated and will be removed in the future.
|
|
234
|
+
|
|
235
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or queryAllByRole(role, { value: ... }) query instead."
|
|
236
|
+
`);
|
|
237
|
+
|
|
238
|
+
view.findByAccessibilityValue({ min: 10 });
|
|
239
|
+
expect(mockCalls[4][0]).toMatchInlineSnapshot(`
|
|
240
|
+
"findByAccessibilityValue(...) is deprecated and will be removed in the future.
|
|
241
|
+
|
|
242
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or findByRole(role, { value: ... }) query instead."
|
|
243
|
+
`);
|
|
244
|
+
|
|
245
|
+
view.findAllByAccessibilityValue({ min: 10 });
|
|
246
|
+
expect(mockCalls[5][0]).toMatchInlineSnapshot(`
|
|
247
|
+
"findAllByAccessibilityValue(...) is deprecated and will be removed in the future.
|
|
248
|
+
|
|
249
|
+
Use expect(...).toHaveAccessibilityValue(...) matcher from "@testing-library/jest-native" package or findAllByRole(role, { value: ... }) query instead."
|
|
250
|
+
`);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test('error message renders the element tree, preserving only helpful props', async () => {
|
|
254
|
+
const view = render(
|
|
255
|
+
<View accessibilityValue={{ min: 2 }} key="NOT_RELEVANT" />
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
expect(() => view.getByA11yValue({ min: 1 }))
|
|
259
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
260
|
+
"Unable to find an element with min value: 1
|
|
261
|
+
|
|
262
|
+
<View
|
|
263
|
+
accessibilityValue={
|
|
264
|
+
{
|
|
265
|
+
"min": 2,
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/>"
|
|
269
|
+
`);
|
|
270
|
+
|
|
271
|
+
expect(() => view.getAllByA11yValue({ min: 1 }))
|
|
272
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
273
|
+
"Unable to find an element with min value: 1
|
|
274
|
+
|
|
275
|
+
<View
|
|
276
|
+
accessibilityValue={
|
|
277
|
+
{
|
|
278
|
+
"min": 2,
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/>"
|
|
282
|
+
`);
|
|
283
|
+
|
|
284
|
+
await expect(view.findByA11yValue({ min: 1 })).rejects
|
|
285
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
286
|
+
"Unable to find an element with min value: 1
|
|
287
|
+
|
|
288
|
+
<View
|
|
289
|
+
accessibilityValue={
|
|
290
|
+
{
|
|
291
|
+
"min": 2,
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/>"
|
|
295
|
+
`);
|
|
296
|
+
|
|
297
|
+
await expect(view.findAllByA11yValue({ min: 1 })).rejects
|
|
298
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
299
|
+
"Unable to find an element with min value: 1
|
|
300
|
+
|
|
301
|
+
<View
|
|
302
|
+
accessibilityValue={
|
|
303
|
+
{
|
|
304
|
+
"min": 2,
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/>"
|
|
308
|
+
`);
|
|
309
|
+
});
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TextInput, View } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import { render } from '../..';
|
|
5
|
+
|
|
6
|
+
const PLACEHOLDER_FRESHNESS = 'Add custom freshness';
|
|
7
|
+
const PLACEHOLDER_CHEF = 'Who inspected freshness?';
|
|
8
|
+
const INPUT_FRESHNESS = 'Custom Freshie';
|
|
9
|
+
const INPUT_CHEF = 'I inspected freshie';
|
|
10
|
+
const DEFAULT_INPUT_CHEF = 'What did you inspect?';
|
|
11
|
+
const DEFAULT_INPUT_CUSTOMER = 'What banana?';
|
|
12
|
+
|
|
13
|
+
const Banana = () => (
|
|
14
|
+
<View>
|
|
15
|
+
<TextInput
|
|
16
|
+
testID="bananaCustomFreshness"
|
|
17
|
+
placeholder={PLACEHOLDER_FRESHNESS}
|
|
18
|
+
value={INPUT_FRESHNESS}
|
|
19
|
+
/>
|
|
20
|
+
<TextInput
|
|
21
|
+
testID="bananaChef"
|
|
22
|
+
placeholder={PLACEHOLDER_CHEF}
|
|
23
|
+
value={INPUT_CHEF}
|
|
24
|
+
defaultValue={DEFAULT_INPUT_CHEF}
|
|
25
|
+
/>
|
|
26
|
+
<TextInput defaultValue={DEFAULT_INPUT_CUSTOMER} />
|
|
27
|
+
<TextInput defaultValue={'hello'} value="" />
|
|
28
|
+
</View>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
test('getByDisplayValue, queryByDisplayValue', () => {
|
|
32
|
+
const { getByDisplayValue, queryByDisplayValue } = render(<Banana />);
|
|
33
|
+
const input = getByDisplayValue(/custom/i);
|
|
34
|
+
|
|
35
|
+
expect(input.props.value).toBe(INPUT_FRESHNESS);
|
|
36
|
+
|
|
37
|
+
const sameInput = getByDisplayValue(INPUT_FRESHNESS);
|
|
38
|
+
|
|
39
|
+
expect(sameInput.props.value).toBe(INPUT_FRESHNESS);
|
|
40
|
+
expect(() => getByDisplayValue('no value')).toThrow(
|
|
41
|
+
'Unable to find an element with displayValue: no value'
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
expect(queryByDisplayValue(/custom/i)).toBe(input);
|
|
45
|
+
expect(queryByDisplayValue('no value')).toBeNull();
|
|
46
|
+
expect(() => queryByDisplayValue(/fresh/i)).toThrow(
|
|
47
|
+
'Found multiple elements with display value: /fresh/i'
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('getByDisplayValue, queryByDisplayValue get element by default value only when value is undefined', () => {
|
|
52
|
+
const { getByDisplayValue, queryByDisplayValue } = render(<Banana />);
|
|
53
|
+
expect(() => getByDisplayValue(DEFAULT_INPUT_CHEF))
|
|
54
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
55
|
+
"Unable to find an element with displayValue: What did you inspect?
|
|
56
|
+
|
|
57
|
+
<View>
|
|
58
|
+
<TextInput
|
|
59
|
+
placeholder="Add custom freshness"
|
|
60
|
+
testID="bananaCustomFreshness"
|
|
61
|
+
value="Custom Freshie"
|
|
62
|
+
/>
|
|
63
|
+
<TextInput
|
|
64
|
+
defaultValue="What did you inspect?"
|
|
65
|
+
placeholder="Who inspected freshness?"
|
|
66
|
+
testID="bananaChef"
|
|
67
|
+
value="I inspected freshie"
|
|
68
|
+
/>
|
|
69
|
+
<TextInput
|
|
70
|
+
defaultValue="What banana?"
|
|
71
|
+
/>
|
|
72
|
+
<TextInput
|
|
73
|
+
defaultValue="hello"
|
|
74
|
+
value=""
|
|
75
|
+
/>
|
|
76
|
+
</View>"
|
|
77
|
+
`);
|
|
78
|
+
expect(queryByDisplayValue(DEFAULT_INPUT_CHEF)).toBeNull();
|
|
79
|
+
|
|
80
|
+
expect(() => getByDisplayValue('hello')).toThrowErrorMatchingInlineSnapshot(`
|
|
81
|
+
"Unable to find an element with displayValue: hello
|
|
82
|
+
|
|
83
|
+
<View>
|
|
84
|
+
<TextInput
|
|
85
|
+
placeholder="Add custom freshness"
|
|
86
|
+
testID="bananaCustomFreshness"
|
|
87
|
+
value="Custom Freshie"
|
|
88
|
+
/>
|
|
89
|
+
<TextInput
|
|
90
|
+
defaultValue="What did you inspect?"
|
|
91
|
+
placeholder="Who inspected freshness?"
|
|
92
|
+
testID="bananaChef"
|
|
93
|
+
value="I inspected freshie"
|
|
94
|
+
/>
|
|
95
|
+
<TextInput
|
|
96
|
+
defaultValue="What banana?"
|
|
97
|
+
/>
|
|
98
|
+
<TextInput
|
|
99
|
+
defaultValue="hello"
|
|
100
|
+
value=""
|
|
101
|
+
/>
|
|
102
|
+
</View>"
|
|
103
|
+
`);
|
|
104
|
+
expect(queryByDisplayValue('hello')).toBeNull();
|
|
105
|
+
|
|
106
|
+
expect(getByDisplayValue(DEFAULT_INPUT_CUSTOMER)).toBeTruthy();
|
|
107
|
+
expect(queryByDisplayValue(DEFAULT_INPUT_CUSTOMER)).toBeTruthy();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('getAllByDisplayValue, queryAllByDisplayValue', () => {
|
|
111
|
+
const { getAllByDisplayValue, queryAllByDisplayValue } = render(<Banana />);
|
|
112
|
+
const inputs = getAllByDisplayValue(/fresh/i);
|
|
113
|
+
|
|
114
|
+
expect(inputs).toHaveLength(2);
|
|
115
|
+
expect(() => getAllByDisplayValue('no value')).toThrow(
|
|
116
|
+
'Unable to find an element with displayValue: no value'
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
expect(queryAllByDisplayValue(/fresh/i)).toEqual(inputs);
|
|
120
|
+
expect(queryAllByDisplayValue('no value')).toHaveLength(0);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('findBy queries work asynchronously', async () => {
|
|
124
|
+
const options = { timeout: 10 }; // Short timeout so that this test runs quickly
|
|
125
|
+
const { rerender, findByDisplayValue, findAllByDisplayValue } = render(
|
|
126
|
+
<View />
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
await expect(
|
|
130
|
+
findByDisplayValue('Display Value', {}, options)
|
|
131
|
+
).rejects.toBeTruthy();
|
|
132
|
+
await expect(
|
|
133
|
+
findAllByDisplayValue('Display Value', {}, options)
|
|
134
|
+
).rejects.toBeTruthy();
|
|
135
|
+
|
|
136
|
+
setTimeout(
|
|
137
|
+
() =>
|
|
138
|
+
rerender(
|
|
139
|
+
<View>
|
|
140
|
+
<TextInput value="Display Value" />
|
|
141
|
+
</View>
|
|
142
|
+
),
|
|
143
|
+
20
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
await expect(findByDisplayValue('Display Value')).resolves.toBeTruthy();
|
|
147
|
+
await expect(findAllByDisplayValue('Display Value')).resolves.toHaveLength(1);
|
|
148
|
+
}, 20000);
|
|
149
|
+
|
|
150
|
+
test('byDisplayValue queries support hidden option', () => {
|
|
151
|
+
const { getByDisplayValue, queryByDisplayValue } = render(
|
|
152
|
+
<TextInput value="hidden" style={{ display: 'none' }} />
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
expect(
|
|
156
|
+
getByDisplayValue('hidden', { includeHiddenElements: true })
|
|
157
|
+
).toBeTruthy();
|
|
158
|
+
|
|
159
|
+
expect(queryByDisplayValue('hidden')).toBeFalsy();
|
|
160
|
+
expect(
|
|
161
|
+
queryByDisplayValue('hidden', { includeHiddenElements: false })
|
|
162
|
+
).toBeFalsy();
|
|
163
|
+
expect(() => getByDisplayValue('hidden', { includeHiddenElements: false }))
|
|
164
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
165
|
+
"Unable to find an element with displayValue: hidden
|
|
166
|
+
|
|
167
|
+
<TextInput
|
|
168
|
+
style={
|
|
169
|
+
{
|
|
170
|
+
"display": "none",
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
value="hidden"
|
|
174
|
+
/>"
|
|
175
|
+
`);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test('byDisplayValue should return host component', () => {
|
|
179
|
+
const { getByDisplayValue } = render(<TextInput value="value" />);
|
|
180
|
+
|
|
181
|
+
expect(getByDisplayValue('value').type).toBe('TextInput');
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('error message renders the element tree, preserving only helpful props', async () => {
|
|
185
|
+
const view = render(<TextInput value="1" key="3" />);
|
|
186
|
+
|
|
187
|
+
expect(() => view.getByDisplayValue('2')).toThrowErrorMatchingInlineSnapshot(`
|
|
188
|
+
"Unable to find an element with displayValue: 2
|
|
189
|
+
|
|
190
|
+
<TextInput
|
|
191
|
+
value="1"
|
|
192
|
+
/>"
|
|
193
|
+
`);
|
|
194
|
+
|
|
195
|
+
expect(() => view.getAllByDisplayValue('2'))
|
|
196
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
197
|
+
"Unable to find an element with displayValue: 2
|
|
198
|
+
|
|
199
|
+
<TextInput
|
|
200
|
+
value="1"
|
|
201
|
+
/>"
|
|
202
|
+
`);
|
|
203
|
+
|
|
204
|
+
await expect(view.findByDisplayValue('2')).rejects
|
|
205
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
206
|
+
"Unable to find an element with displayValue: 2
|
|
207
|
+
|
|
208
|
+
<TextInput
|
|
209
|
+
value="1"
|
|
210
|
+
/>"
|
|
211
|
+
`);
|
|
212
|
+
|
|
213
|
+
await expect(view.findAllByDisplayValue('2')).rejects
|
|
214
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
215
|
+
"Unable to find an element with displayValue: 2
|
|
216
|
+
|
|
217
|
+
<TextInput
|
|
218
|
+
value="1"
|
|
219
|
+
/>"
|
|
220
|
+
`);
|
|
221
|
+
});
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TouchableOpacity, Text, View } from 'react-native';
|
|
3
|
+
import { render } from '../..';
|
|
4
|
+
|
|
5
|
+
const BUTTON_HINT = 'click this button';
|
|
6
|
+
const TEXT_HINT = 'static text';
|
|
7
|
+
// Little hack to make all the methods happy with type
|
|
8
|
+
const NO_MATCHES_TEXT: any = 'not-existent-element';
|
|
9
|
+
|
|
10
|
+
const getMultipleInstancesFoundMessage = (value: string) => {
|
|
11
|
+
return `Found multiple elements with accessibilityHint: ${value}`;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const getNoInstancesFoundMessage = (value: string) => {
|
|
15
|
+
return `Unable to find an element with accessibilityHint: ${value}`;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const Typography = ({ children, ...rest }: any) => {
|
|
19
|
+
return <Text {...rest}>{children}</Text>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const Button = ({ children }: { children: React.ReactNode }) => (
|
|
23
|
+
<TouchableOpacity accessibilityHint={BUTTON_HINT}>
|
|
24
|
+
<Typography accessibilityHint={TEXT_HINT}>{children}</Typography>
|
|
25
|
+
</TouchableOpacity>
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const Section = () => (
|
|
29
|
+
<>
|
|
30
|
+
<Typography accessibilityHint={TEXT_HINT}>Title</Typography>
|
|
31
|
+
<Button>Hello</Button>
|
|
32
|
+
</>
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
test('getByA11yHint, queryByA11yHint, findByA11yHint', async () => {
|
|
36
|
+
const { getByA11yHint, queryByA11yHint, findByA11yHint } = render(
|
|
37
|
+
<Section />
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
expect(getByA11yHint(BUTTON_HINT).props.accessibilityHint).toEqual(
|
|
41
|
+
BUTTON_HINT
|
|
42
|
+
);
|
|
43
|
+
const button = queryByA11yHint(BUTTON_HINT);
|
|
44
|
+
expect(button?.props.accessibilityHint).toEqual(BUTTON_HINT);
|
|
45
|
+
|
|
46
|
+
expect(() => getByA11yHint(NO_MATCHES_TEXT)).toThrow(
|
|
47
|
+
getNoInstancesFoundMessage(NO_MATCHES_TEXT)
|
|
48
|
+
);
|
|
49
|
+
expect(queryByA11yHint(NO_MATCHES_TEXT)).toBeNull();
|
|
50
|
+
|
|
51
|
+
expect(() => getByA11yHint(TEXT_HINT)).toThrow(
|
|
52
|
+
getMultipleInstancesFoundMessage(TEXT_HINT)
|
|
53
|
+
);
|
|
54
|
+
expect(() => queryByA11yHint(TEXT_HINT)).toThrow(
|
|
55
|
+
getMultipleInstancesFoundMessage(TEXT_HINT)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const asyncButton = await findByA11yHint(BUTTON_HINT);
|
|
59
|
+
expect(asyncButton.props.accessibilityHint).toEqual(BUTTON_HINT);
|
|
60
|
+
await expect(findByA11yHint(NO_MATCHES_TEXT)).rejects.toThrow(
|
|
61
|
+
getNoInstancesFoundMessage(NO_MATCHES_TEXT)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
await expect(findByA11yHint(TEXT_HINT)).rejects.toThrow(
|
|
65
|
+
getMultipleInstancesFoundMessage(TEXT_HINT)
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('getAllByA11yHint, queryAllByA11yHint, findAllByA11yHint', async () => {
|
|
70
|
+
const { getAllByA11yHint, queryAllByA11yHint, findAllByA11yHint } = render(
|
|
71
|
+
<Section />
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
expect(getAllByA11yHint(TEXT_HINT)).toHaveLength(2);
|
|
75
|
+
expect(queryAllByA11yHint(TEXT_HINT)).toHaveLength(2);
|
|
76
|
+
|
|
77
|
+
expect(() => getAllByA11yHint(NO_MATCHES_TEXT)).toThrow(
|
|
78
|
+
getNoInstancesFoundMessage(NO_MATCHES_TEXT)
|
|
79
|
+
);
|
|
80
|
+
expect(queryAllByA11yHint(NO_MATCHES_TEXT)).toEqual([]);
|
|
81
|
+
|
|
82
|
+
await expect(findAllByA11yHint(TEXT_HINT)).resolves.toHaveLength(2);
|
|
83
|
+
await expect(findAllByA11yHint(NO_MATCHES_TEXT)).rejects.toThrow(
|
|
84
|
+
getNoInstancesFoundMessage(NO_MATCHES_TEXT)
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('getByHintText, getByHintText', () => {
|
|
89
|
+
const { getByHintText, getAllByHintText } = render(
|
|
90
|
+
<View>
|
|
91
|
+
<View accessibilityHint="test" />
|
|
92
|
+
<View accessibilityHint="tests id" />
|
|
93
|
+
</View>
|
|
94
|
+
);
|
|
95
|
+
expect(getByHintText('id', { exact: false })).toBeTruthy();
|
|
96
|
+
expect(getAllByHintText('test', { exact: false })).toHaveLength(2);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('getByHintText, getByHintText and exact = true', () => {
|
|
100
|
+
const { queryByHintText, getAllByHintText } = render(
|
|
101
|
+
<View>
|
|
102
|
+
<View accessibilityHint="test" />
|
|
103
|
+
<View accessibilityHint="tests id" />
|
|
104
|
+
</View>
|
|
105
|
+
);
|
|
106
|
+
expect(queryByHintText('id', { exact: true })).toBeNull();
|
|
107
|
+
expect(getAllByHintText('test', { exact: true })).toHaveLength(1);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('byHintText queries support hidden option', () => {
|
|
111
|
+
const { getByHintText, queryByHintText } = render(
|
|
112
|
+
<Text accessibilityHint="hidden" style={{ display: 'none' }}>
|
|
113
|
+
Hidden from accessiblity
|
|
114
|
+
</Text>
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
expect(getByHintText('hidden', { includeHiddenElements: true })).toBeTruthy();
|
|
118
|
+
|
|
119
|
+
expect(queryByHintText('hidden')).toBeFalsy();
|
|
120
|
+
expect(
|
|
121
|
+
queryByHintText('hidden', { includeHiddenElements: false })
|
|
122
|
+
).toBeFalsy();
|
|
123
|
+
expect(() => getByHintText('hidden', { includeHiddenElements: false }))
|
|
124
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
125
|
+
"Unable to find an element with accessibilityHint: hidden
|
|
126
|
+
|
|
127
|
+
<Text
|
|
128
|
+
accessibilityHint="hidden"
|
|
129
|
+
style={
|
|
130
|
+
{
|
|
131
|
+
"display": "none",
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
>
|
|
135
|
+
Hidden from accessiblity
|
|
136
|
+
</Text>"
|
|
137
|
+
`);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('error message renders the element tree, preserving only helpful props', async () => {
|
|
141
|
+
const view = render(<TouchableOpacity accessibilityHint="HINT" key="3" />);
|
|
142
|
+
|
|
143
|
+
expect(() => view.getByHintText('FOO')).toThrowErrorMatchingInlineSnapshot(`
|
|
144
|
+
"Unable to find an element with accessibilityHint: FOO
|
|
145
|
+
|
|
146
|
+
<View
|
|
147
|
+
accessibilityHint="HINT"
|
|
148
|
+
/>"
|
|
149
|
+
`);
|
|
150
|
+
|
|
151
|
+
expect(() => view.getAllByHintText('FOO'))
|
|
152
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
153
|
+
"Unable to find an element with accessibilityHint: FOO
|
|
154
|
+
|
|
155
|
+
<View
|
|
156
|
+
accessibilityHint="HINT"
|
|
157
|
+
/>"
|
|
158
|
+
`);
|
|
159
|
+
|
|
160
|
+
await expect(view.findByHintText('FOO')).rejects
|
|
161
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
162
|
+
"Unable to find an element with accessibilityHint: FOO
|
|
163
|
+
|
|
164
|
+
<View
|
|
165
|
+
accessibilityHint="HINT"
|
|
166
|
+
/>"
|
|
167
|
+
`);
|
|
168
|
+
|
|
169
|
+
await expect(view.findAllByHintText('FOO')).rejects
|
|
170
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
171
|
+
"Unable to find an element with accessibilityHint: FOO
|
|
172
|
+
|
|
173
|
+
<View
|
|
174
|
+
accessibilityHint="HINT"
|
|
175
|
+
/>"
|
|
176
|
+
`);
|
|
177
|
+
});
|