@telus-uds/components-base 0.0.2-prerelease.6 → 0.0.2-prerelease.7
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/.ultra.cache.json +1 -1
- package/CHANGELOG.md +20 -0
- package/__fixtures__/testTheme.js +424 -37
- package/__tests__/Button/ButtonBase.test.jsx +2 -31
- package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
- package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
- package/__tests__/List/List.test.jsx +60 -0
- package/__tests__/Radio/Radio.test.jsx +87 -0
- package/__tests__/Select/Select.test.jsx +93 -0
- package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
- package/__tests__/Tags/Tags.test.jsx +328 -0
- package/__tests__/TextInput/TextArea.test.jsx +34 -0
- package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +20 -46
- package/jest.config.js +3 -1
- package/lib/Button/Button.js +10 -3
- package/lib/Button/ButtonBase.js +73 -59
- package/lib/Button/ButtonGroup.js +11 -27
- package/lib/Button/ButtonLink.js +5 -0
- package/lib/Checkbox/Checkbox.js +308 -0
- package/lib/Checkbox/CheckboxInput.native.js +6 -0
- package/lib/Checkbox/CheckboxInput.web.js +57 -0
- package/lib/Checkbox/index.js +2 -0
- package/lib/Feedback/Feedback.js +20 -3
- package/lib/Icon/Icon.js +8 -5
- package/lib/Icon/IconText.js +72 -0
- package/lib/Icon/index.js +2 -1
- package/lib/InputSupports/InputSupports.js +90 -0
- package/lib/InputSupports/index.js +2 -0
- package/lib/InputSupports/propTypes.js +55 -0
- package/lib/Link/ChevronLink.js +23 -20
- package/lib/Link/InlinePressable.native.js +78 -0
- package/lib/Link/InlinePressable.web.js +32 -0
- package/lib/Link/Link.js +11 -10
- package/lib/Link/LinkBase.js +62 -123
- package/lib/Link/TextButton.js +20 -9
- package/lib/Link/index.js +2 -1
- package/lib/List/List.js +52 -0
- package/lib/List/ListItem.js +207 -0
- package/lib/List/index.js +2 -0
- package/lib/Pagination/PageButton.js +2 -25
- package/lib/Pagination/SideButton.js +27 -37
- package/lib/Radio/Radio.js +291 -0
- package/lib/Radio/RadioInput.native.js +6 -0
- package/lib/Radio/RadioInput.web.js +59 -0
- package/lib/Radio/index.js +2 -0
- package/lib/Select/Group.native.js +14 -0
- package/lib/Select/Group.web.js +18 -0
- package/lib/Select/Item.native.js +9 -0
- package/lib/Select/Item.web.js +15 -0
- package/lib/Select/Picker.native.js +87 -0
- package/lib/Select/Picker.web.js +63 -0
- package/lib/Select/Select.js +272 -0
- package/lib/Select/index.js +6 -0
- package/lib/Skeleton/Skeleton.js +119 -0
- package/lib/Skeleton/index.js +2 -0
- package/lib/Tags/Tags.js +217 -0
- package/lib/Tags/index.js +2 -0
- package/lib/TextInput/TextArea.js +82 -0
- package/lib/TextInput/TextInput.js +23 -304
- package/lib/TextInput/TextInputBase.js +229 -0
- package/lib/TextInput/index.js +2 -1
- package/lib/TextInput/propTypes.js +31 -0
- package/lib/ThemeProvider/useThemeTokens.js +54 -3
- package/lib/ToggleSwitch/ToggleSwitch.js +1 -1
- package/lib/Typography/Typography.js +4 -19
- package/lib/index.js +8 -1
- package/lib/utils/a11y/index.js +1 -0
- package/lib/utils/a11y/textSize.js +33 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/info/index.js +7 -0
- package/lib/utils/info/platform/index.js +11 -0
- package/lib/utils/info/platform/platform.android.js +1 -0
- package/lib/utils/info/platform/platform.ios.js +1 -0
- package/lib/utils/info/platform/platform.native.js +4 -0
- package/lib/utils/info/platform/platform.web.js +1 -0
- package/lib/utils/info/versions.js +5 -0
- package/lib/utils/pressability.js +92 -0
- package/lib/utils/propTypes.js +78 -17
- package/package.json +5 -4
- package/release-context.json +4 -4
- package/src/Button/Button.jsx +6 -3
- package/src/Button/ButtonBase.jsx +66 -57
- package/src/Button/ButtonGroup.jsx +9 -22
- package/src/Button/ButtonLink.jsx +11 -2
- package/src/Checkbox/Checkbox.jsx +275 -0
- package/src/Checkbox/CheckboxInput.native.jsx +6 -0
- package/src/Checkbox/CheckboxInput.web.jsx +55 -0
- package/src/Checkbox/index.js +3 -0
- package/src/Feedback/Feedback.jsx +13 -4
- package/src/Icon/Icon.jsx +9 -5
- package/src/Icon/IconText.jsx +63 -0
- package/src/Icon/index.js +2 -1
- package/src/InputSupports/InputSupports.jsx +86 -0
- package/src/InputSupports/index.js +3 -0
- package/src/InputSupports/propTypes.js +44 -0
- package/src/Link/ChevronLink.jsx +20 -17
- package/src/Link/InlinePressable.native.jsx +73 -0
- package/src/Link/InlinePressable.web.jsx +37 -0
- package/src/Link/Link.jsx +17 -13
- package/src/Link/LinkBase.jsx +57 -140
- package/src/Link/TextButton.jsx +25 -11
- package/src/Link/index.js +2 -1
- package/src/List/List.jsx +47 -0
- package/src/List/ListItem.jsx +187 -0
- package/src/List/index.js +3 -0
- package/src/Pagination/PageButton.jsx +2 -16
- package/src/Pagination/SideButton.jsx +23 -34
- package/src/Radio/Radio.jsx +270 -0
- package/src/Radio/RadioInput.native.jsx +6 -0
- package/src/Radio/RadioInput.web.jsx +57 -0
- package/src/Radio/index.js +3 -0
- package/src/Select/Group.native.jsx +14 -0
- package/src/Select/Group.web.jsx +15 -0
- package/src/Select/Item.native.jsx +10 -0
- package/src/Select/Item.web.jsx +11 -0
- package/src/Select/Picker.native.jsx +95 -0
- package/src/Select/Picker.web.jsx +67 -0
- package/src/Select/Select.jsx +265 -0
- package/src/Select/index.js +8 -0
- package/src/Skeleton/Skeleton.jsx +101 -0
- package/src/Skeleton/index.js +3 -0
- package/src/Tags/Tags.jsx +206 -0
- package/src/Tags/index.js +3 -0
- package/src/TextInput/TextArea.jsx +78 -0
- package/src/TextInput/TextInput.jsx +17 -284
- package/src/TextInput/TextInputBase.jsx +220 -0
- package/src/TextInput/index.js +2 -1
- package/src/TextInput/propTypes.js +29 -0
- package/src/ThemeProvider/useThemeTokens.js +54 -3
- package/src/ToggleSwitch/ToggleSwitch.jsx +1 -1
- package/src/Typography/Typography.jsx +4 -15
- package/src/index.js +8 -1
- package/src/utils/a11y/index.js +1 -0
- package/src/utils/a11y/textSize.js +30 -0
- package/src/utils/index.js +3 -0
- package/src/utils/info/index.js +8 -0
- package/src/utils/info/platform/index.js +11 -0
- package/src/utils/info/platform/platform.android.js +1 -0
- package/src/utils/info/platform/platform.ios.js +1 -0
- package/src/utils/info/platform/platform.native.js +4 -0
- package/src/utils/info/platform/platform.web.js +1 -0
- package/src/utils/info/versions.js +6 -0
- package/src/utils/pressability.js +92 -0
- package/src/utils/propTypes.js +97 -22
- package/stories/Button/Button.stories.jsx +5 -0
- package/stories/Checkbox/Checkbox.stories.jsx +71 -0
- package/stories/Feedback/Feedback.stories.jsx +5 -6
- package/stories/Link/Link.stories.jsx +15 -1
- package/stories/List/List.stories.jsx +117 -0
- package/stories/Radio/Radio.stories.jsx +113 -0
- package/stories/Select/Select.stories.jsx +55 -0
- package/stories/Skeleton/Skeleton.stories.jsx +36 -0
- package/stories/Tags/Tags.stories.jsx +69 -0
- package/stories/TextInput/TextArea.stories.jsx +100 -0
- package/stories/supports.jsx +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
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')
|
|
90
|
+
expect(onChange).toHaveBeenCalledTimes(1)
|
|
91
|
+
expect(onChange).toHaveBeenCalledWith(true)
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
})
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { fireEvent, render } from '@testing-library/react-native'
|
|
3
|
+
|
|
4
|
+
import InputSupports from '../../src/InputSupports'
|
|
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('InputSupports', () => {
|
|
16
|
+
it('renders the label', () => {
|
|
17
|
+
const { queryByText } = render(<InputSupports label="Test label content" />, {
|
|
18
|
+
wrapper: Wrapper
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
expect(queryByText('Test label content')).toBeTruthy()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('renders the hint', () => {
|
|
25
|
+
const { queryByText } = render(
|
|
26
|
+
<InputSupports label="Test label content" hint="Test hint content" />,
|
|
27
|
+
{ wrapper: Wrapper }
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
expect(queryByText('Test hint content')).toBeTruthy()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('renders the feedback', () => {
|
|
34
|
+
const { queryByText } = render(<InputSupports feedback="Test feedback content" />, {
|
|
35
|
+
wrapper: Wrapper
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
expect(queryByText('Test feedback content')).toBeTruthy()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('renders the tooltip which content shows up when pressed', () => {
|
|
42
|
+
const { queryByText, getByRole } = render(
|
|
43
|
+
<InputSupports label="Test label content" tooltip="Test tooltip content" />,
|
|
44
|
+
{ wrapper: Wrapper }
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
fireEvent(getByRole('button'), 'press')
|
|
48
|
+
expect(queryByText('Test tooltip content')).toBeTruthy()
|
|
49
|
+
})
|
|
50
|
+
})
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Text } from 'react-native'
|
|
3
|
+
import { render } from '@testing-library/react-native'
|
|
4
|
+
import { List } from '../../src'
|
|
5
|
+
import Theme from '../../__fixtures__/Theme'
|
|
6
|
+
import testTheme from '../../__fixtures__/testTheme'
|
|
7
|
+
|
|
8
|
+
const setup = ({ showDivider = false, icon, children } = {}) =>
|
|
9
|
+
render(
|
|
10
|
+
<Theme>
|
|
11
|
+
<List showDivider={showDivider}>
|
|
12
|
+
<List.Item icon={icon}>{children || 'Item'}</List.Item>
|
|
13
|
+
<List.Item icon={icon}>{children || 'Item'}</List.Item>
|
|
14
|
+
<List.Item icon={icon}>{children || 'Item'}</List.Item>
|
|
15
|
+
<List.Item icon={icon}>{children || 'Item'}</List.Item>
|
|
16
|
+
</List>
|
|
17
|
+
</Theme>
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
describe('List', () => {
|
|
21
|
+
it('should render bullets by default', () => {
|
|
22
|
+
const { queryAllByTestId } = setup()
|
|
23
|
+
const bullet = queryAllByTestId('unordered-item-bullet')
|
|
24
|
+
expect(bullet.length).toBe(4)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('should render dividers for all items except for the last one', () => {
|
|
28
|
+
const { getAllByRole } = setup({ showDivider: true })
|
|
29
|
+
const {
|
|
30
|
+
interItemMarginWithDivider: marginBottom,
|
|
31
|
+
dividerColor: borderColor,
|
|
32
|
+
dividerSize: borderBottomWidth
|
|
33
|
+
} = testTheme.components.List.tokens
|
|
34
|
+
|
|
35
|
+
const listItems = getAllByRole('item')
|
|
36
|
+
|
|
37
|
+
listItems.forEach((item, index) => {
|
|
38
|
+
if (index + 1 !== listItems.length) {
|
|
39
|
+
expect(item).toHaveStyle({ marginBottom, borderColor, borderBottomWidth })
|
|
40
|
+
} else {
|
|
41
|
+
expect(item).toHaveStyle({})
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('should render the icon when defined', () => {
|
|
47
|
+
const { queryAllByTestId } = setup({ icon: () => <Text testID="icon" /> })
|
|
48
|
+
|
|
49
|
+
const icons = queryAllByTestId('icon')
|
|
50
|
+
|
|
51
|
+
expect(icons.length).toBe(4)
|
|
52
|
+
})
|
|
53
|
+
it('should allow children nested components', () => {
|
|
54
|
+
const { queryAllByTestId } = setup({ children: <Text testID="child" /> })
|
|
55
|
+
|
|
56
|
+
const children = queryAllByTestId('child')
|
|
57
|
+
|
|
58
|
+
expect(children.length).toBe(4)
|
|
59
|
+
})
|
|
60
|
+
})
|
|
@@ -0,0 +1,87 @@
|
|
|
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')
|
|
83
|
+
expect(onChange).toHaveBeenCalledTimes(1)
|
|
84
|
+
expect(onChange).toHaveBeenCalledWith(true)
|
|
85
|
+
})
|
|
86
|
+
})
|
|
87
|
+
})
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { render, fireEvent } from '@testing-library/react-native'
|
|
3
|
+
|
|
4
|
+
import { Platform } from 'react-native'
|
|
5
|
+
import { Select } from '../../src'
|
|
6
|
+
import Theme from '../../__fixtures__/Theme'
|
|
7
|
+
|
|
8
|
+
describe('Select', () => {
|
|
9
|
+
it('renders', () => {
|
|
10
|
+
render(
|
|
11
|
+
<Select>
|
|
12
|
+
<Select.Item value="item-1">Item 1</Select.Item>
|
|
13
|
+
<Select.Item value="item-2">Item 2</Select.Item>
|
|
14
|
+
</Select>,
|
|
15
|
+
{
|
|
16
|
+
wrapper: Theme
|
|
17
|
+
}
|
|
18
|
+
)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
if (Platform.OS === 'web') {
|
|
22
|
+
it('renders a placeholder', () => {
|
|
23
|
+
const { queryByText } = render(<Select placeholder="Test placeholder value" />, {
|
|
24
|
+
wrapper: Theme
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
expect(queryByText('Non-existing value')).toBeFalsy()
|
|
28
|
+
expect(queryByText('Test placeholder value')).not.toBeFalsy()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('changes value when controlled', () => {
|
|
32
|
+
const onChange = jest.fn()
|
|
33
|
+
|
|
34
|
+
const { getByTestId } = render(
|
|
35
|
+
<Select value="item-2" onChange={onChange} testID="Test-Select">
|
|
36
|
+
<Select.Item value="item-1">Item 1</Select.Item>
|
|
37
|
+
<Select.Item value="item-2">Item 2</Select.Item>
|
|
38
|
+
</Select>,
|
|
39
|
+
{
|
|
40
|
+
wrapper: Theme
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
expect(onChange).not.toHaveBeenCalled()
|
|
45
|
+
|
|
46
|
+
fireEvent.change(getByTestId('Test-Select'), { target: { value: 'item-1' } })
|
|
47
|
+
|
|
48
|
+
expect(onChange).toHaveBeenCalledTimes(1)
|
|
49
|
+
expect(onChange).toHaveBeenLastCalledWith('item-1')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('changes value when uncontrolled', () => {
|
|
53
|
+
const onChange = jest.fn()
|
|
54
|
+
|
|
55
|
+
const { getByTestId } = render(
|
|
56
|
+
<Select initialValue="item-2" onChange={onChange} testID="Test-Select">
|
|
57
|
+
<Select.Item value="item-1">Item 1</Select.Item>
|
|
58
|
+
<Select.Item value="item-2">Item 2</Select.Item>
|
|
59
|
+
</Select>,
|
|
60
|
+
{
|
|
61
|
+
wrapper: Theme
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
expect(onChange).not.toHaveBeenCalled()
|
|
66
|
+
|
|
67
|
+
fireEvent.change(getByTestId('Test-Select'), { target: { value: 'item-1' } })
|
|
68
|
+
|
|
69
|
+
expect(onChange).toHaveBeenCalledTimes(1)
|
|
70
|
+
expect(onChange).toHaveBeenLastCalledWith('item-1')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it("doesn't change value when readOnly", () => {
|
|
74
|
+
const onChange = jest.fn()
|
|
75
|
+
|
|
76
|
+
const { getByTestId } = render(
|
|
77
|
+
<Select value="item-2" onChange={onChange} testID="Test-Select" readOnly>
|
|
78
|
+
<Select.Item value="item-1">Item 1</Select.Item>
|
|
79
|
+
<Select.Item value="item-2">Item 2</Select.Item>
|
|
80
|
+
</Select>,
|
|
81
|
+
{
|
|
82
|
+
wrapper: Theme
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
expect(onChange).not.toHaveBeenCalled()
|
|
87
|
+
|
|
88
|
+
fireEvent.change(getByTestId('Test-Select'), { target: { value: 'item-1' } })
|
|
89
|
+
|
|
90
|
+
expect(onChange).not.toHaveBeenCalled()
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
})
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { render } from '@testing-library/react-native'
|
|
3
|
+
|
|
4
|
+
import { Skeleton } from '../../src'
|
|
5
|
+
import Theme from '../../__fixtures__/Theme'
|
|
6
|
+
import testTheme from '../../__fixtures__/testTheme'
|
|
7
|
+
|
|
8
|
+
jest.mock('react-native/Libraries/Animated/src/NativeAnimatedHelper')
|
|
9
|
+
const { tokens } = testTheme.components.Skeleton
|
|
10
|
+
|
|
11
|
+
const setup = ({ size = 10, characters, lines, shape } = {}) =>
|
|
12
|
+
render(
|
|
13
|
+
<Theme>
|
|
14
|
+
<Skeleton
|
|
15
|
+
size={size}
|
|
16
|
+
characters={characters}
|
|
17
|
+
lines={lines}
|
|
18
|
+
shape={shape}
|
|
19
|
+
aria-label="loader"
|
|
20
|
+
/>
|
|
21
|
+
</Theme>
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
describe('Skeleton', () => {
|
|
25
|
+
it('should calculate line width based on baseWidth', () => {
|
|
26
|
+
const { getByTestId } = setup()
|
|
27
|
+
const { characters, baseWidth } = tokens
|
|
28
|
+
const lineWidth = characters * baseWidth
|
|
29
|
+
|
|
30
|
+
const element = getByTestId('skeleton')
|
|
31
|
+
|
|
32
|
+
expect(element).toHaveStyle({ width: lineWidth })
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('render a circle', () => {
|
|
36
|
+
const { getByTestId } = setup({ shape: 'circle' })
|
|
37
|
+
const { radius } = tokens
|
|
38
|
+
|
|
39
|
+
const element = getByTestId('skeleton')
|
|
40
|
+
|
|
41
|
+
expect(element.width).toEqual(element.height)
|
|
42
|
+
expect(element).toHaveStyle({ borderRadius: radius })
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('render a square', () => {
|
|
46
|
+
const { getByTestId } = setup({ shape: 'box' })
|
|
47
|
+
|
|
48
|
+
const element = getByTestId('skeleton')
|
|
49
|
+
|
|
50
|
+
expect(element.width).toEqual(element.height)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('render multiple lines', () => {
|
|
54
|
+
const lines = 8
|
|
55
|
+
const { queryAllByTestId } = setup({ lines })
|
|
56
|
+
|
|
57
|
+
const elements = queryAllByTestId('skeleton')
|
|
58
|
+
|
|
59
|
+
expect(elements.length).toEqual(lines)
|
|
60
|
+
})
|
|
61
|
+
})
|