@telus-uds/components-base 0.0.2-prerelease.7 → 0.0.2-prerelease.8

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 (349) hide show
  1. package/.ultra.cache.json +1 -1
  2. package/CHANGELOG.md +27 -0
  3. package/__fixtures__/Accessible.js +33 -0
  4. package/__fixtures__/Accessible.native.js +32 -0
  5. package/__fixtures__/testTheme.js +429 -29
  6. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
  7. package/__tests__/Button/ButtonGroup.test.jsx +2 -2
  8. package/__tests__/Checkbox/CheckboxGroup.test.jsx +247 -0
  9. package/__tests__/Icon/Icon.test.jsx +3 -3
  10. package/__tests__/Modal/Modal.test.jsx +47 -0
  11. package/__tests__/Notification/Notification.test.jsx +20 -0
  12. package/__tests__/Pagination/Pagination.test.jsx +2 -2
  13. package/__tests__/Progress/Progress.test.jsx +79 -0
  14. package/__tests__/Radio/RadioGroup.test.jsx +221 -0
  15. package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
  16. package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
  17. package/__tests__/Search/Search.test.jsx +72 -0
  18. package/__tests__/Skeleton/Skeleton.test.jsx +1 -1
  19. package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
  20. package/__tests__/Tabs/Tabs.test.jsx +200 -0
  21. package/__tests__/Tags/Tags.test.jsx +1 -1
  22. package/__tests__/utils/input.test.js +58 -0
  23. package/__tests__/utils/useCopy.test.js +14 -3
  24. package/babel.config.js +20 -0
  25. package/jest.config.js +1 -1
  26. package/lib/A11yInfoProvider/index.js +54 -26
  27. package/lib/A11yText/index.js +37 -14
  28. package/lib/ActivityIndicator/Spinner.js +78 -0
  29. package/lib/ActivityIndicator/Spinner.native.js +121 -87
  30. package/lib/ActivityIndicator/index.js +28 -12
  31. package/lib/ActivityIndicator/shared.js +27 -12
  32. package/lib/BaseProvider/index.js +34 -11
  33. package/lib/Box/Box.js +54 -31
  34. package/lib/Box/index.js +13 -2
  35. package/lib/Button/Button.js +32 -11
  36. package/lib/Button/ButtonBase.js +85 -78
  37. package/lib/Button/ButtonGroup.js +94 -70
  38. package/lib/Button/ButtonLink.js +38 -15
  39. package/lib/Button/index.js +31 -4
  40. package/lib/Button/propTypes.js +32 -9
  41. package/lib/Card/Card.js +36 -41
  42. package/lib/Card/CardBase.js +78 -0
  43. package/lib/Card/PressableCardBase.js +137 -0
  44. package/lib/Card/index.js +40 -2
  45. package/lib/Checkbox/Checkbox.js +139 -103
  46. package/lib/Checkbox/CheckboxGroup.js +231 -0
  47. package/lib/Checkbox/CheckboxInput.js +74 -0
  48. package/lib/Checkbox/CheckboxInput.native.js +9 -1
  49. package/lib/Checkbox/index.js +21 -2
  50. package/lib/Divider/Divider.js +50 -24
  51. package/lib/Divider/index.js +13 -2
  52. package/lib/ExpandCollapse/Accordion.js +20 -7
  53. package/lib/ExpandCollapse/Control.js +50 -27
  54. package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
  55. package/lib/ExpandCollapse/Panel.js +75 -37
  56. package/lib/ExpandCollapse/index.js +25 -7
  57. package/lib/Feedback/Feedback.js +69 -40
  58. package/lib/Feedback/index.js +13 -2
  59. package/lib/Fieldset/Fieldset.js +160 -0
  60. package/lib/Fieldset/FieldsetContainer.js +41 -0
  61. package/lib/Fieldset/FieldsetContainer.native.js +33 -0
  62. package/lib/Fieldset/Legend.js +33 -0
  63. package/lib/Fieldset/Legend.native.js +43 -0
  64. package/lib/Fieldset/cssReset.js +21 -0
  65. package/lib/Fieldset/index.js +13 -0
  66. package/lib/FlexGrid/Col/Col.js +67 -38
  67. package/lib/FlexGrid/Col/index.js +13 -2
  68. package/lib/FlexGrid/FlexGrid.js +70 -45
  69. package/lib/FlexGrid/Row/Row.js +48 -27
  70. package/lib/FlexGrid/Row/index.js +13 -2
  71. package/lib/FlexGrid/helpers/index.js +9 -1
  72. package/lib/FlexGrid/index.js +13 -2
  73. package/lib/FlexGrid/providers/GutterContext.js +15 -3
  74. package/lib/Icon/Icon.js +46 -44
  75. package/lib/Icon/IconText.js +49 -21
  76. package/lib/Icon/index.js +31 -4
  77. package/lib/InputLabel/InputLabel.js +70 -36
  78. package/lib/InputLabel/LabelContent.js +31 -0
  79. package/lib/InputLabel/LabelContent.native.js +9 -1
  80. package/lib/InputLabel/index.js +13 -2
  81. package/lib/InputSupports/InputSupports.js +62 -48
  82. package/lib/InputSupports/index.js +13 -2
  83. package/lib/InputSupports/propTypes.js +19 -8
  84. package/lib/InputSupports/useInputSupports.js +41 -0
  85. package/lib/Link/ChevronLink.js +33 -16
  86. package/lib/Link/InlinePressable.js +50 -0
  87. package/lib/Link/InlinePressable.native.js +34 -11
  88. package/lib/Link/Link.js +25 -9
  89. package/lib/Link/LinkBase.js +87 -57
  90. package/lib/Link/TextButton.js +32 -13
  91. package/lib/Link/index.js +39 -5
  92. package/lib/List/List.js +51 -23
  93. package/lib/List/ListItem.js +70 -40
  94. package/lib/List/index.js +13 -2
  95. package/lib/Modal/Modal.js +226 -0
  96. package/lib/Modal/dictionary.js +16 -0
  97. package/lib/Modal/index.js +13 -0
  98. package/lib/Notification/Notification.js +200 -0
  99. package/lib/Notification/dictionary.js +15 -0
  100. package/lib/Notification/index.js +13 -0
  101. package/lib/Pagination/PageButton.js +47 -25
  102. package/lib/Pagination/Pagination.js +70 -40
  103. package/lib/Pagination/SideButton.js +63 -37
  104. package/lib/Pagination/dictionary.js +9 -2
  105. package/lib/Pagination/index.js +13 -2
  106. package/lib/Pagination/usePagination.js +12 -2
  107. package/lib/Progress/Progress.js +99 -0
  108. package/lib/Progress/ProgressBar.js +146 -0
  109. package/lib/Progress/ProgressBarBackground.js +57 -0
  110. package/lib/Progress/index.js +16 -0
  111. package/lib/Radio/Radio.js +110 -109
  112. package/lib/Radio/RadioButton.js +141 -0
  113. package/lib/Radio/RadioGroup.js +233 -0
  114. package/lib/Radio/RadioInput.js +76 -0
  115. package/lib/Radio/RadioInput.native.js +9 -1
  116. package/lib/Radio/index.js +21 -2
  117. package/lib/RadioCard/RadioCard.js +240 -0
  118. package/lib/RadioCard/RadioCardGroup.js +251 -0
  119. package/lib/RadioCard/index.js +21 -0
  120. package/lib/Search/Search.js +243 -0
  121. package/lib/Search/dictionary.js +19 -0
  122. package/lib/Search/index.js +13 -0
  123. package/lib/Select/Group.js +33 -0
  124. package/lib/Select/Group.native.js +16 -5
  125. package/lib/Select/Item.js +29 -0
  126. package/lib/Select/Item.native.js +14 -4
  127. package/lib/Select/Picker.js +79 -0
  128. package/lib/Select/Picker.native.js +52 -24
  129. package/lib/Select/Select.js +110 -82
  130. package/lib/Select/index.js +19 -6
  131. package/lib/SideNav/Item.js +54 -33
  132. package/lib/SideNav/ItemContent.js +41 -15
  133. package/lib/SideNav/ItemsGroup.js +46 -27
  134. package/lib/SideNav/SideNav.js +92 -69
  135. package/lib/SideNav/index.js +15 -1
  136. package/lib/Skeleton/Skeleton.js +55 -37
  137. package/lib/Skeleton/index.js +13 -2
  138. package/lib/Skeleton/skeleton.constant.js +12 -0
  139. package/lib/Skeleton/skeletonWebAnimation.js +27 -0
  140. package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
  141. package/lib/Spacer/Spacer.js +31 -12
  142. package/lib/Spacer/index.js +13 -2
  143. package/lib/StackView/StackView.js +49 -27
  144. package/lib/StackView/StackWrap.js +33 -10
  145. package/lib/StackView/StackWrap.native.js +13 -2
  146. package/lib/StackView/StackWrapBox.js +46 -24
  147. package/lib/StackView/StackWrapGap.js +43 -22
  148. package/lib/StackView/common.js +19 -4
  149. package/lib/StackView/getStackedContent.js +49 -19
  150. package/lib/StackView/index.js +29 -5
  151. package/lib/StepTracker/Step.js +245 -0
  152. package/lib/StepTracker/StepTracker.js +197 -0
  153. package/lib/StepTracker/dictionary.js +17 -0
  154. package/lib/StepTracker/index.js +13 -0
  155. package/lib/Tabs/HorizontalScroll.js +199 -0
  156. package/lib/Tabs/ScrollViewEnd.js +66 -0
  157. package/lib/Tabs/ScrollViewEnd.native.js +41 -0
  158. package/lib/Tabs/Tabs.js +117 -0
  159. package/lib/Tabs/TabsItem.js +234 -0
  160. package/lib/Tabs/TabsScrollButton.js +121 -0
  161. package/lib/Tabs/dictionary.js +18 -0
  162. package/lib/Tabs/index.js +13 -0
  163. package/lib/Tabs/itemPositions.js +128 -0
  164. package/lib/Tags/Tags.js +130 -97
  165. package/lib/Tags/index.js +13 -2
  166. package/lib/TextInput/TextArea.js +51 -24
  167. package/lib/TextInput/TextInput.js +40 -19
  168. package/lib/TextInput/TextInputBase.js +78 -55
  169. package/lib/TextInput/index.js +23 -3
  170. package/lib/TextInput/propTypes.js +18 -7
  171. package/lib/ThemeProvider/ThemeProvider.js +38 -14
  172. package/lib/ThemeProvider/index.js +61 -6
  173. package/lib/ThemeProvider/useSetTheme.js +14 -5
  174. package/lib/ThemeProvider/useTheme.js +13 -4
  175. package/lib/ThemeProvider/useThemeTokens.js +32 -16
  176. package/lib/ThemeProvider/utils/index.js +31 -2
  177. package/lib/ThemeProvider/utils/styles.js +52 -16
  178. package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
  179. package/lib/ToggleSwitch/ToggleSwitch.js +75 -51
  180. package/lib/ToggleSwitch/index.js +13 -2
  181. package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +22 -18
  182. package/lib/Tooltip/Backdrop.native.js +39 -15
  183. package/lib/Tooltip/Tooltip.js +112 -70
  184. package/lib/Tooltip/dictionary.js +9 -2
  185. package/lib/Tooltip/getTooltipPosition.js +9 -1
  186. package/lib/Tooltip/index.js +13 -2
  187. package/lib/TooltipButton/TooltipButton.js +57 -38
  188. package/lib/TooltipButton/index.js +13 -2
  189. package/lib/Typography/Typography.js +57 -27
  190. package/lib/Typography/index.js +13 -2
  191. package/lib/ViewportProvider/ViewportProvider.js +34 -13
  192. package/lib/ViewportProvider/index.js +28 -3
  193. package/lib/ViewportProvider/useViewport.js +15 -3
  194. package/lib/ViewportProvider/useViewportListener.js +24 -10
  195. package/lib/index.js +509 -33
  196. package/lib/utils/a11y/index.js +18 -1
  197. package/lib/utils/a11y/textSize.js +23 -7
  198. package/lib/utils/animation/index.js +15 -2
  199. package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
  200. package/lib/utils/children.js +87 -0
  201. package/lib/utils/index.js +163 -10
  202. package/lib/utils/info/index.js +18 -6
  203. package/lib/utils/info/platform/index.js +19 -7
  204. package/lib/utils/info/platform/platform.android.js +8 -1
  205. package/lib/utils/info/platform/platform.ios.js +8 -1
  206. package/lib/utils/info/platform/platform.js +8 -0
  207. package/lib/utils/info/platform/platform.native.js +8 -1
  208. package/lib/utils/info/versions.js +15 -4
  209. package/lib/utils/input.js +51 -33
  210. package/lib/utils/pressability.js +38 -10
  211. package/lib/utils/propTypes.js +217 -125
  212. package/lib/utils/useCopy.js +40 -5
  213. package/lib/utils/useHash.js +48 -0
  214. package/lib/utils/useHash.native.js +15 -0
  215. package/lib/utils/useResponsiveProp.js +21 -9
  216. package/lib/utils/useSpacingScale.js +21 -9
  217. package/lib/utils/useUniqueId.js +13 -4
  218. package/package.json +7 -6
  219. package/release-context.json +4 -4
  220. package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
  221. package/src/Box/Box.jsx +11 -4
  222. package/src/Button/Button.jsx +3 -2
  223. package/src/Button/ButtonBase.jsx +27 -36
  224. package/src/Button/ButtonGroup.jsx +2 -2
  225. package/src/Button/ButtonLink.jsx +3 -2
  226. package/src/Button/propTypes.js +12 -2
  227. package/src/Card/Card.jsx +4 -30
  228. package/src/Card/CardBase.jsx +57 -0
  229. package/src/Card/PressableCardBase.jsx +112 -0
  230. package/src/Card/index.js +3 -0
  231. package/src/Checkbox/Checkbox.jsx +10 -11
  232. package/src/Checkbox/CheckboxGroup.jsx +196 -0
  233. package/src/Checkbox/{CheckboxInput.web.jsx → CheckboxInput.jsx} +0 -0
  234. package/src/Checkbox/index.js +2 -0
  235. package/src/ExpandCollapse/Control.jsx +1 -1
  236. package/src/Feedback/Feedback.jsx +1 -1
  237. package/src/Fieldset/Fieldset.jsx +129 -0
  238. package/src/Fieldset/FieldsetContainer.jsx +22 -0
  239. package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
  240. package/src/Fieldset/Legend.jsx +16 -0
  241. package/src/Fieldset/Legend.native.jsx +22 -0
  242. package/src/Fieldset/cssReset.js +14 -0
  243. package/src/Fieldset/index.js +3 -0
  244. package/src/Icon/Icon.jsx +14 -23
  245. package/src/Icon/IconText.jsx +2 -2
  246. package/src/Icon/index.js +2 -2
  247. package/src/InputLabel/InputLabel.jsx +9 -2
  248. package/src/InputLabel/{LabelContent.web.jsx → LabelContent.jsx} +0 -0
  249. package/src/InputSupports/InputSupports.jsx +7 -18
  250. package/src/InputSupports/useInputSupports.js +30 -0
  251. package/src/Link/{InlinePressable.web.jsx → InlinePressable.jsx} +0 -0
  252. package/src/Link/LinkBase.jsx +14 -12
  253. package/src/Modal/Modal.jsx +185 -0
  254. package/src/Modal/dictionary.js +9 -0
  255. package/src/Modal/index.js +3 -0
  256. package/src/Notification/Notification.jsx +149 -0
  257. package/src/Notification/dictionary.js +8 -0
  258. package/src/Notification/index.js +3 -0
  259. package/src/Progress/Progress.jsx +77 -0
  260. package/src/Progress/ProgressBar.jsx +110 -0
  261. package/src/Progress/ProgressBarBackground.jsx +34 -0
  262. package/src/Progress/index.js +6 -0
  263. package/src/Radio/Radio.jsx +19 -56
  264. package/src/Radio/RadioButton.jsx +131 -0
  265. package/src/Radio/RadioGroup.jsx +198 -0
  266. package/src/Radio/{RadioInput.web.jsx → RadioInput.jsx} +0 -0
  267. package/src/Radio/index.js +2 -0
  268. package/src/RadioCard/RadioCard.jsx +191 -0
  269. package/src/RadioCard/RadioCardGroup.jsx +211 -0
  270. package/src/RadioCard/index.js +5 -0
  271. package/src/Search/Search.jsx +204 -0
  272. package/src/Search/dictionary.js +12 -0
  273. package/src/Search/index.js +3 -0
  274. package/src/Select/{Group.web.jsx → Group.jsx} +0 -0
  275. package/src/Select/{Item.web.jsx → Item.jsx} +0 -0
  276. package/src/Select/{Picker.web.jsx → Picker.jsx} +0 -0
  277. package/src/Select/Select.jsx +12 -22
  278. package/src/SideNav/Item.jsx +2 -2
  279. package/src/Skeleton/Skeleton.jsx +17 -20
  280. package/src/Skeleton/skeleton.constant.js +3 -0
  281. package/src/Skeleton/skeletonWebAnimation.js +13 -0
  282. package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
  283. package/src/StackView/StackView.jsx +10 -3
  284. package/src/StackView/StackWrap.jsx +9 -1
  285. package/src/StackView/StackWrapBox.jsx +4 -3
  286. package/src/StackView/StackWrapGap.jsx +3 -3
  287. package/src/StackView/getStackedContent.jsx +8 -2
  288. package/src/StepTracker/Step.jsx +202 -0
  289. package/src/StepTracker/StepTracker.jsx +163 -0
  290. package/src/StepTracker/dictionary.js +10 -0
  291. package/src/StepTracker/index.js +3 -0
  292. package/src/Tabs/HorizontalScroll.jsx +165 -0
  293. package/src/Tabs/ScrollViewEnd.jsx +53 -0
  294. package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
  295. package/src/Tabs/Tabs.jsx +89 -0
  296. package/src/Tabs/TabsItem.jsx +204 -0
  297. package/src/Tabs/TabsScrollButton.jsx +100 -0
  298. package/src/Tabs/dictionary.js +11 -0
  299. package/src/Tabs/index.js +3 -0
  300. package/src/Tabs/itemPositions.js +101 -0
  301. package/src/Tags/Tags.jsx +2 -1
  302. package/src/TextInput/TextInputBase.jsx +12 -22
  303. package/src/ThemeProvider/useThemeTokens.js +2 -2
  304. package/src/ThemeProvider/utils/styles.js +18 -5
  305. package/src/ThemeProvider/utils/theme-tokens.js +46 -5
  306. package/src/ToggleSwitch/ToggleSwitch.jsx +2 -3
  307. package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
  308. package/src/Tooltip/Tooltip.jsx +1 -1
  309. package/src/TooltipButton/TooltipButton.jsx +23 -27
  310. package/src/Typography/Typography.jsx +6 -5
  311. package/src/index.js +20 -2
  312. package/src/utils/children.jsx +66 -0
  313. package/src/utils/index.js +3 -0
  314. package/src/utils/info/platform/platform.js +1 -0
  315. package/src/utils/info/versions.js +2 -2
  316. package/src/utils/input.js +20 -12
  317. package/src/utils/pressability.js +4 -0
  318. package/src/utils/propTypes.js +98 -34
  319. package/src/utils/useCopy.js +30 -4
  320. package/src/utils/useHash.js +34 -0
  321. package/src/utils/useHash.native.js +6 -0
  322. package/stories/A11yText/A11yText.stories.jsx +4 -8
  323. package/stories/Checkbox/Checkbox.stories.jsx +24 -1
  324. package/stories/Icon/Icon.stories.jsx +6 -5
  325. package/stories/Modal/Modal.stories.jsx +29 -0
  326. package/stories/Notification/Notification.stories.jsx +82 -0
  327. package/stories/Progress/Progress.stories.jsx +93 -0
  328. package/stories/Radio/Radio.stories.jsx +23 -36
  329. package/stories/RadioCard/RadioCard.stories.jsx +98 -0
  330. package/stories/Search/Search.stories.jsx +16 -0
  331. package/stories/StepTracker/StepTracker.stories.jsx +71 -0
  332. package/stories/Tabs/Tabs.stories.jsx +97 -0
  333. package/stories/{platform-supports.web.jsx → platform-supports.jsx} +0 -0
  334. package/__fixtures__/accessible.icon.svg +0 -6
  335. package/babel.config.json +0 -8
  336. package/lib/ActivityIndicator/Spinner.web.js +0 -55
  337. package/lib/Checkbox/CheckboxInput.web.js +0 -57
  338. package/lib/InputLabel/LabelContent.web.js +0 -17
  339. package/lib/Link/InlinePressable.web.js +0 -32
  340. package/lib/Radio/RadioInput.web.js +0 -59
  341. package/lib/Select/Group.web.js +0 -18
  342. package/lib/Select/Item.web.js +0 -15
  343. package/lib/Select/Picker.web.js +0 -63
  344. package/lib/config/svgr-icons-web.js +0 -9
  345. package/lib/config/svgr-icons.js +0 -52
  346. package/lib/utils/info/platform/platform.web.js +0 -1
  347. package/src/config/svgr-icons-web.js +0 -11
  348. package/src/config/svgr-icons.js +0 -46
  349. package/src/utils/info/platform/platform.web.js +0 -1
@@ -0,0 +1,247 @@
1
+ import React from 'react'
2
+ import { render, fireEvent } from '@testing-library/react-native'
3
+ import { toHaveTextContent } from '@testing-library/jest-native'
4
+
5
+ import Theme from '../../__fixtures__/Theme'
6
+ import CheckboxGroup from '../../src/Checkbox/CheckboxGroup'
7
+
8
+ const items = [
9
+ { label: 'One', id: 'one' },
10
+ { label: 'Two', id: 'two' },
11
+ { label: 'Three', id: 'three' },
12
+ { label: 'Four', id: 'four' }
13
+ ]
14
+ const checked = { checked: true }
15
+
16
+ // expect().toHaveTextContent doesn't work on arrays, expect().toContain etc doesn't match elements
17
+ const containsText = (queryResult, text) =>
18
+ queryResult.some((testInstance) => toHaveTextContent(testInstance, text).pass)
19
+
20
+ describe('CheckboxGroup', () => {
21
+ // eslint-disable-next-line no-console
22
+ const consoleError = console.error
23
+ beforeEach(() => {
24
+ // eslint-disable-next-line no-console
25
+ console.error = () => {}
26
+ })
27
+ afterEach(() => {
28
+ // eslint-disable-next-line no-console
29
+ console.error = consoleError
30
+ })
31
+
32
+ it('Throws if has `checkedIds` without `onChange`', () => {
33
+ expect(() =>
34
+ render(
35
+ <Theme>
36
+ <CheckboxGroup items={items} checkedIds={['one']} />
37
+ </Theme>
38
+ )
39
+ ).toThrow(/values.+without.+onChange/)
40
+ })
41
+ it("Doesn't throw if has `checkedIds` without `onChange` and is read only", () => {
42
+ expect(() =>
43
+ render(
44
+ <Theme>
45
+ <CheckboxGroup items={items} checkedIds={['one']} readOnly />
46
+ </Theme>
47
+ )
48
+ ).not.toThrow()
49
+ })
50
+ it('Throws if has both `checkedIds` and `initialCheckedIds`', () => {
51
+ expect(() =>
52
+ render(
53
+ <Theme>
54
+ <CheckboxGroup
55
+ items={items}
56
+ checkedIds={['one']}
57
+ initialCheckedIds={['one']}
58
+ onChange={() => {}}
59
+ />
60
+ </Theme>
61
+ )
62
+ ).toThrow(/both(?=.*initialValues)(?=.*values){2}/)
63
+ })
64
+ })
65
+
66
+ describe('CheckboxGroup (uncontrolled)', () => {
67
+ it('Selects unlimited items', async () => {
68
+ const { getByText, queryAllByA11yState } = render(
69
+ <Theme>
70
+ <CheckboxGroup items={items} />
71
+ </Theme>
72
+ )
73
+
74
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
75
+
76
+ const one = getByText('One')
77
+ await fireEvent.press(one)
78
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
79
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
80
+
81
+ const two = getByText('Two')
82
+ await fireEvent.press(two)
83
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
84
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
85
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
86
+
87
+ const three = getByText('Three')
88
+ await fireEvent.press(three)
89
+ expect(queryAllByA11yState(checked)).toHaveLength(3)
90
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
91
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
92
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
93
+
94
+ const four = getByText('Four')
95
+ await fireEvent.press(four)
96
+ expect(queryAllByA11yState(checked)).toHaveLength(4)
97
+ expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
98
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
99
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
100
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
101
+ })
102
+
103
+ it('Deselects if the selected item is pressed', async () => {
104
+ const { getByText, queryAllByA11yState } = render(
105
+ <Theme>
106
+ <CheckboxGroup items={items} />
107
+ </Theme>
108
+ )
109
+
110
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
111
+
112
+ const three = getByText('Three')
113
+ await fireEvent.press(three)
114
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
115
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
116
+
117
+ await fireEvent.press(three)
118
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
119
+ expect(containsText(queryAllByA11yState(checked), 'Three')).not.toBeTruthy()
120
+ })
121
+
122
+ it('Is accessible as checkboxes button', async () => {
123
+ const { queryAllByA11yRole, queryAllByA11yState } = render(
124
+ <Theme>
125
+ <CheckboxGroup items={items} />
126
+ </Theme>
127
+ )
128
+
129
+ expect(queryAllByA11yRole('radiogroup')).toHaveLength(0)
130
+ expect(queryAllByA11yRole('radio')).toHaveLength(0)
131
+
132
+ const checks = queryAllByA11yRole('checkbox')
133
+ expect(checks).toHaveLength(4)
134
+
135
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
136
+ await fireEvent.press(checks[0])
137
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
138
+ })
139
+
140
+ it('Auto-selects any provided initialCheckedIds', async () => {
141
+ const { getByText, queryAllByA11yState } = render(
142
+ <Theme>
143
+ <CheckboxGroup items={items} initialCheckedIds={['one', 'two']} />
144
+ </Theme>
145
+ )
146
+ expect(queryAllByA11yState(checked)).toHaveLength(2)
147
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
148
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
149
+
150
+ const three = getByText('Three')
151
+ await fireEvent.press(three)
152
+
153
+ expect(queryAllByA11yState(checked)).toHaveLength(3)
154
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
155
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
156
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
157
+ })
158
+ })
159
+
160
+ describe('CheckboxGroup (controlled)', () => {
161
+ it('Calls onChange handler on press in controlled mode, providing pressed id', async () => {
162
+ const handleChange = jest.fn((arg) => arg)
163
+ const { getByText } = render(
164
+ <Theme>
165
+ <CheckboxGroup items={items} checkedIds={[]} onChange={handleChange} />
166
+ </Theme>
167
+ )
168
+
169
+ expect(handleChange).toHaveBeenCalledTimes(0)
170
+
171
+ const one = getByText('One')
172
+ await fireEvent.press(one)
173
+ expect(handleChange).toHaveBeenCalledTimes(1)
174
+
175
+ expect(handleChange.mock.calls[0][0]).toEqual(['one'])
176
+
177
+ const two = getByText('Two')
178
+ await fireEvent.press(two)
179
+ expect(handleChange).toHaveBeenCalledTimes(2)
180
+ expect(handleChange.mock.calls[1][0]).toEqual(['two'])
181
+ })
182
+
183
+ it("Doesn't change its own selection if `checkedIds` is passed", async () => {
184
+ const { getByText, queryAllByA11yState } = render(
185
+ <Theme>
186
+ <CheckboxGroup items={items} checkedIds={['one']} onChange={() => {}} />
187
+ </Theme>
188
+ )
189
+
190
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
191
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
192
+
193
+ const one = getByText('One')
194
+ await fireEvent.press(one)
195
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
196
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
197
+
198
+ const two = getByText('Two')
199
+ await fireEvent.press(two)
200
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
201
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
202
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
203
+ })
204
+ })
205
+
206
+ describe('CheckboxGroup (read-only)', () => {
207
+ it("Doesn't call onChange handler when read-only", async () => {
208
+ const handleChange = jest.fn((arg) => arg)
209
+ const { getByText } = render(
210
+ <Theme>
211
+ <CheckboxGroup items={items} checkedIds={[]} onChange={handleChange} readOnly />
212
+ </Theme>
213
+ )
214
+
215
+ expect(handleChange).toHaveBeenCalledTimes(0)
216
+
217
+ const one = getByText('One')
218
+ await fireEvent.press(one)
219
+ expect(handleChange).toHaveBeenCalledTimes(0)
220
+
221
+ const two = getByText('Two')
222
+ await fireEvent.press(two)
223
+ expect(handleChange).toHaveBeenCalledTimes(0)
224
+ })
225
+
226
+ it("Doesn't change its selection on press", async () => {
227
+ const { getByText, queryAllByA11yState } = render(
228
+ <Theme>
229
+ <CheckboxGroup items={items} checkedIds={['one']} readOnly />
230
+ </Theme>
231
+ )
232
+
233
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
234
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
235
+
236
+ const one = getByText('One')
237
+ await fireEvent.press(one)
238
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
239
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
240
+
241
+ const two = getByText('Two')
242
+ await fireEvent.press(two)
243
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
244
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
245
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
246
+ })
247
+ })
@@ -16,7 +16,7 @@ describe('Icon', () => {
16
16
  it('gets default styles from theme', () => {
17
17
  const { getByTestId } = render(
18
18
  <Theme>
19
- <Icon IconSvg={InnerComponent} />
19
+ <Icon icon={InnerComponent} />
20
20
  </Theme>
21
21
  )
22
22
 
@@ -29,7 +29,7 @@ describe('Icon', () => {
29
29
  it('gets styles from variant', () => {
30
30
  const { getByTestId } = render(
31
31
  <Theme>
32
- <Icon IconSvg={InnerComponent} variant={{ size: 'small' }} />
32
+ <Icon icon={InnerComponent} variant={{ size: 'small' }} />
33
33
  </Theme>
34
34
  )
35
35
 
@@ -46,7 +46,7 @@ describe('Icon', () => {
46
46
  const props = { tokens: { size: 30 } }
47
47
  const { getByTestId } = render(
48
48
  <Theme>
49
- <Icon IconSvg={InnerComponent} {...props} />
49
+ <Icon icon={InnerComponent} {...props} />
50
50
  </Theme>
51
51
  )
52
52
 
@@ -0,0 +1,47 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+ import { fireEvent, render } from '@testing-library/react-native'
4
+
5
+ import { Modal } from '../../src'
6
+ import Theme from '../../__fixtures__/Theme'
7
+
8
+ describe('Modal', () => {
9
+ it('is not rendered when closed', () => {
10
+ const { queryByText } = render(
11
+ <Modal>
12
+ <Text>Test content</Text>
13
+ </Modal>,
14
+ { wrapper: Theme }
15
+ )
16
+
17
+ expect(queryByText('Test content')).toBeFalsy()
18
+ })
19
+
20
+ it('is rendered when open', () => {
21
+ const { queryByText } = render(
22
+ <Modal isOpen>
23
+ <Text>Test content</Text>
24
+ </Modal>,
25
+ { wrapper: Theme }
26
+ )
27
+
28
+ expect(queryByText('Test content')).not.toBeFalsy()
29
+ })
30
+
31
+ it('onClose callback is triggered when closing', () => {
32
+ const onClose = jest.fn()
33
+
34
+ const { getByA11yRole } = render(
35
+ <Modal isOpen onClose={onClose}>
36
+ <Text>Test content</Text>
37
+ </Modal>,
38
+ { wrapper: Theme }
39
+ )
40
+
41
+ expect(onClose).not.toHaveBeenCalled()
42
+
43
+ fireEvent.press(getByA11yRole('button'))
44
+
45
+ expect(onClose).toHaveBeenCalledTimes(1)
46
+ })
47
+ })
@@ -0,0 +1,20 @@
1
+ import React from 'react'
2
+ import { fireEvent, render } from '@testing-library/react-native'
3
+
4
+ import { Notification } from '../../src'
5
+ import Theme from '../../__fixtures__/Theme'
6
+
7
+ describe('Notification', () => {
8
+ it('is removed when dismiss button is pressed', () => {
9
+ const content = 'Notification content lands here'
10
+ const { getByRole, getByText } = render(<Notification dismissible>{content}</Notification>, {
11
+ wrapper: Theme
12
+ })
13
+
14
+ expect(() => getByText(content)).not.toThrow()
15
+
16
+ fireEvent.press(getByRole('button'))
17
+
18
+ expect(() => getByText(content)).toThrow()
19
+ })
20
+ })
@@ -114,7 +114,7 @@ describe('Pagination', () => {
114
114
 
115
115
  expect(button).toHaveProp('accessibilityRole', 'link')
116
116
  expect(button).toHaveProp('href', 'test-url')
117
- expect(button).toHaveProp('target', '_blank')
117
+ expect(button).toHaveProp('hrefAttrs', { target: '_blank' })
118
118
  })
119
119
  })
120
120
 
@@ -154,7 +154,7 @@ describe('Pagination', () => {
154
154
 
155
155
  expect(button).toHaveProp('accessibilityRole', 'link')
156
156
  expect(button).toHaveProp('href', 'test-url')
157
- expect(button).toHaveProp('target', '_blank')
157
+ expect(button).toHaveProp('hrefAttrs', { target: '_blank' })
158
158
  })
159
159
  })
160
160
  })
@@ -0,0 +1,79 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+ import { render, within } from '@testing-library/react-native'
4
+
5
+ import { Progress } from '../../src'
6
+ import Theme from '../../__fixtures__/Theme'
7
+
8
+ const barTokens = {
9
+ backgroundColor: 'green'
10
+ }
11
+ const percentage = 75
12
+ const progressTokens = {
13
+ backgroundColor: 'white',
14
+ borderColor: 'black'
15
+ }
16
+ const a11yLabel = 'Progress bar'
17
+ const progressA11yLabel = 'This is a progress indicator'
18
+ const setup = (
19
+ { children, ...props } = {
20
+ children: (
21
+ <Progress.Bar percentage={percentage} tokens={barTokens} accessibilityLabel={a11yLabel} />
22
+ )
23
+ }
24
+ ) =>
25
+ render(
26
+ <Progress tokens={progressTokens} accessibilityLabel={progressA11yLabel} {...props}>
27
+ {children}
28
+ </Progress>,
29
+ { wrapper: Theme }
30
+ )
31
+
32
+ describe('Progress', () => {
33
+ it('renders with correct percentage and applies tokens accordingly', () => {
34
+ const { getByA11yLabel } = setup()
35
+ expect(getByA11yLabel(progressA11yLabel)).toHaveStyle(progressTokens)
36
+ expect(getByA11yLabel(a11yLabel)).toHaveStyle({
37
+ width: `${percentage}%`,
38
+ ...barTokens
39
+ })
40
+ })
41
+
42
+ it('renders arbitrary content inside the progress bar', () => {
43
+ const contentText = 'This can be an arbitrary content'
44
+ const { getByA11yLabel } = setup({
45
+ children: (
46
+ <Progress.Bar percentage={percentage} tokens={barTokens} accessibilityLabel={a11yLabel}>
47
+ <Text>{contentText}</Text>
48
+ </Progress.Bar>
49
+ )
50
+ })
51
+ expect(within(getByA11yLabel(a11yLabel)).getByText(contentText)).toBeTruthy()
52
+ })
53
+
54
+ it('renders proper accessibility attributes on the progress bar', () => {
55
+ const { getByA11yRole, getByA11yValue } = setup()
56
+ expect(getByA11yRole('progressbar')).toBeTruthy()
57
+ expect(
58
+ getByA11yValue({ min: 0, max: 100, now: percentage, text: `${percentage}%` })
59
+ ).toBeTruthy()
60
+ })
61
+
62
+ it('renders stacked progress bars', () => {
63
+ const inactiveA11yLabel = 'This bar is inactive'
64
+ const { getByA11yLabel } = setup({
65
+ children: (
66
+ <>
67
+ <Progress.Bar
68
+ percentage={percentage + 10}
69
+ variant={{ inactive: true }}
70
+ accessibilityLabel={inactiveA11yLabel}
71
+ />
72
+ <Progress.Bar percentage={percentage} accessibilityLabel={a11yLabel} />
73
+ </>
74
+ )
75
+ })
76
+ expect(within(getByA11yLabel(progressA11yLabel)).getByA11yLabel(inactiveA11yLabel)).toBeTruthy()
77
+ expect(within(getByA11yLabel(progressA11yLabel)).getByA11yLabel(a11yLabel)).toBeTruthy()
78
+ })
79
+ })
@@ -0,0 +1,221 @@
1
+ import React from 'react'
2
+ import { render, fireEvent } from '@testing-library/react-native'
3
+ import { toHaveTextContent } from '@testing-library/jest-native'
4
+
5
+ import Theme from '../../__fixtures__/Theme'
6
+ import RadioGroup from '../../src/Radio/RadioGroup'
7
+
8
+ const items = [
9
+ { label: 'One', id: 'one' },
10
+ { label: 'Two', id: 'two' },
11
+ { label: 'Three', id: 'three' },
12
+ { label: 'Four', id: 'four' }
13
+ ]
14
+ const checked = { checked: true }
15
+
16
+ // expect().toHaveTextContent doesn't work on arrays, expect().toContain etc doesn't match elements
17
+ const containsText = (queryResult, text) =>
18
+ queryResult.some((testInstance) => toHaveTextContent(testInstance, text).pass)
19
+
20
+ describe('RadioGroup', () => {
21
+ // eslint-disable-next-line no-console
22
+ const consoleError = console.error
23
+ beforeEach(() => {
24
+ // eslint-disable-next-line no-console
25
+ console.error = () => {}
26
+ })
27
+ afterEach(() => {
28
+ // eslint-disable-next-line no-console
29
+ console.error = consoleError
30
+ })
31
+
32
+ it('Throws if has `checkedId` without `onChange`', () => {
33
+ expect(() =>
34
+ render(
35
+ <Theme>
36
+ <RadioGroup items={items} checkedId="one" />
37
+ </Theme>
38
+ )
39
+ ).toThrow(/value.+without.+onChange/)
40
+ })
41
+ it("Doesn't throw if has `checkedId` without `onChange` and is read only", () => {
42
+ expect(() =>
43
+ render(
44
+ <Theme>
45
+ <RadioGroup items={items} checkedId="one" readOnly />
46
+ </Theme>
47
+ )
48
+ ).not.toThrow()
49
+ })
50
+ it('Throws if has both `checkedId` and `initialCheckedId`', () => {
51
+ expect(() =>
52
+ render(
53
+ <Theme>
54
+ <RadioGroup items={items} initialCheckedId="one" checkedId="one" onChange={() => {}} />
55
+ </Theme>
56
+ )
57
+ ).toThrow(/both(?=.*initialValue)(?=.*value){2}/)
58
+ })
59
+ })
60
+
61
+ describe('RadioGroup (uncontrolled)', () => {
62
+ it('Selects one and only one item', async () => {
63
+ const { getByText, queryAllByA11yState } = render(
64
+ <Theme>
65
+ <RadioGroup items={items} />
66
+ </Theme>
67
+ )
68
+
69
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
70
+
71
+ const one = getByText('One')
72
+ await fireEvent.press(one)
73
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
74
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
75
+
76
+ const two = getByText('Two')
77
+ await fireEvent.press(two)
78
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
79
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
80
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
81
+ })
82
+
83
+ it('Does not deselect if the selected item is pressed', async () => {
84
+ const { getByText, queryAllByA11yState } = render(
85
+ <Theme>
86
+ <RadioGroup items={items} />
87
+ </Theme>
88
+ )
89
+
90
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
91
+
92
+ const three = getByText('Three')
93
+ await fireEvent.press(three)
94
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
95
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
96
+
97
+ await fireEvent.press(three)
98
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
99
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
100
+ })
101
+
102
+ it('Is accessible as a radio button', async () => {
103
+ const { queryAllByA11yRole, queryAllByA11yState } = render(
104
+ <Theme>
105
+ <RadioGroup items={items} />
106
+ </Theme>
107
+ )
108
+
109
+ expect(queryAllByA11yRole('checkbox')).toHaveLength(0)
110
+ expect(queryAllByA11yRole('radiogroup')).toHaveLength(1)
111
+ const radios = queryAllByA11yRole('radio')
112
+ expect(radios).toHaveLength(4)
113
+
114
+ expect(queryAllByA11yState(checked)).toHaveLength(0)
115
+ await fireEvent.press(radios[0])
116
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
117
+ })
118
+
119
+ it('Auto-selects initialCheckedId', async () => {
120
+ const { getByText, queryAllByA11yState } = render(
121
+ <Theme>
122
+ <RadioGroup items={items} initialCheckedId="two" />
123
+ </Theme>
124
+ )
125
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
126
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
127
+ expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
128
+
129
+ const three = getByText('Three')
130
+ await fireEvent.press(three)
131
+
132
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
133
+ expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
134
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
135
+ expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
136
+ })
137
+ })
138
+
139
+ describe('RadioGroup (controlled)', () => {
140
+ it('Calls onChange handler on press in controlled mode, providing pressed id', async () => {
141
+ const handleChange = jest.fn((arg) => arg)
142
+ const { getByText } = render(
143
+ <Theme>
144
+ <RadioGroup items={items} checkedId={null} onChange={handleChange} />
145
+ </Theme>
146
+ )
147
+
148
+ expect(handleChange).toHaveBeenCalledTimes(0)
149
+
150
+ const one = getByText('One')
151
+ await fireEvent.press(one)
152
+ expect(handleChange).toHaveBeenCalledTimes(1)
153
+
154
+ expect(handleChange.mock.calls[0][0]).toEqual('one')
155
+
156
+ const two = getByText('Two')
157
+ await fireEvent.press(two)
158
+ expect(handleChange).toHaveBeenCalledTimes(2)
159
+ expect(handleChange.mock.calls[1][0]).toEqual('two')
160
+ })
161
+
162
+ it("Doesn't change its own selection if `checkedId` is passed", async () => {
163
+ const { getByText, queryAllByA11yState } = render(
164
+ <Theme>
165
+ <RadioGroup items={items} checkedId="one" onChange={() => {}} />
166
+ </Theme>
167
+ )
168
+
169
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
170
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
171
+
172
+ const two = getByText('Two')
173
+ await fireEvent.press(two)
174
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
175
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
176
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
177
+ })
178
+ })
179
+
180
+ describe('RadioGroup (read-only)', () => {
181
+ it("Doesn't call onChange handler when read-only", async () => {
182
+ const handleChange = jest.fn((arg) => arg)
183
+ const { getByText } = render(
184
+ <Theme>
185
+ <RadioGroup items={items} checkedId="two" onChange={handleChange} readOnly />
186
+ </Theme>
187
+ )
188
+
189
+ expect(handleChange).toHaveBeenCalledTimes(0)
190
+
191
+ const one = getByText('One')
192
+ await fireEvent.press(one)
193
+ expect(handleChange).toHaveBeenCalledTimes(0)
194
+
195
+ const two = getByText('Two')
196
+ await fireEvent.press(two)
197
+ expect(handleChange).toHaveBeenCalledTimes(0)
198
+ })
199
+
200
+ it("Doesn't change its selection on press", async () => {
201
+ const { getByText, queryAllByA11yState } = render(
202
+ <Theme>
203
+ <RadioGroup items={items} checkedId="one" readOnly />
204
+ </Theme>
205
+ )
206
+
207
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
208
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
209
+
210
+ const one = getByText('One')
211
+ await fireEvent.press(one)
212
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
213
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
214
+
215
+ const two = getByText('Two')
216
+ await fireEvent.press(two)
217
+ expect(queryAllByA11yState(checked)).toHaveLength(1)
218
+ expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
219
+ expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
220
+ })
221
+ })