@testing-library/react-native 12.2.1 → 12.2.2

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 (302) hide show
  1. package/package.json +2 -3
  2. package/.DS_Store +0 -0
  3. package/.codecov.yml +0 -9
  4. package/.eslintcache +0 -1
  5. package/.eslintignore +0 -3
  6. package/.eslintrc +0 -19
  7. package/.flowconfig +0 -63
  8. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  9. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -14
  10. package/.github/ISSUE_TEMPLATE/question.md +0 -9
  11. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  12. package/.github/actions/setup-deps/action.yml +0 -22
  13. package/.github/actions/setup-website-deps/action.yml +0 -22
  14. package/.github/dependabot.yml +0 -10
  15. package/.github/workflows/deploy-website.yml +0 -36
  16. package/.github/workflows/example-apps.yml +0 -25
  17. package/.github/workflows/main.yml +0 -103
  18. package/.gitignore +0 -11
  19. package/.prettierrc.js +0 -5
  20. package/CODE_OF_CONDUCT.md +0 -73
  21. package/CONTRIBUTING.md +0 -64
  22. package/babel.config.js +0 -22
  23. package/examples/basic/.expo/README.md +0 -15
  24. package/examples/basic/.expo/packager-info.json +0 -4
  25. package/examples/basic/.expo/settings.json +0 -10
  26. package/examples/basic/.expo-shared/assets.json +0 -4
  27. package/examples/basic/.gitignore +0 -14
  28. package/examples/basic/App.tsx +0 -20
  29. package/examples/basic/README.md +0 -11
  30. package/examples/basic/__tests__/App.test.tsx +0 -137
  31. package/examples/basic/app.json +0 -31
  32. package/examples/basic/assets/adaptive-icon.png +0 -0
  33. package/examples/basic/assets/favicon.png +0 -0
  34. package/examples/basic/assets/icon.png +0 -0
  35. package/examples/basic/assets/splash.png +0 -0
  36. package/examples/basic/babel.config.js +0 -6
  37. package/examples/basic/components/Home.tsx +0 -28
  38. package/examples/basic/components/LoginForm.tsx +0 -138
  39. package/examples/basic/jest-setup.ts +0 -7
  40. package/examples/basic/jest.config.js +0 -5
  41. package/examples/basic/package.json +0 -30
  42. package/examples/basic/tsconfig.json +0 -7
  43. package/examples/basic/yarn.lock +0 -7499
  44. package/examples/react-navigation/README.md +0 -16
  45. package/examples/react-navigation/babel.config.js +0 -4
  46. package/examples/react-navigation/jest-setup.js +0 -11
  47. package/examples/react-navigation/jest.config.js +0 -10
  48. package/examples/react-navigation/package.json +0 -31
  49. package/examples/react-navigation/src/App.js +0 -21
  50. package/examples/react-navigation/src/DrawerNavigator.js +0 -15
  51. package/examples/react-navigation/src/DrawerNavigator.test.js +0 -42
  52. package/examples/react-navigation/src/NativeStackNavigator.js +0 -15
  53. package/examples/react-navigation/src/NativeStackNavigator.test.js +0 -34
  54. package/examples/react-navigation/src/StackNavigator.js +0 -15
  55. package/examples/react-navigation/src/StackNavigator.test.js +0 -34
  56. package/examples/react-navigation/src/TabNavigator.js +0 -15
  57. package/examples/react-navigation/src/TabNavigator.test.js +0 -21
  58. package/examples/react-navigation/src/screens/DetailsScreen.js +0 -43
  59. package/examples/react-navigation/src/screens/DetailsScreen.test.js +0 -27
  60. package/examples/react-navigation/src/screens/DrawerHomeScreen.js +0 -26
  61. package/examples/react-navigation/src/screens/HomeScreen.js +0 -48
  62. package/examples/react-navigation/src/screens/SettingsScreen.js +0 -20
  63. package/examples/react-navigation/src/test-utils.js +0 -12
  64. package/examples/react-navigation/yarn.lock +0 -5018
  65. package/examples/redux/App.js +0 -27
  66. package/examples/redux/README.md +0 -5
  67. package/examples/redux/actions/todoActions.js +0 -25
  68. package/examples/redux/babel.config.js +0 -6
  69. package/examples/redux/components/AddTodo.js +0 -73
  70. package/examples/redux/components/AddTodo.test.js +0 -27
  71. package/examples/redux/components/TodoElem.js +0 -25
  72. package/examples/redux/components/TodoList.js +0 -29
  73. package/examples/redux/components/TodoList.test.js +0 -34
  74. package/examples/redux/index.js +0 -8
  75. package/examples/redux/jest-setup.js +0 -2
  76. package/examples/redux/jest.config.js +0 -4
  77. package/examples/redux/package.json +0 -23
  78. package/examples/redux/reducers/index.js +0 -6
  79. package/examples/redux/reducers/todoReducer.js +0 -27
  80. package/examples/redux/store.js +0 -10
  81. package/examples/redux/test-utils.js +0 -11
  82. package/examples/redux/yarn.lock +0 -4819
  83. package/experiments-app/.expo/README.md +0 -15
  84. package/experiments-app/.expo/devices.json +0 -3
  85. package/experiments-app/.expo/packager-info.json +0 -9
  86. package/experiments-app/.expo/settings.json +0 -9
  87. package/experiments-app/.gitignore +0 -17
  88. package/experiments-app/.prettierrc.js +0 -5
  89. package/experiments-app/app.json +0 -30
  90. package/experiments-app/assets/adaptive-icon.png +0 -0
  91. package/experiments-app/assets/favicon.png +0 -0
  92. package/experiments-app/assets/icon.png +0 -0
  93. package/experiments-app/assets/splash.png +0 -0
  94. package/experiments-app/babel.config.js +0 -6
  95. package/experiments-app/index.js +0 -4
  96. package/experiments-app/package.json +0 -29
  97. package/experiments-app/src/App.tsx +0 -31
  98. package/experiments-app/src/MainScreen.tsx +0 -52
  99. package/experiments-app/src/experiments.ts +0 -35
  100. package/experiments-app/src/screens/FlatListEvents.tsx +0 -57
  101. package/experiments-app/src/screens/ScrollViewEvents.tsx +0 -65
  102. package/experiments-app/src/screens/SectionListEvents.tsx +0 -91
  103. package/experiments-app/src/screens/TextInputEventPropagation.tsx +0 -42
  104. package/experiments-app/src/screens/TextInputEvents.tsx +0 -48
  105. package/experiments-app/src/utils/helpers.ts +0 -18
  106. package/experiments-app/tsconfig.json +0 -6
  107. package/experiments-app/yarn.lock +0 -6709
  108. package/experiments-rtl/.babelrc +0 -8
  109. package/experiments-rtl/.eslintrc.json +0 -3
  110. package/experiments-rtl/.gitignore +0 -35
  111. package/experiments-rtl/README.md +0 -34
  112. package/experiments-rtl/jest-setup.js +0 -1
  113. package/experiments-rtl/jest.config.js +0 -4
  114. package/experiments-rtl/next.config.js +0 -4
  115. package/experiments-rtl/package.json +0 -38
  116. package/experiments-rtl/postcss.config.js +0 -6
  117. package/experiments-rtl/public/next.svg +0 -1
  118. package/experiments-rtl/public/vercel.svg +0 -1
  119. package/experiments-rtl/src/app/__tests__/click.test.tsx +0 -31
  120. package/experiments-rtl/src/app/__tests__/managed-text-input.test.tsx +0 -51
  121. package/experiments-rtl/src/app/globals.css +0 -27
  122. package/experiments-rtl/src/app/layout.tsx +0 -22
  123. package/experiments-rtl/src/app/page.tsx +0 -113
  124. package/experiments-rtl/tailwind.config.ts +0 -20
  125. package/experiments-rtl/tsconfig.json +0 -28
  126. package/experiments-rtl/yarn.lock +0 -5418
  127. package/flow-typed/npm/jest_v26.x.x.js +0 -1218
  128. package/flow-typed/npm/react-test-renderer_v16.x.x.js +0 -81
  129. package/jest-setup.ts +0 -10
  130. package/renovate.json +0 -19
  131. package/scripts/test_react_17 +0 -12
  132. package/src/__tests__/__snapshots__/render-debug.test.tsx.snap +0 -548
  133. package/src/__tests__/__snapshots__/render.test.tsx.snap +0 -39
  134. package/src/__tests__/act.test.tsx +0 -56
  135. package/src/__tests__/auto-cleanup-skip.test.tsx +0 -39
  136. package/src/__tests__/auto-cleanup.test.tsx +0 -50
  137. package/src/__tests__/cleanup.test.tsx +0 -26
  138. package/src/__tests__/config.test.ts +0 -55
  139. package/src/__tests__/fireEvent-textInput.test.tsx +0 -154
  140. package/src/__tests__/fireEvent.test.tsx +0 -485
  141. package/src/__tests__/host-component-names.test.tsx +0 -109
  142. package/src/__tests__/host-text-nesting.test.tsx +0 -90
  143. package/src/__tests__/jest-native.test.tsx +0 -84
  144. package/src/__tests__/questionsBoard.test.tsx +0 -62
  145. package/src/__tests__/react-native-api.test.tsx +0 -126
  146. package/src/__tests__/render-debug.test.tsx +0 -207
  147. package/src/__tests__/render-stringValidation.test.tsx +0 -157
  148. package/src/__tests__/render.test.tsx +0 -256
  149. package/src/__tests__/renderHook.test.tsx +0 -114
  150. package/src/__tests__/screen.test.tsx +0 -66
  151. package/src/__tests__/timerUtils.ts +0 -7
  152. package/src/__tests__/timers.test.ts +0 -27
  153. package/src/__tests__/waitFor.test.tsx +0 -327
  154. package/src/__tests__/waitForElementToBeRemoved.test.tsx +0 -151
  155. package/src/__tests__/within.test.tsx +0 -96
  156. package/src/act.ts +0 -86
  157. package/src/cleanup.ts +0 -15
  158. package/src/config.ts +0 -72
  159. package/src/fireEvent.ts +0 -159
  160. package/src/flush-micro-tasks.ts +0 -30
  161. package/src/helpers/__tests__/accessiblity.test.tsx +0 -373
  162. package/src/helpers/__tests__/component-tree.test.tsx +0 -226
  163. package/src/helpers/__tests__/format-default.tsx +0 -114
  164. package/src/helpers/__tests__/getTextContent.test.tsx +0 -49
  165. package/src/helpers/__tests__/includeHiddenElements.test.tsx +0 -39
  166. package/src/helpers/__tests__/query-name.test.ts +0 -10
  167. package/src/helpers/__tests__/timers.test.ts +0 -8
  168. package/src/helpers/accessiblity.ts +0 -108
  169. package/src/helpers/component-tree.ts +0 -94
  170. package/src/helpers/debugDeep.ts +0 -27
  171. package/src/helpers/debugShallow.ts +0 -22
  172. package/src/helpers/deprecation.ts +0 -53
  173. package/src/helpers/errors.ts +0 -66
  174. package/src/helpers/findAll.ts +0 -70
  175. package/src/helpers/format-default.ts +0 -72
  176. package/src/helpers/format.ts +0 -47
  177. package/src/helpers/getTextContent.ts +0 -20
  178. package/src/helpers/host-component-names.tsx +0 -88
  179. package/src/helpers/matchers/__tests__/matchArrayValue.test.ts +0 -34
  180. package/src/helpers/matchers/__tests__/matchObject.test.ts +0 -37
  181. package/src/helpers/matchers/__tests__/matchStringValue.test.ts +0 -15
  182. package/src/helpers/matchers/accessibilityState.ts +0 -48
  183. package/src/helpers/matchers/accessibilityValue.ts +0 -24
  184. package/src/helpers/matchers/matchArrayProp.ts +0 -21
  185. package/src/helpers/matchers/matchLabelText.ts +0 -50
  186. package/src/helpers/matchers/matchObjectProp.ts +0 -25
  187. package/src/helpers/matchers/matchStringProp.ts +0 -23
  188. package/src/helpers/matchers/matchTextContent.ts +0 -20
  189. package/src/helpers/pointer-events.ts +0 -27
  190. package/src/helpers/query-name.ts +0 -4
  191. package/src/helpers/stringValidation.ts +0 -36
  192. package/src/helpers/timers.ts +0 -98
  193. package/src/index.ts +0 -33
  194. package/src/matches.ts +0 -49
  195. package/src/pure.ts +0 -27
  196. package/src/queries/__tests__/a11yState.test.tsx +0 -439
  197. package/src/queries/__tests__/a11yValue.test.tsx +0 -309
  198. package/src/queries/__tests__/displayValue.test.tsx +0 -221
  199. package/src/queries/__tests__/hintText.test.tsx +0 -177
  200. package/src/queries/__tests__/labelText.test.tsx +0 -242
  201. package/src/queries/__tests__/makeQueries.test.tsx +0 -235
  202. package/src/queries/__tests__/placeholderText.test.tsx +0 -136
  203. package/src/queries/__tests__/role-value.test.tsx +0 -176
  204. package/src/queries/__tests__/role.test.tsx +0 -824
  205. package/src/queries/__tests__/testId.test.tsx +0 -200
  206. package/src/queries/__tests__/text.test.tsx +0 -556
  207. package/src/queries/a11yState.ts +0 -127
  208. package/src/queries/a11yValue.ts +0 -127
  209. package/src/queries/displayValue.ts +0 -71
  210. package/src/queries/hintText.ts +0 -107
  211. package/src/queries/labelText.ts +0 -57
  212. package/src/queries/makeQueries.ts +0 -255
  213. package/src/queries/options.ts +0 -14
  214. package/src/queries/placeholderText.ts +0 -72
  215. package/src/queries/role.ts +0 -131
  216. package/src/queries/testId.ts +0 -66
  217. package/src/queries/text.ts +0 -63
  218. package/src/queries/unsafeProps.ts +0 -76
  219. package/src/queries/unsafeType.ts +0 -73
  220. package/src/react-versions.ts +0 -11
  221. package/src/render-act.ts +0 -19
  222. package/src/render.tsx +0 -183
  223. package/src/renderHook.tsx +0 -56
  224. package/src/screen.ts +0 -123
  225. package/src/shallow.ts +0 -18
  226. package/src/test-utils/events.ts +0 -24
  227. package/src/test-utils/index.ts +0 -1
  228. package/src/user-event/__tests__/__snapshots__/clear.test.tsx.snap +0 -269
  229. package/src/user-event/__tests__/clear.test.tsx +0 -217
  230. package/src/user-event/clear.ts +0 -59
  231. package/src/user-event/event-builder/common.ts +0 -66
  232. package/src/user-event/event-builder/index.ts +0 -7
  233. package/src/user-event/event-builder/text-input.ts +0 -86
  234. package/src/user-event/index.ts +0 -18
  235. package/src/user-event/press/__tests__/longPress.real-timers.test.tsx +0 -117
  236. package/src/user-event/press/__tests__/longPress.test.tsx +0 -157
  237. package/src/user-event/press/__tests__/press.real-timers.test.tsx +0 -320
  238. package/src/user-event/press/__tests__/press.test.tsx +0 -457
  239. package/src/user-event/press/constants.ts +0 -7
  240. package/src/user-event/press/index.ts +0 -1
  241. package/src/user-event/press/press.ts +0 -163
  242. package/src/user-event/setup/index.ts +0 -2
  243. package/src/user-event/setup/setup.ts +0 -142
  244. package/src/user-event/type/__tests__/__snapshots__/type-managed.test.tsx.snap +0 -339
  245. package/src/user-event/type/__tests__/__snapshots__/type.test.tsx.snap +0 -668
  246. package/src/user-event/type/__tests__/parseKeys.test.ts +0 -23
  247. package/src/user-event/type/__tests__/type-managed.test.tsx +0 -120
  248. package/src/user-event/type/__tests__/type.test.tsx +0 -335
  249. package/src/user-event/type/index.ts +0 -1
  250. package/src/user-event/type/parseKeys.ts +0 -41
  251. package/src/user-event/type/type.ts +0 -138
  252. package/src/user-event/utils/__tests__/dispatch-event.test.tsx +0 -41
  253. package/src/user-event/utils/__tests__/wait.test.ts +0 -62
  254. package/src/user-event/utils/content-size.ts +0 -25
  255. package/src/user-event/utils/dispatch-event.ts +0 -38
  256. package/src/user-event/utils/host-components.ts +0 -6
  257. package/src/user-event/utils/index.ts +0 -6
  258. package/src/user-event/utils/text-range.ts +0 -4
  259. package/src/user-event/utils/wait.ts +0 -15
  260. package/src/user-event/utils/warn-about-real-timers.ts +0 -13
  261. package/src/waitFor.ts +0 -228
  262. package/src/waitForElementToBeRemoved.ts +0 -42
  263. package/src/within.ts +0 -30
  264. package/tsconfig.json +0 -17
  265. package/tsconfig.release.json +0 -8
  266. package/website/.gitignore +0 -20
  267. package/website/README.md +0 -33
  268. package/website/docker/.dockerignore +0 -3
  269. package/website/docker/Dockerfile +0 -9
  270. package/website/docker/docker-compose.yml +0 -11
  271. package/website/docs/API.md +0 -940
  272. package/website/docs/EslintPLluginTestingLibrary.md +0 -28
  273. package/website/docs/FAQ.md +0 -44
  274. package/website/docs/GettingStarted.md +0 -100
  275. package/website/docs/HowShouldIQuery.md +0 -21
  276. package/website/docs/MigrationV11.md +0 -64
  277. package/website/docs/MigrationV12.md +0 -67
  278. package/website/docs/MigrationV2.md +0 -126
  279. package/website/docs/MigrationV7.md +0 -119
  280. package/website/docs/MigrationV9.md +0 -67
  281. package/website/docs/Queries.md +0 -572
  282. package/website/docs/ReactNavigation.md +0 -371
  283. package/website/docs/ReduxIntegration.md +0 -137
  284. package/website/docs/TestingEnvironment.md +0 -154
  285. package/website/docs/Troubleshooting.md +0 -44
  286. package/website/docs/UnderstandingAct.md +0 -227
  287. package/website/docs/UserEvent.md +0 -191
  288. package/website/docusaurus.config.js +0 -114
  289. package/website/package.json +0 -31
  290. package/website/sidebars.js +0 -20
  291. package/website/src/components/Feature.js +0 -31
  292. package/website/src/css/custom.css +0 -13
  293. package/website/src/css/index.module.css +0 -77
  294. package/website/src/pages/index.js +0 -82
  295. package/website/static/.nojekyll +0 -0
  296. package/website/static/css/custom.css +0 -28
  297. package/website/static/img/hit.png +0 -0
  298. package/website/static/img/locomotive.png +0 -0
  299. package/website/static/img/owl.png +0 -0
  300. package/website/static/img/tools.png +0 -0
  301. package/website/yarn.lock +0 -7669
  302. package/yarn.lock +0 -7765
@@ -1,824 +0,0 @@
1
- import * as React from 'react';
2
- import {
3
- TouchableOpacity,
4
- TouchableWithoutFeedback,
5
- Text,
6
- View,
7
- Pressable,
8
- Button as RNButton,
9
- } from 'react-native';
10
- import { render } from '../..';
11
-
12
- const TEXT_LABEL = 'cool text';
13
-
14
- // Little hack to make all the methods happy with type
15
- const NO_MATCHES_TEXT: any = 'not-existent-element';
16
-
17
- const getMultipleInstancesFoundMessage = (value: string) => {
18
- return `Found multiple elements with role: "${value}"`;
19
- };
20
-
21
- const getNoInstancesFoundMessage = (value: string) => {
22
- return `Unable to find an element with role: "${value}"`;
23
- };
24
-
25
- const Typography = ({ children, ...rest }: any) => {
26
- return <Text {...rest}>{children}</Text>;
27
- };
28
-
29
- const Button = ({ children }: { children: React.ReactNode }) => (
30
- <TouchableOpacity accessibilityRole="button">
31
- <Typography accessibilityRole="link">{children}</Typography>
32
- </TouchableOpacity>
33
- );
34
-
35
- const Section = () => (
36
- <>
37
- <Typography accessibilityRole="link">Title</Typography>
38
- <Button>{TEXT_LABEL}</Button>
39
- </>
40
- );
41
-
42
- test('getByRole, queryByRole, findByRole', async () => {
43
- const { getByRole, queryByRole, findByRole } = render(<Section />);
44
-
45
- expect(getByRole('button').props.accessibilityRole).toEqual('button');
46
- const button = queryByRole(/button/g);
47
- expect(button?.props.accessibilityRole).toEqual('button');
48
-
49
- expect(() => getByRole(NO_MATCHES_TEXT)).toThrow(
50
- getNoInstancesFoundMessage(NO_MATCHES_TEXT)
51
- );
52
-
53
- expect(queryByRole(NO_MATCHES_TEXT)).toBeNull();
54
-
55
- expect(() => getByRole('link')).toThrow(
56
- getMultipleInstancesFoundMessage('link')
57
- );
58
- expect(() => queryByRole('link')).toThrow(
59
- getMultipleInstancesFoundMessage('link')
60
- );
61
-
62
- const asyncButton = await findByRole('button');
63
- expect(asyncButton.props.accessibilityRole).toEqual('button');
64
- await expect(findByRole(NO_MATCHES_TEXT)).rejects.toThrow(
65
- getNoInstancesFoundMessage(NO_MATCHES_TEXT)
66
- );
67
- await expect(findByRole('link')).rejects.toThrow(
68
- getMultipleInstancesFoundMessage('link')
69
- );
70
- });
71
-
72
- test('getAllByRole, queryAllByRole, findAllByRole', async () => {
73
- const { getAllByRole, queryAllByRole, findAllByRole } = render(<Section />);
74
-
75
- expect(getAllByRole('link')).toHaveLength(2);
76
- expect(queryAllByRole(/ink/g)).toHaveLength(2);
77
-
78
- expect(() => getAllByRole(NO_MATCHES_TEXT)).toThrow(
79
- getNoInstancesFoundMessage(NO_MATCHES_TEXT)
80
- );
81
- expect(queryAllByRole(NO_MATCHES_TEXT)).toEqual([]);
82
-
83
- await expect(findAllByRole('link')).resolves.toHaveLength(2);
84
- await expect(findAllByRole(NO_MATCHES_TEXT)).rejects.toThrow(
85
- getNoInstancesFoundMessage(NO_MATCHES_TEXT)
86
- );
87
- });
88
-
89
- describe('supports name option', () => {
90
- test('returns an element that has the corresponding role and a children with the name', () => {
91
- const { getByRole } = render(
92
- <TouchableOpacity accessibilityRole="button" testID="target-button">
93
- <Text>Save</Text>
94
- </TouchableOpacity>
95
- );
96
-
97
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
98
- expect(getByRole('button', { name: 'Save' }).props.testID).toBe(
99
- 'target-button'
100
- );
101
- });
102
-
103
- test('returns an element that has the corresponding role when several children include the name', () => {
104
- const { getByRole } = render(
105
- <TouchableOpacity accessibilityRole="button" testID="target-button">
106
- <Text>Save</Text>
107
- <Text>Save</Text>
108
- </TouchableOpacity>
109
- );
110
-
111
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
112
- expect(getByRole('button', { name: 'Save' }).props.testID).toBe(
113
- 'target-button'
114
- );
115
- });
116
-
117
- test('returns an element that has the corresponding role and a children with a matching accessibilityLabel', () => {
118
- const { getByRole } = render(
119
- <TouchableOpacity accessibilityRole="button" testID="target-button">
120
- <Text accessibilityLabel="Save" />
121
- </TouchableOpacity>
122
- );
123
-
124
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
125
- expect(getByRole('button', { name: 'Save' }).props.testID).toBe(
126
- 'target-button'
127
- );
128
- });
129
-
130
- test('returns an element that has the corresponding role and a matching accessibilityLabel', () => {
131
- const { getByRole } = render(
132
- <TouchableOpacity
133
- accessibilityRole="button"
134
- testID="target-button"
135
- accessibilityLabel="Save"
136
- ></TouchableOpacity>
137
- );
138
-
139
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
140
- expect(getByRole('button', { name: 'Save' }).props.testID).toBe(
141
- 'target-button'
142
- );
143
- });
144
-
145
- test('returns an element when the direct child is text', () => {
146
- const { getByRole, getByTestId } = render(
147
- <Text accessibilityRole="header" testID="target-header">
148
- About
149
- </Text>
150
- );
151
-
152
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
153
- expect(getByRole('header', { name: 'About' })).toBe(
154
- getByTestId('target-header')
155
- );
156
- expect(getByRole('header', { name: 'About' }).props.testID).toBe(
157
- 'target-header'
158
- );
159
- });
160
-
161
- test('returns an element with nested Text as children', () => {
162
- const { getByRole, getByTestId } = render(
163
- <Text accessibilityRole="header" testID="parent">
164
- <Text testID="child">About</Text>
165
- </Text>
166
- );
167
-
168
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
169
- expect(getByRole('header', { name: 'About' })).toBe(getByTestId('parent'));
170
- expect(getByRole('header', { name: 'About' }).props.testID).toBe('parent');
171
- });
172
-
173
- test('returns a header with an accessibilityLabel', () => {
174
- const { getByRole, getByTestId } = render(
175
- <Text
176
- accessibilityRole="header"
177
- testID="target-header"
178
- accessibilityLabel="About"
179
- />
180
- );
181
-
182
- // assert on the testId to be sure that the returned element is the one with the accessibilityRole
183
- expect(getByRole('header', { name: 'About' })).toBe(
184
- getByTestId('target-header')
185
- );
186
- expect(getByRole('header', { name: 'About' }).props.testID).toBe(
187
- 'target-header'
188
- );
189
- });
190
- });
191
-
192
- describe('supports accessibility states', () => {
193
- describe('disabled', () => {
194
- test('returns a disabled element when required', () => {
195
- const { getByRole, queryByRole } = render(
196
- <TouchableOpacity
197
- accessibilityRole="button"
198
- accessibilityState={{ disabled: true }}
199
- />
200
- );
201
-
202
- expect(getByRole('button', { disabled: true })).toBeTruthy();
203
- expect(queryByRole('button', { disabled: false })).toBe(null);
204
- });
205
-
206
- test('returns the correct element when only one matches all the requirements', () => {
207
- const { getByRole } = render(
208
- <>
209
- <TouchableOpacity
210
- testID="correct"
211
- accessibilityRole="button"
212
- accessibilityState={{ disabled: true }}
213
- >
214
- <Text>Save</Text>
215
- </TouchableOpacity>
216
- <TouchableOpacity testID="wrong" accessibilityRole="button">
217
- <Text>Save</Text>
218
- </TouchableOpacity>
219
- </>
220
- );
221
-
222
- expect(
223
- getByRole('button', { name: 'Save', disabled: true }).props.testID
224
- ).toBe('correct');
225
- });
226
-
227
- test('returns an implicitly enabled element', () => {
228
- const { getByRole, queryByRole } = render(
229
- <TouchableOpacity accessibilityRole="button"></TouchableOpacity>
230
- );
231
-
232
- expect(getByRole('button', { disabled: false })).toBeTruthy();
233
- expect(queryByRole('button', { disabled: true })).toBe(null);
234
- });
235
-
236
- test('returns an explicitly enabled element', () => {
237
- const { getByRole, queryByRole } = render(
238
- <TouchableOpacity
239
- accessibilityRole="button"
240
- accessibilityState={{ disabled: false }}
241
- ></TouchableOpacity>
242
- );
243
-
244
- expect(getByRole('button', { disabled: false })).toBeTruthy();
245
- expect(queryByRole('button', { disabled: true })).toBe(null);
246
- });
247
-
248
- test('does not return disabled elements when querying for non disabled', () => {
249
- const { queryByRole } = render(
250
- <TouchableOpacity
251
- accessibilityRole="button"
252
- accessibilityState={{ disabled: true }}
253
- ></TouchableOpacity>
254
- );
255
-
256
- expect(queryByRole('button', { disabled: false })).toBe(null);
257
- });
258
-
259
- test('returns elements using the built-in disabled prop', () => {
260
- const { getByRole } = render(
261
- <>
262
- <Pressable disabled accessibilityRole="button">
263
- <Text>Pressable</Text>
264
- </Pressable>
265
-
266
- <TouchableWithoutFeedback disabled accessibilityRole="button">
267
- <View>
268
- <Text>TouchableWithoutFeedback</Text>
269
- </View>
270
- </TouchableWithoutFeedback>
271
- <RNButton disabled onPress={() => {}} title="RNButton" />
272
- </>
273
- );
274
-
275
- expect(
276
- getByRole('button', { name: 'Pressable', disabled: true })
277
- ).toBeTruthy();
278
-
279
- expect(
280
- getByRole('button', {
281
- name: 'TouchableWithoutFeedback',
282
- disabled: true,
283
- })
284
- ).toBeTruthy();
285
-
286
- expect(
287
- getByRole('button', { name: 'RNButton', disabled: true })
288
- ).toBeTruthy();
289
- });
290
- });
291
-
292
- describe('selected', () => {
293
- test('returns a selected element when required', () => {
294
- const { getByRole, queryByRole } = render(
295
- <TouchableOpacity
296
- accessibilityRole="tab"
297
- accessibilityState={{ selected: true }}
298
- />
299
- );
300
-
301
- expect(getByRole('tab', { selected: true })).toBeTruthy();
302
- expect(queryByRole('tab', { selected: false })).toBe(null);
303
- });
304
-
305
- test('returns the correct element when only one matches all the requirements', () => {
306
- const { getByRole } = render(
307
- <>
308
- <TouchableOpacity
309
- testID="correct"
310
- accessibilityRole="tab"
311
- accessibilityState={{ selected: true }}
312
- >
313
- <Text>Save</Text>
314
- </TouchableOpacity>
315
- <TouchableOpacity testID="wrong" accessibilityRole="tab">
316
- <Text>Save</Text>
317
- </TouchableOpacity>
318
- </>
319
- );
320
-
321
- expect(
322
- getByRole('tab', { name: 'Save', selected: true }).props.testID
323
- ).toBe('correct');
324
- });
325
-
326
- test('returns an implicitly non selected element', () => {
327
- const { getByRole, queryByRole } = render(
328
- <TouchableOpacity accessibilityRole="tab"></TouchableOpacity>
329
- );
330
-
331
- expect(getByRole('tab', { selected: false })).toBeTruthy();
332
- expect(queryByRole('tab', { selected: true })).toBe(null);
333
- });
334
-
335
- test('returns an explicitly non selected element', () => {
336
- const { getByRole, queryByRole } = render(
337
- <TouchableOpacity
338
- accessibilityRole="tab"
339
- accessibilityState={{ selected: false }}
340
- ></TouchableOpacity>
341
- );
342
-
343
- expect(getByRole('tab', { selected: false })).toBeTruthy();
344
- expect(queryByRole('tab', { selected: true })).toBe(null);
345
- });
346
-
347
- test('does not return selected elements when querying for non selected', () => {
348
- const { queryByRole } = render(
349
- <TouchableOpacity
350
- accessibilityRole="tab"
351
- accessibilityState={{ selected: true }}
352
- ></TouchableOpacity>
353
- );
354
-
355
- expect(queryByRole('tab', { selected: false })).toBe(null);
356
- });
357
- });
358
-
359
- describe('checked', () => {
360
- test('returns a checked element when required', () => {
361
- const { getByRole, queryByRole } = render(
362
- <TouchableOpacity
363
- accessibilityRole="checkbox"
364
- accessibilityState={{ checked: true }}
365
- />
366
- );
367
-
368
- expect(getByRole('checkbox', { checked: true })).toBeTruthy();
369
- expect(queryByRole('checkbox', { checked: false })).toBe(null);
370
- expect(queryByRole('checkbox', { checked: 'mixed' })).toBe(null);
371
- });
372
-
373
- it('returns `mixed` checkboxes', () => {
374
- const { queryByRole, getByRole } = render(
375
- <TouchableOpacity
376
- accessibilityRole="checkbox"
377
- accessibilityState={{ checked: 'mixed' }}
378
- />
379
- );
380
-
381
- expect(getByRole('checkbox', { checked: 'mixed' })).toBeTruthy();
382
- expect(queryByRole('checkbox', { checked: true })).toBe(null);
383
- expect(queryByRole('checkbox', { checked: false })).toBe(null);
384
- });
385
-
386
- it('does not return mixed checkboxes when querying for checked: true', () => {
387
- const { queryByRole } = render(
388
- <TouchableOpacity
389
- accessibilityRole="checkbox"
390
- accessibilityState={{ checked: 'mixed' }}
391
- />
392
- );
393
-
394
- expect(queryByRole('checkbox', { checked: false })).toBe(null);
395
- });
396
-
397
- test('returns the correct element when only one matches all the requirements', () => {
398
- const { getByRole } = render(
399
- <>
400
- <TouchableOpacity
401
- testID="correct"
402
- accessibilityRole="checkbox"
403
- accessibilityState={{ checked: true }}
404
- >
405
- <Text>Save</Text>
406
- </TouchableOpacity>
407
- <TouchableOpacity testID="wrong" accessibilityRole="checkbox">
408
- <Text>Save</Text>
409
- </TouchableOpacity>
410
- </>
411
- );
412
-
413
- expect(
414
- getByRole('checkbox', { name: 'Save', checked: true }).props.testID
415
- ).toBe('correct');
416
- });
417
-
418
- test('does not return return as non checked an element with checked: undefined', () => {
419
- const { queryByRole } = render(
420
- <TouchableOpacity accessibilityRole="checkbox"></TouchableOpacity>
421
- );
422
-
423
- expect(queryByRole('checkbox', { checked: false })).toBe(null);
424
- });
425
-
426
- test('returns an explicitly non checked element', () => {
427
- const { getByRole, queryByRole } = render(
428
- <TouchableOpacity
429
- accessibilityRole="checkbox"
430
- accessibilityState={{ checked: false }}
431
- ></TouchableOpacity>
432
- );
433
-
434
- expect(getByRole('checkbox', { checked: false })).toBeTruthy();
435
- expect(queryByRole('checkbox', { checked: true })).toBe(null);
436
- });
437
-
438
- test('does not return checked elements when querying for non checked', () => {
439
- const { queryByRole } = render(
440
- <TouchableOpacity
441
- accessibilityRole="checkbox"
442
- accessibilityState={{ checked: true }}
443
- ></TouchableOpacity>
444
- );
445
-
446
- expect(queryByRole('checkbox', { checked: false })).toBe(null);
447
- });
448
-
449
- test('does not return mixed elements when querying for non checked', () => {
450
- const { queryByRole } = render(
451
- <TouchableOpacity
452
- accessibilityRole="checkbox"
453
- accessibilityState={{ checked: 'mixed' }}
454
- ></TouchableOpacity>
455
- );
456
-
457
- expect(queryByRole('checkbox', { checked: false })).toBe(null);
458
- });
459
- });
460
-
461
- describe('busy', () => {
462
- test('returns a busy element when required', () => {
463
- const { getByRole, queryByRole } = render(
464
- <TouchableOpacity
465
- accessibilityRole="button"
466
- accessibilityState={{ busy: true }}
467
- />
468
- );
469
-
470
- expect(getByRole('button', { busy: true })).toBeTruthy();
471
- expect(queryByRole('button', { busy: false })).toBe(null);
472
- });
473
-
474
- test('returns the correct element when only one matches all the requirements', () => {
475
- const { getByRole } = render(
476
- <>
477
- <TouchableOpacity
478
- testID="correct"
479
- accessibilityRole="button"
480
- accessibilityState={{ busy: true }}
481
- >
482
- <Text>Save</Text>
483
- </TouchableOpacity>
484
- <TouchableOpacity testID="wrong" accessibilityRole="button">
485
- <Text>Save</Text>
486
- </TouchableOpacity>
487
- </>
488
- );
489
-
490
- expect(
491
- getByRole('button', { name: 'Save', busy: true }).props.testID
492
- ).toBe('correct');
493
- });
494
-
495
- test('returns an implicitly non busy element', () => {
496
- const { getByRole, queryByRole } = render(
497
- <TouchableOpacity accessibilityRole="button"></TouchableOpacity>
498
- );
499
-
500
- expect(getByRole('button', { busy: false })).toBeTruthy();
501
- expect(queryByRole('button', { busy: true })).toBe(null);
502
- });
503
-
504
- test('returns an explicitly non busy element', () => {
505
- const { getByRole, queryByRole } = render(
506
- <TouchableOpacity
507
- accessibilityRole="button"
508
- accessibilityState={{ busy: false }}
509
- ></TouchableOpacity>
510
- );
511
-
512
- expect(getByRole('button', { busy: false })).toBeTruthy();
513
- expect(queryByRole('button', { busy: true })).toBe(null);
514
- });
515
-
516
- test('does not return busy elements when querying for non busy', () => {
517
- const { queryByRole } = render(
518
- <TouchableOpacity
519
- accessibilityRole="button"
520
- accessibilityState={{ selected: true }}
521
- ></TouchableOpacity>
522
- );
523
-
524
- expect(queryByRole('button', { selected: false })).toBe(null);
525
- });
526
- });
527
-
528
- describe('expanded', () => {
529
- test('returns a expanded element when required', () => {
530
- const { getByRole, queryByRole } = render(
531
- <TouchableOpacity
532
- accessibilityRole="button"
533
- accessibilityState={{ expanded: true }}
534
- />
535
- );
536
-
537
- expect(getByRole('button', { expanded: true })).toBeTruthy();
538
- expect(queryByRole('button', { expanded: false })).toBe(null);
539
- });
540
-
541
- test('returns the correct element when only one matches all the requirements', () => {
542
- const { getByRole } = render(
543
- <>
544
- <TouchableOpacity
545
- testID="correct"
546
- accessibilityRole="button"
547
- accessibilityState={{ expanded: true }}
548
- >
549
- <Text>Save</Text>
550
- </TouchableOpacity>
551
- <TouchableOpacity testID="wrong" accessibilityRole="button">
552
- <Text>Save</Text>
553
- </TouchableOpacity>
554
- </>
555
- );
556
-
557
- expect(
558
- getByRole('button', { name: 'Save', expanded: true }).props.testID
559
- ).toBe('correct');
560
- });
561
-
562
- test('does not return return as non expanded an element with expanded: undefined', () => {
563
- const { queryByRole } = render(
564
- <TouchableOpacity accessibilityRole="button"></TouchableOpacity>
565
- );
566
-
567
- expect(queryByRole('button', { expanded: false })).toBe(null);
568
- });
569
-
570
- test('returns an explicitly non expanded element', () => {
571
- const { getByRole, queryByRole } = render(
572
- <TouchableOpacity
573
- accessibilityRole="button"
574
- accessibilityState={{ expanded: false }}
575
- ></TouchableOpacity>
576
- );
577
-
578
- expect(getByRole('button', { expanded: false })).toBeTruthy();
579
- expect(queryByRole('button', { expanded: true })).toBe(null);
580
- });
581
-
582
- test('does not return expanded elements when querying for non expanded', () => {
583
- const { queryByRole } = render(
584
- <TouchableOpacity
585
- accessibilityRole="button"
586
- accessibilityState={{ expanded: true }}
587
- ></TouchableOpacity>
588
- );
589
-
590
- expect(queryByRole('button', { expanded: false })).toBe(null);
591
- });
592
- });
593
-
594
- test('ignores non queried accessibilityState', () => {
595
- const { getByRole, queryByRole } = render(
596
- <TouchableOpacity
597
- accessibilityRole="button"
598
- accessibilityState={{
599
- disabled: true,
600
- // set `selected`, but don't query it
601
- selected: true,
602
- }}
603
- >
604
- <Text>Save</Text>
605
- </TouchableOpacity>
606
- );
607
-
608
- expect(
609
- getByRole('button', {
610
- name: 'Save',
611
- disabled: true,
612
- })
613
- ).toBeTruthy();
614
- expect(
615
- queryByRole('button', {
616
- name: 'Save',
617
- disabled: false,
618
- })
619
- ).toBe(null);
620
- });
621
-
622
- test('matches an element combining all the options', () => {
623
- const { getByRole } = render(
624
- <TouchableOpacity
625
- accessibilityRole="button"
626
- accessibilityState={{
627
- disabled: true,
628
- selected: true,
629
- checked: true,
630
- busy: true,
631
- expanded: true,
632
- }}
633
- >
634
- <Text>Save</Text>
635
- </TouchableOpacity>
636
- );
637
-
638
- expect(
639
- getByRole('button', {
640
- name: 'Save',
641
- disabled: true,
642
- selected: true,
643
- checked: true,
644
- busy: true,
645
- expanded: true,
646
- })
647
- ).toBeTruthy();
648
- });
649
- });
650
-
651
- describe('error messages', () => {
652
- test('gives a descriptive error message when querying with a role', () => {
653
- const { getByRole } = render(<View />);
654
-
655
- expect(() => getByRole('button')).toThrowErrorMatchingInlineSnapshot(`
656
- "Unable to find an element with role: "button"
657
-
658
- <View />"
659
- `);
660
- });
661
-
662
- test('gives a descriptive error message when querying with a role and a name', () => {
663
- const { getByRole } = render(<View />);
664
-
665
- expect(() => getByRole('button', { name: 'Save' }))
666
- .toThrowErrorMatchingInlineSnapshot(`
667
- "Unable to find an element with role: "button", name: "Save"
668
-
669
- <View />"
670
- `);
671
- });
672
-
673
- test('gives a descriptive error message when querying with a role, a name and accessibility state', () => {
674
- const { getByRole } = render(<View />);
675
-
676
- expect(() => getByRole('button', { name: 'Save', disabled: true }))
677
- .toThrowErrorMatchingInlineSnapshot(`
678
- "Unable to find an element with role: "button", name: "Save", disabled state: true
679
-
680
- <View />"
681
- `);
682
- });
683
-
684
- test('gives a descriptive error message when querying with a role, a name and several accessibility state', () => {
685
- const { getByRole } = render(<View />);
686
-
687
- expect(() =>
688
- getByRole('button', { name: 'Save', disabled: true, selected: true })
689
- ).toThrowErrorMatchingInlineSnapshot(`
690
- "Unable to find an element with role: "button", name: "Save", disabled state: true, selected state: true
691
-
692
- <View />"
693
- `);
694
- });
695
-
696
- test('gives a descriptive error message when querying with a role and an accessibility state', () => {
697
- const { getByRole } = render(<View />);
698
-
699
- expect(() => getByRole('button', { disabled: true }))
700
- .toThrowErrorMatchingInlineSnapshot(`
701
- "Unable to find an element with role: "button", disabled state: true
702
-
703
- <View />"
704
- `);
705
- });
706
-
707
- test('gives a descriptive error message when querying with a role and an accessibility value', () => {
708
- const { getByRole } = render(<View />);
709
-
710
- expect(() => getByRole('adjustable', { value: { min: 1 } }))
711
- .toThrowErrorMatchingInlineSnapshot(`
712
- "Unable to find an element with role: "adjustable", min value: 1
713
-
714
- <View />"
715
- `);
716
-
717
- expect(() =>
718
- getByRole('adjustable', {
719
- value: { min: 1, max: 2, now: 1, text: /hello/ },
720
- })
721
- ).toThrowErrorMatchingInlineSnapshot(`
722
- "Unable to find an element with role: "adjustable", min value: 1, max value: 2, now value: 1, text value: /hello/
723
-
724
- <View />"
725
- `);
726
- });
727
- });
728
-
729
- test('byRole queries support hidden option', () => {
730
- const { getByRole, queryByRole } = render(
731
- <Pressable accessibilityRole="button" style={{ display: 'none' }}>
732
- <Text>Hidden from accessibility</Text>
733
- </Pressable>
734
- );
735
-
736
- expect(getByRole('button', { includeHiddenElements: true })).toBeTruthy();
737
-
738
- expect(queryByRole('button')).toBeFalsy();
739
- expect(queryByRole('button', { includeHiddenElements: false })).toBeFalsy();
740
- expect(() => getByRole('button', { includeHiddenElements: false }))
741
- .toThrowErrorMatchingInlineSnapshot(`
742
- "Unable to find an element with role: "button"
743
-
744
- <View
745
- accessibilityRole="button"
746
- style={
747
- {
748
- "display": "none",
749
- }
750
- }
751
- >
752
- <Text>
753
- Hidden from accessibility
754
- </Text>
755
- </View>"
756
- `);
757
- });
758
-
759
- describe('matches only accessible elements', () => {
760
- test('matches elements with accessible={true}', () => {
761
- const { queryByRole } = render(
762
- <View accessibilityRole="menu" accessible={true}>
763
- <Text>Action</Text>
764
- </View>
765
- );
766
- expect(queryByRole('menu', { name: 'Action' })).toBeTruthy();
767
- });
768
-
769
- test('ignores elements with accessible={false}', () => {
770
- const { queryByRole } = render(
771
- <Pressable accessibilityRole="button" accessible={false}>
772
- <Text>Action</Text>
773
- </Pressable>
774
- );
775
- expect(queryByRole('button', { name: 'Action' })).toBeFalsy();
776
- });
777
-
778
- test('ignores elements with accessible={undefined} and that are implicitely not accessible', () => {
779
- const { queryByRole } = render(
780
- <View accessibilityRole="menu">
781
- <Text>Action</Text>
782
- </View>
783
- );
784
- expect(queryByRole('menu', { name: 'Action' })).toBeFalsy();
785
- });
786
- });
787
-
788
- test('error message renders the element tree, preserving only helpful props', async () => {
789
- const view = render(<View accessibilityRole="button" key="3" />);
790
-
791
- expect(() => view.getByRole('link')).toThrowErrorMatchingInlineSnapshot(`
792
- "Unable to find an element with role: "link"
793
-
794
- <View
795
- accessibilityRole="button"
796
- />"
797
- `);
798
-
799
- expect(() => view.getAllByRole('link')).toThrowErrorMatchingInlineSnapshot(`
800
- "Unable to find an element with role: "link"
801
-
802
- <View
803
- accessibilityRole="button"
804
- />"
805
- `);
806
-
807
- await expect(view.findByRole('link')).rejects
808
- .toThrowErrorMatchingInlineSnapshot(`
809
- "Unable to find an element with role: "link"
810
-
811
- <View
812
- accessibilityRole="button"
813
- />"
814
- `);
815
-
816
- await expect(view.findAllByRole('link')).rejects
817
- .toThrowErrorMatchingInlineSnapshot(`
818
- "Unable to find an element with role: "link"
819
-
820
- <View
821
- accessibilityRole="button"
822
- />"
823
- `);
824
- });