@telus-uds/components-base 0.0.2-prerelease.3 → 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.
Files changed (266) hide show
  1. package/.ultra.cache.json +1 -0
  2. package/CHANGELOG.md +55 -0
  3. package/__fixtures__/testTheme.js +528 -42
  4. package/__tests__/Button/ButtonBase.test.jsx +3 -32
  5. package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
  6. package/__tests__/Divider/Divider.test.jsx +26 -5
  7. package/__tests__/Feedback/Feedback.test.jsx +42 -0
  8. package/__tests__/FlexGrid/Col.test.jsx +5 -0
  9. package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
  10. package/__tests__/List/List.test.jsx +60 -0
  11. package/__tests__/Radio/Radio.test.jsx +87 -0
  12. package/__tests__/Select/Select.test.jsx +93 -0
  13. package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
  14. package/__tests__/Spacer/Spacer.test.jsx +63 -0
  15. package/__tests__/StackView/StackView.test.jsx +216 -0
  16. package/__tests__/StackView/StackWrap.test.jsx +47 -0
  17. package/__tests__/StackView/getStackedContent.test.jsx +295 -0
  18. package/__tests__/Tags/Tags.test.jsx +328 -0
  19. package/__tests__/TextInput/TextArea.test.jsx +34 -0
  20. package/__tests__/TextInput/TextInputBase.test.jsx +120 -0
  21. package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
  22. package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
  23. package/__tests__/utils/useCopy.test.js +31 -0
  24. package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
  25. package/__tests__/utils/{spacing.test.jsx → useSpacingScale.test.jsx} +1 -1
  26. package/__tests__/utils/useUniqueId.test.js +31 -0
  27. package/jest.config.js +8 -2
  28. package/lib/Box/Box.js +7 -2
  29. package/lib/Button/Button.js +10 -3
  30. package/lib/Button/ButtonBase.js +79 -75
  31. package/lib/Button/ButtonGroup.js +24 -49
  32. package/lib/Button/ButtonLink.js +5 -0
  33. package/lib/Checkbox/Checkbox.js +308 -0
  34. package/lib/Checkbox/CheckboxInput.native.js +6 -0
  35. package/lib/Checkbox/CheckboxInput.web.js +57 -0
  36. package/lib/Checkbox/index.js +2 -0
  37. package/lib/Divider/Divider.js +40 -2
  38. package/lib/Feedback/Feedback.js +132 -0
  39. package/lib/Feedback/index.js +2 -0
  40. package/lib/Icon/Icon.js +9 -6
  41. package/lib/Icon/IconText.js +72 -0
  42. package/lib/Icon/index.js +2 -1
  43. package/lib/InputLabel/InputLabel.js +88 -0
  44. package/lib/InputLabel/LabelContent.native.js +8 -0
  45. package/lib/InputLabel/LabelContent.web.js +17 -0
  46. package/lib/InputLabel/index.js +2 -0
  47. package/lib/InputSupports/InputSupports.js +90 -0
  48. package/lib/InputSupports/index.js +2 -0
  49. package/lib/InputSupports/propTypes.js +55 -0
  50. package/lib/Link/ChevronLink.js +35 -10
  51. package/lib/Link/InlinePressable.native.js +78 -0
  52. package/lib/Link/InlinePressable.web.js +32 -0
  53. package/lib/Link/Link.js +11 -10
  54. package/lib/Link/LinkBase.js +69 -124
  55. package/lib/Link/TextButton.js +20 -9
  56. package/lib/Link/index.js +2 -1
  57. package/lib/List/List.js +52 -0
  58. package/lib/List/ListItem.js +207 -0
  59. package/lib/List/index.js +2 -0
  60. package/lib/Pagination/PageButton.js +3 -26
  61. package/lib/Pagination/SideButton.js +32 -42
  62. package/lib/Radio/Radio.js +291 -0
  63. package/lib/Radio/RadioInput.native.js +6 -0
  64. package/lib/Radio/RadioInput.web.js +59 -0
  65. package/lib/Radio/index.js +2 -0
  66. package/lib/Select/Group.native.js +14 -0
  67. package/lib/Select/Group.web.js +18 -0
  68. package/lib/Select/Item.native.js +9 -0
  69. package/lib/Select/Item.web.js +15 -0
  70. package/lib/Select/Picker.native.js +87 -0
  71. package/lib/Select/Picker.web.js +63 -0
  72. package/lib/Select/Select.js +272 -0
  73. package/lib/Select/index.js +6 -0
  74. package/lib/Skeleton/Skeleton.js +119 -0
  75. package/lib/Skeleton/index.js +2 -0
  76. package/lib/Spacer/Spacer.js +98 -0
  77. package/lib/Spacer/index.js +2 -0
  78. package/lib/StackView/StackView.js +107 -0
  79. package/lib/StackView/StackWrap.js +32 -0
  80. package/lib/StackView/StackWrap.native.js +3 -0
  81. package/lib/StackView/StackWrapBox.js +90 -0
  82. package/lib/StackView/StackWrapGap.js +50 -0
  83. package/lib/StackView/common.js +30 -0
  84. package/lib/StackView/getStackedContent.js +111 -0
  85. package/lib/StackView/index.js +5 -0
  86. package/lib/Tags/Tags.js +217 -0
  87. package/lib/Tags/index.js +2 -0
  88. package/lib/TextInput/TextArea.js +82 -0
  89. package/lib/TextInput/TextInput.js +54 -0
  90. package/lib/TextInput/TextInputBase.js +229 -0
  91. package/lib/TextInput/index.js +3 -0
  92. package/lib/TextInput/propTypes.js +31 -0
  93. package/lib/ThemeProvider/useThemeTokens.js +54 -3
  94. package/lib/ToggleSwitch/ToggleSwitch.js +1 -1
  95. package/lib/Tooltip/Backdrop.native.js +35 -0
  96. package/lib/Tooltip/Backdrop.web.js +52 -0
  97. package/lib/Tooltip/Tooltip.js +315 -0
  98. package/lib/Tooltip/dictionary.js +8 -0
  99. package/lib/Tooltip/getTooltipPosition.js +164 -0
  100. package/lib/Tooltip/index.js +2 -0
  101. package/lib/TooltipButton/TooltipButton.js +64 -0
  102. package/lib/TooltipButton/index.js +2 -0
  103. package/lib/Typography/Typography.js +4 -23
  104. package/lib/ViewportProvider/ViewportProvider.js +25 -0
  105. package/lib/ViewportProvider/index.js +2 -43
  106. package/lib/ViewportProvider/useViewport.js +3 -0
  107. package/lib/ViewportProvider/useViewportListener.js +43 -0
  108. package/lib/index.js +15 -1
  109. package/lib/utils/a11y/index.js +1 -0
  110. package/lib/utils/a11y/textSize.js +33 -0
  111. package/lib/utils/index.js +7 -1
  112. package/lib/utils/info/index.js +7 -0
  113. package/lib/utils/info/platform/index.js +11 -0
  114. package/lib/utils/info/platform/platform.android.js +1 -0
  115. package/lib/utils/info/platform/platform.ios.js +1 -0
  116. package/lib/utils/info/platform/platform.native.js +4 -0
  117. package/lib/utils/info/platform/platform.web.js +1 -0
  118. package/lib/utils/info/versions.js +5 -0
  119. package/lib/utils/input.js +3 -1
  120. package/lib/utils/pressability.js +92 -0
  121. package/lib/utils/propTypes.js +77 -8
  122. package/lib/utils/useCopy.js +16 -0
  123. package/lib/utils/useResponsiveProp.js +47 -0
  124. package/lib/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +30 -9
  125. package/lib/utils/useUniqueId.js +12 -0
  126. package/package.json +7 -5
  127. package/release-context.json +4 -4
  128. package/src/Box/Box.jsx +4 -2
  129. package/src/Button/Button.jsx +6 -3
  130. package/src/Button/ButtonBase.jsx +72 -75
  131. package/src/Button/ButtonGroup.jsx +22 -39
  132. package/src/Button/ButtonLink.jsx +11 -2
  133. package/src/Checkbox/Checkbox.jsx +275 -0
  134. package/src/Checkbox/CheckboxInput.native.jsx +6 -0
  135. package/src/Checkbox/CheckboxInput.web.jsx +55 -0
  136. package/src/Checkbox/index.js +3 -0
  137. package/src/Divider/Divider.jsx +38 -3
  138. package/src/Feedback/Feedback.jsx +108 -0
  139. package/src/Feedback/index.js +3 -0
  140. package/src/Icon/Icon.jsx +11 -6
  141. package/src/Icon/IconText.jsx +63 -0
  142. package/src/Icon/index.js +2 -1
  143. package/src/InputLabel/InputLabel.jsx +99 -0
  144. package/src/InputLabel/LabelContent.native.jsx +6 -0
  145. package/src/InputLabel/LabelContent.web.jsx +13 -0
  146. package/src/InputLabel/index.js +3 -0
  147. package/src/InputSupports/InputSupports.jsx +86 -0
  148. package/src/InputSupports/index.js +3 -0
  149. package/src/InputSupports/propTypes.js +44 -0
  150. package/src/Link/ChevronLink.jsx +28 -7
  151. package/src/Link/InlinePressable.native.jsx +73 -0
  152. package/src/Link/InlinePressable.web.jsx +37 -0
  153. package/src/Link/Link.jsx +17 -13
  154. package/src/Link/LinkBase.jsx +62 -139
  155. package/src/Link/TextButton.jsx +25 -11
  156. package/src/Link/index.js +2 -1
  157. package/src/List/List.jsx +47 -0
  158. package/src/List/ListItem.jsx +187 -0
  159. package/src/List/index.js +3 -0
  160. package/src/Pagination/PageButton.jsx +3 -17
  161. package/src/Pagination/SideButton.jsx +27 -38
  162. package/src/Radio/Radio.jsx +270 -0
  163. package/src/Radio/RadioInput.native.jsx +6 -0
  164. package/src/Radio/RadioInput.web.jsx +57 -0
  165. package/src/Radio/index.js +3 -0
  166. package/src/Select/Group.native.jsx +14 -0
  167. package/src/Select/Group.web.jsx +15 -0
  168. package/src/Select/Item.native.jsx +10 -0
  169. package/src/Select/Item.web.jsx +11 -0
  170. package/src/Select/Picker.native.jsx +95 -0
  171. package/src/Select/Picker.web.jsx +67 -0
  172. package/src/Select/Select.jsx +265 -0
  173. package/src/Select/index.js +8 -0
  174. package/src/Skeleton/Skeleton.jsx +101 -0
  175. package/src/Skeleton/index.js +3 -0
  176. package/src/Spacer/Spacer.jsx +91 -0
  177. package/src/Spacer/index.js +3 -0
  178. package/src/StackView/StackView.jsx +104 -0
  179. package/src/StackView/StackWrap.jsx +33 -0
  180. package/src/StackView/StackWrap.native.jsx +4 -0
  181. package/src/StackView/StackWrapBox.jsx +93 -0
  182. package/src/StackView/StackWrapGap.jsx +49 -0
  183. package/src/StackView/common.jsx +28 -0
  184. package/src/StackView/getStackedContent.jsx +106 -0
  185. package/src/StackView/index.js +6 -0
  186. package/src/Tags/Tags.jsx +206 -0
  187. package/src/Tags/index.js +3 -0
  188. package/src/TextInput/TextArea.jsx +78 -0
  189. package/src/TextInput/TextInput.jsx +52 -0
  190. package/src/TextInput/TextInputBase.jsx +220 -0
  191. package/src/TextInput/index.js +4 -0
  192. package/src/TextInput/propTypes.js +29 -0
  193. package/src/ThemeProvider/useThemeTokens.js +54 -3
  194. package/src/ToggleSwitch/ToggleSwitch.jsx +1 -1
  195. package/src/Tooltip/Backdrop.native.jsx +33 -0
  196. package/src/Tooltip/Backdrop.web.jsx +60 -0
  197. package/src/Tooltip/Tooltip.jsx +294 -0
  198. package/src/Tooltip/dictionary.js +8 -0
  199. package/src/Tooltip/getTooltipPosition.js +161 -0
  200. package/src/Tooltip/index.js +3 -0
  201. package/src/TooltipButton/TooltipButton.jsx +53 -0
  202. package/src/TooltipButton/index.js +3 -0
  203. package/src/Typography/Typography.jsx +4 -19
  204. package/src/ViewportProvider/ViewportProvider.jsx +21 -0
  205. package/src/ViewportProvider/index.jsx +2 -41
  206. package/src/ViewportProvider/useViewport.js +5 -0
  207. package/src/ViewportProvider/useViewportListener.js +43 -0
  208. package/src/index.js +15 -1
  209. package/src/utils/a11y/index.js +1 -0
  210. package/src/utils/a11y/textSize.js +30 -0
  211. package/src/utils/index.js +8 -1
  212. package/src/utils/info/index.js +8 -0
  213. package/src/utils/info/platform/index.js +11 -0
  214. package/src/utils/info/platform/platform.android.js +1 -0
  215. package/src/utils/info/platform/platform.ios.js +1 -0
  216. package/src/utils/info/platform/platform.native.js +4 -0
  217. package/src/utils/info/platform/platform.web.js +1 -0
  218. package/src/utils/info/versions.js +6 -0
  219. package/src/utils/input.js +2 -1
  220. package/src/utils/pressability.js +92 -0
  221. package/src/utils/propTypes.js +97 -13
  222. package/src/utils/useCopy.js +13 -0
  223. package/src/utils/useResponsiveProp.js +50 -0
  224. package/src/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +25 -10
  225. package/src/utils/useUniqueId.js +14 -0
  226. package/stories/A11yText/A11yText.stories.jsx +11 -5
  227. package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +11 -2
  228. package/stories/Box/Box.stories.jsx +29 -2
  229. package/stories/Button/Button.stories.jsx +21 -20
  230. package/stories/Button/ButtonGroup.stories.jsx +2 -1
  231. package/stories/Button/ButtonLink.stories.jsx +6 -4
  232. package/stories/Card/Card.stories.jsx +13 -1
  233. package/stories/Checkbox/Checkbox.stories.jsx +71 -0
  234. package/stories/Divider/Divider.stories.jsx +26 -2
  235. package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +74 -79
  236. package/stories/Feedback/Feedback.stories.jsx +96 -0
  237. package/stories/FlexGrid/01 FlexGrid.stories.jsx +20 -7
  238. package/stories/Icon/Icon.stories.jsx +11 -3
  239. package/stories/InputLabel/InputLabel.stories.jsx +42 -0
  240. package/stories/Link/ChevronLink.stories.jsx +20 -4
  241. package/stories/Link/Link.stories.jsx +39 -3
  242. package/stories/Link/TextButton.stories.jsx +24 -2
  243. package/stories/List/List.stories.jsx +117 -0
  244. package/stories/Pagination/Pagination.stories.jsx +28 -14
  245. package/stories/Radio/Radio.stories.jsx +113 -0
  246. package/stories/Select/Select.stories.jsx +55 -0
  247. package/stories/SideNav/SideNav.stories.jsx +17 -2
  248. package/stories/Skeleton/Skeleton.stories.jsx +36 -0
  249. package/stories/Spacer/Spacer.stories.jsx +38 -0
  250. package/stories/StackView/StackView.stories.jsx +75 -0
  251. package/stories/StackView/StackWrap.stories.jsx +64 -0
  252. package/stories/Tags/Tags.stories.jsx +69 -0
  253. package/stories/TextInput/TextArea.stories.jsx +100 -0
  254. package/stories/TextInput/TextInput.stories.jsx +103 -0
  255. package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +16 -3
  256. package/stories/Tooltip/Tooltip.stories.jsx +81 -0
  257. package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
  258. package/stories/Typography/Typography.stories.jsx +12 -3
  259. package/stories/platform-supports.web.jsx +1 -1
  260. package/stories/supports.jsx +110 -14
  261. package/lib/Pagination/useCopy.js +0 -10
  262. package/lib/utils/spacing/index.js +0 -2
  263. package/lib/utils/spacing/utils.js +0 -32
  264. package/src/Pagination/useCopy.js +0 -7
  265. package/src/utils/spacing/index.js +0 -3
  266. package/src/utils/spacing/utils.js +0 -28
@@ -1,4 +1,3 @@
1
- /* eslint-disable no-console */
2
1
  import React from 'react'
3
2
  import { render } from '@testing-library/react-native'
4
3
  import { Platform, Text } from 'react-native'
@@ -9,41 +8,13 @@ import ButtonBase from '../../src/Button/ButtonBase'
9
8
 
10
9
  beforeEach(() => jest.clearAllMocks())
11
10
 
12
- describe('ButtonBase', () => {
13
- it('throws if both href and onPress are provided', async () => {
14
- jest.spyOn(console, 'error').mockImplementation()
15
- expect(() =>
16
- render(
17
- <Theme>
18
- <ButtonBase href="example.com" onPress={jest.fn()}>
19
- click me
20
- </ButtonBase>
21
- </Theme>
22
- )
23
- ).toThrow()
24
- expect(console.error).toHaveBeenCalledTimes(1)
25
- })
26
-
27
- it('throws if neither href nor onPress are provided', async () => {
28
- jest.spyOn(console, 'error').mockImplementation()
29
- expect(() =>
30
- render(
31
- <Theme>
32
- <ButtonBase>click me</ButtonBase>
33
- </Theme>
34
- )
35
- ).toThrow()
36
- expect(console.error).toHaveBeenCalledTimes(1)
37
- })
38
- })
39
-
40
11
  describe('ButtonBase with render function child', () => {
41
- it('recieves text styles in render function from button theme', () => {
12
+ it('receives tokens in render function child', () => {
42
13
  const { tokens } = testTheme.components.Button
43
- const arbitraryWeight = '123'
14
+ const arbitraryWeight = '300'
44
15
  const { getByText } = render(
45
16
  <Theme>
46
- <ButtonBase onPress={() => {}} tokens={{ fontWeight: arbitraryWeight }}>
17
+ <ButtonBase onPress={() => {}} tokens={{ ...tokens, fontWeight: arbitraryWeight }}>
47
18
  {({ textStyles }) => <Text style={textStyles}>Function child</Text>}
48
19
  </ButtonBase>
49
20
  </Theme>
@@ -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
+ })
@@ -41,17 +41,38 @@ describe('Divider', () => {
41
41
  expect(divider).not.toHaveStyle(verticalStyles)
42
42
  })
43
43
 
44
- it('renders a vertical line when vertical prop is passed', () => {
44
+ it('renders space above and below a horizontal line if space prop is passed', () => {
45
+ const expectedSize = 8 // from testTheme.js
46
+
45
47
  const { getByTestId } = render(
46
48
  <Theme>
47
49
  <Text>Before</Text>
48
- <Divider vertical testID={testID} />
50
+ <Divider testID={testID} space={2} />
49
51
  <Text>After</Text>
50
52
  </Theme>
51
53
  )
52
- const divider = getByTestId(testID)
53
- expect(divider).toHaveStyle(verticalStyles)
54
- expect(divider).not.toHaveStyle(horizontalStyles)
54
+ const before = getByTestId(`${testID}-Spacer-before`)
55
+ expect(before).toHaveStyle({ height: expectedSize })
56
+
57
+ const after = getByTestId(`${testID}-Spacer-after`)
58
+ expect(after).toHaveStyle({ height: expectedSize })
59
+ })
60
+
61
+ it('renders space left and right of a vertical line if space prop is passed', () => {
62
+ const expectedSize = 8 // from testTheme.js
63
+
64
+ const { getByTestId } = render(
65
+ <Theme>
66
+ <Text>Before</Text>
67
+ <Divider vertical testID={testID} space={2} />
68
+ <Text>After</Text>
69
+ </Theme>
70
+ )
71
+ const before = getByTestId(`${testID}-Spacer-before`)
72
+ expect(before).toHaveStyle({ width: expectedSize })
73
+
74
+ const after = getByTestId(`${testID}-Spacer-after`)
75
+ expect(after).toHaveStyle({ width: expectedSize })
55
76
  })
56
77
 
57
78
  it('renders the correct styles for a given variant', () => {
@@ -0,0 +1,42 @@
1
+ import React from 'react'
2
+ import { Text } from 'react-native'
3
+ import { render } from '@testing-library/react-native'
4
+
5
+ import Feedback from '../../src/Feedback'
6
+ import Theme from '../../__fixtures__/Theme'
7
+
8
+ describe('Feedback', () => {
9
+ it('renders title', () => {
10
+ const { queryByText } = render(<Feedback title="Test title" />, { wrapper: Theme })
11
+
12
+ expect(queryByText('Test title')).toBeTruthy()
13
+ })
14
+
15
+ it('renders content when passed a string', () => {
16
+ const { queryByText } = render(<Feedback>Test content</Feedback>, { wrapper: Theme })
17
+
18
+ expect(queryByText('Test content')).toBeTruthy()
19
+ })
20
+
21
+ it('renders content when passed a React element', () => {
22
+ const { queryByText } = render(
23
+ <Feedback>
24
+ <Text>Test content</Text>
25
+ </Feedback>,
26
+ { wrapper: Theme }
27
+ )
28
+
29
+ expect(queryByText('Test content')).toBeTruthy()
30
+ })
31
+
32
+ it("renders content with theme's style prop when passed a function", () => {
33
+ const { getByText } = render(
34
+ <Feedback>{({ textStyles }) => <Text style={textStyles}>Test content</Text>}</Feedback>,
35
+ {
36
+ wrapper: Theme
37
+ }
38
+ )
39
+
40
+ expect(getByText('Test content')).toHaveStyle({ fontSize: 14 })
41
+ })
42
+ })
@@ -48,6 +48,7 @@ describe('FlexGrid.Col offsets', () => {
48
48
  )
49
49
  const expectIfOffsetExpected = (propViewport) => {
50
50
  const target = getByText(`${propViewport}Offset`).parent
51
+ // eslint-disable-next-line jest/valid-expect
51
52
  return expected[propViewport] ? expect(target) : expect(target).not
52
53
  }
53
54
  expectIfOffsetExpected('xs').toHaveStyle(getOffsetStyle('xs'))
@@ -103,6 +104,7 @@ describe('FlexGrid.Col sizes', () => {
103
104
 
104
105
  const expectIfSizeExpected = (propViewport) => {
105
106
  const target = getByText(propViewport).parent
107
+ // eslint-disable-next-line jest/valid-expect
106
108
  return expected[propViewport] ? expect(target) : expect(target).not
107
109
  }
108
110
  expectIfSizeExpected('xs').toHaveStyle(getNumericSizeStyle('xs'))
@@ -152,6 +154,7 @@ describe('FlexGrid.Col sizes', () => {
152
154
 
153
155
  const expectIfSizeExpected = (text) => {
154
156
  const target = getByText(text).parent
157
+ // eslint-disable-next-line jest/valid-expect
155
158
  return expected[text] ? expect(target) : expect(target).not
156
159
  }
157
160
  expectIfSizeExpected('xs-md').toHaveStyle(getNumericSizeStyle('xs'))
@@ -196,6 +199,7 @@ describe('FlexGrid.Col sizes', () => {
196
199
  )
197
200
  const expectIfHidingExpected = (propViewport) => {
198
201
  const target = getByText(propViewport).parent
202
+ // eslint-disable-next-line jest/valid-expect
199
203
  return expected[propViewport] ? expect(target) : expect(target).not
200
204
  }
201
205
  expectIfHidingExpected('xs').toHaveStyle(hidingStyle)
@@ -244,6 +248,7 @@ describe('FlexGrid.Col horizontalAlign', () => {
244
248
 
245
249
  const expectIfAlignExpected = (propViewport) => {
246
250
  const target = getByText(propViewport).parent
251
+ // eslint-disable-next-line jest/valid-expect
247
252
  return expected[propViewport] ? expect(target) : expect(target).not
248
253
  }
249
254
  expectIfAlignExpected('xs').toHaveStyle(alignRightStyle)
@@ -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
+ })
@@ -0,0 +1,63 @@
1
+ import React from 'react'
2
+ import { render } from '@testing-library/react-native'
3
+
4
+ import { Spacer } from '../../src'
5
+ import Theme from '../../__fixtures__/Theme'
6
+
7
+ const testID = 'spacer'
8
+
9
+ describe('Spacer', () => {
10
+ it('has smallest size from spacing scale by default', () => {
11
+ const expectedSize = 4 // from __fixtures__/testTheme.js
12
+ const { getByTestId } = render(<Spacer testID={testID} />, { wrapper: Theme })
13
+ expect(getByTestId(testID)).toHaveStyle({
14
+ height: expectedSize
15
+ })
16
+ })
17
+
18
+ it('has size from spacing scale if space prop passed', () => {
19
+ const expectedSize = 8 // from __fixtures__/testTheme.js
20
+ const { getByTestId } = render(<Spacer space={2} testID={testID} />, { wrapper: Theme })
21
+ expect(getByTestId(testID)).toHaveStyle({
22
+ height: expectedSize
23
+ })
24
+ })
25
+
26
+ it('has no size if 0 passed in', () => {
27
+ const expectedSize = 0
28
+ const { getByTestId } = render(<Spacer space={0} testID={testID} />, { wrapper: Theme })
29
+ expect(getByTestId(testID)).toHaveStyle({
30
+ height: expectedSize
31
+ })
32
+ })
33
+ })
34
+
35
+ describe('Spacer (row)', () => {
36
+ it('has smallest size from spacing scale by default', () => {
37
+ const expectedSize = 4 // from __fixtures__/testTheme.js
38
+ const { getByTestId } = render(<Spacer testID={testID} direction="row" />, { wrapper: Theme })
39
+ expect(getByTestId(testID)).toHaveStyle({
40
+ width: expectedSize
41
+ })
42
+ })
43
+
44
+ it('has size from spacing scale if space prop passed', () => {
45
+ const expectedSize = 8 // from __fixtures__/testTheme.js
46
+ const { getByTestId } = render(<Spacer space={2} testID={testID} direction="row" />, {
47
+ wrapper: Theme
48
+ })
49
+ expect(getByTestId(testID)).toHaveStyle({
50
+ width: expectedSize
51
+ })
52
+ })
53
+
54
+ it('has no size if 0 passed in', () => {
55
+ const expectedSize = 0
56
+ const { getByTestId } = render(<Spacer space={0} testID={testID} direction="row" />, {
57
+ wrapper: Theme
58
+ })
59
+ expect(getByTestId(testID)).toHaveStyle({
60
+ width: expectedSize
61
+ })
62
+ })
63
+ })