@telus-uds/components-base 1.26.0 → 1.28.0
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 +28 -2
- package/component-docs.json +2 -1
- package/lib/Carousel/dictionary.js +6 -6
- package/lib-module/Carousel/dictionary.js +6 -6
- package/package.json +2 -2
- package/src/Carousel/dictionary.js +6 -6
- package/.eslintrc.js +0 -9
- package/__tests17__/A11yText/A11yText.test.jsx +0 -34
- package/__tests17__/ActivityIndicator/ActivityIndicator.test.jsx +0 -68
- package/__tests17__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +0 -299
- package/__tests17__/Box/Box.test.jsx +0 -111
- package/__tests17__/Button/Button.test.jsx +0 -86
- package/__tests17__/Button/ButtonBase.test.jsx +0 -82
- package/__tests17__/Button/ButtonGroup.test.jsx +0 -347
- package/__tests17__/Button/ButtonLink.test.jsx +0 -61
- package/__tests17__/Card/Card.test.jsx +0 -63
- package/__tests17__/Carousel/Carousel.test.jsx +0 -128
- package/__tests17__/Carousel/CarouselTabs.test.jsx +0 -142
- package/__tests17__/Checkbox/Checkbox.test.jsx +0 -94
- package/__tests17__/Checkbox/CheckboxGroup.test.jsx +0 -246
- package/__tests17__/Divider/Divider.test.jsx +0 -91
- package/__tests17__/ExpandCollapse/ExpandCollapse.test.jsx +0 -109
- package/__tests17__/Feedback/Feedback.test.jsx +0 -42
- package/__tests17__/FlexGrid/Col.test.jsx +0 -261
- package/__tests17__/FlexGrid/FlexGrid.test.jsx +0 -136
- package/__tests17__/FlexGrid/Row.test.jsx +0 -273
- package/__tests17__/HorizontalScroll/HorizontalScroll.test.jsx +0 -165
- package/__tests17__/Icon/Icon.test.jsx +0 -61
- package/__tests17__/IconButton/IconButton.test.jsx +0 -52
- package/__tests17__/InputLabel/InputLabel.test.jsx +0 -28
- package/__tests17__/InputLabel/__snapshots__/InputLabel.test.jsx.snap +0 -3
- package/__tests17__/InputSupports/InputSupports.test.jsx +0 -60
- package/__tests17__/Link/Link.test.jsx +0 -63
- package/__tests17__/Link/TextButton.test.jsx +0 -35
- package/__tests17__/List/List.test.jsx +0 -82
- package/__tests17__/Modal/Modal.test.jsx +0 -47
- package/__tests17__/Notification/Notification.test.jsx +0 -20
- package/__tests17__/Pagination/Pagination.test.jsx +0 -160
- package/__tests17__/Progress/Progress.test.jsx +0 -79
- package/__tests17__/Radio/Radio.test.jsx +0 -87
- package/__tests17__/Radio/RadioGroup.test.jsx +0 -220
- package/__tests17__/RadioCard/RadioCard.test.jsx +0 -87
- package/__tests17__/RadioCard/RadioCardGroup.test.jsx +0 -246
- package/__tests17__/Search/Search.test.jsx +0 -87
- package/__tests17__/Select/Select.test.jsx +0 -94
- package/__tests17__/SideNav/SideNav.test.jsx +0 -110
- package/__tests17__/Skeleton/Skeleton.test.jsx +0 -61
- package/__tests17__/SkipLink/SkipLink.test.jsx +0 -61
- package/__tests17__/Spacer/Spacer.test.jsx +0 -63
- package/__tests17__/StackView/StackView.test.jsx +0 -211
- package/__tests17__/StackView/StackWrap.test.jsx +0 -47
- package/__tests17__/StackView/getStackedContent.test.jsx +0 -295
- package/__tests17__/StepTracker/StepTracker.test.jsx +0 -108
- package/__tests17__/Tabs/Tabs.test.jsx +0 -49
- package/__tests17__/Tags/Tags.test.jsx +0 -327
- package/__tests17__/TextInput/TextArea.test.jsx +0 -35
- package/__tests17__/TextInput/TextInputBase.test.jsx +0 -125
- package/__tests17__/ThemeProvider/ThemeProvider.test.jsx +0 -82
- package/__tests17__/ThemeProvider/useThemeTokens.test.jsx +0 -514
- package/__tests17__/ThemeProvider/utils/theme-tokens.test.js +0 -41
- package/__tests17__/ToggleSwitch/ToggleSwitch.test.jsx +0 -82
- package/__tests17__/ToggleSwitch/ToggleSwitchGroup.test.jsx +0 -192
- package/__tests17__/Tooltip/Tooltip.test.jsx +0 -65
- package/__tests17__/Tooltip/getTooltipPosition.test.js +0 -79
- package/__tests17__/Typography/typography.test.jsx +0 -90
- package/__tests17__/utils/children.test.jsx +0 -128
- package/__tests17__/utils/containUniqueFields.test.js +0 -25
- package/__tests17__/utils/input.test.js +0 -375
- package/__tests17__/utils/props.test.js +0 -36
- package/__tests17__/utils/semantics.test.jsx +0 -34
- package/__tests17__/utils/useCopy.test.js +0 -42
- package/__tests17__/utils/useResponsiveProp.test.jsx +0 -202
- package/__tests17__/utils/useSpacingScale.test.jsx +0 -273
- package/__tests17__/utils/useUniqueId.test.js +0 -31
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Text } from 'react-native'
|
|
3
|
-
import { render, fireEvent } from '@testing-library/react-native'
|
|
4
|
-
|
|
5
|
-
import { Carousel } from '../../src'
|
|
6
|
-
import Theme from '../../__fixtures__/Theme'
|
|
7
|
-
|
|
8
|
-
const setup = (args = {}) =>
|
|
9
|
-
render(
|
|
10
|
-
<Theme>
|
|
11
|
-
<Carousel {...args}>
|
|
12
|
-
<Carousel.Item testID="firstSlide">
|
|
13
|
-
<Text>First</Text>
|
|
14
|
-
</Carousel.Item>
|
|
15
|
-
<Carousel.Item testID="secondSlide">
|
|
16
|
-
<Text>Second</Text>
|
|
17
|
-
</Carousel.Item>
|
|
18
|
-
<Carousel.Item testID="thirdSlide">
|
|
19
|
-
<Text>Third</Text>
|
|
20
|
-
</Carousel.Item>
|
|
21
|
-
</Carousel>
|
|
22
|
-
</Theme>
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
const getButtonLabel = (item, of = 3, itemLabel = 'item') => `Show ${itemLabel} ${item} of ${of}`
|
|
26
|
-
|
|
27
|
-
describe('Carousel', () => {
|
|
28
|
-
it('renders the first Carousel slide', () => {
|
|
29
|
-
const { getByTestId } = setup()
|
|
30
|
-
|
|
31
|
-
expect(getByTestId('firstSlide')).not.toHaveProp('focusable')
|
|
32
|
-
expect(getByTestId('secondSlide')).toHaveProp('focusable', false)
|
|
33
|
-
expect(getByTestId('thirdSlide')).toHaveProp('focusable', false)
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('renders the second Carousel slide when clicked on next button', async () => {
|
|
37
|
-
const { getByTestId, getByA11yLabel } = setup()
|
|
38
|
-
|
|
39
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(2)))
|
|
40
|
-
|
|
41
|
-
expect(getByTestId('firstSlide')).toHaveProp('focusable', false)
|
|
42
|
-
expect(getByTestId('secondSlide')).not.toHaveProp('focusable')
|
|
43
|
-
expect(getByTestId('thirdSlide')).toHaveProp('focusable', false)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('renders the third Carousel slide when clicked on next button twice', async () => {
|
|
47
|
-
const { getByTestId, getByA11yLabel } = setup()
|
|
48
|
-
|
|
49
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(2)))
|
|
50
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(3)))
|
|
51
|
-
|
|
52
|
-
expect(getByTestId('firstSlide')).toHaveProp('focusable', false)
|
|
53
|
-
expect(getByTestId('secondSlide')).toHaveProp('focusable', false)
|
|
54
|
-
expect(getByTestId('thirdSlide')).not.toHaveProp('focusable')
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('has correct accessibilityValue values for each slide', async () => {
|
|
58
|
-
const { getByA11yLabel, getByTestId } = setup({ testID: 'outer-container' })
|
|
59
|
-
|
|
60
|
-
const getContainer = () => getByTestId('outer-container')
|
|
61
|
-
|
|
62
|
-
expect(getContainer()).toHaveProp('accessibilityValue', {
|
|
63
|
-
now: 1,
|
|
64
|
-
min: 1,
|
|
65
|
-
max: 3
|
|
66
|
-
})
|
|
67
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(2)))
|
|
68
|
-
|
|
69
|
-
expect(getContainer()).toHaveProp('accessibilityValue', {
|
|
70
|
-
now: 2,
|
|
71
|
-
min: 1,
|
|
72
|
-
max: 3
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(3)))
|
|
76
|
-
|
|
77
|
-
expect(getContainer()).toHaveProp('accessibilityValue', {
|
|
78
|
-
now: 3,
|
|
79
|
-
min: 1,
|
|
80
|
-
max: 3
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
it('hides previous button and displays next button when on first slide', async () => {
|
|
85
|
-
const { getByTestId } = setup()
|
|
86
|
-
|
|
87
|
-
expect(getByTestId('previous-button-container')).toHaveStyle({ visibility: 'hidden' })
|
|
88
|
-
expect(getByTestId('next-button-container')).toHaveStyle({ visibility: 'visible' })
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
it('displays previous and next buttons when not on first or last slide', async () => {
|
|
92
|
-
const { getByTestId, getByA11yLabel } = setup()
|
|
93
|
-
|
|
94
|
-
expect(getByTestId('previous-button-container')).toHaveStyle({ visibility: 'hidden' })
|
|
95
|
-
expect(getByTestId('next-button-container')).toHaveStyle({ visibility: 'visible' })
|
|
96
|
-
|
|
97
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(2)))
|
|
98
|
-
|
|
99
|
-
expect(getByTestId('previous-button-container')).toHaveStyle({ visibility: 'visible' })
|
|
100
|
-
expect(getByTestId('next-button-container')).toHaveStyle({ visibility: 'visible' })
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('hides next button and displays previous button when on last slide', async () => {
|
|
104
|
-
const { getByTestId, getByA11yLabel } = setup()
|
|
105
|
-
|
|
106
|
-
expect(getByTestId('previous-button-container')).toHaveStyle({ visibility: 'hidden' })
|
|
107
|
-
expect(getByTestId('next-button-container')).toHaveStyle({ visibility: 'visible' })
|
|
108
|
-
|
|
109
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(2)))
|
|
110
|
-
await fireEvent.press(getByA11yLabel(getButtonLabel(3)))
|
|
111
|
-
|
|
112
|
-
expect(getByTestId('previous-button-container')).toHaveStyle({ visibility: 'visible' })
|
|
113
|
-
expect(getByTestId('next-button-container')).toHaveStyle({ visibility: 'hidden' })
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('hides panel navigation when `showPanelNavigation` is false', () => {
|
|
117
|
-
const { queryByRole } = setup({ tokens: { showPanelNavigation: false } })
|
|
118
|
-
|
|
119
|
-
expect(queryByRole('progressbar')).toBeFalsy()
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
it('hides previous/next navigation when `showPreviousNextNavigation` is false', () => {
|
|
123
|
-
const { queryByTestId } = setup({ tokens: { showPreviousNextNavigation: false } })
|
|
124
|
-
|
|
125
|
-
expect(queryByTestId('previous-button-container')).toBeFalsy()
|
|
126
|
-
expect(queryByTestId('next-button-container')).toBeFalsy()
|
|
127
|
-
})
|
|
128
|
-
})
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { render, fireEvent } from '@testing-library/react-native'
|
|
3
|
-
|
|
4
|
-
import { CarouselTabs, Carousel, Typography } from '../../src'
|
|
5
|
-
import Theme from '../../__fixtures__/Theme'
|
|
6
|
-
|
|
7
|
-
const setup = ({ pressHandlers = {} } = {}) =>
|
|
8
|
-
render(
|
|
9
|
-
<CarouselTabs
|
|
10
|
-
items={[
|
|
11
|
-
{
|
|
12
|
-
title: 'First tab title',
|
|
13
|
-
content: (
|
|
14
|
-
<Carousel.Item testID="first">
|
|
15
|
-
<Typography>First tab content</Typography>
|
|
16
|
-
</Carousel.Item>
|
|
17
|
-
),
|
|
18
|
-
onPress: pressHandlers.first
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
title: 'Second tab title',
|
|
22
|
-
content: (
|
|
23
|
-
<Carousel.Item testID="second">
|
|
24
|
-
<Typography>Second tab content</Typography>
|
|
25
|
-
</Carousel.Item>
|
|
26
|
-
),
|
|
27
|
-
onPress: pressHandlers.second
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
title: 'Third tab title',
|
|
31
|
-
content: (
|
|
32
|
-
<Carousel.Item testID="third">
|
|
33
|
-
<Typography>Third tab content</Typography>
|
|
34
|
-
</Carousel.Item>
|
|
35
|
-
),
|
|
36
|
-
onPress: pressHandlers.third
|
|
37
|
-
}
|
|
38
|
-
]}
|
|
39
|
-
/>,
|
|
40
|
-
{ wrapper: Theme }
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
describe('CarouselTabs', () => {
|
|
44
|
-
const selectedStyle = {
|
|
45
|
-
fontWeight: '700'
|
|
46
|
-
}
|
|
47
|
-
const unselectedStyle = {
|
|
48
|
-
fontWeight: '400'
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
it('renders tabs for each item', () => {
|
|
52
|
-
const { queryByText } = setup()
|
|
53
|
-
|
|
54
|
-
expect(queryByText('First tab title')).toBeTruthy()
|
|
55
|
-
expect(queryByText('Second tab title')).toBeTruthy()
|
|
56
|
-
expect(queryByText('Third tab title')).toBeTruthy()
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
it('sets the first tab selected by default and has selected styles', async () => {
|
|
60
|
-
const { getByText } = setup()
|
|
61
|
-
const firstTab = getByText('First tab title')
|
|
62
|
-
expect(firstTab).toHaveStyle(selectedStyle)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('sets the first tab selected by default and is not pressable', async () => {
|
|
66
|
-
const onPress = jest.fn()
|
|
67
|
-
const { getByText } = setup({ pressHandlers: { first: onPress } })
|
|
68
|
-
|
|
69
|
-
const firstTab = getByText('First tab title')
|
|
70
|
-
|
|
71
|
-
expect(() => fireEvent.press(firstTab)).toThrow(/No handler function found for event: "press"/)
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('sets the second tab unselected by default and is pressable', async () => {
|
|
75
|
-
const onPress = jest.fn()
|
|
76
|
-
const { getByText } = setup({ pressHandlers: { second: onPress } })
|
|
77
|
-
|
|
78
|
-
const secondTab = getByText('Second tab title')
|
|
79
|
-
|
|
80
|
-
expect(onPress).not.toHaveBeenCalled()
|
|
81
|
-
await fireEvent.press(secondTab)
|
|
82
|
-
expect(onPress).toHaveBeenCalledTimes(1)
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('sets the second tab unselected by default with unselected styles', async () => {
|
|
86
|
-
const { getByText } = setup()
|
|
87
|
-
const secondTab = getByText('Second tab title')
|
|
88
|
-
expect(secondTab).toHaveStyle(unselectedStyle)
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
it('switches selection to last pressed tab', async () => {
|
|
92
|
-
const onPressFirst = jest.fn()
|
|
93
|
-
const onPressSecond = jest.fn()
|
|
94
|
-
const { getByText, getByTestId } = setup({
|
|
95
|
-
pressHandlers: { first: onPressFirst, second: onPressSecond }
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
const firstTab = getByText('First tab title')
|
|
99
|
-
const secondTab = getByText('Second tab title')
|
|
100
|
-
|
|
101
|
-
const firstSlide = getByTestId('first')
|
|
102
|
-
const secondSlide = getByTestId('second')
|
|
103
|
-
|
|
104
|
-
expect(onPressFirst).not.toHaveBeenCalled()
|
|
105
|
-
expect(onPressSecond).not.toHaveBeenCalled()
|
|
106
|
-
expect(firstTab).toHaveStyle(selectedStyle)
|
|
107
|
-
expect(secondTab).toHaveStyle(unselectedStyle)
|
|
108
|
-
expect(firstSlide).not.toHaveProp('focusable')
|
|
109
|
-
expect(secondSlide).toHaveProp('focusable', false)
|
|
110
|
-
|
|
111
|
-
// Change selection to second tab
|
|
112
|
-
await fireEvent.press(secondTab)
|
|
113
|
-
expect(firstTab).toHaveStyle(unselectedStyle)
|
|
114
|
-
expect(secondTab).toHaveStyle(selectedStyle)
|
|
115
|
-
expect(onPressFirst).not.toHaveBeenCalled()
|
|
116
|
-
expect(onPressSecond).toHaveBeenCalledTimes(1)
|
|
117
|
-
expect(firstSlide).toHaveProp('focusable', false)
|
|
118
|
-
expect(secondSlide).not.toHaveProp('focusable')
|
|
119
|
-
|
|
120
|
-
expect(() => fireEvent.press(secondTab)).toThrow(/No handler function found for event: "press"/)
|
|
121
|
-
|
|
122
|
-
// Change selection to first tab
|
|
123
|
-
await fireEvent.press(firstTab)
|
|
124
|
-
expect(firstTab).toHaveStyle(selectedStyle)
|
|
125
|
-
expect(secondTab).toHaveStyle(unselectedStyle)
|
|
126
|
-
expect(onPressFirst).toHaveBeenCalledTimes(1)
|
|
127
|
-
expect(onPressSecond).toHaveBeenCalledTimes(1)
|
|
128
|
-
expect(firstSlide).not.toHaveProp('focusable')
|
|
129
|
-
expect(secondSlide).toHaveProp('focusable', false)
|
|
130
|
-
|
|
131
|
-
expect(() => fireEvent.press(firstTab)).toThrow(/No handler function found for event: "press"/)
|
|
132
|
-
|
|
133
|
-
// Change selection to first tab
|
|
134
|
-
await fireEvent.press(secondTab)
|
|
135
|
-
expect(firstTab).toHaveStyle(unselectedStyle)
|
|
136
|
-
expect(secondTab).toHaveStyle(selectedStyle)
|
|
137
|
-
expect(onPressFirst).toHaveBeenCalledTimes(1)
|
|
138
|
-
expect(onPressSecond).toHaveBeenCalledTimes(2)
|
|
139
|
-
expect(firstSlide).toHaveProp('focusable', false)
|
|
140
|
-
expect(secondSlide).not.toHaveProp('focusable')
|
|
141
|
-
})
|
|
142
|
-
})
|
|
@@ -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
|
-
})
|
|
@@ -1,246 +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 CheckboxGroup from '../../src/Checkbox/CheckboxGroup'
|
|
7
|
-
|
|
8
|
-
const items = [
|
|
9
|
-
{ label: 'One', id: 'one' },
|
|
10
|
-
{ label: 'Two', id: 'two' },
|
|
11
|
-
{ label: 'Three', id: 'three' },
|
|
12
|
-
{ label: 'Four', id: 'four' }
|
|
13
|
-
]
|
|
14
|
-
const checked = { checked: true }
|
|
15
|
-
|
|
16
|
-
// expect().toHaveTextContent doesn't work on arrays, expect().toContain etc doesn't match elements
|
|
17
|
-
const containsText = (queryResult, text) =>
|
|
18
|
-
queryResult.some((testInstance) => toHaveTextContent(testInstance, text).pass)
|
|
19
|
-
|
|
20
|
-
describe('CheckboxGroup', () => {
|
|
21
|
-
// eslint-disable-next-line no-console
|
|
22
|
-
const consoleError = console.error
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
// eslint-disable-next-line no-console
|
|
25
|
-
console.error = () => {}
|
|
26
|
-
})
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
// eslint-disable-next-line no-console
|
|
29
|
-
console.error = consoleError
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
it('Throws if has `checkedIds` without `onChange`', () => {
|
|
33
|
-
expect(() =>
|
|
34
|
-
render(
|
|
35
|
-
<Theme>
|
|
36
|
-
<CheckboxGroup items={items} checkedIds={['one']} />
|
|
37
|
-
</Theme>
|
|
38
|
-
)
|
|
39
|
-
).toThrow(/values.+without.+onChange/)
|
|
40
|
-
})
|
|
41
|
-
it("Doesn't throw if has `checkedIds` without `onChange` and is read only", () => {
|
|
42
|
-
expect(() =>
|
|
43
|
-
render(
|
|
44
|
-
<Theme>
|
|
45
|
-
<CheckboxGroup items={items} checkedIds={['one']} readOnly />
|
|
46
|
-
</Theme>
|
|
47
|
-
)
|
|
48
|
-
).not.toThrow()
|
|
49
|
-
})
|
|
50
|
-
it('Throws if has both `checkedIds` and `initialCheckedIds`', () => {
|
|
51
|
-
expect(() =>
|
|
52
|
-
render(
|
|
53
|
-
<Theme>
|
|
54
|
-
<CheckboxGroup
|
|
55
|
-
items={items}
|
|
56
|
-
checkedIds={['one']}
|
|
57
|
-
initialCheckedIds={['one']}
|
|
58
|
-
onChange={() => {}}
|
|
59
|
-
/>
|
|
60
|
-
</Theme>
|
|
61
|
-
)
|
|
62
|
-
).toThrow(/both(?=.*initialValues)(?=.*values){2}/)
|
|
63
|
-
})
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
describe('CheckboxGroup (uncontrolled)', () => {
|
|
67
|
-
it('Selects unlimited items', async () => {
|
|
68
|
-
const { getByText, queryAllByA11yState } = render(
|
|
69
|
-
<Theme>
|
|
70
|
-
<CheckboxGroup items={items} />
|
|
71
|
-
</Theme>
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
expect(queryAllByA11yState(checked)).toHaveLength(0)
|
|
75
|
-
|
|
76
|
-
const one = getByText('One')
|
|
77
|
-
await fireEvent.press(one)
|
|
78
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
79
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
80
|
-
|
|
81
|
-
const two = getByText('Two')
|
|
82
|
-
await fireEvent.press(two)
|
|
83
|
-
expect(queryAllByA11yState(checked)).toHaveLength(2)
|
|
84
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
|
|
85
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
86
|
-
|
|
87
|
-
const three = getByText('Three')
|
|
88
|
-
await fireEvent.press(three)
|
|
89
|
-
expect(queryAllByA11yState(checked)).toHaveLength(3)
|
|
90
|
-
expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
|
|
91
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
|
|
92
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
93
|
-
|
|
94
|
-
const four = getByText('Four')
|
|
95
|
-
await fireEvent.press(four)
|
|
96
|
-
expect(queryAllByA11yState(checked)).toHaveLength(4)
|
|
97
|
-
expect(containsText(queryAllByA11yState(checked), 'Four')).toBeTruthy()
|
|
98
|
-
expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
|
|
99
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
|
|
100
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('Deselects if the selected item is pressed', async () => {
|
|
104
|
-
const { getByText, queryAllByA11yState } = render(
|
|
105
|
-
<Theme>
|
|
106
|
-
<CheckboxGroup items={items} />
|
|
107
|
-
</Theme>
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
expect(queryAllByA11yState(checked)).toHaveLength(0)
|
|
111
|
-
|
|
112
|
-
const three = getByText('Three')
|
|
113
|
-
await fireEvent.press(three)
|
|
114
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
115
|
-
expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
|
|
116
|
-
|
|
117
|
-
await fireEvent.press(three)
|
|
118
|
-
expect(queryAllByA11yState(checked)).toHaveLength(0)
|
|
119
|
-
expect(containsText(queryAllByA11yState(checked), 'Three')).not.toBeTruthy()
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
it('Is accessible as checkboxes button', async () => {
|
|
123
|
-
const { queryAllByA11yRole, queryAllByA11yState } = render(
|
|
124
|
-
<Theme>
|
|
125
|
-
<CheckboxGroup items={items} />
|
|
126
|
-
</Theme>
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
expect(queryAllByA11yRole('radiogroup')).toHaveLength(0)
|
|
130
|
-
expect(queryAllByA11yRole('radio')).toHaveLength(0)
|
|
131
|
-
|
|
132
|
-
const checks = queryAllByA11yRole('checkbox')
|
|
133
|
-
expect(checks).toHaveLength(4)
|
|
134
|
-
|
|
135
|
-
expect(queryAllByA11yState(checked)).toHaveLength(0)
|
|
136
|
-
await fireEvent.press(checks[0])
|
|
137
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it('Auto-selects any provided initialCheckedIds', async () => {
|
|
141
|
-
const { getByText, queryAllByA11yState } = render(
|
|
142
|
-
<Theme>
|
|
143
|
-
<CheckboxGroup items={items} initialCheckedIds={['one', 'two']} />
|
|
144
|
-
</Theme>
|
|
145
|
-
)
|
|
146
|
-
expect(queryAllByA11yState(checked)).toHaveLength(2)
|
|
147
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
148
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
|
|
149
|
-
|
|
150
|
-
const three = getByText('Three')
|
|
151
|
-
await fireEvent.press(three)
|
|
152
|
-
|
|
153
|
-
expect(queryAllByA11yState(checked)).toHaveLength(3)
|
|
154
|
-
expect(containsText(queryAllByA11yState(checked), 'Three')).toBeTruthy()
|
|
155
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).toBeTruthy()
|
|
156
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
157
|
-
})
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
describe('CheckboxGroup (controlled)', () => {
|
|
161
|
-
it('Calls onChange handler on press in controlled mode, providing pressed id', async () => {
|
|
162
|
-
const handleChange = jest.fn((arg) => arg)
|
|
163
|
-
const { getByText } = render(
|
|
164
|
-
<Theme>
|
|
165
|
-
<CheckboxGroup items={items} checkedIds={[]} onChange={handleChange} />
|
|
166
|
-
</Theme>
|
|
167
|
-
)
|
|
168
|
-
|
|
169
|
-
expect(handleChange).toHaveBeenCalledTimes(0)
|
|
170
|
-
|
|
171
|
-
const one = getByText('One')
|
|
172
|
-
await fireEvent(one, 'press', { nativeEvent: 'example' })
|
|
173
|
-
expect(handleChange).toHaveBeenCalledTimes(1)
|
|
174
|
-
expect(handleChange).toHaveBeenLastCalledWith(['one'], { nativeEvent: 'example' })
|
|
175
|
-
|
|
176
|
-
const two = getByText('Two')
|
|
177
|
-
await fireEvent(two, 'press', { nativeEvent: 'example2' })
|
|
178
|
-
expect(handleChange).toHaveBeenCalledTimes(2)
|
|
179
|
-
expect(handleChange).toHaveBeenLastCalledWith(['two'], { nativeEvent: 'example2' })
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
it("Doesn't change its own selection if `checkedIds` is passed", async () => {
|
|
183
|
-
const { getByText, queryAllByA11yState } = render(
|
|
184
|
-
<Theme>
|
|
185
|
-
<CheckboxGroup items={items} checkedIds={['one']} onChange={() => {}} />
|
|
186
|
-
</Theme>
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
190
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
191
|
-
|
|
192
|
-
const one = getByText('One')
|
|
193
|
-
await fireEvent.press(one)
|
|
194
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
195
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
196
|
-
|
|
197
|
-
const two = getByText('Two')
|
|
198
|
-
await fireEvent.press(two)
|
|
199
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
200
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
|
|
201
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
202
|
-
})
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
describe('CheckboxGroup (read-only)', () => {
|
|
206
|
-
it("Doesn't call onChange handler when read-only", async () => {
|
|
207
|
-
const handleChange = jest.fn((arg) => arg)
|
|
208
|
-
const { getByText } = render(
|
|
209
|
-
<Theme>
|
|
210
|
-
<CheckboxGroup items={items} checkedIds={[]} onChange={handleChange} readOnly />
|
|
211
|
-
</Theme>
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
expect(handleChange).toHaveBeenCalledTimes(0)
|
|
215
|
-
|
|
216
|
-
const one = getByText('One')
|
|
217
|
-
await fireEvent.press(one)
|
|
218
|
-
expect(handleChange).toHaveBeenCalledTimes(0)
|
|
219
|
-
|
|
220
|
-
const two = getByText('Two')
|
|
221
|
-
await fireEvent.press(two)
|
|
222
|
-
expect(handleChange).toHaveBeenCalledTimes(0)
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
it("Doesn't change its selection on press", async () => {
|
|
226
|
-
const { getByText, queryAllByA11yState } = render(
|
|
227
|
-
<Theme>
|
|
228
|
-
<CheckboxGroup items={items} checkedIds={['one']} readOnly />
|
|
229
|
-
</Theme>
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
233
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
234
|
-
|
|
235
|
-
const one = getByText('One')
|
|
236
|
-
await fireEvent.press(one)
|
|
237
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
238
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
239
|
-
|
|
240
|
-
const two = getByText('Two')
|
|
241
|
-
await fireEvent.press(two)
|
|
242
|
-
expect(queryAllByA11yState(checked)).toHaveLength(1)
|
|
243
|
-
expect(containsText(queryAllByA11yState(checked), 'Two')).not.toBeTruthy()
|
|
244
|
-
expect(containsText(queryAllByA11yState(checked), 'One')).toBeTruthy()
|
|
245
|
-
})
|
|
246
|
-
})
|