@telus-uds/components-base 1.7.0 → 1.8.1

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 (183) hide show
  1. package/CHANGELOG.md +38 -2
  2. package/component-docs.json +264 -18
  3. package/lib/Button/ButtonGroup.js +118 -45
  4. package/lib/Checkbox/CheckboxGroup.js +3 -3
  5. package/lib/ExpandCollapse/Panel.js +2 -1
  6. package/lib/Fieldset/Fieldset.js +7 -0
  7. package/lib/InputLabel/InputLabel.js +8 -1
  8. package/lib/InputSupports/InputSupports.js +7 -0
  9. package/lib/Notification/Notification.js +1 -1
  10. package/lib/Radio/RadioGroup.js +12 -5
  11. package/lib/RadioCard/RadioCardGroup.js +7 -0
  12. package/lib/Search/Search.js +1 -1
  13. package/lib/Skeleton/Skeleton.js +48 -2
  14. package/lib/ToggleSwitch/ToggleSwitch.js +7 -0
  15. package/lib/ToggleSwitch/ToggleSwitchGroup.js +7 -0
  16. package/lib/Tooltip/Tooltip.js +1 -1
  17. package/lib/utils/animation/useVerticalExpandAnimation.js +26 -13
  18. package/lib/utils/props/inputSupportsProps.js +7 -0
  19. package/lib/utils/props/textInputProps.js +2 -1
  20. package/lib-module/Button/ButtonGroup.js +117 -45
  21. package/lib-module/Checkbox/CheckboxGroup.js +3 -3
  22. package/lib-module/ExpandCollapse/Panel.js +2 -1
  23. package/lib-module/Fieldset/Fieldset.js +7 -0
  24. package/lib-module/InputLabel/InputLabel.js +8 -1
  25. package/lib-module/InputSupports/InputSupports.js +7 -0
  26. package/lib-module/Notification/Notification.js +1 -1
  27. package/lib-module/Radio/RadioGroup.js +12 -5
  28. package/lib-module/RadioCard/RadioCardGroup.js +7 -0
  29. package/lib-module/Search/Search.js +1 -1
  30. package/lib-module/Skeleton/Skeleton.js +49 -3
  31. package/lib-module/ToggleSwitch/ToggleSwitch.js +7 -0
  32. package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +7 -0
  33. package/lib-module/Tooltip/Tooltip.js +1 -1
  34. package/lib-module/utils/animation/useVerticalExpandAnimation.js +26 -14
  35. package/lib-module/utils/props/inputSupportsProps.js +7 -0
  36. package/lib-module/utils/props/textInputProps.js +2 -1
  37. package/package.json +11 -6
  38. package/src/Button/ButtonGroup.jsx +106 -41
  39. package/src/Checkbox/Checkbox.jsx +7 -4
  40. package/src/Checkbox/CheckboxGroup.jsx +3 -3
  41. package/src/ExpandCollapse/Panel.jsx +3 -1
  42. package/src/Fieldset/Fieldset.jsx +6 -0
  43. package/src/InputLabel/InputLabel.jsx +17 -2
  44. package/src/InputSupports/InputSupports.jsx +9 -1
  45. package/src/Notification/Notification.jsx +1 -1
  46. package/src/Radio/Radio.jsx +5 -1
  47. package/src/Radio/RadioGroup.jsx +11 -5
  48. package/src/RadioCard/RadioCard.jsx +5 -1
  49. package/src/RadioCard/RadioCardGroup.jsx +6 -0
  50. package/src/Search/Search.jsx +1 -1
  51. package/src/Skeleton/Skeleton.jsx +56 -3
  52. package/src/ToggleSwitch/ToggleSwitch.jsx +6 -0
  53. package/src/ToggleSwitch/ToggleSwitchGroup.jsx +6 -0
  54. package/src/Tooltip/Tooltip.jsx +1 -1
  55. package/src/utils/animation/useVerticalExpandAnimation.js +25 -12
  56. package/src/utils/props/inputSupportsProps.js +6 -1
  57. package/src/utils/props/textInputProps.js +2 -1
  58. package/src/utils/props/tokens.js +21 -19
  59. package/.storybook/main.js +0 -4
  60. package/.storybook/preview.js +0 -37
  61. package/.turbo/turbo-build.log +0 -8
  62. package/.turbo/turbo-lint.log +0 -13
  63. package/CHANGELOG.json +0 -235
  64. package/__fixtures__/Accessible.js +0 -35
  65. package/__fixtures__/Accessible.native.js +0 -35
  66. package/__fixtures__/Theme.jsx +0 -13
  67. package/__fixtures__/Viewport.jsx +0 -17
  68. package/__fixtures__/test-utils.js +0 -25
  69. package/__fixtures__/testTheme.js +0 -1830
  70. package/__tests__/A11yText/A11yText.test.jsx +0 -34
  71. package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +0 -68
  72. package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +0 -287
  73. package/__tests__/Box/Box.test.jsx +0 -111
  74. package/__tests__/Button/Button.test.jsx +0 -86
  75. package/__tests__/Button/ButtonBase.test.jsx +0 -82
  76. package/__tests__/Button/ButtonGroup.test.jsx +0 -347
  77. package/__tests__/Button/ButtonLink.test.jsx +0 -61
  78. package/__tests__/Card/Card.test.jsx +0 -63
  79. package/__tests__/Checkbox/Checkbox.test.jsx +0 -94
  80. package/__tests__/Checkbox/CheckboxGroup.test.jsx +0 -246
  81. package/__tests__/Divider/Divider.test.jsx +0 -91
  82. package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +0 -109
  83. package/__tests__/Feedback/Feedback.test.jsx +0 -42
  84. package/__tests__/FlexGrid/Col.test.jsx +0 -256
  85. package/__tests__/FlexGrid/FlexGrid.test.jsx +0 -136
  86. package/__tests__/FlexGrid/Row.test.jsx +0 -273
  87. package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +0 -165
  88. package/__tests__/Icon/Icon.test.jsx +0 -61
  89. package/__tests__/IconButton/IconButton.test.jsx +0 -52
  90. package/__tests__/InputSupports/InputSupports.test.jsx +0 -50
  91. package/__tests__/Link/Link.test.jsx +0 -63
  92. package/__tests__/Link/TextButton.test.jsx +0 -35
  93. package/__tests__/List/List.test.jsx +0 -60
  94. package/__tests__/Modal/Modal.test.jsx +0 -47
  95. package/__tests__/Notification/Notification.test.jsx +0 -20
  96. package/__tests__/Pagination/Pagination.test.jsx +0 -160
  97. package/__tests__/Progress/Progress.test.jsx +0 -79
  98. package/__tests__/Radio/Radio.test.jsx +0 -87
  99. package/__tests__/Radio/RadioGroup.test.jsx +0 -220
  100. package/__tests__/RadioCard/RadioCard.test.jsx +0 -87
  101. package/__tests__/RadioCard/RadioCardGroup.test.jsx +0 -246
  102. package/__tests__/Search/Search.test.jsx +0 -73
  103. package/__tests__/Select/Select.test.jsx +0 -94
  104. package/__tests__/SideNav/SideNav.test.jsx +0 -110
  105. package/__tests__/Skeleton/Skeleton.test.jsx +0 -61
  106. package/__tests__/Spacer/Spacer.test.jsx +0 -63
  107. package/__tests__/StackView/StackView.test.jsx +0 -216
  108. package/__tests__/StackView/StackWrap.test.jsx +0 -47
  109. package/__tests__/StackView/getStackedContent.test.jsx +0 -295
  110. package/__tests__/StepTracker/StepTracker.test.jsx +0 -94
  111. package/__tests__/Tabs/Tabs.test.jsx +0 -40
  112. package/__tests__/Tags/Tags.test.jsx +0 -327
  113. package/__tests__/TextInput/TextArea.test.jsx +0 -35
  114. package/__tests__/TextInput/TextInputBase.test.jsx +0 -125
  115. package/__tests__/ThemeProvider/ThemeProvider.test.jsx +0 -77
  116. package/__tests__/ThemeProvider/useThemeTokens.test.jsx +0 -514
  117. package/__tests__/ThemeProvider/utils/theme-tokens.test.js +0 -41
  118. package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +0 -82
  119. package/__tests__/ToggleSwitch/ToggleSwitchGroup.test.jsx +0 -192
  120. package/__tests__/Tooltip/Tooltip.test.jsx +0 -65
  121. package/__tests__/Tooltip/getTooltipPosition.test.js +0 -79
  122. package/__tests__/Typography/typography.test.jsx +0 -90
  123. package/__tests__/utils/children.test.jsx +0 -128
  124. package/__tests__/utils/containUniqueFields.test.js +0 -25
  125. package/__tests__/utils/input.test.js +0 -375
  126. package/__tests__/utils/props.test.js +0 -36
  127. package/__tests__/utils/semantics.test.jsx +0 -34
  128. package/__tests__/utils/useCopy.test.js +0 -42
  129. package/__tests__/utils/useResponsiveProp.test.jsx +0 -202
  130. package/__tests__/utils/useSpacingScale.test.jsx +0 -273
  131. package/__tests__/utils/useUniqueId.test.js +0 -31
  132. package/babel.config.js +0 -35
  133. package/generate-component-docs.js +0 -72
  134. package/jest.config.js +0 -32
  135. package/stories/A11yText/A11yText.stories.jsx +0 -71
  136. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +0 -22
  137. package/stories/Box/Box.stories.jsx +0 -143
  138. package/stories/Button/Button.stories.jsx +0 -72
  139. package/stories/Button/ButtonGroup.stories.jsx +0 -81
  140. package/stories/Button/ButtonLink.stories.jsx +0 -30
  141. package/stories/Card/Card.stories.jsx +0 -62
  142. package/stories/Checkbox/Checkbox.stories.jsx +0 -94
  143. package/stories/Divider/Divider.stories.jsx +0 -68
  144. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +0 -112
  145. package/stories/Feedback/Feedback.stories.jsx +0 -96
  146. package/stories/FlexGrid/01 FlexGrid.stories.jsx +0 -54
  147. package/stories/FlexGrid/02 Row.stories.jsx +0 -41
  148. package/stories/FlexGrid/03 Col.stories.jsx +0 -141
  149. package/stories/Icon/Icon.stories.jsx +0 -79
  150. package/stories/IconButton/IconButton.stories.jsx +0 -50
  151. package/stories/InputLabel/InputLabel.stories.jsx +0 -39
  152. package/stories/Link/ChevronLink.stories.jsx +0 -48
  153. package/stories/Link/Link.stories.jsx +0 -90
  154. package/stories/Link/TextButton.stories.jsx +0 -79
  155. package/stories/List/List.stories.jsx +0 -117
  156. package/stories/Modal/Modal.stories.jsx +0 -54
  157. package/stories/Notification/Notification.stories.jsx +0 -82
  158. package/stories/Pagination/Pagination.stories.jsx +0 -64
  159. package/stories/Progress/Progress.stories.jsx +0 -93
  160. package/stories/Radio/Radio.stories.jsx +0 -100
  161. package/stories/RadioCard/RadioCard.stories.jsx +0 -98
  162. package/stories/Search/Search.stories.jsx +0 -66
  163. package/stories/Select/Select.stories.jsx +0 -55
  164. package/stories/SideNav/SideNav.stories.jsx +0 -42
  165. package/stories/SideNav/SideNavItem.stories.jsx +0 -9
  166. package/stories/SideNav/SideNavItemsGroup.stories.jsx +0 -17
  167. package/stories/Skeleton/Skeleton.stories.jsx +0 -36
  168. package/stories/Spacer/Spacer.stories.jsx +0 -38
  169. package/stories/StackView/StackView.stories.jsx +0 -75
  170. package/stories/StackView/StackWrap.stories.jsx +0 -64
  171. package/stories/StepTracker/StepTracker.stories.jsx +0 -71
  172. package/stories/Tabs/Tabs.stories.jsx +0 -97
  173. package/stories/Tags/Tags.stories.jsx +0 -69
  174. package/stories/TextInput/TextArea.stories.jsx +0 -101
  175. package/stories/TextInput/TextInput.stories.jsx +0 -141
  176. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +0 -64
  177. package/stories/ToggleSwitch/ToggleSwitchGroup.stories.jsx +0 -81
  178. package/stories/Tooltip/Tooltip.stories.jsx +0 -81
  179. package/stories/TooltipButton/TooltipButton.stories.jsx +0 -11
  180. package/stories/Typography/Typography.stories.jsx +0 -49
  181. package/stories/platform-supports.jsx +0 -32
  182. package/stories/platform-supports.native.jsx +0 -3
  183. package/stories/supports.jsx +0 -236
@@ -1,347 +0,0 @@
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 ButtonGroup from '../../src/Button/ButtonGroup'
7
-
8
- const items = [
9
- { label: 'One', id: 'one', accessibilityLabel: 'Option one' },
10
- { label: 'Two', id: 'two', accessibilityLabel: 'Option two' },
11
- { label: 'Three', id: 'three', accessibilityLabel: 'Option three' },
12
- { label: 'Four', id: 'four', accessibilityLabel: 'Option 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('ButtonGroup', () => {
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 `values` without `onChange`', () => {
33
- expect(() =>
34
- render(
35
- <Theme>
36
- <ButtonGroup items={items} values={['one']} />
37
- </Theme>
38
- )
39
- ).toThrow(/values.+without.+onChange/)
40
- })
41
- it("Doesn't throw if has `values` without `onChange` and is read only", () => {
42
- expect(() =>
43
- render(
44
- <Theme>
45
- <ButtonGroup items={items} values={['one']} readOnly />
46
- </Theme>
47
- )
48
- ).not.toThrow()
49
- })
50
- it('Throws if has both `values` and `initialValues`', () => {
51
- expect(() =>
52
- render(
53
- <Theme>
54
- <ButtonGroup items={items} values={['one']} initialValues={['one']} onChange={() => {}} />
55
- </Theme>
56
- )
57
- ).toThrow(/both(?=.*initialValues)(?=.*values){2}/)
58
- })
59
- })
60
-
61
- describe('ButtonGroup (uncontrolled)', () => {
62
- it('Selects one and only one item by default', async () => {
63
- const { getByText, queryAllByA11yState } = render(
64
- <Theme>
65
- <ButtonGroup 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('Deselects if the selected item is pressed', async () => {
84
- const { getByText, queryAllByA11yState } = render(
85
- <Theme>
86
- <ButtonGroup 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(0)
99
- expect(containsText(queryAllByA11yState(checked), 'Three')).not.toBeTruthy()
100
- })
101
-
102
- it('Is accessible as a radio button by default', async () => {
103
- const { queryAllByA11yRole, queryAllByA11yState } = render(
104
- <Theme>
105
- <ButtonGroup items={items} />
106
- </Theme>
107
- )
108
- expect(queryAllByA11yRole('checkbox')).toHaveLength(0)
109
- expect(queryAllByA11yRole('radiogroup')).toHaveLength(1)
110
- const radios = queryAllByA11yRole('radio')
111
- expect(radios).toHaveLength(4)
112
-
113
- expect(queryAllByA11yState(checked)).toHaveLength(0)
114
- await fireEvent.press(radios[0])
115
- expect(queryAllByA11yState(checked)).toHaveLength(1)
116
- })
117
-
118
- it('Selects <= two items when maxValues === 2', async () => {
119
- const { getByText, queryAllByA11yState } = render(
120
- <Theme>
121
- <ButtonGroup items={items} maxValues={2} />
122
- </Theme>
123
- )
124
-
125
- expect(queryAllByA11yState(checked)).toHaveLength(0)
126
-
127
- const one = getByText('One')
128
- await fireEvent.press(one)
129
- expect(queryAllByA11yState(checked)).toHaveLength(1)
130
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
131
-
132
- const two = getByText('Two')
133
- await fireEvent.press(two)
134
- expect(queryAllByA11yState(checked)).toHaveLength(2)
135
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
136
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
137
-
138
- const three = getByText('Three')
139
- await fireEvent.press(three)
140
- expect(queryAllByA11yState(checked)).toHaveLength(2)
141
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
142
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
143
- expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
144
-
145
- const four = getByText('Four')
146
- await fireEvent.press(four)
147
- expect(queryAllByA11yState(checked)).toHaveLength(2)
148
- expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
149
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
150
- expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
151
- expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
152
- })
153
-
154
- it('Is accessible as checkboxes button when maxValues > 1', async () => {
155
- const { queryAllByA11yRole, queryAllByA11yState } = render(
156
- <Theme>
157
- <ButtonGroup items={items} maxValues={2} />
158
- </Theme>
159
- )
160
-
161
- expect(queryAllByA11yRole('radiogroup')).toHaveLength(0)
162
- expect(queryAllByA11yRole('radio')).toHaveLength(0)
163
-
164
- const checks = queryAllByA11yRole('checkbox')
165
- expect(checks).toHaveLength(4)
166
-
167
- expect(queryAllByA11yState(checked)).toHaveLength(0)
168
- await fireEvent.press(checks[0])
169
- expect(queryAllByA11yState(checked)).toHaveLength(1)
170
- })
171
-
172
- it('Selects unlimited items when maxValues is turned off', async () => {
173
- const { getByText, queryAllByA11yState } = render(
174
- <Theme>
175
- <ButtonGroup items={items} maxValues={null} />
176
- </Theme>
177
- )
178
-
179
- expect(queryAllByA11yState(checked)).toHaveLength(0)
180
-
181
- const one = getByText('One')
182
- await fireEvent.press(one)
183
- expect(queryAllByA11yState(checked)).toHaveLength(1)
184
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
185
-
186
- const two = getByText('Two')
187
- await fireEvent.press(two)
188
- expect(queryAllByA11yState(checked)).toHaveLength(2)
189
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
190
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
191
-
192
- const three = getByText('Three')
193
- await fireEvent.press(three)
194
- expect(queryAllByA11yState(checked)).toHaveLength(3)
195
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
196
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
197
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
198
-
199
- const four = getByText('Four')
200
- await fireEvent.press(four)
201
- expect(queryAllByA11yState(checked)).toHaveLength(4)
202
- expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
203
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
204
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
205
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
206
- })
207
-
208
- it('Auto-selects any provided initialValues', async () => {
209
- const { getByText, queryAllByA11yState } = render(
210
- <Theme>
211
- <ButtonGroup items={items} initialValues={['one', 'two']} maxValues={3} />
212
- </Theme>
213
- )
214
- expect(queryAllByA11yState(checked)).toHaveLength(2)
215
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
216
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
217
-
218
- const three = getByText('Three')
219
- await fireEvent.press(three)
220
-
221
- expect(queryAllByA11yState(checked)).toHaveLength(3)
222
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
223
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
224
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
225
-
226
- const four = getByText('Four')
227
- await fireEvent.press(four)
228
- expect(queryAllByA11yState(checked)).toHaveLength(3)
229
- expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
230
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
231
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
232
- expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
233
-
234
- const two = getByText('Two')
235
- await fireEvent.press(two)
236
- expect(queryAllByA11yState(checked)).toHaveLength(2)
237
- expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
238
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
239
- expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
240
- expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
241
- })
242
- })
243
-
244
- describe('ButtonGroup (controlled)', () => {
245
- it('Calls onChange handler on press in controlled mode, providing pressed id', async () => {
246
- const handleChange = jest.fn((arg) => arg)
247
- const { getByText } = render(
248
- <Theme>
249
- <ButtonGroup items={items} values={[]} onChange={handleChange} />
250
- </Theme>
251
- )
252
-
253
- expect(handleChange).toHaveBeenCalledTimes(0)
254
-
255
- const one = getByText('One')
256
- await fireEvent(one, 'press', { nativeEvent: 'example' })
257
- expect(handleChange).toHaveBeenCalledTimes(1)
258
- expect(handleChange).toHaveBeenLastCalledWith(['one'], { nativeEvent: 'example' })
259
-
260
- const two = getByText('Two')
261
- await fireEvent(two, 'press', { nativeEvent: 'example2' })
262
- expect(handleChange).toHaveBeenCalledTimes(2)
263
- expect(handleChange).toHaveBeenLastCalledWith(['two'], { nativeEvent: 'example2' })
264
- })
265
-
266
- it("Doesn't change its own selection if `values` is passed", async () => {
267
- const { getByText, queryAllByA11yState } = render(
268
- <Theme>
269
- <ButtonGroup items={items} values={['one']} onChange={() => {}} />
270
- </Theme>
271
- )
272
-
273
- expect(queryAllByA11yState(checked)).toHaveLength(1)
274
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
275
-
276
- const one = getByText('One')
277
- await fireEvent.press(one)
278
- expect(queryAllByA11yState(checked)).toHaveLength(1)
279
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
280
-
281
- const two = getByText('Two')
282
- await fireEvent.press(two)
283
- expect(queryAllByA11yState(checked)).toHaveLength(1)
284
- expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
285
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
286
- })
287
-
288
- it('Does not render an invalid `values` invalidly', async () => {
289
- const { queryAllByA11yState } = render(
290
- <Theme>
291
- <ButtonGroup
292
- items={items}
293
- values={['one', 'two', 'three']}
294
- maxValues={2}
295
- onChange={() => {}}
296
- />
297
- </Theme>
298
- )
299
- expect(queryAllByA11yState(checked)).toHaveLength(2)
300
- expect(containsText(queryAllByA11yState(checked), 'One')).not.toBeTruthy()
301
- expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
302
- expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
303
- })
304
- })
305
-
306
- describe('ButtonGroup (read-only)', () => {
307
- it("Doesn't call onChange handler when read-only", async () => {
308
- const handleChange = jest.fn((arg) => arg)
309
- const { getByText } = render(
310
- <Theme>
311
- <ButtonGroup items={items} values={[]} onChange={handleChange} readOnly />
312
- </Theme>
313
- )
314
-
315
- expect(handleChange).toHaveBeenCalledTimes(0)
316
-
317
- const one = getByText('One')
318
- await fireEvent.press(one)
319
- expect(handleChange).toHaveBeenCalledTimes(0)
320
-
321
- const two = getByText('Two')
322
- await fireEvent.press(two)
323
- expect(handleChange).toHaveBeenCalledTimes(0)
324
- })
325
-
326
- it("Doesn't change its selection on press", async () => {
327
- const { getByText, queryAllByA11yState } = render(
328
- <Theme>
329
- <ButtonGroup items={items} values={['one']} readOnly />
330
- </Theme>
331
- )
332
-
333
- expect(queryAllByA11yState(checked)).toHaveLength(1)
334
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
335
-
336
- const one = getByText('One')
337
- await fireEvent.press(one)
338
- expect(queryAllByA11yState(checked)).toHaveLength(1)
339
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
340
-
341
- const two = getByText('Two')
342
- await fireEvent.press(two)
343
- expect(queryAllByA11yState(checked)).toHaveLength(1)
344
- expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
345
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
346
- })
347
- })
@@ -1,61 +0,0 @@
1
- import React from 'react'
2
- import { Platform, Linking } from 'react-native'
3
- import { render, fireEvent } from '@testing-library/react-native'
4
-
5
- import Theme from '../../__fixtures__/Theme'
6
- import ButtonLink from '../../src/Button/ButtonLink'
7
-
8
- const href = 'https://example.com'
9
- const label = 'Test ButtonLink'
10
-
11
- describe('ButtonLink', () => {
12
- it('renders an accessible link', async () => {
13
- const { getByRole } = render(
14
- <Theme>
15
- <ButtonLink href={href}>{label}</ButtonLink>
16
- </Theme>
17
- )
18
-
19
- const link = getByRole('link')
20
- expect(link).toHaveTextContent(label)
21
- })
22
-
23
- // TODO: this won't be called until cross-platform Jest tests are configured
24
- // see https://github.com/telus/universal-design-system/issues/319
25
- if (Platform.OS === 'web') {
26
- it('defers to platform link handling (web)', async () => {
27
- // This test is untested
28
- jest.spyOn(Linking, 'openURL')
29
- const originalValue = Platform.OS
30
- Platform.OS = 'web'
31
- const { getByRole } = render(
32
- <Theme>
33
- <ButtonLink href={href}>{label}</ButtonLink>
34
- </Theme>
35
- )
36
-
37
- const el = getByRole('link')
38
- fireEvent.press(el)
39
- expect(Linking.openURL).not.toHaveBeenCalled()
40
- Platform.OS = originalValue
41
- })
42
- }
43
-
44
- // Default jest OS is ios, this will always be called until
45
- // https://github.com/telus/universal-design-system/issues/319
46
- if (Platform.OS !== 'web') {
47
- it('calls Linking.openURL (mobile)', async () => {
48
- jest.spyOn(Linking, 'openURL').mockImplementation(() => {})
49
- const { getByRole } = render(
50
- <Theme>
51
- <ButtonLink href={href}>{label}</ButtonLink>
52
- </Theme>
53
- )
54
-
55
- const el = getByRole('link')
56
- fireEvent.press(el)
57
- expect(Linking.openURL).toHaveBeenCalledTimes(1)
58
- expect(Linking.openURL).toHaveBeenCalledWith(href)
59
- })
60
- }
61
- })
@@ -1,63 +0,0 @@
1
- import React from 'react'
2
- import { render } from '@testing-library/react-native'
3
- import { Text } from 'react-native'
4
-
5
- import { Card } from '../../src'
6
- import Theme from '../../__fixtures__/Theme'
7
- import testTheme from '../../__fixtures__/testTheme'
8
-
9
- const contentText = 'This is a card'
10
-
11
- const setup = ({ tokens } = {}) =>
12
- render(
13
- <Theme>
14
- <Card tokens={tokens}>
15
- <Text>{contentText}</Text>
16
- </Card>
17
- </Theme>
18
- )
19
-
20
- describe('Card', () => {
21
- it('renders the card content', () => {
22
- const { getByText } = setup()
23
- const cardContent = getByText(contentText)
24
- expect(cardContent).toBeTruthy()
25
- })
26
-
27
- it('renders the default style properly', () => {
28
- const defaultStyle = testTheme.components.Card.tokens
29
- const { getByText } = setup()
30
- const card = getByText(contentText).parent
31
- expect(card).toHaveStyle(defaultStyle)
32
- })
33
-
34
- it('renders a card with a custom background color', () => {
35
- const backgroundColor = '#0F0F0F'
36
- const { getByText } = setup({ tokens: { backgroundColor } })
37
- const card = getByText(contentText).parent
38
- expect(card).toHaveStyle({ backgroundColor })
39
- })
40
-
41
- it('renders a card with a custom border', () => {
42
- const border = {
43
- borderColor: '#123456',
44
- borderWidth: 7,
45
- borderRadius: 8
46
- }
47
- const { getByText } = setup({ tokens: { ...border } })
48
- const card = getByText(contentText).parent
49
- expect(card).toHaveStyle({ ...border })
50
- })
51
-
52
- it('renders a card with a custom padding', () => {
53
- const padding = {
54
- paddingBottom: 1,
55
- paddingLeft: 2,
56
- paddingRight: 3,
57
- paddingTop: 4
58
- }
59
- const { getByText } = setup({ tokens: { ...padding } })
60
- const card = getByText(contentText).parent
61
- expect(card).toHaveStyle({ ...padding })
62
- })
63
- })
@@ -1,94 +0,0 @@
1
- import React from 'react'
2
- import { fireEvent, render } from '@testing-library/react-native'
3
-
4
- import { Checkbox } from '../../src'
5
- import Theme from '../../__fixtures__/Theme'
6
-
7
- const checkedId = 'Checkbox-Icon'
8
- const inputId = 'Checkbox-Input'
9
- const setup = (props) =>
10
- render(
11
- <Theme>
12
- <Checkbox {...props} />
13
- </Theme>
14
- )
15
-
16
- describe('Checkbox', () => {
17
- it('renders with defaults', () => {
18
- const { getByRole } = setup()
19
-
20
- expect(getByRole('checkbox')).toBeTruthy()
21
- })
22
-
23
- it('renders the label', () => {
24
- const label = 'Test label message'
25
- const { queryByText } = setup({ label })
26
-
27
- expect(queryByText(label)).toBeTruthy()
28
- })
29
-
30
- it('renders the feedback', () => {
31
- const feedback = 'Test feedback message'
32
- const { queryByText } = setup({ feedback })
33
-
34
- expect(queryByText(feedback)).toBeTruthy()
35
- })
36
-
37
- it('renders error styling on validation failure', () => {
38
- const errorBorderColor = '#e12339' // from __fixtures__/testTheme.js
39
- const { getByTestId } = setup({ error: true })
40
-
41
- const checkboxInput = getByTestId(inputId)
42
- expect(checkboxInput).toHaveStyle({ borderColor: errorBorderColor })
43
- })
44
-
45
- it('triggers the callback', () => {
46
- const onChange = jest.fn()
47
-
48
- const { getByRole } = setup({ onChange })
49
-
50
- const checkbox = getByRole('checkbox')
51
- expect(onChange).not.toHaveBeenCalled()
52
- fireEvent(checkbox, 'press')
53
- expect(onChange).toHaveBeenCalledTimes(1)
54
- })
55
-
56
- it('cannot be changed if inactive', () => {
57
- const { getByRole, queryByTestId } = setup({ inactive: true })
58
-
59
- const checkbox = getByRole('checkbox')
60
- expect(queryByTestId(checkedId)).toBeFalsy()
61
- fireEvent(checkbox, 'press')
62
- expect(queryByTestId(checkedId)).toBeFalsy()
63
- })
64
-
65
- describe('when uncontrolled', () => {
66
- it('uses `defaultChecked` as the initial value', () => {
67
- const { queryByTestId } = setup({ defaultChecked: true })
68
-
69
- expect(queryByTestId(checkedId)).toBeTruthy()
70
- })
71
-
72
- it('changes value', () => {
73
- const { getByRole, queryByTestId } = setup({ defaultChecked: false })
74
-
75
- const checkbox = getByRole('checkbox')
76
- expect(queryByTestId(checkedId)).toBeFalsy()
77
- fireEvent(checkbox, 'press')
78
- expect(queryByTestId(checkedId)).toBeTruthy()
79
- })
80
- })
81
-
82
- describe('when controlled', () => {
83
- it('calls `onChange` with the new value', () => {
84
- const onChange = jest.fn()
85
- const { getByRole, queryByTestId } = setup({ onChange, checked: false })
86
-
87
- const checkbox = getByRole('checkbox')
88
- expect(queryByTestId(checkedId)).toBeFalsy()
89
- fireEvent(checkbox, 'press', { nativeEvent: 'example' })
90
- expect(onChange).toHaveBeenCalledTimes(1)
91
- expect(onChange).toHaveBeenCalledWith(true, { nativeEvent: 'example' })
92
- })
93
- })
94
- })