@dxc-technology/halstack-react 0.0.0-e792e0c → 0.0.0-e832ef8
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/babel.config.js +6 -2
- package/dist/BackgroundColorContext.js +46 -0
- package/dist/ThemeContext.js +235 -2
- package/dist/V3Textarea/V3Textarea.js +264 -0
- package/dist/accordion/Accordion.js +170 -81
- package/dist/accordion-group/AccordionGroup.js +186 -0
- package/dist/alert/Alert.js +184 -83
- package/dist/alert/index.d.ts +51 -0
- package/dist/badge/Badge.js +63 -0
- package/dist/box/Box.js +31 -23
- package/dist/button/Button.js +82 -27
- package/dist/card/Card.js +72 -35
- package/dist/checkbox/Checkbox.js +108 -32
- package/dist/chip/Chip.js +129 -35
- package/dist/common/RequiredComponent.js +2 -8
- package/dist/common/utils.js +2 -22
- package/dist/common/variables.js +1459 -197
- package/dist/date/Date.js +86 -64
- package/dist/date-input/DateInput.js +400 -0
- package/dist/date-input/index.d.ts +95 -0
- package/dist/dialog/Dialog.js +58 -37
- package/dist/dropdown/Dropdown.js +226 -94
- package/dist/file-input/FileInput.js +644 -0
- package/dist/file-input/FileItem.js +280 -0
- package/dist/file-input/index.d.ts +81 -0
- package/dist/footer/Footer.js +122 -47
- package/dist/footer/Icons.js +77 -0
- package/dist/header/Header.js +171 -91
- package/dist/header/Icons.js +59 -0
- package/dist/heading/Heading.js +81 -22
- package/dist/input-text/Icons.js +22 -0
- package/dist/input-text/InputText.js +293 -107
- package/dist/layout/ApplicationLayout.js +327 -0
- package/dist/layout/Icons.js +55 -0
- package/dist/link/Link.js +136 -35
- package/dist/main.d.ts +8 -0
- package/dist/main.js +111 -7
- package/dist/new-select/NewSelect.js +836 -0
- package/dist/new-select/index.d.ts +53 -0
- package/dist/number-input/NumberInput.js +136 -0
- package/dist/number-input/NumberInputContext.js +16 -0
- package/dist/number-input/index.d.ts +113 -0
- package/dist/paginator/Icons.js +66 -0
- package/dist/paginator/Paginator.js +162 -57
- package/dist/password-input/PasswordInput.js +198 -0
- package/dist/password-input/index.d.ts +94 -0
- package/dist/progress-bar/ProgressBar.js +97 -44
- package/dist/radio/Radio.js +39 -21
- package/dist/resultsetTable/ResultsetTable.js +93 -69
- package/dist/select/Select.js +250 -143
- package/dist/sidenav/Sidenav.js +85 -143
- package/dist/slider/Slider.js +219 -73
- package/dist/spinner/Spinner.js +249 -64
- package/dist/switch/Switch.js +51 -26
- package/dist/table/Table.js +63 -15
- package/dist/tabs/Tabs.js +208 -35
- package/dist/tabs-for-sections/TabsForSections.js +1 -16
- package/dist/tag/Tag.js +100 -35
- package/dist/text-input/TextInput.js +971 -0
- package/dist/text-input/index.d.ts +135 -0
- package/dist/textarea/Textarea.js +250 -107
- package/dist/textarea/index.d.ts +117 -0
- package/dist/toggle/Toggle.js +16 -19
- package/dist/toggle-group/ToggleGroup.js +327 -0
- package/dist/upload/Upload.js +16 -11
- package/dist/upload/buttons-upload/ButtonsUpload.js +35 -25
- package/dist/upload/buttons-upload/Icons.js +40 -0
- package/dist/upload/dragAndDropArea/DragAndDropArea.js +78 -31
- package/dist/upload/file-upload/FileToUpload.js +64 -33
- package/dist/upload/file-upload/Icons.js +66 -0
- package/dist/upload/files-upload/FilesToUpload.js +16 -16
- package/dist/upload/readme.md +2 -2
- package/dist/upload/transaction/Icons.js +160 -0
- package/dist/upload/transaction/Transaction.js +42 -49
- package/dist/upload/transactions/Transactions.js +38 -20
- package/dist/useTheme.js +22 -0
- package/dist/wizard/Icons.js +65 -0
- package/dist/wizard/Wizard.js +141 -56
- package/package.json +14 -6
- package/test/AccordionGroup.test.js +125 -0
- package/test/Date.test.js +49 -45
- package/test/DateInput.test.js +242 -0
- package/test/Dropdown.test.js +19 -4
- package/test/FileInput.test.js +201 -0
- package/test/Footer.test.js +2 -7
- package/test/Header.test.js +5 -10
- package/test/InputText.test.js +53 -41
- package/test/Link.test.js +25 -7
- package/test/NumberInput.test.js +259 -0
- package/test/Paginator.test.js +72 -60
- package/test/PasswordInput.test.js +83 -0
- package/test/ResultsetTable.test.js +66 -19
- package/test/Select.test.js +55 -34
- package/test/Sidenav.test.js +22 -64
- package/test/Slider.test.js +24 -15
- package/test/Spinner.test.js +5 -0
- package/test/Tabs.test.js +21 -0
- package/test/TextInput.test.js +732 -0
- package/test/Textarea.test.js +193 -0
- package/test/ToggleGroup.test.js +85 -0
- package/test/Upload.test.js +5 -5
- package/test/{TextArea.test.js → V3TextArea.test.js} +6 -7
- package/dist/accordion/Accordion.stories.js +0 -207
- package/dist/accordion/readme.md +0 -96
- package/dist/alert/Alert.stories.js +0 -158
- package/dist/alert/close.svg +0 -4
- package/dist/alert/error.svg +0 -4
- package/dist/alert/info.svg +0 -4
- package/dist/alert/readme.md +0 -43
- package/dist/alert/success.svg +0 -4
- package/dist/alert/warning.svg +0 -4
- package/dist/button/Button.stories.js +0 -224
- package/dist/button/readme.md +0 -93
- package/dist/common/services/example-service.js +0 -10
- package/dist/common/services/example-service.test.js +0 -12
- package/dist/date/calendar.svg +0 -1
- package/dist/date/calendar_dark.svg +0 -1
- package/dist/dialog/Dialog.stories.js +0 -217
- package/dist/dialog/readme.md +0 -32
- package/dist/dropdown/Dropdown.stories.js +0 -249
- package/dist/dropdown/baseline-arrow_drop_down.svg +0 -1
- package/dist/dropdown/baseline-arrow_drop_down_wh.svg +0 -4
- package/dist/dropdown/baseline-arrow_drop_up.svg +0 -1
- package/dist/dropdown/baseline-arrow_drop_up_wh.svg +0 -4
- package/dist/dropdown/readme.md +0 -69
- package/dist/footer/Footer.stories.js +0 -94
- package/dist/footer/dxc_logo_wht.png +0 -0
- package/dist/footer/readme.md +0 -41
- package/dist/header/Header.stories.js +0 -176
- package/dist/header/close_icon.svg +0 -1
- package/dist/header/dxc_logo_black.png +0 -0
- package/dist/header/dxc_logo_white.png +0 -0
- package/dist/header/hamb_menu_black.svg +0 -1
- package/dist/header/hamb_menu_white.svg +0 -1
- package/dist/header/readme.md +0 -33
- package/dist/input-text/InputText.stories.js +0 -209
- package/dist/input-text/error.svg +0 -1
- package/dist/input-text/readme.md +0 -91
- package/dist/paginator/images/next.svg +0 -3
- package/dist/paginator/images/nextPage.svg +0 -3
- package/dist/paginator/images/previous.svg +0 -3
- package/dist/paginator/images/previousPage.svg +0 -3
- package/dist/paginator/readme.md +0 -50
- package/dist/resultsetTable/arrow_downward-24px_wht.svg +0 -1
- package/dist/resultsetTable/arrow_upward-24px_wht.svg +0 -1
- package/dist/resultsetTable/unfold_more-24px_wht.svg +0 -1
- package/dist/select/Select.stories.js +0 -235
- package/dist/select/readme.md +0 -72
- package/dist/sidenav/arrow_icon.svg +0 -3
- package/dist/slider/Slider.stories.js +0 -241
- package/dist/upload/buttons-upload/drag-drop-icon.svg +0 -4
- package/dist/upload/buttons-upload/upload-button.svg +0 -1
- package/dist/upload/file-upload/audio-icon.svg +0 -4
- package/dist/upload/file-upload/close.svg +0 -4
- package/dist/upload/file-upload/file-icon.svg +0 -4
- package/dist/upload/file-upload/video-icon.svg +0 -4
- package/dist/upload/transaction/audio-icon-err.svg +0 -4
- package/dist/upload/transaction/audio-icon.svg +0 -4
- package/dist/upload/transaction/error-icon.svg +0 -4
- package/dist/upload/transaction/file-icon-err.svg +0 -4
- package/dist/upload/transaction/file-icon.svg +0 -4
- package/dist/upload/transaction/image-icon-err.svg +0 -4
- package/dist/upload/transaction/image-icon.svg +0 -4
- package/dist/upload/transaction/success-icon.svg +0 -4
- package/dist/upload/transaction/video-icon-err.svg +0 -4
- package/dist/upload/transaction/video-icon.svg +0 -4
- package/dist/wizard/invalid_icon.svg +0 -6
- package/dist/wizard/valid_icon.svg +0 -6
- package/dist/wizard/validation-wrong.svg +0 -6
- package/test/Toggle.test.js +0 -43
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render, fireEvent, waitFor } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
|
|
5
|
+
import DxcFileInput from "../src/file-input/FileInput";
|
|
6
|
+
|
|
7
|
+
describe("FileInput component tests", () => {
|
|
8
|
+
const file1 = new File(["file1"], "file1.png", { type: "image/png" });
|
|
9
|
+
const file2 = new File(["file2"], "file2.txt", {
|
|
10
|
+
type: "text/plain",
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const files = [
|
|
14
|
+
{
|
|
15
|
+
error: null,
|
|
16
|
+
preview: null,
|
|
17
|
+
file: file1,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
error: "Error message",
|
|
21
|
+
preview: null,
|
|
22
|
+
file: file2,
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
test("Renders with correct labels and helper text in file mode", () => {
|
|
27
|
+
const { getByText } = render(<DxcFileInput label="File input label" helperText="File input helper text" />);
|
|
28
|
+
expect(getByText("File input label")).toBeTruthy();
|
|
29
|
+
expect(getByText("File input helper text")).toBeTruthy();
|
|
30
|
+
});
|
|
31
|
+
test("Renders with correct button label in file mode", () => {
|
|
32
|
+
const { getByText } = render(<DxcFileInput label="File input label" helperText="File input helper text" />);
|
|
33
|
+
expect(getByText("Select files")).toBeTruthy();
|
|
34
|
+
});
|
|
35
|
+
test("Renders with correct labels in filedrop mode", () => {
|
|
36
|
+
const { getByText } = render(
|
|
37
|
+
<DxcFileInput label="File input label" helperText="File input helper text" mode="filedrop" />
|
|
38
|
+
);
|
|
39
|
+
expect(getByText("Select")).toBeTruthy();
|
|
40
|
+
expect(getByText("or drop files")).toBeTruthy();
|
|
41
|
+
});
|
|
42
|
+
test("Renders with correct labels in dropzone mode", () => {
|
|
43
|
+
const { getByText } = render(
|
|
44
|
+
<DxcFileInput label="File input label" helperText="File input helper text" mode="dropzone" />
|
|
45
|
+
);
|
|
46
|
+
expect(getByText("Select")).toBeTruthy();
|
|
47
|
+
expect(getByText("or drop files")).toBeTruthy();
|
|
48
|
+
});
|
|
49
|
+
test("Disabled file input", () => {
|
|
50
|
+
const { getByText, getByRole } = render(
|
|
51
|
+
<DxcFileInput label="File input label" helperText="File input helper text" disabled />
|
|
52
|
+
);
|
|
53
|
+
expect(getByText("Select files")).toBeTruthy();
|
|
54
|
+
const button = getByRole("button");
|
|
55
|
+
expect(button.disabled).toBeTruthy();
|
|
56
|
+
});
|
|
57
|
+
test("Renders file items passed in value when multiple file input", () => {
|
|
58
|
+
const callbackFile = jest.fn();
|
|
59
|
+
const { getByText } = render(
|
|
60
|
+
<DxcFileInput
|
|
61
|
+
label="File input label"
|
|
62
|
+
helperText="File input helper text"
|
|
63
|
+
value={files}
|
|
64
|
+
callbackFile={callbackFile}
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
67
|
+
expect(getByText("file1.png")).toBeTruthy();
|
|
68
|
+
expect(getByText("file2.txt")).toBeTruthy();
|
|
69
|
+
expect(getByText("Error message")).toBeTruthy();
|
|
70
|
+
});
|
|
71
|
+
test("Renders file items when single file input", () => {
|
|
72
|
+
const callbackFile = jest.fn();
|
|
73
|
+
const { getByText } = render(
|
|
74
|
+
<DxcFileInput
|
|
75
|
+
label="File input label"
|
|
76
|
+
helperText="File input helper text"
|
|
77
|
+
multiple={false}
|
|
78
|
+
value={files}
|
|
79
|
+
callbackFile={callbackFile}
|
|
80
|
+
/>
|
|
81
|
+
);
|
|
82
|
+
expect(getByText("file1.png")).toBeTruthy();
|
|
83
|
+
expect(getByText("file2.txt")).toBeTruthy();
|
|
84
|
+
expect(getByText("Error message")).toBeTruthy();
|
|
85
|
+
});
|
|
86
|
+
test("Add file item when single file input", async () => {
|
|
87
|
+
const newFile = new File(["newFile"], "newFile.pdf", { type: "pdf" });
|
|
88
|
+
const callbackFile = jest.fn();
|
|
89
|
+
const { getByText, getByLabelText } = render(
|
|
90
|
+
<DxcFileInput
|
|
91
|
+
label="File input label"
|
|
92
|
+
helperText="File input helper text"
|
|
93
|
+
value={files}
|
|
94
|
+
callbackFile={callbackFile}
|
|
95
|
+
multiple={false}
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
expect(getByText("file1.png")).toBeTruthy();
|
|
99
|
+
expect(getByText("file2.txt")).toBeTruthy();
|
|
100
|
+
expect(getByText("Error message")).toBeTruthy();
|
|
101
|
+
const inputFile = getByLabelText("File input label", { hidden: true });
|
|
102
|
+
fireEvent.change(inputFile, { target: { files: [newFile] } });
|
|
103
|
+
await waitFor(() => {
|
|
104
|
+
expect(callbackFile).toHaveBeenCalledWith([
|
|
105
|
+
{
|
|
106
|
+
error: undefined,
|
|
107
|
+
file: newFile,
|
|
108
|
+
preview: (
|
|
109
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
|
|
110
|
+
<path fill="none" d="M0 0h24v24H0V0z" />
|
|
111
|
+
<path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zM6 20V4h7v5h5v11H6z" />
|
|
112
|
+
</svg>
|
|
113
|
+
),
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
test("Renders file items and delete one file", async () => {
|
|
119
|
+
const callbackFile = jest.fn();
|
|
120
|
+
const { getByText, getAllByRole } = render(
|
|
121
|
+
<DxcFileInput
|
|
122
|
+
label="File input label"
|
|
123
|
+
helperText="File input helper text"
|
|
124
|
+
value={files}
|
|
125
|
+
callbackFile={callbackFile}
|
|
126
|
+
/>
|
|
127
|
+
);
|
|
128
|
+
expect(getByText("file1.png")).toBeTruthy();
|
|
129
|
+
expect(getByText("file2.txt")).toBeTruthy();
|
|
130
|
+
expect(getByText("Error message")).toBeTruthy();
|
|
131
|
+
const removeBtn = getAllByRole("button")[1];
|
|
132
|
+
userEvent.click(removeBtn);
|
|
133
|
+
await waitFor(() => {
|
|
134
|
+
expect(callbackFile).toHaveBeenCalledWith([{ error: "Error message", file: file2, preview: null }]);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test("CallbackFile is correctly called", async () => {
|
|
139
|
+
const newFile = new File(["newFile"], "newFile.pdf", { type: "pdf" });
|
|
140
|
+
const callbackFile = jest.fn();
|
|
141
|
+
const { getByLabelText } = render(
|
|
142
|
+
<DxcFileInput
|
|
143
|
+
label="File input label"
|
|
144
|
+
helperText="File input helper text"
|
|
145
|
+
value={files}
|
|
146
|
+
callbackFile={callbackFile}
|
|
147
|
+
/>
|
|
148
|
+
);
|
|
149
|
+
const inputFile = getByLabelText("File input label", { hidden: true });
|
|
150
|
+
fireEvent.change(inputFile, { target: { files: [newFile] } });
|
|
151
|
+
await waitFor(() => {
|
|
152
|
+
expect(callbackFile).toHaveBeenCalledWith([
|
|
153
|
+
{ error: null, preview: null, file: file1 },
|
|
154
|
+
{ error: "Error message", preview: null, file: file2 },
|
|
155
|
+
{
|
|
156
|
+
error: undefined,
|
|
157
|
+
file: newFile,
|
|
158
|
+
preview: (
|
|
159
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
|
|
160
|
+
<path fill="none" d="M0 0h24v24H0V0z" />
|
|
161
|
+
<path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zM6 20V4h7v5h5v11H6z" />
|
|
162
|
+
</svg>
|
|
163
|
+
),
|
|
164
|
+
},
|
|
165
|
+
]);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("Callback called correctly when a file size does not comply minSize or maxSize", async () => {
|
|
170
|
+
const newFile = new File(["newFile"], "newFile.pdf", { type: "pdf" });
|
|
171
|
+
const callbackFile = jest.fn();
|
|
172
|
+
const { getByLabelText } = render(
|
|
173
|
+
<DxcFileInput
|
|
174
|
+
label="File input label"
|
|
175
|
+
helperText="File input helper text"
|
|
176
|
+
minSize={1000}
|
|
177
|
+
maxSize={20000}
|
|
178
|
+
value={files}
|
|
179
|
+
callbackFile={callbackFile}
|
|
180
|
+
/>
|
|
181
|
+
);
|
|
182
|
+
const inputFile = getByLabelText("File input label", { hidden: true });
|
|
183
|
+
fireEvent.change(inputFile, { target: { files: [newFile] } });
|
|
184
|
+
await waitFor(() => {
|
|
185
|
+
expect(callbackFile).toHaveBeenCalledWith([
|
|
186
|
+
{ error: null, preview: null, file: file1 },
|
|
187
|
+
{ error: "Error message", preview: null, file: file2 },
|
|
188
|
+
{
|
|
189
|
+
error: "File size must be greater than min size.",
|
|
190
|
+
file: newFile,
|
|
191
|
+
preview: (
|
|
192
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
|
|
193
|
+
<path fill="none" d="M0 0h24v24H0V0z" />
|
|
194
|
+
<path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zM6 20V4h7v5h5v11H6z" />
|
|
195
|
+
</svg>
|
|
196
|
+
),
|
|
197
|
+
},
|
|
198
|
+
]);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
});
|
package/test/Footer.test.js
CHANGED
|
@@ -5,13 +5,8 @@ import icon from "../../app/src/images/linkedin.svg";
|
|
|
5
5
|
|
|
6
6
|
describe("Footer component tests", () => {
|
|
7
7
|
test("Footer renders with default logo", () => {
|
|
8
|
-
const {
|
|
9
|
-
expect(
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test("Footer renders with logo", () => {
|
|
13
|
-
const { getByRole } = render(<DxcFooter logoSrc={icon}></DxcFooter>);
|
|
14
|
-
expect(getByRole("img")).toBeTruthy();
|
|
8
|
+
const { getByTitle } = render(<DxcFooter></DxcFooter>);
|
|
9
|
+
expect(getByTitle("DXC Logo")).toBeTruthy();
|
|
15
10
|
});
|
|
16
11
|
|
|
17
12
|
test("Footer renders with social links", () => {
|
package/test/Header.test.js
CHANGED
|
@@ -5,25 +5,20 @@ import icon from "../../app/src/images/linkedin.svg";
|
|
|
5
5
|
|
|
6
6
|
describe("Header component tests", () => {
|
|
7
7
|
test("Header renders with default logo", () => {
|
|
8
|
-
const {
|
|
9
|
-
expect(
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test("Header renders with logo", () => {
|
|
13
|
-
const { getByRole } = render(<DxcHeader logoSrc={icon}></DxcHeader>);
|
|
14
|
-
expect(getByRole("img")).toBeTruthy();
|
|
8
|
+
const { getByTitle } = render(<DxcHeader></DxcHeader>);
|
|
9
|
+
expect(getByTitle("DXC Logo")).toBeTruthy();
|
|
15
10
|
});
|
|
16
11
|
|
|
17
12
|
test("Call correct function on logo click", () => {
|
|
18
13
|
const onClick = jest.fn();
|
|
19
|
-
const {
|
|
20
|
-
const logo =
|
|
14
|
+
const { getByTitle } = render(<DxcHeader onClick={onClick}></DxcHeader>);
|
|
15
|
+
const logo = getByTitle("DXC Logo");
|
|
21
16
|
fireEvent.click(logo);
|
|
22
17
|
expect(onClick).toHaveBeenCalled();
|
|
23
18
|
});
|
|
24
19
|
|
|
25
20
|
test("Header renders with correct children", () => {
|
|
26
|
-
//We need to force the offsetWidth value
|
|
21
|
+
// We need to force the offsetWidth value
|
|
27
22
|
Object.defineProperty(HTMLElement.prototype, "offsetWidth", { configurable: true, value: 1024 });
|
|
28
23
|
|
|
29
24
|
const { getByText } = render(<DxcHeader content={<p>header-child-text</p>}></DxcHeader>);
|
package/test/InputText.test.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { render, fireEvent, waitFor, screen, act, waitForElementToBeRemoved } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
|
|
3
5
|
import icon from "../../app/src/images/invision.svg";
|
|
4
6
|
|
|
5
|
-
import
|
|
7
|
+
import V3DxcInputText from "../src/input-text/InputText";
|
|
6
8
|
|
|
7
9
|
const countries = ["Albania", "Andorra", "Armenia", "Austria", "Azerbaijan"];
|
|
8
10
|
|
|
@@ -18,6 +20,7 @@ jest.mock("popper.js", () => {
|
|
|
18
20
|
return {
|
|
19
21
|
destroy: () => {},
|
|
20
22
|
scheduleUpdate: () => {},
|
|
23
|
+
update: () => {},
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
26
|
};
|
|
@@ -25,16 +28,15 @@ jest.mock("popper.js", () => {
|
|
|
25
28
|
|
|
26
29
|
describe("InputText component tests", () => {
|
|
27
30
|
test("Input renders with correct label", () => {
|
|
28
|
-
const { getByText } = render(<
|
|
29
|
-
|
|
31
|
+
const { getByText } = render(<V3DxcInputText label="Input label" />);
|
|
30
32
|
expect(getByText("Input label")).toBeTruthy();
|
|
31
33
|
});
|
|
32
34
|
|
|
33
35
|
test("onChange function is called correctly", () => {
|
|
34
36
|
const onChange = jest.fn();
|
|
35
|
-
const { getByRole } = render(<
|
|
37
|
+
const { getByRole } = render(<V3DxcInputText label="Input label" onChange={onChange} />);
|
|
36
38
|
const input = getByRole("textbox");
|
|
37
|
-
|
|
39
|
+
userEvent.type(input, "20000");
|
|
38
40
|
expect(onChange).toHaveBeenCalled();
|
|
39
41
|
expect(onChange).toHaveBeenCalledWith("20000");
|
|
40
42
|
});
|
|
@@ -42,9 +44,9 @@ describe("InputText component tests", () => {
|
|
|
42
44
|
const onBlur = jest.fn();
|
|
43
45
|
const onChange = jest.fn();
|
|
44
46
|
|
|
45
|
-
const { getByRole } = render(<
|
|
47
|
+
const { getByRole } = render(<V3DxcInputText label="Input label" onChange={onChange} onBlur={onBlur} />);
|
|
46
48
|
const input = getByRole("textbox");
|
|
47
|
-
|
|
49
|
+
userEvent.type(input, "Test value");
|
|
48
50
|
fireEvent.blur(input);
|
|
49
51
|
expect(onBlur).toHaveBeenCalled();
|
|
50
52
|
expect(onBlur).toHaveBeenCalledWith("Test value");
|
|
@@ -52,9 +54,9 @@ describe("InputText component tests", () => {
|
|
|
52
54
|
|
|
53
55
|
test("Uncontrolled component", () => {
|
|
54
56
|
const onChange = jest.fn();
|
|
55
|
-
const { getByRole } = render(<
|
|
57
|
+
const { getByRole } = render(<V3DxcInputText label="Input label" onChange={onChange} />);
|
|
56
58
|
const input = getByRole("textbox");
|
|
57
|
-
|
|
59
|
+
userEvent.type(input, "20000");
|
|
58
60
|
expect(onChange).toHaveBeenCalled();
|
|
59
61
|
expect(onChange).toHaveBeenCalledWith("20000");
|
|
60
62
|
expect(input.value).toBe("20000");
|
|
@@ -64,12 +66,11 @@ describe("InputText component tests", () => {
|
|
|
64
66
|
const onChange = jest.fn();
|
|
65
67
|
const onBlur = jest.fn();
|
|
66
68
|
const { getByRole } = render(
|
|
67
|
-
<
|
|
69
|
+
<V3DxcInputText label="Input label" value="Test value" onChange={onChange} onBlur={onBlur} />
|
|
68
70
|
);
|
|
69
71
|
const input = getByRole("textbox");
|
|
70
|
-
|
|
72
|
+
userEvent.type(input, "20000");
|
|
71
73
|
expect(onChange).toHaveBeenCalled();
|
|
72
|
-
expect(onChange).toHaveBeenCalledWith("20000");
|
|
73
74
|
expect(input.value).toBe("Test value");
|
|
74
75
|
fireEvent.blur(input);
|
|
75
76
|
expect(onBlur).toHaveBeenCalled();
|
|
@@ -77,16 +78,16 @@ describe("InputText component tests", () => {
|
|
|
77
78
|
});
|
|
78
79
|
test("Prefix icon onClick", () => {
|
|
79
80
|
const onClick = jest.fn();
|
|
80
|
-
const { getByRole } = render(<
|
|
81
|
+
const { getByRole } = render(<V3DxcInputText label="Input label" prefixIconSrc={icon} onClickPrefix={onClick} />);
|
|
81
82
|
const prefixIcon = getByRole("img");
|
|
82
|
-
|
|
83
|
+
userEvent.click(prefixIcon);
|
|
83
84
|
expect(onClick).toHaveBeenCalled();
|
|
84
85
|
});
|
|
85
86
|
test("Suffix icon onClick", () => {
|
|
86
87
|
const onClick = jest.fn();
|
|
87
|
-
const { getByRole } = render(<
|
|
88
|
+
const { getByRole } = render(<V3DxcInputText label="Input label" suffixIconSrc={icon} onClickSuffix={onClick} />);
|
|
88
89
|
const suffixIcon = getByRole("img");
|
|
89
|
-
|
|
90
|
+
userEvent.click(suffixIcon);
|
|
90
91
|
expect(onClick).toHaveBeenCalled();
|
|
91
92
|
});
|
|
92
93
|
});
|
|
@@ -95,39 +96,39 @@ describe("Autocomplete component Synchronous tests", () => {
|
|
|
95
96
|
test("Autocomplete no matches found is shown", async () => {
|
|
96
97
|
const onChangeAtocomplete = jest.fn();
|
|
97
98
|
render(
|
|
98
|
-
<
|
|
99
|
+
<V3DxcInputText label="Autocomplete Countries" autocompleteOptions={countries} onChange={onChangeAtocomplete} />
|
|
99
100
|
);
|
|
100
101
|
const input = screen.getByRole("textbox");
|
|
101
|
-
|
|
102
|
+
fireEvent.focus(input);
|
|
102
103
|
expect(screen.getByText("Andorra")).toBeTruthy();
|
|
103
|
-
|
|
104
|
+
userEvent.type(input, "X");
|
|
104
105
|
expect(screen.getByText("No matches found.")).toBeTruthy();
|
|
105
106
|
});
|
|
106
107
|
|
|
107
108
|
test("Autocomplete suggestions are shown", async () => {
|
|
108
109
|
const onChangeAtocomplete = jest.fn();
|
|
109
110
|
render(
|
|
110
|
-
<
|
|
111
|
+
<V3DxcInputText label="Autocomplete Countries" autocompleteOptions={countries} onChange={onChangeAtocomplete} />
|
|
111
112
|
);
|
|
112
113
|
const input = screen.getByRole("textbox");
|
|
113
|
-
|
|
114
|
+
fireEvent.focus(input);
|
|
114
115
|
expect(screen.getByText("Andorra")).toBeTruthy();
|
|
115
116
|
});
|
|
116
117
|
|
|
117
118
|
test("Autocomplete UNCONTROLLED suggestion selected", async () => {
|
|
118
119
|
const onChangeAtocomplete = jest.fn();
|
|
119
120
|
render(
|
|
120
|
-
<
|
|
121
|
+
<V3DxcInputText label="Autocomplete Countries" autocompleteOptions={countries} onChange={onChangeAtocomplete} />
|
|
121
122
|
);
|
|
122
123
|
const input = screen.getByRole("textbox");
|
|
123
|
-
|
|
124
|
+
fireEvent.focus(input);
|
|
124
125
|
expect(screen.getByText("Andorra")).toBeTruthy();
|
|
125
|
-
|
|
126
|
+
userEvent.type(screen.getByRole("textbox"), "Alb");
|
|
126
127
|
expect(onChangeAtocomplete).toHaveBeenCalled();
|
|
127
128
|
expect(screen.getByText("Albania")).toBeTruthy();
|
|
128
129
|
const suggestion1 = screen.getByText("Albania");
|
|
129
130
|
act(() => {
|
|
130
|
-
|
|
131
|
+
userEvent.click(suggestion1);
|
|
131
132
|
});
|
|
132
133
|
|
|
133
134
|
// expect(onChangeAtocomplete).toHaveBeenCalledWith("Albania");
|
|
@@ -137,36 +138,41 @@ describe("Autocomplete component Synchronous tests", () => {
|
|
|
137
138
|
test("Autocomplete CONTROLLED suggestions selected", async () => {
|
|
138
139
|
const onChangeAtocomplete = jest.fn();
|
|
139
140
|
render(
|
|
140
|
-
<
|
|
141
|
+
<V3DxcInputText
|
|
141
142
|
label="Autocomplete Countries"
|
|
142
143
|
value="Andorra"
|
|
143
144
|
autocompleteOptions={countries}
|
|
144
145
|
onChange={onChangeAtocomplete}
|
|
145
146
|
/>
|
|
146
147
|
);
|
|
147
|
-
screen.getByRole("textbox")
|
|
148
|
-
|
|
148
|
+
const input = screen.getByRole("textbox");
|
|
149
|
+
fireEvent.focus(input);
|
|
149
150
|
expect(screen.getByText("Andorra")).toBeTruthy();
|
|
150
151
|
|
|
151
152
|
expect(screen.getByText("Andorra")).toBeTruthy();
|
|
152
153
|
const suggestion1 = screen.getByText("Andorra");
|
|
153
154
|
act(() => {
|
|
154
|
-
|
|
155
|
+
userEvent.click(suggestion1);
|
|
155
156
|
});
|
|
156
157
|
|
|
157
158
|
expect(onChangeAtocomplete).toHaveBeenCalledWith("Andorra");
|
|
158
159
|
});
|
|
159
160
|
});
|
|
161
|
+
|
|
160
162
|
describe("InputText component Asynchronous Autocomplete tests", () => {
|
|
161
163
|
test("Autocomplete Searching is shown", async () => {
|
|
162
164
|
const callbackFunc = jest.fn(() => new Promise((resolve) => setTimeout(resolve(["Italy", "Spain"]), 1000)));
|
|
163
165
|
|
|
164
166
|
const onChangeAtocomplete = jest.fn();
|
|
165
167
|
render(
|
|
166
|
-
<
|
|
168
|
+
<V3DxcInputText
|
|
169
|
+
label="Autocomplete Countries"
|
|
170
|
+
autocompleteOptions={callbackFunc}
|
|
171
|
+
onChange={onChangeAtocomplete}
|
|
172
|
+
/>
|
|
167
173
|
);
|
|
168
174
|
const input = screen.getByRole("textbox");
|
|
169
|
-
|
|
175
|
+
fireEvent.focus(input);
|
|
170
176
|
await waitForElementToBeRemoved(() => screen.getByText(/Searching.../i));
|
|
171
177
|
expect(screen.getByText("Italy")).toBeTruthy();
|
|
172
178
|
expect(screen.getByText("Spain")).toBeTruthy();
|
|
@@ -176,26 +182,31 @@ describe("InputText component Asynchronous Autocomplete tests", () => {
|
|
|
176
182
|
const callbackFunc = jest.fn(() => new Promise((resolve) => setTimeout(resolve(["Italy", "Spain"]), 1000)));
|
|
177
183
|
const onChangeAtocomplete = jest.fn();
|
|
178
184
|
render(
|
|
179
|
-
<
|
|
185
|
+
<V3DxcInputText
|
|
186
|
+
label="Autocomplete Countries"
|
|
187
|
+
onChange={onChangeAtocomplete}
|
|
188
|
+
autocompleteOptions={callbackFunc}
|
|
189
|
+
/>
|
|
180
190
|
);
|
|
181
191
|
const input = screen.getByRole("textbox");
|
|
182
|
-
|
|
183
|
-
|
|
192
|
+
fireEvent.focus(input);
|
|
193
|
+
userEvent.type(input, "And");
|
|
184
194
|
await waitForElementToBeRemoved(() => screen.getByText(/Searching.../i));
|
|
185
195
|
expect(screen.getByText("Italy")).toBeTruthy();
|
|
186
196
|
expect(screen.getByText("Spain")).toBeTruthy();
|
|
187
197
|
const suggestion1 = screen.getByText("Spain");
|
|
188
198
|
act(() => {
|
|
189
|
-
|
|
199
|
+
userEvent.click(suggestion1);
|
|
190
200
|
});
|
|
191
201
|
expect(onChangeAtocomplete).toHaveBeenCalledWith("Spain");
|
|
192
202
|
expect(screen.getByRole("textbox").value).toBe("Spain");
|
|
193
203
|
});
|
|
204
|
+
|
|
194
205
|
test("Asynchronous CONTROLLED autocomplete tests", async () => {
|
|
195
206
|
const callbackFunc = jest.fn(() => new Promise((resolve) => setTimeout(resolve(["Italy", "Spain"]), 3000)));
|
|
196
207
|
const onChangeAtocomplete = jest.fn();
|
|
197
208
|
render(
|
|
198
|
-
<
|
|
209
|
+
<V3DxcInputText
|
|
199
210
|
label="Autocomplete Countries"
|
|
200
211
|
value="test value"
|
|
201
212
|
onChange={onChangeAtocomplete}
|
|
@@ -203,24 +214,25 @@ describe("InputText component Asynchronous Autocomplete tests", () => {
|
|
|
203
214
|
/>
|
|
204
215
|
);
|
|
205
216
|
const input = screen.getByRole("textbox");
|
|
206
|
-
|
|
207
|
-
|
|
217
|
+
fireEvent.focus(input);
|
|
218
|
+
userEvent.type(input, "And");
|
|
208
219
|
await waitForElementToBeRemoved(() => screen.getByText(/Searching.../i));
|
|
209
220
|
expect(screen.getByText("Italy")).toBeTruthy();
|
|
210
221
|
expect(screen.getByText("Spain")).toBeTruthy();
|
|
211
222
|
const suggestion1 = screen.getByText("Spain");
|
|
212
223
|
act(() => {
|
|
213
|
-
|
|
224
|
+
userEvent.click(suggestion1);
|
|
214
225
|
});
|
|
215
226
|
expect(onChangeAtocomplete).toHaveBeenCalledWith("Spain");
|
|
216
227
|
expect(screen.getByRole("textbox").value).toBe("test value");
|
|
217
228
|
});
|
|
229
|
+
|
|
218
230
|
test("Asynchronous autocomplete request failed", async () => {
|
|
219
231
|
const errorCallbackFunc = jest.fn(() => new Promise((resolve, reject) => setTimeout(reject("E"), 3000)));
|
|
220
232
|
const onChangeAtocomplete = jest.fn();
|
|
221
233
|
|
|
222
234
|
render(
|
|
223
|
-
<
|
|
235
|
+
<V3DxcInputText
|
|
224
236
|
label="Autocomplete Countries"
|
|
225
237
|
value="test value"
|
|
226
238
|
onChange={onChangeAtocomplete}
|
|
@@ -229,7 +241,7 @@ describe("InputText component Asynchronous Autocomplete tests", () => {
|
|
|
229
241
|
);
|
|
230
242
|
|
|
231
243
|
const input = screen.getByRole("textbox");
|
|
232
|
-
|
|
244
|
+
fireEvent.focus(input);
|
|
233
245
|
await waitForElementToBeRemoved(() => screen.getByText(/Searching.../i));
|
|
234
246
|
expect(screen.getByText("Error fetching data")).toBeTruthy();
|
|
235
247
|
});
|
package/test/Link.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { render } from "@testing-library/react";
|
|
2
|
+
import { render, fireEvent } from "@testing-library/react";
|
|
3
3
|
import DxcLink from "../src/link/Link";
|
|
4
4
|
|
|
5
5
|
describe("Link component tests", () => {
|
|
@@ -9,17 +9,35 @@ describe("Link component tests", () => {
|
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
test("Link renders with correct href", () => {
|
|
12
|
-
const {
|
|
13
|
-
expect(
|
|
12
|
+
const { getByRole } = render(<DxcLink text="Link" href="/testPage" />);
|
|
13
|
+
expect(getByRole("link").getAttribute("href")).toEqual("/testPage");
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
test("Link renders with
|
|
16
|
+
test("Link renders with correct disabled state", () => {
|
|
17
17
|
const { getByText } = render(<DxcLink text="Link" href="/testPage" disabled={true} />);
|
|
18
|
-
expect(getByText("Link").hasAttribute("
|
|
18
|
+
expect(getByText("Link").hasAttribute("href")).toBeFalsy();
|
|
19
|
+
const { getByText: getByTextLinkButton } = render(<DxcLink text="LinkButton" onClick={() => console.log("Andorra")} disabled={true} />);
|
|
20
|
+
expect(getByTextLinkButton("LinkButton").hasAttribute("onclick")).toBeFalsy();
|
|
19
21
|
});
|
|
20
22
|
|
|
21
23
|
test("Link open new tab", () => {
|
|
22
|
-
const {
|
|
23
|
-
expect(
|
|
24
|
+
const { getByRole } = render(<DxcLink text="Link" href="/testPage" newWindow={true} />);
|
|
25
|
+
expect(getByRole("link").getAttribute("target")).toEqual("_blank");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("Link onClick called", () => {
|
|
29
|
+
const onClick = jest.fn();
|
|
30
|
+
const { getByText } = render(<DxcLink text="Link" onClick={onClick} />);
|
|
31
|
+
const link = getByText("Link");
|
|
32
|
+
fireEvent.click(link);
|
|
33
|
+
expect(onClick).toHaveBeenCalled();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("Disabled link onClick not called", () => {
|
|
37
|
+
const onClick = jest.fn();
|
|
38
|
+
const { getByText } = render(<DxcLink text="Link" onClick={onClick} disabled={true} />);
|
|
39
|
+
const link = getByText("Link");
|
|
40
|
+
fireEvent.click(link);
|
|
41
|
+
expect(onClick).toHaveBeenCalledTimes(0);
|
|
24
42
|
});
|
|
25
43
|
});
|