@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.
Files changed (372) hide show
  1. package/.DS_Store +0 -0
  2. package/.codecov.yml +9 -0
  3. package/.eslintcache +1 -0
  4. package/.eslintignore +2 -0
  5. package/.eslintrc +19 -0
  6. package/.flowconfig +63 -0
  7. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
  9. package/.github/ISSUE_TEMPLATE/question.md +9 -0
  10. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  11. package/.github/actions/setup-deps/action.yml +22 -0
  12. package/.github/actions/setup-website-deps/action.yml +22 -0
  13. package/.github/dependabot.yml +10 -0
  14. package/.github/workflows/deploy-website.yml +36 -0
  15. package/.github/workflows/example-apps.yml +25 -0
  16. package/.github/workflows/main.yml +103 -0
  17. package/.gitignore +11 -0
  18. package/.prettierrc.js +5 -0
  19. package/CODE_OF_CONDUCT.md +73 -0
  20. package/CONTRIBUTING.md +64 -0
  21. package/README.md +8 -7
  22. package/babel.config.js +22 -0
  23. package/build/act.js.map +1 -1
  24. package/build/cleanup.js.map +1 -1
  25. package/build/config.d.ts +1 -0
  26. package/build/config.js.map +1 -1
  27. package/build/fireEvent.d.ts +13 -5
  28. package/build/fireEvent.js +57 -48
  29. package/build/fireEvent.js.map +1 -1
  30. package/build/flush-micro-tasks.d.ts +19 -0
  31. package/build/flush-micro-tasks.js +36 -0
  32. package/build/flush-micro-tasks.js.map +1 -0
  33. package/build/helpers/accessiblity.js +3 -1
  34. package/build/helpers/accessiblity.js.map +1 -1
  35. package/build/helpers/component-tree.d.ts +0 -15
  36. package/build/helpers/component-tree.js +0 -45
  37. package/build/helpers/component-tree.js.map +1 -1
  38. package/build/helpers/deprecation.d.ts +1 -0
  39. package/build/helpers/deprecation.js +16 -0
  40. package/build/helpers/deprecation.js.map +1 -1
  41. package/build/helpers/errors.d.ts +0 -4
  42. package/build/helpers/errors.js +1 -25
  43. package/build/helpers/errors.js.map +1 -1
  44. package/build/helpers/findAll.js.map +1 -1
  45. package/build/helpers/format-default.js.map +1 -1
  46. package/build/helpers/format.js.map +1 -1
  47. package/build/helpers/host-component-names.js +4 -1
  48. package/build/helpers/host-component-names.js.map +1 -1
  49. package/build/helpers/matchers/matchLabelText.js.map +1 -1
  50. package/build/helpers/pointer-events.d.ts +9 -0
  51. package/build/helpers/pointer-events.js +25 -0
  52. package/build/helpers/pointer-events.js.map +1 -0
  53. package/build/helpers/stringValidation.js.map +1 -1
  54. package/build/helpers/timers.js.map +1 -1
  55. package/build/index.js +2 -2
  56. package/build/index.js.map +1 -1
  57. package/build/matches.js.map +1 -1
  58. package/build/pure.d.ts +1 -1
  59. package/build/pure.js.map +1 -1
  60. package/build/queries/a11yState.js.map +1 -1
  61. package/build/queries/a11yValue.js.map +1 -1
  62. package/build/queries/displayValue.js.map +1 -1
  63. package/build/queries/hintText.js.map +1 -1
  64. package/build/queries/labelText.js.map +1 -1
  65. package/build/queries/makeQueries.js.map +1 -1
  66. package/build/queries/placeholderText.js.map +1 -1
  67. package/build/queries/role.js.map +1 -1
  68. package/build/queries/testId.js.map +1 -1
  69. package/build/queries/text.js.map +1 -1
  70. package/build/queries/unsafeProps.js.map +1 -1
  71. package/build/render.d.ts +171 -12
  72. package/build/render.js +11 -4
  73. package/build/render.js.map +1 -1
  74. package/build/renderHook.d.ts +3 -6
  75. package/build/renderHook.js +4 -3
  76. package/build/renderHook.js.map +1 -1
  77. package/build/shallow.js.map +1 -1
  78. package/build/test-utils/events.d.ts +10 -0
  79. package/build/test-utils/events.js +27 -0
  80. package/build/test-utils/events.js.map +1 -0
  81. package/build/test-utils/index.d.ts +1 -0
  82. package/build/test-utils/index.js +17 -0
  83. package/build/test-utils/index.js.map +1 -0
  84. package/build/user-event/event-builder/common.d.ts +45 -0
  85. package/build/user-event/event-builder/common.js +58 -0
  86. package/build/user-event/event-builder/common.js.map +1 -0
  87. package/build/user-event/event-builder/index.d.ts +32 -0
  88. package/build/user-event/event-builder/index.js +12 -0
  89. package/build/user-event/event-builder/index.js.map +1 -0
  90. package/build/user-event/index.d.ts +9 -0
  91. package/build/user-event/index.js +16 -0
  92. package/build/user-event/index.js.map +1 -0
  93. package/build/user-event/press/constants.d.ts +2 -0
  94. package/build/user-event/press/constants.js +16 -0
  95. package/build/user-event/press/constants.js.map +1 -0
  96. package/build/user-event/press/index.d.ts +1 -0
  97. package/build/user-event/press/index.js +19 -0
  98. package/build/user-event/press/index.js.map +1 -0
  99. package/build/user-event/press/press.d.ts +7 -0
  100. package/build/user-event/press/press.js +106 -0
  101. package/build/user-event/press/press.js.map +1 -0
  102. package/build/user-event/press/utils/warnAboutRealTimers.d.ts +1 -0
  103. package/build/user-event/press/utils/warnAboutRealTimers.js +14 -0
  104. package/build/user-event/press/utils/warnAboutRealTimers.js.map +1 -0
  105. package/build/user-event/setup/index.d.ts +2 -0
  106. package/build/user-event/setup/index.js +13 -0
  107. package/build/user-event/setup/index.js.map +1 -0
  108. package/build/user-event/setup/setup.d.ts +39 -0
  109. package/build/user-event/setup/setup.js +56 -0
  110. package/build/user-event/setup/setup.js.map +1 -0
  111. package/build/user-event/type/index.d.ts +1 -0
  112. package/build/user-event/type/index.js +13 -0
  113. package/build/user-event/type/index.js.map +1 -0
  114. package/build/user-event/type/type.d.ts +3 -0
  115. package/build/user-event/type/type.js +18 -0
  116. package/build/user-event/type/type.js.map +1 -0
  117. package/build/user-event/utils/events.d.ts +9 -0
  118. package/build/user-event/utils/events.js +44 -0
  119. package/build/user-event/utils/events.js.map +1 -0
  120. package/build/user-event/utils/index.d.ts +2 -0
  121. package/build/user-event/utils/index.js +28 -0
  122. package/build/user-event/utils/index.js.map +1 -0
  123. package/build/user-event/utils/wait.d.ts +2 -0
  124. package/build/user-event/utils/wait.js +14 -0
  125. package/build/user-event/utils/wait.js.map +1 -0
  126. package/build/waitFor.js +3 -3
  127. package/build/waitFor.js.map +1 -1
  128. package/build/waitForElementToBeRemoved.js.map +1 -1
  129. package/examples/basic/.expo-shared/assets.json +4 -0
  130. package/examples/basic/.gitignore +14 -0
  131. package/examples/basic/App.tsx +20 -0
  132. package/examples/basic/README.md +11 -0
  133. package/examples/basic/__tests__/App.test.tsx +119 -0
  134. package/examples/basic/app.json +31 -0
  135. package/examples/basic/assets/adaptive-icon.png +0 -0
  136. package/examples/basic/assets/favicon.png +0 -0
  137. package/examples/basic/assets/icon.png +0 -0
  138. package/examples/basic/assets/splash.png +0 -0
  139. package/examples/basic/babel.config.js +6 -0
  140. package/examples/basic/components/Home.tsx +28 -0
  141. package/examples/basic/components/LoginForm.tsx +138 -0
  142. package/examples/basic/jest-setup.ts +7 -0
  143. package/examples/basic/jest.config.js +5 -0
  144. package/examples/basic/package.json +30 -0
  145. package/examples/basic/tsconfig.json +7 -0
  146. package/examples/react-navigation/README.md +14 -0
  147. package/examples/react-navigation/babel.config.js +4 -0
  148. package/examples/react-navigation/jest-setup.js +11 -0
  149. package/examples/react-navigation/jest.config.js +10 -0
  150. package/examples/react-navigation/package.json +31 -0
  151. package/examples/react-navigation/src/App.js +21 -0
  152. package/examples/react-navigation/src/DrawerNavigator.js +15 -0
  153. package/examples/react-navigation/src/DrawerNavigator.test.js +42 -0
  154. package/examples/react-navigation/src/NativeStackNavigator.js +15 -0
  155. package/examples/react-navigation/src/NativeStackNavigator.test.js +34 -0
  156. package/examples/react-navigation/src/StackNavigator.js +15 -0
  157. package/examples/react-navigation/src/StackNavigator.test.js +34 -0
  158. package/examples/react-navigation/src/TabNavigator.js +15 -0
  159. package/examples/react-navigation/src/TabNavigator.test.js +21 -0
  160. package/examples/react-navigation/src/screens/DetailsScreen.js +43 -0
  161. package/examples/react-navigation/src/screens/DetailsScreen.test.js +27 -0
  162. package/examples/react-navigation/src/screens/DrawerHomeScreen.js +26 -0
  163. package/examples/react-navigation/src/screens/HomeScreen.js +48 -0
  164. package/examples/react-navigation/src/screens/SettingsScreen.js +20 -0
  165. package/examples/react-navigation/src/test-utils.js +12 -0
  166. package/examples/redux/App.js +27 -0
  167. package/examples/redux/actions/todoActions.js +25 -0
  168. package/examples/redux/babel.config.js +6 -0
  169. package/examples/redux/components/AddTodo.js +73 -0
  170. package/examples/redux/components/AddTodo.test.js +27 -0
  171. package/examples/redux/components/TodoElem.js +25 -0
  172. package/examples/redux/components/TodoList.js +29 -0
  173. package/examples/redux/components/TodoList.test.js +34 -0
  174. package/examples/redux/index.js +8 -0
  175. package/examples/redux/jest-setup.js +2 -0
  176. package/examples/redux/jest.config.js +4 -0
  177. package/examples/redux/package.json +23 -0
  178. package/examples/redux/reducers/index.js +6 -0
  179. package/examples/redux/reducers/todoReducer.js +27 -0
  180. package/examples/redux/store.js +10 -0
  181. package/examples/redux/test-utils.js +11 -0
  182. package/experiments-app/.expo/README.md +15 -0
  183. package/experiments-app/.expo/devices.json +3 -0
  184. package/experiments-app/.expo/packager-info.json +9 -0
  185. package/experiments-app/.expo/settings.json +9 -0
  186. package/experiments-app/.gitignore +17 -0
  187. package/experiments-app/.prettierrc.js +5 -0
  188. package/experiments-app/app.json +30 -0
  189. package/experiments-app/assets/adaptive-icon.png +0 -0
  190. package/experiments-app/assets/favicon.png +0 -0
  191. package/experiments-app/assets/icon.png +0 -0
  192. package/experiments-app/assets/splash.png +0 -0
  193. package/experiments-app/babel.config.js +6 -0
  194. package/experiments-app/index.js +4 -0
  195. package/experiments-app/package.json +31 -0
  196. package/experiments-app/src/App.tsx +31 -0
  197. package/experiments-app/src/MainScreen.tsx +51 -0
  198. package/experiments-app/src/experiments.ts +17 -0
  199. package/experiments-app/src/screens/TextInputEventPropagation.tsx +54 -0
  200. package/experiments-app/src/screens/TextInputEvents.tsx +50 -0
  201. package/experiments-app/src/utils/helpers.ts +8 -0
  202. package/experiments-app/tsconfig.json +6 -0
  203. package/experiments-app/yarn.lock +6913 -0
  204. package/flow-typed/npm/jest_v26.x.x.js +1218 -0
  205. package/flow-typed/npm/react-test-renderer_v16.x.x.js +81 -0
  206. package/jest-setup.ts +10 -0
  207. package/package.json +6 -6
  208. package/renovate.json +19 -0
  209. package/scripts/test_react_17 +12 -0
  210. package/src/__tests__/__snapshots__/render-debug.test.tsx.snap +548 -0
  211. package/src/__tests__/__snapshots__/render.test.tsx.snap +39 -0
  212. package/src/__tests__/act.test.tsx +52 -0
  213. package/src/__tests__/auto-cleanup-skip.test.tsx +39 -0
  214. package/src/__tests__/auto-cleanup.test.tsx +50 -0
  215. package/src/__tests__/cleanup.test.tsx +26 -0
  216. package/src/__tests__/config.test.ts +55 -0
  217. package/src/__tests__/fireEvent-textInput.test.tsx +154 -0
  218. package/src/__tests__/fireEvent.test.tsx +485 -0
  219. package/src/__tests__/host-component-names.test.tsx +109 -0
  220. package/src/__tests__/host-text-nesting.test.tsx +90 -0
  221. package/src/__tests__/jest-native.test.tsx +84 -0
  222. package/src/__tests__/questionsBoard.test.tsx +62 -0
  223. package/src/__tests__/react-native-api.test.tsx +126 -0
  224. package/src/__tests__/render-debug.test.tsx +207 -0
  225. package/src/__tests__/render-stringValidation.test.tsx +157 -0
  226. package/src/__tests__/render.test.tsx +256 -0
  227. package/src/__tests__/renderHook.test.tsx +114 -0
  228. package/src/__tests__/screen.test.tsx +66 -0
  229. package/src/__tests__/timerUtils.ts +7 -0
  230. package/src/__tests__/timers.test.ts +27 -0
  231. package/src/__tests__/waitFor.test.tsx +327 -0
  232. package/src/__tests__/waitForElementToBeRemoved.test.tsx +151 -0
  233. package/src/__tests__/within.test.tsx +96 -0
  234. package/src/act.ts +86 -0
  235. package/src/cleanup.ts +15 -0
  236. package/src/config.ts +72 -0
  237. package/src/fireEvent.ts +163 -0
  238. package/src/flush-micro-tasks.ts +30 -0
  239. package/src/helpers/__tests__/accessiblity.test.tsx +373 -0
  240. package/src/helpers/__tests__/component-tree.test.tsx +226 -0
  241. package/src/helpers/__tests__/format-default.tsx +114 -0
  242. package/src/helpers/__tests__/getTextContent.test.tsx +49 -0
  243. package/src/helpers/__tests__/includeHiddenElements.test.tsx +39 -0
  244. package/src/helpers/__tests__/query-name.test.ts +10 -0
  245. package/src/helpers/__tests__/timers.test.ts +8 -0
  246. package/src/helpers/accessiblity.ts +108 -0
  247. package/src/helpers/component-tree.ts +89 -0
  248. package/src/helpers/debugDeep.ts +27 -0
  249. package/src/helpers/debugShallow.ts +22 -0
  250. package/src/helpers/deprecation.ts +53 -0
  251. package/src/helpers/errors.ts +66 -0
  252. package/src/helpers/filterNodeByType.ts +7 -0
  253. package/src/helpers/findAll.ts +68 -0
  254. package/src/helpers/format-default.ts +72 -0
  255. package/src/helpers/format.ts +47 -0
  256. package/src/helpers/getTextContent.ts +20 -0
  257. package/src/helpers/host-component-names.tsx +67 -0
  258. package/src/helpers/matchers/__tests__/matchArrayValue.test.ts +34 -0
  259. package/src/helpers/matchers/__tests__/matchObject.test.ts +37 -0
  260. package/src/helpers/matchers/__tests__/matchStringValue.test.ts +15 -0
  261. package/src/helpers/matchers/accessibilityState.ts +48 -0
  262. package/src/helpers/matchers/accessibilityValue.ts +24 -0
  263. package/src/helpers/matchers/matchArrayProp.ts +21 -0
  264. package/src/helpers/matchers/matchLabelText.ts +51 -0
  265. package/src/helpers/matchers/matchObjectProp.ts +25 -0
  266. package/src/helpers/matchers/matchStringProp.ts +23 -0
  267. package/src/helpers/matchers/matchTextContent.ts +20 -0
  268. package/src/helpers/pointer-events.ts +27 -0
  269. package/src/helpers/query-name.ts +4 -0
  270. package/src/helpers/stringValidation.ts +36 -0
  271. package/src/helpers/timers.ts +98 -0
  272. package/src/index.ts +33 -0
  273. package/src/matches.ts +49 -0
  274. package/src/pure.ts +25 -0
  275. package/src/queries/__tests__/a11yState.test.tsx +439 -0
  276. package/src/queries/__tests__/a11yValue.test.tsx +309 -0
  277. package/src/queries/__tests__/displayValue.test.tsx +221 -0
  278. package/src/queries/__tests__/hintText.test.tsx +177 -0
  279. package/src/queries/__tests__/labelText.test.tsx +242 -0
  280. package/src/queries/__tests__/makeQueries.test.tsx +235 -0
  281. package/src/queries/__tests__/placeholderText.test.tsx +136 -0
  282. package/src/queries/__tests__/role-value.test.tsx +176 -0
  283. package/src/queries/__tests__/role.test.tsx +824 -0
  284. package/src/queries/__tests__/testId.test.tsx +200 -0
  285. package/src/queries/__tests__/text.test.tsx +556 -0
  286. package/src/queries/a11yState.ts +131 -0
  287. package/src/queries/a11yValue.ts +131 -0
  288. package/src/queries/displayValue.ts +78 -0
  289. package/src/queries/hintText.ts +112 -0
  290. package/src/queries/labelText.ts +59 -0
  291. package/src/queries/makeQueries.ts +255 -0
  292. package/src/queries/options.ts +14 -0
  293. package/src/queries/placeholderText.ts +79 -0
  294. package/src/queries/role.ts +132 -0
  295. package/src/queries/testId.ts +71 -0
  296. package/src/queries/text.ts +66 -0
  297. package/src/queries/unsafeProps.ts +76 -0
  298. package/src/queries/unsafeType.ts +73 -0
  299. package/src/react-versions.ts +11 -0
  300. package/src/render-act.ts +19 -0
  301. package/src/render.tsx +183 -0
  302. package/src/renderHook.tsx +56 -0
  303. package/src/screen.ts +123 -0
  304. package/src/shallow.ts +18 -0
  305. package/src/test-utils/events.ts +24 -0
  306. package/src/test-utils/index.ts +1 -0
  307. package/src/user-event/event-builder/common.ts +50 -0
  308. package/src/user-event/event-builder/index.ts +5 -0
  309. package/src/user-event/index.ts +14 -0
  310. package/src/user-event/press/__tests__/longPress.real-timers.test.tsx +115 -0
  311. package/src/user-event/press/__tests__/longPress.test.tsx +157 -0
  312. package/src/user-event/press/__tests__/press.real-timers.test.tsx +318 -0
  313. package/src/user-event/press/__tests__/press.test.tsx +422 -0
  314. package/src/user-event/press/constants.ts +7 -0
  315. package/src/user-event/press/index.ts +1 -0
  316. package/src/user-event/press/press.ts +134 -0
  317. package/src/user-event/press/utils/warnAboutRealTimers.ts +6 -0
  318. package/src/user-event/setup/index.ts +2 -0
  319. package/src/user-event/setup/setup.ts +93 -0
  320. package/src/user-event/type/__tests__/__snapshots__/type.test.tsx.snap +26 -0
  321. package/src/user-event/type/__tests__/type.test.tsx +63 -0
  322. package/src/user-event/type/index.ts +1 -0
  323. package/src/user-event/type/type.ts +20 -0
  324. package/src/user-event/utils/__tests__/wait.test.ts +63 -0
  325. package/src/user-event/utils/events.ts +54 -0
  326. package/src/user-event/utils/index.ts +2 -0
  327. package/src/user-event/utils/wait.ts +15 -0
  328. package/src/waitFor.ts +228 -0
  329. package/src/waitForElementToBeRemoved.ts +42 -0
  330. package/src/within.ts +30 -0
  331. package/tsconfig.json +17 -0
  332. package/tsconfig.release.json +8 -0
  333. package/website/.gitignore +20 -0
  334. package/website/README.md +33 -0
  335. package/website/docker/.dockerignore +3 -0
  336. package/website/docker/Dockerfile +9 -0
  337. package/website/docker/docker-compose.yml +11 -0
  338. package/website/docs/API.md +946 -0
  339. package/website/docs/EslintPLluginTestingLibrary.md +28 -0
  340. package/website/docs/FAQ.md +44 -0
  341. package/website/docs/GettingStarted.md +100 -0
  342. package/website/docs/HowShouldIQuery.md +21 -0
  343. package/website/docs/MigrationV11.md +64 -0
  344. package/website/docs/MigrationV12.md +67 -0
  345. package/website/docs/MigrationV2.md +126 -0
  346. package/website/docs/MigrationV7.md +119 -0
  347. package/website/docs/MigrationV9.md +67 -0
  348. package/website/docs/Queries.md +567 -0
  349. package/website/docs/ReactNavigation.md +371 -0
  350. package/website/docs/ReduxIntegration.md +137 -0
  351. package/website/docs/TestingEnvironment.md +154 -0
  352. package/website/docs/Troubleshooting.md +44 -0
  353. package/website/docs/UnderstandingAct.md +227 -0
  354. package/website/docs/UserEvent.md +66 -0
  355. package/website/docusaurus.config.js +114 -0
  356. package/website/package.json +31 -0
  357. package/website/sidebars.js +20 -0
  358. package/website/src/components/Feature.js +31 -0
  359. package/website/src/css/custom.css +13 -0
  360. package/website/src/css/index.module.css +77 -0
  361. package/website/src/pages/index.js +82 -0
  362. package/website/static/.nojekyll +0 -0
  363. package/website/static/css/custom.css +28 -0
  364. package/website/static/img/hit.png +0 -0
  365. package/website/static/img/locomotive.png +0 -0
  366. package/website/static/img/owl.png +0 -0
  367. package/website/static/img/tools.png +0 -0
  368. package/website/yarn.lock +7669 -0
  369. package/yarn.lock +7765 -0
  370. package/build/flushMicroTasks.d.ts +0 -5
  371. package/build/flushMicroTasks.js +0 -17
  372. package/build/flushMicroTasks.js.map +0 -1
@@ -0,0 +1,79 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { findAll } from '../helpers/findAll';
3
+ import { matches, TextMatch, TextMatchOptions } from '../matches';
4
+ import { filterNodeByType } from '../helpers/filterNodeByType';
5
+ import { getHostComponentNames } from '../helpers/host-component-names';
6
+ import { makeQueries } from './makeQueries';
7
+ import type {
8
+ FindAllByQuery,
9
+ FindByQuery,
10
+ GetAllByQuery,
11
+ GetByQuery,
12
+ QueryAllByQuery,
13
+ QueryByQuery,
14
+ } from './makeQueries';
15
+ import type { CommonQueryOptions } from './options';
16
+
17
+ type ByPlaceholderTextOptions = CommonQueryOptions & TextMatchOptions;
18
+
19
+ const getTextInputNodeByPlaceholderText = (
20
+ node: ReactTestInstance,
21
+ placeholder: TextMatch,
22
+ options: TextMatchOptions = {}
23
+ ) => {
24
+ const { exact, normalizer } = options;
25
+
26
+ return (
27
+ filterNodeByType(node, getHostComponentNames().textInput) &&
28
+ matches(placeholder, node.props.placeholder, normalizer, exact)
29
+ );
30
+ };
31
+
32
+ const queryAllByPlaceholderText = (
33
+ instance: ReactTestInstance
34
+ ): ((
35
+ placeholder: TextMatch,
36
+ queryOptions?: ByPlaceholderTextOptions
37
+ ) => Array<ReactTestInstance>) =>
38
+ function queryAllByPlaceholderFn(placeholder, queryOptions) {
39
+ return findAll(
40
+ instance,
41
+ (node) =>
42
+ getTextInputNodeByPlaceholderText(node, placeholder, queryOptions),
43
+ queryOptions
44
+ );
45
+ };
46
+
47
+ const getMultipleError = (placeholder: TextMatch) =>
48
+ `Found multiple elements with placeholder: ${String(placeholder)} `;
49
+ const getMissingError = (placeholder: TextMatch) =>
50
+ `Unable to find an element with placeholder: ${String(placeholder)}`;
51
+
52
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
53
+ queryAllByPlaceholderText,
54
+ getMissingError,
55
+ getMultipleError
56
+ );
57
+
58
+ export type ByPlaceholderTextQueries = {
59
+ getByPlaceholderText: GetByQuery<TextMatch, ByPlaceholderTextOptions>;
60
+ getAllByPlaceholderText: GetAllByQuery<TextMatch, ByPlaceholderTextOptions>;
61
+ queryByPlaceholderText: QueryByQuery<TextMatch, ByPlaceholderTextOptions>;
62
+ queryAllByPlaceholderText: QueryAllByQuery<
63
+ TextMatch,
64
+ ByPlaceholderTextOptions
65
+ >;
66
+ findByPlaceholderText: FindByQuery<TextMatch, ByPlaceholderTextOptions>;
67
+ findAllByPlaceholderText: FindAllByQuery<TextMatch, ByPlaceholderTextOptions>;
68
+ };
69
+
70
+ export const bindByPlaceholderTextQueries = (
71
+ instance: ReactTestInstance
72
+ ): ByPlaceholderTextQueries => ({
73
+ getByPlaceholderText: getBy(instance),
74
+ getAllByPlaceholderText: getAllBy(instance),
75
+ queryByPlaceholderText: queryBy(instance),
76
+ queryAllByPlaceholderText: queryAllBy(instance),
77
+ findByPlaceholderText: findBy(instance),
78
+ findAllByPlaceholderText: findAllBy(instance),
79
+ });
@@ -0,0 +1,132 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import {
3
+ accessibilityStateKeys,
4
+ accessiblityValueKeys,
5
+ isAccessibilityElement,
6
+ } from '../helpers/accessiblity';
7
+ import { findAll } from '../helpers/findAll';
8
+ import {
9
+ AccessibilityStateMatcher,
10
+ matchAccessibilityState,
11
+ } from '../helpers/matchers/accessibilityState';
12
+ import {
13
+ AccessibilityValueMatcher,
14
+ matchAccessibilityValue,
15
+ } from '../helpers/matchers/accessibilityValue';
16
+ import { matchStringProp } from '../helpers/matchers/matchStringProp';
17
+ import type { TextMatch } from '../matches';
18
+ import { getQueriesForElement } from '../within';
19
+ import { makeQueries } from './makeQueries';
20
+ import type {
21
+ FindAllByQuery,
22
+ FindByQuery,
23
+ GetAllByQuery,
24
+ GetByQuery,
25
+ QueryAllByQuery,
26
+ QueryByQuery,
27
+ } from './makeQueries';
28
+ import { CommonQueryOptions } from './options';
29
+
30
+ type ByRoleOptions = CommonQueryOptions &
31
+ AccessibilityStateMatcher & {
32
+ name?: TextMatch;
33
+ value?: AccessibilityValueMatcher;
34
+ };
35
+
36
+ const matchAccessibleNameIfNeeded = (
37
+ node: ReactTestInstance,
38
+ name?: TextMatch
39
+ ) => {
40
+ if (name == null) return true;
41
+
42
+ const { queryAllByText, queryAllByLabelText } = getQueriesForElement(node);
43
+ return (
44
+ queryAllByText(name).length > 0 || queryAllByLabelText(name).length > 0
45
+ );
46
+ };
47
+
48
+ const matchAccessibleStateIfNeeded = (
49
+ node: ReactTestInstance,
50
+ options?: ByRoleOptions
51
+ ) => {
52
+ return options != null ? matchAccessibilityState(node, options) : true;
53
+ };
54
+
55
+ const matchAccessibilityValueIfNeeded = (
56
+ node: ReactTestInstance,
57
+ value?: AccessibilityValueMatcher
58
+ ) => {
59
+ return value != null ? matchAccessibilityValue(node, value) : true;
60
+ };
61
+
62
+ const queryAllByRole = (
63
+ instance: ReactTestInstance
64
+ ): ((role: TextMatch, options?: ByRoleOptions) => Array<ReactTestInstance>) =>
65
+ function queryAllByRoleFn(role, options) {
66
+ return findAll(
67
+ instance,
68
+ (node) =>
69
+ // run the cheapest checks first, and early exit to avoid unneeded computations
70
+ typeof node.type === 'string' &&
71
+ isAccessibilityElement(node) &&
72
+ matchStringProp(node.props.accessibilityRole, role) &&
73
+ matchAccessibleStateIfNeeded(node, options) &&
74
+ matchAccessibilityValueIfNeeded(node, options?.value) &&
75
+ matchAccessibleNameIfNeeded(node, options?.name),
76
+ options
77
+ );
78
+ };
79
+
80
+ const formatQueryParams = (role: TextMatch, options: ByRoleOptions = {}) => {
81
+ const params = [`role: "${String(role)}"`];
82
+
83
+ if (options.name) {
84
+ params.push(`name: "${String(options.name)}"`);
85
+ }
86
+
87
+ accessibilityStateKeys.forEach((stateKey) => {
88
+ if (options[stateKey] !== undefined) {
89
+ params.push(`${stateKey} state: ${options[stateKey]}`);
90
+ }
91
+ });
92
+
93
+ accessiblityValueKeys.forEach((valueKey) => {
94
+ if (options?.value?.[valueKey] !== undefined) {
95
+ params.push(`${valueKey} value: ${options?.value?.[valueKey]}`);
96
+ }
97
+ });
98
+
99
+ return params.join(', ');
100
+ };
101
+
102
+ const getMultipleError = (role: TextMatch, options?: ByRoleOptions) =>
103
+ `Found multiple elements with ${formatQueryParams(role, options)}`;
104
+
105
+ const getMissingError = (role: TextMatch, options?: ByRoleOptions) =>
106
+ `Unable to find an element with ${formatQueryParams(role, options)}`;
107
+
108
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
109
+ queryAllByRole,
110
+ getMissingError,
111
+ getMultipleError
112
+ );
113
+
114
+ export type ByRoleQueries = {
115
+ getByRole: GetByQuery<TextMatch, ByRoleOptions>;
116
+ getAllByRole: GetAllByQuery<TextMatch, ByRoleOptions>;
117
+ queryByRole: QueryByQuery<TextMatch, ByRoleOptions>;
118
+ queryAllByRole: QueryAllByQuery<TextMatch, ByRoleOptions>;
119
+ findByRole: FindByQuery<TextMatch, ByRoleOptions>;
120
+ findAllByRole: FindAllByQuery<TextMatch, ByRoleOptions>;
121
+ };
122
+
123
+ export const bindByRoleQueries = (
124
+ instance: ReactTestInstance
125
+ ): ByRoleQueries => ({
126
+ getByRole: getBy(instance),
127
+ getAllByRole: getAllBy(instance),
128
+ queryByRole: queryBy(instance),
129
+ queryAllByRole: queryAllBy(instance),
130
+ findByRole: findBy(instance),
131
+ findAllByRole: findAllBy(instance),
132
+ });
@@ -0,0 +1,71 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { findAll } from '../helpers/findAll';
3
+ import { matches, TextMatch, TextMatchOptions } from '../matches';
4
+ import { makeQueries } from './makeQueries';
5
+ import type {
6
+ FindAllByQuery,
7
+ FindByQuery,
8
+ GetAllByQuery,
9
+ GetByQuery,
10
+ QueryAllByQuery,
11
+ QueryByQuery,
12
+ } from './makeQueries';
13
+ import type { CommonQueryOptions } from './options';
14
+
15
+ type ByTestIdOptions = CommonQueryOptions & TextMatchOptions;
16
+
17
+ const getNodeByTestId = (
18
+ node: ReactTestInstance,
19
+ testID: TextMatch,
20
+ options: TextMatchOptions = {}
21
+ ) => {
22
+ const { exact, normalizer } = options;
23
+ return matches(testID, node.props.testID, normalizer, exact);
24
+ };
25
+
26
+ const queryAllByTestId = (
27
+ instance: ReactTestInstance
28
+ ): ((
29
+ testId: TextMatch,
30
+ queryOptions?: ByTestIdOptions
31
+ ) => Array<ReactTestInstance>) =>
32
+ function queryAllByTestIdFn(testId, queryOptions) {
33
+ return findAll(
34
+ instance,
35
+ (node) =>
36
+ typeof node.type === 'string' &&
37
+ getNodeByTestId(node, testId, queryOptions),
38
+ queryOptions
39
+ );
40
+ };
41
+
42
+ const getMultipleError = (testId: TextMatch) =>
43
+ `Found multiple elements with testID: ${String(testId)}`;
44
+ const getMissingError = (testId: TextMatch) =>
45
+ `Unable to find an element with testID: ${String(testId)}`;
46
+
47
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
48
+ queryAllByTestId,
49
+ getMissingError,
50
+ getMultipleError
51
+ );
52
+
53
+ export type ByTestIdQueries = {
54
+ getByTestId: GetByQuery<TextMatch, ByTestIdOptions>;
55
+ getAllByTestId: GetAllByQuery<TextMatch, ByTestIdOptions>;
56
+ queryByTestId: QueryByQuery<TextMatch, ByTestIdOptions>;
57
+ queryAllByTestId: QueryAllByQuery<TextMatch, ByTestIdOptions>;
58
+ findByTestId: FindByQuery<TextMatch, ByTestIdOptions>;
59
+ findAllByTestId: FindAllByQuery<TextMatch, ByTestIdOptions>;
60
+ };
61
+
62
+ export const bindByTestIdQueries = (
63
+ instance: ReactTestInstance
64
+ ): ByTestIdQueries => ({
65
+ getByTestId: getBy(instance),
66
+ getAllByTestId: getAllBy(instance),
67
+ queryByTestId: queryBy(instance),
68
+ queryAllByTestId: queryAllBy(instance),
69
+ findByTestId: findBy(instance),
70
+ findAllByTestId: findAllBy(instance),
71
+ });
@@ -0,0 +1,66 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import { filterNodeByType } from '../helpers/filterNodeByType';
3
+ import { findAll } from '../helpers/findAll';
4
+ import { getHostComponentNames } from '../helpers/host-component-names';
5
+ import { matchTextContent } from '../helpers/matchers/matchTextContent';
6
+ import { TextMatch, TextMatchOptions } from '../matches';
7
+ import { makeQueries } from './makeQueries';
8
+ import type {
9
+ FindAllByQuery,
10
+ FindByQuery,
11
+ GetAllByQuery,
12
+ GetByQuery,
13
+ QueryAllByQuery,
14
+ QueryByQuery,
15
+ } from './makeQueries';
16
+ import type { CommonQueryOptions } from './options';
17
+
18
+ type ByTextOptions = CommonQueryOptions & TextMatchOptions;
19
+
20
+ const queryAllByText = (
21
+ instance: ReactTestInstance
22
+ ): ((text: TextMatch, options?: ByTextOptions) => Array<ReactTestInstance>) =>
23
+ function queryAllByTextFn(text, options = {}) {
24
+ return findAll(
25
+ instance,
26
+ (node) =>
27
+ filterNodeByType(node, getHostComponentNames().text) &&
28
+ matchTextContent(node, text, options),
29
+ {
30
+ ...options,
31
+ matchDeepestOnly: true,
32
+ }
33
+ );
34
+ };
35
+
36
+ const getMultipleError = (text: TextMatch) =>
37
+ `Found multiple elements with text: ${String(text)}`;
38
+
39
+ const getMissingError = (text: TextMatch) =>
40
+ `Unable to find an element with text: ${String(text)}`;
41
+
42
+ const { getBy, getAllBy, queryBy, queryAllBy, findBy, findAllBy } = makeQueries(
43
+ queryAllByText,
44
+ getMissingError,
45
+ getMultipleError
46
+ );
47
+
48
+ export type ByTextQueries = {
49
+ getByText: GetByQuery<TextMatch, ByTextOptions>;
50
+ getAllByText: GetAllByQuery<TextMatch, ByTextOptions>;
51
+ queryByText: QueryByQuery<TextMatch, ByTextOptions>;
52
+ queryAllByText: QueryAllByQuery<TextMatch, ByTextOptions>;
53
+ findByText: FindByQuery<TextMatch, ByTextOptions>;
54
+ findAllByText: FindAllByQuery<TextMatch, ByTextOptions>;
55
+ };
56
+
57
+ export const bindByTextQueries = (
58
+ instance: ReactTestInstance
59
+ ): ByTextQueries => ({
60
+ getByText: getBy(instance),
61
+ getAllByText: getAllBy(instance),
62
+ queryByText: queryBy(instance),
63
+ queryAllByText: queryAllBy(instance),
64
+ findByText: findBy(instance),
65
+ findAllByText: findAllBy(instance),
66
+ });
@@ -0,0 +1,76 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import prettyFormat from 'pretty-format';
3
+ import { ErrorWithStack, prepareErrorMessage } from '../helpers/errors';
4
+ import { createQueryByError } from '../helpers/errors';
5
+
6
+ const UNSAFE_getByProps = (
7
+ instance: ReactTestInstance
8
+ ): ((props: { [propName: string]: any }) => ReactTestInstance) =>
9
+ function getByPropsFn(props: { [propName: string]: any }) {
10
+ try {
11
+ return instance.findByProps(props);
12
+ } catch (error) {
13
+ throw new ErrorWithStack(prepareErrorMessage(error), getByPropsFn);
14
+ }
15
+ };
16
+
17
+ const UNSAFE_getAllByProps = (
18
+ instance: ReactTestInstance
19
+ ): ((props: { [propName: string]: any }) => Array<ReactTestInstance>) =>
20
+ function getAllByPropsFn(props: { [propName: string]: any }) {
21
+ const results = instance.findAllByProps(props);
22
+ if (results.length === 0) {
23
+ throw new ErrorWithStack(
24
+ `No instances found with props:\n${prettyFormat(props)}`,
25
+ getAllByPropsFn
26
+ );
27
+ }
28
+ return results;
29
+ };
30
+
31
+ const UNSAFE_queryByProps = (
32
+ instance: ReactTestInstance
33
+ ): ((props: { [propName: string]: any }) => ReactTestInstance | null) =>
34
+ function queryByPropsFn(props: { [propName: string]: any }) {
35
+ try {
36
+ return UNSAFE_getByProps(instance)(props);
37
+ } catch (error) {
38
+ return createQueryByError(error, queryByPropsFn);
39
+ }
40
+ };
41
+
42
+ const UNSAFE_queryAllByProps =
43
+ (
44
+ instance: ReactTestInstance
45
+ ): ((props: { [propName: string]: any }) => Array<ReactTestInstance>) =>
46
+ (props: { [propName: string]: any }) => {
47
+ try {
48
+ return UNSAFE_getAllByProps(instance)(props);
49
+ } catch (error) {
50
+ return [];
51
+ }
52
+ };
53
+
54
+ // Unsafe aliases
55
+ export type UnsafeByPropsQueries = {
56
+ UNSAFE_getByProps: (props: { [key: string]: any }) => ReactTestInstance;
57
+ UNSAFE_getAllByProps: (props: {
58
+ [key: string]: any;
59
+ }) => Array<ReactTestInstance>;
60
+ UNSAFE_queryByProps: (props: {
61
+ [key: string]: any;
62
+ }) => ReactTestInstance | null;
63
+ UNSAFE_queryAllByProps: (props: {
64
+ [key: string]: any;
65
+ }) => Array<ReactTestInstance>;
66
+ };
67
+
68
+ // TODO: migrate to makeQueries pattern
69
+ export const bindUnsafeByPropsQueries = (
70
+ instance: ReactTestInstance
71
+ ): UnsafeByPropsQueries => ({
72
+ UNSAFE_getByProps: UNSAFE_getByProps(instance),
73
+ UNSAFE_getAllByProps: UNSAFE_getAllByProps(instance),
74
+ UNSAFE_queryByProps: UNSAFE_queryByProps(instance),
75
+ UNSAFE_queryAllByProps: UNSAFE_queryAllByProps(instance),
76
+ });
@@ -0,0 +1,73 @@
1
+ import type { ReactTestInstance } from 'react-test-renderer';
2
+ import * as React from 'react';
3
+ import { ErrorWithStack, prepareErrorMessage } from '../helpers/errors';
4
+ import { createQueryByError } from '../helpers/errors';
5
+
6
+ const UNSAFE_getByType = (
7
+ instance: ReactTestInstance
8
+ ): ((type: React.ComponentType<any>) => ReactTestInstance) =>
9
+ function getByTypeFn(type: React.ComponentType<any>) {
10
+ try {
11
+ return instance.findByType(type);
12
+ } catch (error) {
13
+ throw new ErrorWithStack(prepareErrorMessage(error), getByTypeFn);
14
+ }
15
+ };
16
+
17
+ const UNSAFE_getAllByType = (
18
+ instance: ReactTestInstance
19
+ ): ((type: React.ComponentType<any>) => Array<ReactTestInstance>) =>
20
+ function getAllByTypeFn(type: React.ComponentType<any>) {
21
+ const results = instance.findAllByType(type);
22
+ if (results.length === 0) {
23
+ throw new ErrorWithStack('No instances found', getAllByTypeFn);
24
+ }
25
+ return results;
26
+ };
27
+
28
+ const UNSAFE_queryByType = (
29
+ instance: ReactTestInstance
30
+ ): ((type: React.ComponentType<any>) => ReactTestInstance | null) =>
31
+ function queryByTypeFn(type: React.ComponentType<any>) {
32
+ try {
33
+ return UNSAFE_getByType(instance)(type);
34
+ } catch (error) {
35
+ return createQueryByError(error, queryByTypeFn);
36
+ }
37
+ };
38
+
39
+ const UNSAFE_queryAllByType =
40
+ (
41
+ instance: ReactTestInstance
42
+ ): ((type: React.ComponentType<any>) => Array<ReactTestInstance>) =>
43
+ (type: React.ComponentType<any>) => {
44
+ try {
45
+ return UNSAFE_getAllByType(instance)(type);
46
+ } catch (error) {
47
+ return [];
48
+ }
49
+ };
50
+
51
+ // Unsafe aliases
52
+ export type UnsafeByTypeQueries = {
53
+ UNSAFE_getByType: <P>(type: React.ComponentType<P>) => ReactTestInstance;
54
+ UNSAFE_getAllByType: <P>(
55
+ type: React.ComponentType<P>
56
+ ) => Array<ReactTestInstance>;
57
+ UNSAFE_queryByType: <P>(
58
+ type: React.ComponentType<P>
59
+ ) => ReactTestInstance | null;
60
+ UNSAFE_queryAllByType: <P>(
61
+ type: React.ComponentType<P>
62
+ ) => Array<ReactTestInstance>;
63
+ };
64
+
65
+ // TODO: migrate to makeQueries pattern
66
+ export const bindUnsafeByTypeQueries = (
67
+ instance: ReactTestInstance
68
+ ): UnsafeByTypeQueries => ({
69
+ UNSAFE_getByType: UNSAFE_getByType(instance),
70
+ UNSAFE_getAllByType: UNSAFE_getAllByType(instance),
71
+ UNSAFE_queryByType: UNSAFE_queryByType(instance),
72
+ UNSAFE_queryAllByType: UNSAFE_queryAllByType(instance),
73
+ });
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+
3
+ export function checkReactVersionAtLeast(
4
+ major: number,
5
+ minor: number
6
+ ): boolean {
7
+ if (React.version === undefined) return false;
8
+ const [actualMajor, actualMinor] = React.version.split('.').map(Number);
9
+
10
+ return actualMajor > major || (actualMajor === major && actualMinor >= minor);
11
+ }
@@ -0,0 +1,19 @@
1
+ import TestRenderer from 'react-test-renderer';
2
+ import type {
3
+ ReactTestRenderer,
4
+ TestRendererOptions,
5
+ } from 'react-test-renderer';
6
+
7
+ export function renderWithAct(
8
+ component: React.ReactElement,
9
+ options?: TestRendererOptions
10
+ ): ReactTestRenderer {
11
+ let renderer: ReactTestRenderer;
12
+
13
+ TestRenderer.act(() => {
14
+ renderer = TestRenderer.create(component, options);
15
+ });
16
+
17
+ // @ts-ignore act is synchronous, so renderer is already initialised here
18
+ return renderer;
19
+ }