@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,23 @@
|
|
|
1
|
+
import { TextMatch } from '../../matches';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Matches the given string property again string or regex matcher.
|
|
5
|
+
*
|
|
6
|
+
* @param prop - The string prop to match.
|
|
7
|
+
* @param matcher - The string or regex to match.
|
|
8
|
+
* @returns - Whether the string prop matches the given string or regex.
|
|
9
|
+
*/
|
|
10
|
+
export function matchStringProp(
|
|
11
|
+
prop: string | undefined,
|
|
12
|
+
matcher: TextMatch
|
|
13
|
+
): boolean {
|
|
14
|
+
if (!prop) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (typeof matcher === 'string') {
|
|
19
|
+
return prop === matcher;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return prop.match(matcher) != null;
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReactTestInstance } from 'react-test-renderer';
|
|
2
|
+
import { matches, TextMatch, TextMatchOptions } from '../../matches';
|
|
3
|
+
import { getTextContent } from '../getTextContent';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Matches the given node's text content against string or regex matcher.
|
|
7
|
+
*
|
|
8
|
+
* @param node - Node which text content will be matched
|
|
9
|
+
* @param text - The string or regex to match.
|
|
10
|
+
* @returns - Whether the node's text content matches the given string or regex.
|
|
11
|
+
*/
|
|
12
|
+
export function matchTextContent(
|
|
13
|
+
node: ReactTestInstance,
|
|
14
|
+
text: TextMatch,
|
|
15
|
+
options: TextMatchOptions = {}
|
|
16
|
+
) {
|
|
17
|
+
const textContent = getTextContent(node);
|
|
18
|
+
const { exact, normalizer } = options;
|
|
19
|
+
return matches(text, textContent, normalizer, exact);
|
|
20
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ReactTestInstance } from 'react-test-renderer';
|
|
2
|
+
import { getHostParent } from './component-tree';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* pointerEvents controls whether the View can be the target of touch events.
|
|
6
|
+
* 'auto': The View and its children can be the target of touch events.
|
|
7
|
+
* 'none': The View is never the target of touch events.
|
|
8
|
+
* 'box-none': The View is never the target of touch events but its subviews can be
|
|
9
|
+
* 'box-only': The view can be the target of touch events but its subviews cannot be
|
|
10
|
+
* see the official react native doc https://reactnative.dev/docs/view#pointerevents */
|
|
11
|
+
export const isPointerEventEnabled = (
|
|
12
|
+
element: ReactTestInstance,
|
|
13
|
+
isParent?: boolean
|
|
14
|
+
): boolean => {
|
|
15
|
+
const parentCondition = isParent
|
|
16
|
+
? element?.props.pointerEvents === 'box-only'
|
|
17
|
+
: element?.props.pointerEvents === 'box-none';
|
|
18
|
+
|
|
19
|
+
if (element?.props.pointerEvents === 'none' || parentCondition) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const hostParent = getHostParent(element);
|
|
24
|
+
if (!hostParent) return true;
|
|
25
|
+
|
|
26
|
+
return isPointerEventEnabled(hostParent, true);
|
|
27
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ReactTestRendererNode } from 'react-test-renderer';
|
|
2
|
+
|
|
3
|
+
export const validateStringsRenderedWithinText = (
|
|
4
|
+
rendererJSON: ReactTestRendererNode | Array<ReactTestRendererNode> | null
|
|
5
|
+
) => {
|
|
6
|
+
if (!rendererJSON) return;
|
|
7
|
+
|
|
8
|
+
if (Array.isArray(rendererJSON)) {
|
|
9
|
+
rendererJSON.forEach(validateStringsRenderedWithinTextForNode);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return validateStringsRenderedWithinTextForNode(rendererJSON);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const validateStringsRenderedWithinTextForNode = (
|
|
17
|
+
node: ReactTestRendererNode
|
|
18
|
+
) => {
|
|
19
|
+
if (typeof node === 'string') {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (node.type !== 'Text') {
|
|
24
|
+
node.children?.forEach((child) => {
|
|
25
|
+
if (typeof child === 'string') {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Invariant Violation: Text strings must be rendered within a <Text> component. Detected attempt to render "${child}" string within a <${node.type}> component.`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (node.children) {
|
|
34
|
+
node.children.forEach(validateStringsRenderedWithinTextForNode);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Most content of this file sourced directly from https://github.com/testing-library/dom-testing-library/blob/main/src/helpers.js
|
|
2
|
+
/* globals jest */
|
|
3
|
+
const globalObj = typeof window === 'undefined' ? global : window;
|
|
4
|
+
|
|
5
|
+
type FakeTimersTypes = 'modern' | 'legacy';
|
|
6
|
+
|
|
7
|
+
// Currently this fn only supports jest timers, but it could support other test runners in the future.
|
|
8
|
+
function runWithRealTimers<T>(callback: () => T): T {
|
|
9
|
+
const fakeTimersType = getJestFakeTimersType();
|
|
10
|
+
if (fakeTimersType) {
|
|
11
|
+
jest.useRealTimers();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const callbackReturnValue = callback();
|
|
15
|
+
|
|
16
|
+
if (fakeTimersType) {
|
|
17
|
+
const fakeTimersConfig = getFakeTimersConfigFromType(fakeTimersType);
|
|
18
|
+
jest.useFakeTimers(fakeTimersConfig);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return callbackReturnValue;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getJestFakeTimersType(): FakeTimersTypes | null {
|
|
25
|
+
// istanbul ignore if
|
|
26
|
+
if (
|
|
27
|
+
typeof jest === 'undefined' ||
|
|
28
|
+
typeof globalObj.setTimeout === 'undefined' ||
|
|
29
|
+
process.env.RNTL_SKIP_AUTO_DETECT_FAKE_TIMERS
|
|
30
|
+
) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (
|
|
35
|
+
// @ts-expect-error jest mutates setTimeout
|
|
36
|
+
typeof globalObj.setTimeout._isMockFunction !== 'undefined' &&
|
|
37
|
+
// @ts-expect-error jest mutates setTimeout
|
|
38
|
+
globalObj.setTimeout._isMockFunction
|
|
39
|
+
) {
|
|
40
|
+
return 'legacy';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (
|
|
44
|
+
// @ts-expect-error jest mutates setTimeout
|
|
45
|
+
typeof globalObj.setTimeout.clock !== 'undefined' &&
|
|
46
|
+
typeof jest.getRealSystemTime !== 'undefined'
|
|
47
|
+
) {
|
|
48
|
+
try {
|
|
49
|
+
// jest.getRealSystemTime is only supported for Jest's `modern` fake timers and otherwise throws
|
|
50
|
+
jest.getRealSystemTime();
|
|
51
|
+
return 'modern';
|
|
52
|
+
} catch {
|
|
53
|
+
// not using Jest's modern fake timers
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getFakeTimersConfigFromType(type: FakeTimersTypes) {
|
|
61
|
+
return type === 'legacy'
|
|
62
|
+
? { legacyFakeTimers: true }
|
|
63
|
+
: { legacyFakeTimers: false };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const jestFakeTimersAreEnabled = (): boolean =>
|
|
67
|
+
Boolean(getJestFakeTimersType());
|
|
68
|
+
|
|
69
|
+
// we only run our tests in node, and setImmediate is supported in node.
|
|
70
|
+
function setImmediatePolyfill(fn: Function) {
|
|
71
|
+
return globalObj.setTimeout(fn, 0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
type BindTimeFunctions = {
|
|
75
|
+
clearTimeoutFn: typeof clearTimeout;
|
|
76
|
+
setImmediateFn: typeof setImmediate;
|
|
77
|
+
setTimeoutFn: typeof setTimeout;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
function bindTimeFunctions(): BindTimeFunctions {
|
|
81
|
+
return {
|
|
82
|
+
clearTimeoutFn: globalObj.clearTimeout,
|
|
83
|
+
setImmediateFn: globalObj.setImmediate || setImmediatePolyfill,
|
|
84
|
+
setTimeoutFn: globalObj.setTimeout,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const { clearTimeoutFn, setImmediateFn, setTimeoutFn } = runWithRealTimers(
|
|
89
|
+
bindTimeFunctions
|
|
90
|
+
) as BindTimeFunctions;
|
|
91
|
+
|
|
92
|
+
export {
|
|
93
|
+
runWithRealTimers,
|
|
94
|
+
jestFakeTimersAreEnabled,
|
|
95
|
+
clearTimeoutFn as clearTimeout,
|
|
96
|
+
setImmediateFn as setImmediate,
|
|
97
|
+
setTimeoutFn as setTimeout,
|
|
98
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cleanup } from './pure';
|
|
2
|
+
import { flushMicroTasksLegacy } from './flush-micro-tasks';
|
|
3
|
+
import { getIsReactActEnvironment, setReactActEnvironment } from './act';
|
|
4
|
+
|
|
5
|
+
if (typeof process === 'undefined' || !process.env?.RNTL_SKIP_AUTO_CLEANUP) {
|
|
6
|
+
// If we're running in a test runner that supports afterEach
|
|
7
|
+
// then we'll automatically run cleanup afterEach test
|
|
8
|
+
// this ensures that tests run in isolation from each other
|
|
9
|
+
// if you don't like this then either import the `pure` module
|
|
10
|
+
// or set the RNTL_SKIP_AUTO_CLEANUP env variable to 'true'.
|
|
11
|
+
if (typeof afterEach === 'function') {
|
|
12
|
+
// eslint-disable-next-line no-undef
|
|
13
|
+
afterEach(async () => {
|
|
14
|
+
await flushMicroTasksLegacy();
|
|
15
|
+
cleanup();
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (typeof beforeAll === 'function' && typeof afterAll === 'function') {
|
|
20
|
+
// This matches the behavior of React < 18.
|
|
21
|
+
let previousIsReactActEnvironment = getIsReactActEnvironment();
|
|
22
|
+
beforeAll(() => {
|
|
23
|
+
previousIsReactActEnvironment = getIsReactActEnvironment();
|
|
24
|
+
setReactActEnvironment(true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
afterAll(() => {
|
|
28
|
+
setReactActEnvironment(previousIsReactActEnvironment);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export * from './pure';
|
package/src/matches.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type NormalizerFn = (textToNormalize: string) => string;
|
|
2
|
+
|
|
3
|
+
export type TextMatch = string | RegExp;
|
|
4
|
+
export type TextMatchOptions = {
|
|
5
|
+
exact?: boolean;
|
|
6
|
+
normalizer?: NormalizerFn;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function matches(
|
|
10
|
+
matcher: TextMatch,
|
|
11
|
+
text: string,
|
|
12
|
+
normalizer: NormalizerFn = getDefaultNormalizer(),
|
|
13
|
+
exact: boolean = true
|
|
14
|
+
): boolean {
|
|
15
|
+
if (typeof text !== 'string') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const normalizedText = normalizer(text);
|
|
20
|
+
if (typeof matcher === 'string') {
|
|
21
|
+
const normalizedMatcher = normalizer(matcher);
|
|
22
|
+
return exact
|
|
23
|
+
? normalizedText === normalizedMatcher
|
|
24
|
+
: normalizedText.toLowerCase().includes(normalizedMatcher.toLowerCase());
|
|
25
|
+
} else {
|
|
26
|
+
// Reset state for global regexes: https://stackoverflow.com/a/1520839/484499
|
|
27
|
+
matcher.lastIndex = 0;
|
|
28
|
+
return matcher.test(normalizedText);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type NormalizerConfig = {
|
|
33
|
+
trim?: boolean;
|
|
34
|
+
collapseWhitespace?: boolean;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export function getDefaultNormalizer({
|
|
38
|
+
trim = true,
|
|
39
|
+
collapseWhitespace = true,
|
|
40
|
+
}: NormalizerConfig = {}): NormalizerFn {
|
|
41
|
+
return (text: string) => {
|
|
42
|
+
let normalizedText = text;
|
|
43
|
+
normalizedText = trim ? normalizedText.trim() : normalizedText;
|
|
44
|
+
normalizedText = collapseWhitespace
|
|
45
|
+
? normalizedText.replace(/\s+/g, ' ')
|
|
46
|
+
: normalizedText;
|
|
47
|
+
return normalizedText;
|
|
48
|
+
};
|
|
49
|
+
}
|
package/src/pure.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { default as act } from './act';
|
|
2
|
+
export { default as cleanup } from './cleanup';
|
|
3
|
+
export { default as fireEvent } from './fireEvent';
|
|
4
|
+
export { default as render } from './render';
|
|
5
|
+
export { default as waitFor } from './waitFor';
|
|
6
|
+
export { default as waitForElementToBeRemoved } from './waitForElementToBeRemoved';
|
|
7
|
+
export { within, getQueriesForElement } from './within';
|
|
8
|
+
|
|
9
|
+
export { configure, resetToDefaults } from './config';
|
|
10
|
+
export {
|
|
11
|
+
isHiddenFromAccessibility,
|
|
12
|
+
isInaccessible,
|
|
13
|
+
} from './helpers/accessiblity';
|
|
14
|
+
export { getDefaultNormalizer } from './matches';
|
|
15
|
+
export { renderHook } from './renderHook';
|
|
16
|
+
export { screen } from './screen';
|
|
17
|
+
|
|
18
|
+
export type {
|
|
19
|
+
RenderOptions,
|
|
20
|
+
RenderResult,
|
|
21
|
+
RenderResult as RenderAPI,
|
|
22
|
+
DebugFunction,
|
|
23
|
+
} from './render';
|
|
24
|
+
export type { RenderHookOptions, RenderHookResult } from './renderHook';
|
|
25
|
+
export type { Config } from './config';
|