@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.
- package/CHANGELOG.md +38 -2
- package/component-docs.json +264 -18
- package/lib/Button/ButtonGroup.js +118 -45
- package/lib/Checkbox/CheckboxGroup.js +3 -3
- package/lib/ExpandCollapse/Panel.js +2 -1
- package/lib/Fieldset/Fieldset.js +7 -0
- package/lib/InputLabel/InputLabel.js +8 -1
- package/lib/InputSupports/InputSupports.js +7 -0
- package/lib/Notification/Notification.js +1 -1
- package/lib/Radio/RadioGroup.js +12 -5
- package/lib/RadioCard/RadioCardGroup.js +7 -0
- package/lib/Search/Search.js +1 -1
- package/lib/Skeleton/Skeleton.js +48 -2
- package/lib/ToggleSwitch/ToggleSwitch.js +7 -0
- package/lib/ToggleSwitch/ToggleSwitchGroup.js +7 -0
- package/lib/Tooltip/Tooltip.js +1 -1
- package/lib/utils/animation/useVerticalExpandAnimation.js +26 -13
- package/lib/utils/props/inputSupportsProps.js +7 -0
- package/lib/utils/props/textInputProps.js +2 -1
- package/lib-module/Button/ButtonGroup.js +117 -45
- package/lib-module/Checkbox/CheckboxGroup.js +3 -3
- package/lib-module/ExpandCollapse/Panel.js +2 -1
- package/lib-module/Fieldset/Fieldset.js +7 -0
- package/lib-module/InputLabel/InputLabel.js +8 -1
- package/lib-module/InputSupports/InputSupports.js +7 -0
- package/lib-module/Notification/Notification.js +1 -1
- package/lib-module/Radio/RadioGroup.js +12 -5
- package/lib-module/RadioCard/RadioCardGroup.js +7 -0
- package/lib-module/Search/Search.js +1 -1
- package/lib-module/Skeleton/Skeleton.js +49 -3
- package/lib-module/ToggleSwitch/ToggleSwitch.js +7 -0
- package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +7 -0
- package/lib-module/Tooltip/Tooltip.js +1 -1
- package/lib-module/utils/animation/useVerticalExpandAnimation.js +26 -14
- package/lib-module/utils/props/inputSupportsProps.js +7 -0
- package/lib-module/utils/props/textInputProps.js +2 -1
- package/package.json +11 -6
- package/src/Button/ButtonGroup.jsx +106 -41
- package/src/Checkbox/Checkbox.jsx +7 -4
- package/src/Checkbox/CheckboxGroup.jsx +3 -3
- package/src/ExpandCollapse/Panel.jsx +3 -1
- package/src/Fieldset/Fieldset.jsx +6 -0
- package/src/InputLabel/InputLabel.jsx +17 -2
- package/src/InputSupports/InputSupports.jsx +9 -1
- package/src/Notification/Notification.jsx +1 -1
- package/src/Radio/Radio.jsx +5 -1
- package/src/Radio/RadioGroup.jsx +11 -5
- package/src/RadioCard/RadioCard.jsx +5 -1
- package/src/RadioCard/RadioCardGroup.jsx +6 -0
- package/src/Search/Search.jsx +1 -1
- package/src/Skeleton/Skeleton.jsx +56 -3
- package/src/ToggleSwitch/ToggleSwitch.jsx +6 -0
- package/src/ToggleSwitch/ToggleSwitchGroup.jsx +6 -0
- package/src/Tooltip/Tooltip.jsx +1 -1
- package/src/utils/animation/useVerticalExpandAnimation.js +25 -12
- package/src/utils/props/inputSupportsProps.js +6 -1
- package/src/utils/props/textInputProps.js +2 -1
- package/src/utils/props/tokens.js +21 -19
- package/.storybook/main.js +0 -4
- package/.storybook/preview.js +0 -37
- package/.turbo/turbo-build.log +0 -8
- package/.turbo/turbo-lint.log +0 -13
- package/CHANGELOG.json +0 -235
- package/__fixtures__/Accessible.js +0 -35
- package/__fixtures__/Accessible.native.js +0 -35
- package/__fixtures__/Theme.jsx +0 -13
- package/__fixtures__/Viewport.jsx +0 -17
- package/__fixtures__/test-utils.js +0 -25
- package/__fixtures__/testTheme.js +0 -1830
- package/__tests__/A11yText/A11yText.test.jsx +0 -34
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +0 -68
- package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +0 -287
- package/__tests__/Box/Box.test.jsx +0 -111
- package/__tests__/Button/Button.test.jsx +0 -86
- package/__tests__/Button/ButtonBase.test.jsx +0 -82
- package/__tests__/Button/ButtonGroup.test.jsx +0 -347
- package/__tests__/Button/ButtonLink.test.jsx +0 -61
- package/__tests__/Card/Card.test.jsx +0 -63
- package/__tests__/Checkbox/Checkbox.test.jsx +0 -94
- package/__tests__/Checkbox/CheckboxGroup.test.jsx +0 -246
- package/__tests__/Divider/Divider.test.jsx +0 -91
- package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +0 -109
- package/__tests__/Feedback/Feedback.test.jsx +0 -42
- package/__tests__/FlexGrid/Col.test.jsx +0 -256
- package/__tests__/FlexGrid/FlexGrid.test.jsx +0 -136
- package/__tests__/FlexGrid/Row.test.jsx +0 -273
- package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +0 -165
- package/__tests__/Icon/Icon.test.jsx +0 -61
- package/__tests__/IconButton/IconButton.test.jsx +0 -52
- package/__tests__/InputSupports/InputSupports.test.jsx +0 -50
- package/__tests__/Link/Link.test.jsx +0 -63
- package/__tests__/Link/TextButton.test.jsx +0 -35
- package/__tests__/List/List.test.jsx +0 -60
- package/__tests__/Modal/Modal.test.jsx +0 -47
- package/__tests__/Notification/Notification.test.jsx +0 -20
- package/__tests__/Pagination/Pagination.test.jsx +0 -160
- package/__tests__/Progress/Progress.test.jsx +0 -79
- package/__tests__/Radio/Radio.test.jsx +0 -87
- package/__tests__/Radio/RadioGroup.test.jsx +0 -220
- package/__tests__/RadioCard/RadioCard.test.jsx +0 -87
- package/__tests__/RadioCard/RadioCardGroup.test.jsx +0 -246
- package/__tests__/Search/Search.test.jsx +0 -73
- package/__tests__/Select/Select.test.jsx +0 -94
- package/__tests__/SideNav/SideNav.test.jsx +0 -110
- package/__tests__/Skeleton/Skeleton.test.jsx +0 -61
- package/__tests__/Spacer/Spacer.test.jsx +0 -63
- package/__tests__/StackView/StackView.test.jsx +0 -216
- package/__tests__/StackView/StackWrap.test.jsx +0 -47
- package/__tests__/StackView/getStackedContent.test.jsx +0 -295
- package/__tests__/StepTracker/StepTracker.test.jsx +0 -94
- package/__tests__/Tabs/Tabs.test.jsx +0 -40
- package/__tests__/Tags/Tags.test.jsx +0 -327
- package/__tests__/TextInput/TextArea.test.jsx +0 -35
- package/__tests__/TextInput/TextInputBase.test.jsx +0 -125
- package/__tests__/ThemeProvider/ThemeProvider.test.jsx +0 -77
- package/__tests__/ThemeProvider/useThemeTokens.test.jsx +0 -514
- package/__tests__/ThemeProvider/utils/theme-tokens.test.js +0 -41
- package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +0 -82
- package/__tests__/ToggleSwitch/ToggleSwitchGroup.test.jsx +0 -192
- package/__tests__/Tooltip/Tooltip.test.jsx +0 -65
- package/__tests__/Tooltip/getTooltipPosition.test.js +0 -79
- package/__tests__/Typography/typography.test.jsx +0 -90
- package/__tests__/utils/children.test.jsx +0 -128
- package/__tests__/utils/containUniqueFields.test.js +0 -25
- package/__tests__/utils/input.test.js +0 -375
- package/__tests__/utils/props.test.js +0 -36
- package/__tests__/utils/semantics.test.jsx +0 -34
- package/__tests__/utils/useCopy.test.js +0 -42
- package/__tests__/utils/useResponsiveProp.test.jsx +0 -202
- package/__tests__/utils/useSpacingScale.test.jsx +0 -273
- package/__tests__/utils/useUniqueId.test.js +0 -31
- package/babel.config.js +0 -35
- package/generate-component-docs.js +0 -72
- package/jest.config.js +0 -32
- package/stories/A11yText/A11yText.stories.jsx +0 -71
- package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +0 -22
- package/stories/Box/Box.stories.jsx +0 -143
- package/stories/Button/Button.stories.jsx +0 -72
- package/stories/Button/ButtonGroup.stories.jsx +0 -81
- package/stories/Button/ButtonLink.stories.jsx +0 -30
- package/stories/Card/Card.stories.jsx +0 -62
- package/stories/Checkbox/Checkbox.stories.jsx +0 -94
- package/stories/Divider/Divider.stories.jsx +0 -68
- package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +0 -112
- package/stories/Feedback/Feedback.stories.jsx +0 -96
- package/stories/FlexGrid/01 FlexGrid.stories.jsx +0 -54
- package/stories/FlexGrid/02 Row.stories.jsx +0 -41
- package/stories/FlexGrid/03 Col.stories.jsx +0 -141
- package/stories/Icon/Icon.stories.jsx +0 -79
- package/stories/IconButton/IconButton.stories.jsx +0 -50
- package/stories/InputLabel/InputLabel.stories.jsx +0 -39
- package/stories/Link/ChevronLink.stories.jsx +0 -48
- package/stories/Link/Link.stories.jsx +0 -90
- package/stories/Link/TextButton.stories.jsx +0 -79
- package/stories/List/List.stories.jsx +0 -117
- package/stories/Modal/Modal.stories.jsx +0 -54
- package/stories/Notification/Notification.stories.jsx +0 -82
- package/stories/Pagination/Pagination.stories.jsx +0 -64
- package/stories/Progress/Progress.stories.jsx +0 -93
- package/stories/Radio/Radio.stories.jsx +0 -100
- package/stories/RadioCard/RadioCard.stories.jsx +0 -98
- package/stories/Search/Search.stories.jsx +0 -66
- package/stories/Select/Select.stories.jsx +0 -55
- package/stories/SideNav/SideNav.stories.jsx +0 -42
- package/stories/SideNav/SideNavItem.stories.jsx +0 -9
- package/stories/SideNav/SideNavItemsGroup.stories.jsx +0 -17
- package/stories/Skeleton/Skeleton.stories.jsx +0 -36
- package/stories/Spacer/Spacer.stories.jsx +0 -38
- package/stories/StackView/StackView.stories.jsx +0 -75
- package/stories/StackView/StackWrap.stories.jsx +0 -64
- package/stories/StepTracker/StepTracker.stories.jsx +0 -71
- package/stories/Tabs/Tabs.stories.jsx +0 -97
- package/stories/Tags/Tags.stories.jsx +0 -69
- package/stories/TextInput/TextArea.stories.jsx +0 -101
- package/stories/TextInput/TextInput.stories.jsx +0 -141
- package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +0 -64
- package/stories/ToggleSwitch/ToggleSwitchGroup.stories.jsx +0 -81
- package/stories/Tooltip/Tooltip.stories.jsx +0 -81
- package/stories/TooltipButton/TooltipButton.stories.jsx +0 -11
- package/stories/Typography/Typography.stories.jsx +0 -49
- package/stories/platform-supports.jsx +0 -32
- package/stories/platform-supports.native.jsx +0 -3
- 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
|
-
})
|