@nypl/design-system-react-components 0.25.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/components/Accordion/Accordion.d.ts +14 -14
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
  4. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
  5. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  6. package/dist/components/Card/Card.d.ts +1 -1
  7. package/dist/components/Card/CardTypes.d.ts +2 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
  9. package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
  10. package/dist/components/DatePicker/DatePicker.d.ts +3 -3
  11. package/dist/components/Form/Form.d.ts +13 -8
  12. package/dist/components/Form/FormTypes.d.ts +2 -8
  13. package/dist/components/Grid/GridTypes.d.ts +9 -0
  14. package/dist/components/Grid/SimpleGrid.d.ts +14 -0
  15. package/dist/components/Heading/Heading.d.ts +4 -4
  16. package/dist/components/Hero/Hero.d.ts +19 -14
  17. package/dist/components/Hero/HeroTypes.d.ts +10 -5
  18. package/dist/components/Icons/Icon.d.ts +13 -16
  19. package/dist/components/Icons/IconTypes.d.ts +78 -64
  20. package/dist/components/Label/Label.d.ts +5 -17
  21. package/dist/components/Link/Link.d.ts +8 -12
  22. package/dist/components/SearchBar/SearchBar.d.ts +45 -27
  23. package/dist/components/Select/Select.d.ts +32 -35
  24. package/dist/components/Select/SelectTypes.d.ts +4 -0
  25. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
  26. package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
  27. package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
  28. package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
  29. package/dist/components/Template/Template.d.ts +91 -0
  30. package/dist/components/Text/Text.d.ts +16 -0
  31. package/dist/components/Text/TextTypes.d.ts +6 -0
  32. package/dist/components/TextInput/TextInput.d.ts +32 -31
  33. package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
  34. package/dist/design-system-react-components.cjs.development.js +2597 -1170
  35. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  36. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  37. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  38. package/dist/design-system-react-components.esm.js +2580 -1173
  39. package/dist/design-system-react-components.esm.js.map +1 -1
  40. package/dist/index.d.ts +8 -1
  41. package/dist/styles.css +1 -1
  42. package/dist/theme/components/accordion.d.ts +25 -0
  43. package/dist/theme/components/breadcrumb.d.ts +90 -0
  44. package/dist/theme/components/button.d.ts +17 -7
  45. package/dist/theme/components/checkbox.d.ts +7 -7
  46. package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
  47. package/dist/theme/components/customRadioGroup.d.ts +4 -3
  48. package/dist/theme/components/global.d.ts +55 -0
  49. package/dist/theme/components/globalMixins.d.ts +15 -0
  50. package/dist/theme/components/heading.d.ts +50 -20
  51. package/dist/theme/components/hero.d.ts +492 -0
  52. package/dist/theme/components/icon.d.ts +13 -0
  53. package/dist/theme/components/label.d.ts +16 -0
  54. package/dist/theme/components/link.d.ts +45 -0
  55. package/dist/theme/components/radio.d.ts +8 -7
  56. package/dist/theme/components/searchBar.d.ts +20 -0
  57. package/dist/theme/components/select.d.ts +58 -0
  58. package/dist/theme/components/statusBadge.d.ts +25 -0
  59. package/dist/theme/components/tabs.d.ts +9 -9
  60. package/dist/theme/components/template.d.ts +105 -0
  61. package/dist/theme/components/text.d.ts +20 -0
  62. package/dist/theme/components/textInput.d.ts +105 -0
  63. package/dist/theme/foundations/global.d.ts +3 -0
  64. package/dist/theme/foundations/shadows.d.ts +4 -0
  65. package/dist/utils/utils.d.ts +6 -0
  66. package/package.json +3 -2
  67. package/src/components/Accordion/Accordion.stories.mdx +227 -33
  68. package/src/components/Accordion/Accordion.test.tsx +135 -19
  69. package/src/components/Accordion/Accordion.tsx +81 -56
  70. package/src/components/Autosuggest/Autosuggest.stories.mdx +1 -1
  71. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
  72. package/src/components/Autosuggest/_Autosuggest.scss +2 -2
  73. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +46 -52
  74. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
  75. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
  76. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
  77. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
  78. package/src/components/Button/Button.stories.mdx +31 -27
  79. package/src/components/Button/Button.test.tsx +17 -5
  80. package/src/components/Button/ButtonTypes.tsx +1 -0
  81. package/src/components/Button/_Button.scss +3 -27
  82. package/src/components/Button/__snapshots__/Button.test.tsx.snap +11 -0
  83. package/src/components/Card/Card.stories.mdx +24 -20
  84. package/src/components/Card/Card.test.tsx +13 -19
  85. package/src/components/Card/Card.tsx +1 -1
  86. package/src/components/Card/CardTypes.tsx +2 -2
  87. package/src/components/Card/_Card.scss +1 -1
  88. package/src/components/CardEdition/CardEdition.stories.tsx +11 -6
  89. package/src/components/CardEdition/CardEdition.test.tsx +23 -31
  90. package/src/components/CardEdition/_CardEdition.scss +2 -2
  91. package/src/components/Chakra/Center.stories.mdx +31 -14
  92. package/src/components/Chakra/Grid.stories.mdx +79 -0
  93. package/src/components/Chakra/Stack.stories.mdx +4 -4
  94. package/src/components/Checkbox/Checkbox.tsx +9 -12
  95. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +2 -5
  96. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
  97. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
  98. package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
  99. package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
  100. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
  101. package/src/components/DatePicker/DatePicker.test.tsx +4 -4
  102. package/src/components/DatePicker/DatePicker.tsx +13 -13
  103. package/src/components/DatePicker/_DatePicker.scss +1 -0
  104. package/src/components/Form/Form.stories.mdx +46 -21
  105. package/src/components/Form/Form.test.tsx +58 -45
  106. package/src/components/Form/Form.tsx +49 -21
  107. package/src/components/Form/FormTypes.tsx +3 -8
  108. package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
  109. package/src/components/Grid/GridTypes.tsx +9 -0
  110. package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
  111. package/src/components/Grid/SimpleGrid.test.tsx +66 -0
  112. package/src/components/Grid/SimpleGrid.tsx +37 -0
  113. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
  114. package/src/components/Heading/Heading.stories.mdx +1 -0
  115. package/src/components/Heading/Heading.tsx +12 -6
  116. package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
  117. package/src/components/Hero/Hero.stories.mdx +188 -121
  118. package/src/components/Hero/Hero.test.tsx +537 -107
  119. package/src/components/Hero/Hero.tsx +79 -92
  120. package/src/components/Hero/HeroTypes.tsx +17 -5
  121. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
  122. package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
  123. package/src/components/Icons/Icon.stories.mdx +83 -74
  124. package/src/components/Icons/Icon.test.tsx +30 -22
  125. package/src/components/Icons/Icon.tsx +63 -61
  126. package/src/components/Icons/IconTypes.tsx +80 -64
  127. package/src/components/Input/_Input.scss +2 -2
  128. package/src/components/Label/Label.stories.mdx +28 -7
  129. package/src/components/Label/Label.test.tsx +43 -12
  130. package/src/components/Label/Label.tsx +21 -34
  131. package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
  132. package/src/components/Link/Link.stories.mdx +41 -41
  133. package/src/components/Link/Link.test.tsx +33 -44
  134. package/src/components/Link/Link.tsx +114 -100
  135. package/src/components/List/List.stories.mdx +0 -2
  136. package/src/components/List/List.stories.tsx +5 -5
  137. package/src/components/List/_List.scss +3 -3
  138. package/src/components/Modal/_Modal.scss +1 -1
  139. package/src/components/Notification/Notification.stories.mdx +12 -1
  140. package/src/components/Notification/Notification.test.tsx +3 -16
  141. package/src/components/Notification/Notification.tsx +9 -10
  142. package/src/components/Notification/_Notification.scss +4 -4
  143. package/src/components/Pagination/Pagination.test.tsx +16 -10
  144. package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
  145. package/src/components/RadioGroup/RadioGroup.tsx +2 -10
  146. package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
  147. package/src/components/SearchBar/SearchBar.stories.mdx +189 -219
  148. package/src/components/SearchBar/SearchBar.tsx +151 -46
  149. package/src/components/Select/Select.stories.mdx +188 -170
  150. package/src/components/Select/Select.test.tsx +125 -380
  151. package/src/components/Select/Select.tsx +118 -165
  152. package/src/components/Select/SelectTypes.tsx +4 -0
  153. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +13 -25
  154. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
  155. package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
  156. package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
  157. package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
  158. package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
  159. package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
  160. package/src/components/StatusBadge/StatusBadge.tsx +24 -25
  161. package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
  162. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
  163. package/src/components/StyleGuide/Bidirectionality.stories.mdx +16 -16
  164. package/src/components/StyleGuide/Buttons.stories.mdx +15 -15
  165. package/src/components/StyleGuide/Colors.stories.mdx +336 -0
  166. package/src/components/StyleGuide/Iconography.stories.mdx +88 -90
  167. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  168. package/src/components/Tabs/Tabs.tsx +7 -9
  169. package/src/components/Template/Template.stories.mdx +574 -0
  170. package/src/components/Template/Template.test.tsx +124 -0
  171. package/src/components/Template/Template.tsx +226 -0
  172. package/src/components/Text/Text.stories.mdx +70 -0
  173. package/src/components/Text/Text.test.tsx +63 -0
  174. package/src/components/Text/Text.tsx +55 -0
  175. package/src/components/Text/TextTypes.tsx +6 -0
  176. package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
  177. package/src/components/TextInput/TextInput.stories.mdx +89 -90
  178. package/src/components/TextInput/TextInput.test.tsx +65 -86
  179. package/src/components/TextInput/TextInput.tsx +101 -95
  180. package/src/components/TextInput/TextInputTypes.tsx +6 -0
  181. package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
  182. package/src/docs/Chakra.stories.mdx +4 -4
  183. package/src/docs/Intro.stories.mdx +15 -13
  184. package/src/index.ts +20 -0
  185. package/src/styles/01-colors/_colors-brand.scss +6 -0
  186. package/src/styles/01-colors/_colors-utility.scss +14 -12
  187. package/src/styles/base/_04-base.scss +2 -1
  188. package/src/styles/base/_place-holder.scss +1 -1
  189. package/src/styles.scss +10 -12
  190. package/src/theme/components/accordion.ts +30 -0
  191. package/src/theme/components/breadcrumb.ts +77 -0
  192. package/src/theme/components/button.ts +77 -63
  193. package/src/theme/components/checkbox.ts +15 -27
  194. package/src/theme/components/customCheckboxGroup.ts +12 -0
  195. package/src/theme/components/customRadioGroup.ts +4 -10
  196. package/src/theme/components/global.ts +71 -0
  197. package/src/theme/components/globalMixins.ts +16 -0
  198. package/src/theme/components/heading.ts +15 -8
  199. package/src/theme/components/hero.ts +239 -0
  200. package/src/theme/components/icon.ts +79 -0
  201. package/src/theme/components/label.ts +17 -0
  202. package/src/theme/components/link.ts +47 -0
  203. package/src/theme/components/radio.ts +20 -31
  204. package/src/theme/components/searchBar.ts +21 -0
  205. package/src/theme/components/select.ts +50 -0
  206. package/src/theme/components/statusBadge.ts +27 -0
  207. package/src/theme/components/tabs.ts +72 -69
  208. package/src/theme/components/template.ts +114 -0
  209. package/src/theme/components/text.ts +31 -0
  210. package/src/theme/components/textInput.ts +61 -0
  211. package/src/theme/foundations/colors.ts +29 -13
  212. package/src/theme/foundations/global.ts +3 -0
  213. package/src/theme/foundations/shadows.ts +5 -0
  214. package/src/theme/index.ts +37 -7
  215. package/src/utils/componentCategories.ts +8 -2
  216. package/src/utils/utils.ts +13 -0
  217. package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
  218. package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
  219. package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
  220. package/dist/components/Template/Template.stories.d.ts +0 -30
  221. package/src/components/Accordion/Accordion.stories.tsx +0 -66
  222. package/src/components/Accordion/_Accordion.scss +0 -81
  223. package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
  224. package/src/components/Form/_Form.scss +0 -67
  225. package/src/components/Hero/_Hero.scss +0 -256
  226. package/src/components/Icons/_Icons.scss +0 -116
  227. package/src/components/Label/_Label.scss +0 -22
  228. package/src/components/Link/_Link.scss +0 -73
  229. package/src/components/SearchBar/_SearchBar.scss +0 -16
  230. package/src/components/Select/_Select.scss +0 -82
  231. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
  232. package/src/components/StatusBadge/_StatusBadge.scss +0 -23
  233. package/src/components/StyleGuide/Colors.stories.tsx +0 -289
  234. package/src/components/Template/Template.stories.tsx +0 -86
  235. package/src/components/Template/_Template.scss +0 -63
  236. package/src/components/TextInput/_TextInput.scss +0 -59
@@ -1,250 +1,146 @@
1
1
  import * as React from "react";
2
- import { fireEvent, render, screen } from "@testing-library/react";
2
+ import { render, screen, fireEvent } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
4
 
5
5
  import Select from "./Select";
6
6
 
7
+ const baseProps = {
8
+ labelText: "What is your favorite color?",
9
+ helperText: "This is the helper text.",
10
+ name: "color",
11
+ };
12
+ const baseOptions = (
13
+ <>
14
+ <option value="red">Red</option>
15
+ <option value="green">Green</option>
16
+ <option value="blue">Blue</option>
17
+ <option value="black">Black</option>
18
+ <option value="white">White</option>
19
+ </>
20
+ );
21
+
7
22
  describe("Select Accessibility", () => {
8
23
  it("passes axe accessibility test", async () => {
9
- const { container } = render(
10
- <Select
11
- labelText="Select Label"
12
- onChange={jest.fn()}
13
- onBlur={jest.fn()}
14
- name="test"
15
- >
16
- <option aria-selected={true}>test1</option>
17
- <option aria-selected={false}>test2</option>
18
- </Select>
19
- );
24
+ const { container } = render(<Select {...baseProps}>{baseOptions}</Select>);
20
25
  expect(await axe(container)).toHaveNoViolations();
21
26
  });
22
27
  });
23
28
 
24
29
  describe("Select", () => {
25
- let utils;
26
- const changeCallback = jest.fn();
27
- const blurCallback = jest.fn();
30
+ it("renders a label, select, option, and helper text DOM elements", () => {
31
+ render(<Select {...baseProps}>{baseOptions}</Select>);
28
32
 
29
- it("Renders a select DOM element", () => {
30
- utils = render(
31
- <Select
32
- labelText="Select Label"
33
- onChange={changeCallback}
34
- onBlur={blurCallback}
35
- name="test"
36
- >
37
- <option aria-selected={true}>test1</option>
38
- <option aria-selected={false}>test2</option>
39
- </Select>
40
- );
41
- expect(utils.container.querySelector(".select")).toBeInTheDocument();
33
+ expect(
34
+ screen.getByLabelText(/What is your favorite color/i)
35
+ ).toBeInTheDocument();
36
+ expect(screen.getByRole("combobox")).toBeInTheDocument();
37
+ expect(screen.getAllByRole("option")).toHaveLength(5);
38
+ expect(screen.getByText(/This is the helper text/i)).toBeInTheDocument();
42
39
  });
43
40
 
44
- it("Renders a name attribute to use in forms", () => {
45
- utils = render(
46
- <Select
47
- labelText="Select Label"
48
- onChange={changeCallback}
49
- onBlur={blurCallback}
50
- name="test2"
51
- >
52
- <option aria-selected={true}>test1</option>
53
- <option aria-selected={false}>test2</option>
54
- </Select>
55
- );
56
- expect(screen.getByLabelText("Select Label")).toHaveAttribute(
57
- "name",
58
- "test2"
59
- );
41
+ it("renders a name attribute to use in forms", () => {
42
+ render(<Select {...baseProps}>{baseOptions}</Select>);
43
+ expect(
44
+ screen.getByLabelText(/What is your favorite color/i)
45
+ ).toHaveAttribute("name", "color");
60
46
  });
61
47
 
62
- it("Renders an aria-label", () => {
63
- utils = render(
64
- <Select
65
- labelText="Select Label"
66
- onChange={changeCallback}
67
- onBlur={blurCallback}
68
- showLabel={false}
69
- name="test3"
70
- >
71
- <option aria-selected={true}>test1</option>
72
- <option aria-selected={false}>test2</option>
73
- </Select>
74
- );
75
- expect(screen.getByLabelText("Select Label")).toHaveAttribute(
76
- "aria-label",
77
- "Select Label"
78
- );
79
- });
48
+ it("renders an aria-label attribute when `showLabel` is false", () => {
49
+ const { rerender } = render(<Select {...baseProps}>{baseOptions}</Select>);
80
50
 
81
- it("Renders an aria-label based on deprecated prop", () => {
82
- utils = render(
83
- <Select
84
- labelText="Select Label"
85
- ariaLabel="Aria Label"
86
- onChange={changeCallback}
87
- onBlur={blurCallback}
88
- showLabel={false}
89
- name="test3"
90
- >
91
- <option aria-selected={true}>test1</option>
92
- <option aria-selected={false}>test2</option>
51
+ expect(
52
+ screen.getByLabelText(/What is your favorite color/i)
53
+ ).not.toHaveAttribute("aria-label");
54
+
55
+ rerender(
56
+ <Select {...baseProps} showLabel={false}>
57
+ {baseOptions}
93
58
  </Select>
94
59
  );
95
- expect(screen.getByLabelText("Aria Label")).toHaveAttribute(
60
+ expect(
61
+ screen.getByLabelText(/What is your favorite color/i)
62
+ ).toHaveAttribute(
96
63
  "aria-label",
97
- "Aria Label"
64
+ "What is your favorite color? - This is the helper text."
98
65
  );
99
66
  });
100
67
 
101
- it("Renders aria-describedby when helperText prop is passed", () => {
102
- utils = render(
103
- <Select
104
- id="custom-select-id"
105
- showLabel={true}
106
- labelText="Select Label"
107
- onChange={changeCallback}
108
- onBlur={blurCallback}
109
- helperText="example helper text"
110
- name="test4"
111
- >
112
- <option aria-selected={true}>test1</option>
113
- <option aria-selected={false}>test2</option>
68
+ it("renders aria-describedby when helperText prop is passed", () => {
69
+ const id = "test-describe";
70
+ render(
71
+ <Select {...baseProps} id={id}>
72
+ {baseOptions}
114
73
  </Select>
115
74
  );
116
- expect(screen.getByLabelText(/Select Label/i)).toHaveAttribute(
117
- "aria-describedby",
118
- "custom-select-id-helperText"
119
- );
75
+
76
+ expect(
77
+ screen.getByLabelText(/What is your favorite color/i)
78
+ ).toHaveAttribute("aria-describedby", `${id}-helperText`);
120
79
  });
121
80
 
122
- it("Renders required or optional text in the label", () => {
123
- const utils = render(
124
- <Select
125
- id="custom-select-id"
126
- labelText="Select Label"
127
- showLabel={true}
128
- onChange={changeCallback}
129
- onBlur={blurCallback}
130
- name="test4"
131
- required
132
- >
133
- <option aria-selected={true}>test1</option>
134
- <option aria-selected={false}>test2</option>
81
+ it("renders required or optional text in the label", () => {
82
+ const { rerender } = render(<Select {...baseProps}>{baseOptions}</Select>);
83
+ expect(screen.getByText(/Optional/i)).toBeInTheDocument();
84
+
85
+ rerender(
86
+ <Select {...baseProps} isRequired>
87
+ {baseOptions}
135
88
  </Select>
136
89
  );
137
- expect(screen.getByLabelText(/Select Label/i)).toBeInTheDocument();
138
90
  expect(screen.getByText(/Required/i)).toBeInTheDocument();
139
- expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
140
91
 
141
- utils.rerender(
142
- <Select
143
- id="custom-select-id"
144
- labelText="Select Label"
145
- showLabel={true}
146
- onChange={changeCallback}
147
- onBlur={blurCallback}
148
- name="test4"
149
- required={false}
150
- >
151
- <option aria-selected={true}>test1</option>
152
- <option aria-selected={false}>test2</option>
92
+ rerender(
93
+ <Select {...baseProps} showOptReqLabel={false}>
94
+ {baseOptions}
153
95
  </Select>
154
96
  );
97
+ expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
155
98
 
156
- expect(screen.getByLabelText(/Select Label/i)).toBeInTheDocument();
157
- expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
158
- expect(screen.getByText(/Optional/i)).toBeInTheDocument();
159
- });
160
-
161
- it("Renders required and aria-required attributes when 'showLabel' is false", () => {
162
- render(
163
- <Select
164
- id="custom-select-id"
165
- labelText="Select Label"
166
- showLabel={false}
167
- onChange={changeCallback}
168
- onBlur={blurCallback}
169
- name="test4"
170
- required
171
- >
172
- <option aria-selected={true}>test1</option>
173
- <option aria-selected={false}>test2</option>
99
+ rerender(
100
+ <Select {...baseProps} isRequired showOptReqLabel={false}>
101
+ {baseOptions}
174
102
  </Select>
175
103
  );
176
- expect(screen.queryByText(/required/i)).not.toBeInTheDocument();
177
- expect(screen.getByLabelText("Select Label")).toHaveAttribute(
178
- "aria-required"
179
- );
180
- expect(screen.getByLabelText("Select Label")).toHaveAttribute("required");
104
+ expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
181
105
  });
182
106
 
183
- it("Should not render a required label if 'showOptReqLabel' flag is false, but still render the label", () => {
107
+ it("renders required and aria-required attributes when 'showLabel' is false", () => {
184
108
  render(
185
- <Select
186
- id="custom-select-id"
187
- labelText="Select Label"
188
- onChange={changeCallback}
189
- onBlur={blurCallback}
190
- name="test4"
191
- required
192
- showOptReqLabel={false}
193
- >
194
- <option aria-selected={true}>test1</option>
195
- <option aria-selected={false}>test2</option>
109
+ <Select {...baseProps} isRequired showLabel={false}>
110
+ {baseOptions}
196
111
  </Select>
197
112
  );
198
- expect(screen.queryByText(/required/i)).not.toBeInTheDocument();
199
- expect(screen.getByLabelText("Select Label")).toBeInTheDocument();
113
+ expect(screen.queryByText(/equired/i)).not.toBeInTheDocument();
114
+ expect(
115
+ screen.getByLabelText(/What is your favorite color/i)
116
+ ).toHaveAttribute("aria-required");
117
+ expect(
118
+ screen.getByLabelText(/What is your favorite color/i)
119
+ ).toHaveAttribute("required");
200
120
  });
201
121
 
202
- it("Renders required and aria-required attributes using deprecated prop", () => {
122
+ it("should not render a required label if 'showOptReqLabel' flag is false, but still render the label", () => {
203
123
  render(
204
- <Select
205
- id="custom-select-id"
206
- labelText="Select Label"
207
- onChange={changeCallback}
208
- onBlur={blurCallback}
209
- name="test4"
210
- isRequired
211
- >
212
- <option aria-selected={true}>test1</option>
213
- <option aria-selected={false}>test2</option>
124
+ <Select {...baseProps} isRequired showOptReqLabel={false}>
125
+ {baseOptions}
214
126
  </Select>
215
127
  );
216
- expect(screen.getByLabelText("Select Label")).toHaveAttribute(
217
- "aria-required"
218
- );
219
- expect(screen.getByLabelText("Select Label")).toHaveAttribute("required");
128
+ expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
129
+ expect(
130
+ screen.getByLabelText(/What is your favorite color/i)
131
+ ).toBeInTheDocument();
220
132
  });
221
133
 
222
- it("Renders helper text when helperText prop is passed", () => {
223
- render(
224
- <Select
225
- id="custom-select-id"
226
- labelText="Select Label"
227
- helperText="The helper text."
228
- name="test4"
229
- >
230
- <option aria-selected={true}>test1</option>
231
- <option aria-selected={false}>test2</option>
232
- </Select>
233
- );
134
+ it("renders helper text when helperText prop is passed", () => {
135
+ render(<Select {...baseProps}>{baseOptions}</Select>);
234
136
 
235
- expect(screen.getByText("The helper text.")).toBeInTheDocument();
137
+ expect(screen.getByText("This is the helper text.")).toBeInTheDocument();
236
138
  });
237
139
 
238
- it("Renders default error text when 'invalidText' prop is not passed and 'errored' prop is set to true", () => {
140
+ it("renders default error text when 'invalidText' prop is not passed and 'isInvalid' prop is set to true", () => {
239
141
  render(
240
- <Select
241
- id="custom-select-id"
242
- labelText="Select Label"
243
- name="test4"
244
- errored
245
- >
246
- <option aria-selected={true}>test1</option>
247
- <option aria-selected={false}>test2</option>
142
+ <Select {...baseProps} isInvalid>
143
+ {baseOptions}
248
144
  </Select>
249
145
  );
250
146
 
@@ -253,216 +149,71 @@ describe("Select", () => {
253
149
  ).toBeInTheDocument();
254
150
  });
255
151
 
256
- it("Renders custom error text when 'invalidText' prop is passed and 'errored' prop is set to true", () => {
152
+ it("renders custom error text when 'invalidText' prop is passed and 'isInvalid' prop is set to true", () => {
257
153
  render(
258
154
  <Select
259
- id="custom-select-id"
260
- labelText="Select Label"
261
- invalidText="Custom error text!"
262
- name="test4"
263
- errored
155
+ {...baseProps}
156
+ invalidText="This is a custom error text!"
157
+ isInvalid
264
158
  >
265
- <option aria-selected={true}>test1</option>
266
- <option aria-selected={false}>test2</option>
159
+ {baseOptions}
267
160
  </Select>
268
161
  );
269
- expect(screen.getByText("Custom error text!")).toBeInTheDocument();
162
+ expect(
163
+ screen.getByText("This is a custom error text!")
164
+ ).toBeInTheDocument();
270
165
  });
271
166
 
272
- it("Calls the onChange callback", () => {
167
+ it("updates the value through a ref", () => {
168
+ const selectRef = React.createRef<HTMLSelectElement>();
273
169
  render(
274
- <Select
275
- labelText="Select Label"
276
- labelId="label"
277
- isRequired={false}
278
- id="hi"
279
- onChange={changeCallback}
280
- onBlur={blurCallback}
281
- name="test5"
282
- >
283
- <option aria-selected={true}>test1</option>
284
- <option aria-selected={false}>test2</option>
170
+ <Select {...baseProps} ref={selectRef}>
171
+ {baseOptions}
285
172
  </Select>
286
173
  );
287
174
 
288
- expect(changeCallback).toHaveBeenCalledTimes(0);
289
- fireEvent.change(screen.getByLabelText("Select Label"), {
290
- target: { value: "test2" },
291
- });
292
- expect(changeCallback).toHaveBeenCalledTimes(1);
293
- });
175
+ expect(selectRef.current.value).toEqual("red");
294
176
 
295
- it("Calls the callback onChange function with the updated value", () => {
296
- let currentValue = "";
297
- const onChange = (event) => {
298
- currentValue = event?.target?.value;
299
- };
300
- render(
301
- <Select
302
- labelText="Select Label"
303
- labelId="label"
304
- isRequired={false}
305
- id="update-value"
306
- onChange={onChange}
307
- onBlur={blurCallback}
308
- name="test6"
309
- >
310
- <option aria-selected={false}>value1</option>
311
- <option aria-selected={false}>value2</option>
312
- <option aria-selected={false}>value3</option>
313
- </Select>
314
- );
315
- fireEvent.change(screen.getByLabelText("Select Label"), {
316
- target: { value: "value2" },
317
- });
318
- expect(currentValue).toEqual("value2");
319
-
320
- fireEvent.change(screen.getByLabelText("Select Label"), {
321
- target: { value: "value3" },
177
+ fireEvent.change(screen.getByRole("combobox"), {
178
+ target: { value: "blue" },
322
179
  });
323
- expect(currentValue).toEqual("value3");
180
+ expect(selectRef.current.value).toEqual("blue");
324
181
 
325
- fireEvent.change(screen.getByLabelText("Select Label"), {
326
- target: { value: "value1" },
182
+ fireEvent.change(screen.getByRole("combobox"), {
183
+ target: { value: "white" },
327
184
  });
328
- expect(currentValue).toEqual("value1");
185
+ expect(selectRef.current.value).toEqual("white");
329
186
  });
330
187
 
331
- it("Calls the onBlur callback", () => {
332
- render(
333
- <Select
334
- labelText="Select Label"
335
- id="hi"
336
- labelId="label"
337
- isRequired={false}
338
- onChange={changeCallback}
339
- onBlur={blurCallback}
340
- name="test7"
341
- >
342
- <option aria-selected={true}>test1</option>
343
- <option aria-selected={false}>test2</option>
344
- </Select>
345
- );
346
- expect(blurCallback).toHaveBeenCalledTimes(0);
347
- fireEvent.blur(screen.getByLabelText("Select Label"));
348
- expect(blurCallback).toHaveBeenCalledTimes(1);
349
- });
350
-
351
- it("Calls the callback onBlur function with the updated value", () => {
352
- let currentValue = "";
353
- const onBlur = (event) => {
354
- currentValue = event?.target?.value;
188
+ it("calls the onChange callback function", () => {
189
+ let value = "red";
190
+ const changeCallback = (e) => {
191
+ value = e.target.value;
355
192
  };
356
193
  render(
357
- <Select
358
- labelText="Select Label"
359
- labelId="label"
360
- isRequired={false}
361
- id="update-value"
362
- onChange={changeCallback}
363
- onBlur={onBlur}
364
- name="test8"
365
- >
366
- <option aria-selected={false}>value1</option>
367
- <option aria-selected={false}>value2</option>
368
- <option aria-selected={false}>value3</option>
194
+ <Select {...baseProps} onChange={changeCallback} value={value}>
195
+ {baseOptions}
369
196
  </Select>
370
197
  );
371
198
 
372
- fireEvent.blur(screen.getByLabelText("Select Label"), {
373
- target: { value: "value2" },
374
- });
375
- expect(currentValue).toEqual("value2");
199
+ expect(value).toEqual("red");
376
200
 
377
- fireEvent.blur(screen.getByLabelText("Select Label"), {
378
- target: { value: "value3" },
201
+ fireEvent.change(screen.getByRole("combobox"), {
202
+ target: { value: "blue" },
379
203
  });
380
- expect(currentValue).toEqual("value3");
204
+ expect(value).toEqual("blue");
381
205
 
382
- fireEvent.blur(screen.getByLabelText("Select Label"), {
383
- target: { value: "value1" },
206
+ fireEvent.change(screen.getByRole("combobox"), {
207
+ target: { value: "white" },
384
208
  });
385
- expect(currentValue).toEqual("value1");
209
+ expect(value).toEqual("white");
386
210
  });
387
211
 
388
- it("Displays the selected option onLoad when passed selectedOption", () => {
389
- render(
390
- <Select
391
- labelText="Select Label"
392
- labelId="label"
393
- isRequired={false}
394
- id="hi"
395
- selectedOption="test2"
396
- onChange={changeCallback}
397
- onBlur={blurCallback}
398
- name="test9"
399
- >
400
- <option aria-selected={true}>test1</option>
401
- <option aria-selected={false}>test2</option>
402
- </Select>
403
- );
404
- expect(screen.getByText("test2")).toBeInTheDocument();
405
- });
406
-
407
- it("Calls the correct handlers when a new value is selected", () => {
408
- render(
409
- <Select
410
- labelText="Select Label"
411
- labelId="label"
412
- isRequired={false}
413
- id="state-change"
414
- onChange={changeCallback}
415
- onBlur={blurCallback}
416
- selectedOption="value1"
417
- name="test10"
418
- >
419
- <option aria-selected={false}>value1</option>
420
- <option aria-selected={false}>value2</option>
421
- <option aria-selected={false}>value3</option>
422
- </Select>
423
- );
424
-
425
- fireEvent.change(screen.getByLabelText("Select Label"), {
426
- target: { value: "value2" },
427
- });
428
- expect(changeCallback).toHaveBeenCalled();
429
-
430
- fireEvent.blur(screen.getByLabelText("Select Label"), {
431
- target: { value: "value3" },
432
- });
433
- expect(blurCallback).toHaveBeenCalled();
434
- });
435
-
436
- // TODO:
437
- // it("Passes the ref to the select element", () => {
438
- // const ref = React.createRef<HTMLSelectElement>();
439
- // const container = render(
440
- // <Select
441
- // labelText="Select Label"
442
- // labelId="label"
443
- // isRequired={false}
444
- // id="ref-test"
445
- // name="test11"
446
- // ref={ref}
447
- // >
448
- // <option aria-selected={false}>test1</option>
449
- // <option aria-selected={false}>test2</option>
450
- // </Select>
451
- // );
452
- // expect(container.find("select").instance()).toEqual(ref.current);
453
- // });
454
-
455
212
  it("should throw warning when fewer than 4 options", () => {
456
213
  const warn = jest.spyOn(console, "warn");
457
214
  render(
458
- <Select
459
- labelText="Select Label"
460
- labelId="label"
461
- isRequired={false}
462
- id="ref-test"
463
- name="test1"
464
- >
465
- <option aria-selected={false}>test1</option>
215
+ <Select {...baseProps}>
216
+ <option value="red">Red</option>
466
217
  </Select>
467
218
  );
468
219
  expect(warn).toHaveBeenCalledWith(
@@ -473,13 +224,7 @@ describe("Select", () => {
473
224
  it("should throw warning when there are more than 10 options", () => {
474
225
  const warn = jest.spyOn(console, "warn");
475
226
  render(
476
- <Select
477
- labelText="Select Label"
478
- labelId="label"
479
- isRequired={false}
480
- id="ref-test"
481
- name="test1"
482
- >
227
+ <Select {...baseProps}>
483
228
  <option aria-selected={false}>test1</option>
484
229
  <option aria-selected={false}>test2</option>
485
230
  <option aria-selected={false}>test3</option>