@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,160 +0,0 @@
1
- import React from 'react'
2
- import { render, fireEvent } from '@testing-library/react-native'
3
-
4
- import { Pagination } from '../../src'
5
- import Theme from '../../__fixtures__/Theme'
6
- import Viewport from '../../__fixtures__/Viewport'
7
-
8
- // eslint-disable-next-line react/prop-types
9
- const Wrapper = ({ children }) => (
10
- <Viewport viewport="xs">
11
- <Theme>{children}</Theme>
12
- </Viewport>
13
- )
14
-
15
- describe('Pagination', () => {
16
- it('truncates the number of rendered elements', () => {
17
- const { getByText } = render(
18
- <Pagination tokens={{ truncateAbove: 3 }}>
19
- <Pagination.PageButton onPress={() => {}} />
20
- <Pagination.PageButton onPress={() => {}} />
21
- <Pagination.PageButton onPress={() => {}} />
22
- <Pagination.PageButton onPress={() => {}} />
23
- <Pagination.PageButton onPress={() => {}} />
24
- </Pagination>,
25
- {
26
- wrapper: Wrapper
27
- }
28
- )
29
-
30
- expect(() => getByText('1')).not.toThrow()
31
- expect(() => getByText('2')).not.toThrow()
32
- expect(() => getByText('...')).not.toThrow()
33
- expect(() => getByText('3')).toThrow()
34
- expect(() => getByText('4')).toThrow()
35
- expect(() => getByText('5')).not.toThrow()
36
- })
37
-
38
- it('renders the "Next Page" button when applicable', () => {
39
- const { getByA11yLabel } = render(
40
- <Pagination>
41
- <Pagination.PageButton onPress={() => {}} isActive />
42
- <Pagination.PageButton onPress={() => {}} />
43
- </Pagination>,
44
- {
45
- wrapper: Wrapper
46
- }
47
- )
48
-
49
- expect(() => getByA11yLabel(/next/)).not.toThrow()
50
- expect(() => getByA11yLabel(/previous/)).toThrow()
51
- })
52
-
53
- it('renders the "Previous Page" button when applicable', () => {
54
- const { getByA11yLabel } = render(
55
- <Pagination>
56
- <Pagination.PageButton onPress={() => {}} />
57
- <Pagination.PageButton onPress={() => {}} isActive />
58
- </Pagination>,
59
- {
60
- wrapper: Wrapper
61
- }
62
- )
63
-
64
- expect(() => getByA11yLabel(/next/)).toThrow()
65
- expect(() => getByA11yLabel(/previous/)).not.toThrow()
66
- })
67
-
68
- it('uses correct copy', () => {
69
- const { getByA11yLabel } = render(
70
- <Pagination copy="fr">
71
- <Pagination.PageButton onPress={() => {}} isActive />
72
- </Pagination>,
73
- {
74
- wrapper: Wrapper
75
- }
76
- )
77
-
78
- expect(() => getByA11yLabel(/page actuelle/)).not.toThrow()
79
- })
80
-
81
- describe('Pagination Page Button', () => {
82
- it('triggers the onPress callback when pressed', () => {
83
- const onPress = jest.fn()
84
-
85
- const { getByA11yLabel } = render(
86
- <Pagination>
87
- <Pagination.PageButton onPress={() => {}} isActive />
88
- <Pagination.PageButton onPress={onPress} />
89
- </Pagination>,
90
- {
91
- wrapper: Wrapper
92
- }
93
- )
94
-
95
- expect(onPress).not.toHaveBeenCalled()
96
-
97
- fireEvent.press(getByA11yLabel('Go to page number 2'))
98
-
99
- expect(onPress).toHaveBeenCalledTimes(1)
100
- })
101
-
102
- it('renders a link and passes down hrefAttrs', () => {
103
- const { getByA11yLabel } = render(
104
- <Pagination>
105
- <Pagination.PageButton onPress={() => {}} isActive />
106
- <Pagination.PageButton href="test-url" hrefAttrs={{ target: '_blank' }} />
107
- </Pagination>,
108
- {
109
- wrapper: Wrapper
110
- }
111
- )
112
-
113
- const button = getByA11yLabel('Go to page number 2')
114
-
115
- expect(button).toHaveProp('accessibilityRole', 'link')
116
- expect(button).toHaveProp('href', 'test-url')
117
- expect(button).toHaveProp('hrefAttrs', { target: '_blank' })
118
- })
119
- })
120
-
121
- describe('Pagination Side Button', () => {
122
- it('triggers the onPress event of the item next to the active one', () => {
123
- const onPress = jest.fn()
124
-
125
- const { getByA11yLabel } = render(
126
- <Pagination>
127
- <Pagination.PageButton onPress={() => {}} isActive />
128
- <Pagination.PageButton onPress={onPress} />
129
- </Pagination>,
130
- {
131
- wrapper: Wrapper
132
- }
133
- )
134
-
135
- expect(onPress).not.toHaveBeenCalled()
136
-
137
- fireEvent.press(getByA11yLabel(/next/))
138
-
139
- expect(onPress).toHaveBeenCalledTimes(1)
140
- })
141
-
142
- it('renders a link with href props of the item next to the active one', () => {
143
- const { getByA11yLabel } = render(
144
- <Pagination>
145
- <Pagination.PageButton onPress={() => {}} isActive />
146
- <Pagination.PageButton href="test-url" hrefAttrs={{ target: '_blank' }} />
147
- </Pagination>,
148
- {
149
- wrapper: Wrapper
150
- }
151
- )
152
-
153
- const button = getByA11yLabel(/next/)
154
-
155
- expect(button).toHaveProp('accessibilityRole', 'link')
156
- expect(button).toHaveProp('href', 'test-url')
157
- expect(button).toHaveProp('hrefAttrs', { target: '_blank' })
158
- })
159
- })
160
- })
@@ -1,79 +0,0 @@
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
- })
@@ -1,87 +0,0 @@
1
- import React from 'react'
2
- import { fireEvent, render } from '@testing-library/react-native'
3
-
4
- import { Radio } from '../../src'
5
- import Theme from '../../__fixtures__/Theme'
6
-
7
- const checkedId = 'Radio-Checked'
8
- const inputId = 'Radio-Input'
9
- const setup = (props) =>
10
- render(
11
- <Theme>
12
- <Radio {...props} />
13
- </Theme>
14
- )
15
-
16
- describe('Radio', () => {
17
- it('renders with defaults', () => {
18
- const { getByRole } = setup()
19
-
20
- expect(getByRole('radio')).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 error styling on validation failure', () => {
31
- const errorBorderColor = '#e12339' // from __fixtures__/testTheme.js
32
- const { getByTestId } = setup({ error: true })
33
-
34
- const radioInput = getByTestId(inputId)
35
- expect(radioInput).toHaveStyle({ borderColor: errorBorderColor })
36
- })
37
-
38
- it('triggers the callback', () => {
39
- const onChange = jest.fn()
40
-
41
- const { getByRole } = setup({ onChange })
42
-
43
- const radio = getByRole('radio')
44
- expect(onChange).not.toHaveBeenCalled()
45
- fireEvent(radio, 'press')
46
- expect(onChange).toHaveBeenCalledTimes(1)
47
- })
48
-
49
- it('cannot be changed if inactive', () => {
50
- const { getByRole, queryByTestId } = setup({ inactive: true })
51
-
52
- const radio = getByRole('radio')
53
- expect(queryByTestId(checkedId)).toBeFalsy()
54
- fireEvent(radio, 'press')
55
- expect(queryByTestId(checkedId)).toBeFalsy()
56
- })
57
-
58
- describe('when uncontrolled', () => {
59
- it('uses `defaultChecked` as the initial value', () => {
60
- const { queryByTestId } = setup({ defaultChecked: true })
61
-
62
- expect(queryByTestId(checkedId)).toBeTruthy()
63
- })
64
-
65
- it('changes value', () => {
66
- const { getByRole, queryByTestId } = setup({ defaultChecked: false })
67
-
68
- const radio = getByRole('radio')
69
- expect(queryByTestId(checkedId)).toBeFalsy()
70
- fireEvent(radio, 'press')
71
- expect(queryByTestId(checkedId)).toBeTruthy()
72
- })
73
- })
74
-
75
- describe('when controlled', () => {
76
- it('calls `onChange` with the new value', () => {
77
- const onChange = jest.fn()
78
- const { getByRole, queryByTestId } = setup({ onChange, checked: false })
79
-
80
- const radio = getByRole('radio')
81
- expect(queryByTestId(checkedId)).toBeFalsy()
82
- fireEvent(radio, 'press', { nativeEvent: 'example' })
83
- expect(onChange).toHaveBeenCalledTimes(1)
84
- expect(onChange).toHaveBeenCalledWith(true, { nativeEvent: 'example' })
85
- })
86
- })
87
- })
@@ -1,220 +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 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(one, 'press', { nativeEvent: 'example' })
152
- expect(handleChange).toHaveBeenCalledTimes(1)
153
- expect(handleChange).toHaveBeenLastCalledWith('one', { nativeEvent: 'example' })
154
-
155
- const two = getByText('Two')
156
- await fireEvent(two, 'press', { nativeEvent: 'example2' })
157
- expect(handleChange).toHaveBeenCalledTimes(2)
158
- expect(handleChange).toHaveBeenLastCalledWith('two', { nativeEvent: 'example2' })
159
- })
160
-
161
- it("Doesn't change its own selection if `checkedId` is passed", async () => {
162
- const { getByText, queryAllByA11yState } = render(
163
- <Theme>
164
- <RadioGroup items={items} checkedId="one" onChange={() => {}} />
165
- </Theme>
166
- )
167
-
168
- expect(queryAllByA11yState(checked)).toHaveLength(1)
169
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
170
-
171
- const two = getByText('Two')
172
- await fireEvent.press(two)
173
- expect(queryAllByA11yState(checked)).toHaveLength(1)
174
- expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
175
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
176
- })
177
- })
178
-
179
- describe('RadioGroup (read-only)', () => {
180
- it("Doesn't call onChange handler when read-only", async () => {
181
- const handleChange = jest.fn((arg) => arg)
182
- const { getByText } = render(
183
- <Theme>
184
- <RadioGroup items={items} checkedId="two" onChange={handleChange} readOnly />
185
- </Theme>
186
- )
187
-
188
- expect(handleChange).toHaveBeenCalledTimes(0)
189
-
190
- const one = getByText('One')
191
- await fireEvent.press(one)
192
- expect(handleChange).toHaveBeenCalledTimes(0)
193
-
194
- const two = getByText('Two')
195
- await fireEvent.press(two)
196
- expect(handleChange).toHaveBeenCalledTimes(0)
197
- })
198
-
199
- it("Doesn't change its selection on press", async () => {
200
- const { getByText, queryAllByA11yState } = render(
201
- <Theme>
202
- <RadioGroup items={items} checkedId="one" readOnly />
203
- </Theme>
204
- )
205
-
206
- expect(queryAllByA11yState(checked)).toHaveLength(1)
207
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
208
-
209
- const one = getByText('One')
210
- await fireEvent.press(one)
211
- expect(queryAllByA11yState(checked)).toHaveLength(1)
212
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
213
-
214
- const two = getByText('Two')
215
- await fireEvent.press(two)
216
- expect(queryAllByA11yState(checked)).toHaveLength(1)
217
- expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
218
- expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
219
- })
220
- })
@@ -1,87 +0,0 @@
1
- import React from 'react'
2
- import { fireEvent, render } from '@testing-library/react-native'
3
-
4
- import { RadioCard } from '../../src'
5
- import Theme from '../../__fixtures__/Theme'
6
-
7
- const checkedId = 'Radio-Checked'
8
- const inputId = 'Radio-Input'
9
- const setup = (props) =>
10
- render(
11
- <Theme>
12
- <RadioCard {...props} />
13
- </Theme>
14
- )
15
-
16
- describe('RadioCard', () => {
17
- it('renders with defaults', () => {
18
- const { getByRole } = setup()
19
-
20
- expect(getByRole('radio')).toBeTruthy()
21
- })
22
-
23
- it('renders a title', () => {
24
- const title = 'Test title message'
25
- const { queryByText } = setup({ title })
26
-
27
- expect(queryByText(title)).toBeTruthy()
28
- })
29
-
30
- it('renders error styling on validation failure', () => {
31
- const errorBorderColor = '#676e73' // from __fixtures__/testTheme.js
32
- const { getByTestId } = setup({ error: true })
33
-
34
- const radioInput = getByTestId(inputId)
35
- expect(radioInput).toHaveStyle({ borderColor: errorBorderColor })
36
- })
37
-
38
- it('triggers the callback', () => {
39
- const onChange = jest.fn()
40
-
41
- const { getByRole } = setup({ onChange })
42
-
43
- const radio = getByRole('radio')
44
- expect(onChange).not.toHaveBeenCalled()
45
- fireEvent(radio, 'press')
46
- expect(onChange).toHaveBeenCalledTimes(1)
47
- })
48
-
49
- it('cannot be changed if inactive', () => {
50
- const { getByRole, queryByTestId } = setup({ inactive: true })
51
-
52
- const radio = getByRole('radio')
53
- expect(queryByTestId(checkedId)).toBeFalsy()
54
- fireEvent(radio, 'press')
55
- expect(queryByTestId(checkedId)).toBeFalsy()
56
- })
57
-
58
- describe('when uncontrolled', () => {
59
- it('uses `defaultChecked` as the initial value', () => {
60
- const { queryByTestId } = setup({ defaultChecked: true })
61
-
62
- expect(queryByTestId(checkedId)).toBeTruthy()
63
- })
64
-
65
- it('changes value', () => {
66
- const { getByRole, queryByTestId } = setup({ defaultChecked: false })
67
-
68
- const radio = getByRole('radio')
69
- expect(queryByTestId(checkedId)).toBeFalsy()
70
- fireEvent(radio, 'press')
71
- expect(queryByTestId(checkedId)).toBeTruthy()
72
- })
73
- })
74
-
75
- describe('when controlled', () => {
76
- it('calls `onChange` with the new value', () => {
77
- const onChange = jest.fn()
78
- const { getByRole, queryByTestId } = setup({ onChange, checked: false })
79
-
80
- const radio = getByRole('radio')
81
- expect(queryByTestId(checkedId)).toBeFalsy()
82
- fireEvent(radio, 'press', { nativeEvent: 'example' })
83
- expect(onChange).toHaveBeenCalledTimes(1)
84
- expect(onChange).toHaveBeenCalledWith(true, { nativeEvent: 'example' })
85
- })
86
- })
87
- })