@dxc-technology/halstack-react 0.0.0-e441916 → 0.0.0-e628009
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/README.md +1 -1
- 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 +39 -19
- package/dist/button/Button.js +84 -29
- package/dist/card/Card.js +64 -56
- package/dist/checkbox/Checkbox.js +108 -32
- package/dist/chip/Chip.js +135 -40
- package/dist/common/RequiredComponent.js +2 -8
- package/dist/common/utils.js +2 -22
- package/dist/common/variables.js +1486 -105
- package/dist/date/Date.js +115 -78
- package/dist/date-input/DateInput.js +400 -0
- package/dist/date-input/index.d.ts +95 -0
- package/dist/dialog/Dialog.js +61 -36
- 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 +125 -45
- package/dist/footer/Icons.js +77 -0
- package/dist/header/Header.js +174 -90
- package/dist/header/Icons.js +59 -0
- package/dist/heading/Heading.js +93 -22
- package/dist/input-text/Icons.js +22 -0
- package/dist/input-text/InputText.js +298 -108
- package/dist/layout/ApplicationLayout.js +327 -0
- package/dist/layout/Icons.js +55 -0
- package/dist/link/Link.js +142 -34
- 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 +253 -129
- package/dist/sidenav/Sidenav.js +87 -125
- package/dist/slider/Slider.js +219 -73
- package/dist/spinner/Spinner.js +249 -64
- package/dist/switch/Switch.js +52 -25
- package/dist/table/Table.js +63 -15
- package/dist/tabs/Tabs.js +210 -50
- 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 +84 -37
- package/dist/upload/dragAndDropArea/Icons.js +39 -0
- 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/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 +156 -61
- 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/Heading.test.js +60 -12
- 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/checkbox/Checkbox.stories.js +0 -144
- package/dist/checkbox/readme.md +0 -116
- package/dist/common/services/example-service.js +0 -10
- package/dist/common/services/example-service.test.js +0 -12
- package/dist/date/Date.stories.js +0 -205
- package/dist/date/calendar.svg +0 -1
- package/dist/date/calendar_dark.svg +0 -1
- package/dist/date/readme.md +0 -73
- 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/link/readme.md +0 -51
- 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/progress-bar/ProgressBar.stories.js +0 -280
- package/dist/progress-bar/readme.md +0 -63
- package/dist/radio/Radio.stories.js +0 -166
- package/dist/radio/readme.md +0 -70
- 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/slider/readme.md +0 -64
- package/dist/spinner/Spinner.stories.js +0 -183
- package/dist/spinner/readme.md +0 -65
- package/dist/switch/Switch.stories.js +0 -134
- package/dist/switch/readme.md +0 -133
- package/dist/tabs/Tabs.stories.js +0 -130
- package/dist/tabs/readme.md +0 -78
- package/dist/tabs-for-sections/readme.md +0 -78
- package/dist/toggle/Toggle.stories.js +0 -297
- package/dist/toggle/readme.md +0 -80
- package/dist/upload/Upload.stories.js +0 -72
- package/dist/upload/buttons-upload/drag-drop-icon.svg +0 -4
- package/dist/upload/buttons-upload/upload-button.svg +0 -1
- package/dist/upload/dragAndDropArea/upload_drop.svg +0 -4
- package/dist/upload/dragAndDropArea/upload_file.svg +0 -4
- 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/readme.md +0 -37
- 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
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
|
});
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render, fireEvent } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
import DxcNumberInput from "../src/number-input/NumberInput";
|
|
5
|
+
|
|
6
|
+
describe("Number input component tests", () => {
|
|
7
|
+
test("Number input renders with label", () => {
|
|
8
|
+
const { getByText } = render(<DxcNumberInput label="Number input label" />);
|
|
9
|
+
expect(getByText("Number input label")).toBeTruthy();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test("Number input renders with helper text", () => {
|
|
13
|
+
const { getByText } = render(<DxcNumberInput helperText="Helper text" />);
|
|
14
|
+
expect(getByText("Helper text")).toBeTruthy();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("Number input renders with placeholder", () => {
|
|
18
|
+
const { getByLabelText } = render(<DxcNumberInput label="Number label" placeholder="Placeholder" />);
|
|
19
|
+
const number = getByLabelText("Number label");
|
|
20
|
+
expect(number.getAttribute("placeholder")).toBe("Placeholder");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("Number input renders increment and decrement buttons", () => {
|
|
24
|
+
const { queryAllByRole } = render(<DxcNumberInput label="Number label" />);
|
|
25
|
+
expect(queryAllByRole("button").length).toBe(2);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("Number input is disabled", () => {
|
|
29
|
+
const { getByLabelText } = render(<DxcNumberInput label="Number label" disabled />);
|
|
30
|
+
const number = getByLabelText("Number label");
|
|
31
|
+
expect(number.disabled).toBeTruthy();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("Number input is optional", () => {
|
|
35
|
+
const { getByText } = render(<DxcNumberInput label="Number label" optional />);
|
|
36
|
+
expect(getByText("(Optional)")).toBeTruthy();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("Number input is not optional: required field, displays error if not filled in", () => {
|
|
40
|
+
const onBlur = jest.fn();
|
|
41
|
+
const onChange = jest.fn();
|
|
42
|
+
const { getByRole } = render(<DxcNumberInput onBlur={onBlur} onChange={onChange} />);
|
|
43
|
+
const input = getByRole("textbox");
|
|
44
|
+
|
|
45
|
+
userEvent.type(input, "1");
|
|
46
|
+
userEvent.clear(input);
|
|
47
|
+
fireEvent.blur(input);
|
|
48
|
+
expect(onBlur).toHaveBeenCalled();
|
|
49
|
+
expect(onBlur).toHaveBeenCalledWith({ value: "", error: "This field is required. Please, enter a value." });
|
|
50
|
+
expect(onChange).toHaveBeenCalled();
|
|
51
|
+
expect(onChange).toHaveBeenCalledWith({ value: "", error: "This field is required. Please, enter a value." });
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("Suffix and prefix must be shown)", () => {
|
|
55
|
+
const { getByText } = render(<DxcNumberInput label="Number input label" prefix="+34" suffix="USD" />);
|
|
56
|
+
expect(getByText("+34")).toBeTruthy();
|
|
57
|
+
expect(getByText("USD")).toBeTruthy();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("Invalid number input renders error", () => {
|
|
61
|
+
const { getByText } = render(<DxcNumberInput error="Error message." />);
|
|
62
|
+
expect(getByText("Error message.")).toBeTruthy();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("onChange function is called correctly", () => {
|
|
66
|
+
const onChange = jest.fn();
|
|
67
|
+
const { getByLabelText } = render(<DxcNumberInput label="Number input label" onChange={onChange} />);
|
|
68
|
+
const number = getByLabelText("Number input label");
|
|
69
|
+
userEvent.type(number, "t");
|
|
70
|
+
expect(onChange).not.toHaveBeenCalledWith({ value: "t", error: null });
|
|
71
|
+
expect(number.value).toBe("");
|
|
72
|
+
userEvent.type(number, "1");
|
|
73
|
+
expect(onChange).toHaveBeenCalledWith({ value: "1", error: null });
|
|
74
|
+
expect(number.value).toBe("1");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("Error message is shown if the value is less than the min value", () => {
|
|
78
|
+
const onChange = jest.fn(({ value, error }) => {
|
|
79
|
+
expect(value).toBe("1");
|
|
80
|
+
expect(error).toBe("Value must be greater than or equal to 5.");
|
|
81
|
+
});
|
|
82
|
+
const onBlur = jest.fn(({ value, error }) => {
|
|
83
|
+
expect(value).toBe("1");
|
|
84
|
+
expect(error).toBe("Value must be greater than or equal to 5.");
|
|
85
|
+
});
|
|
86
|
+
const { getByLabelText } = render(
|
|
87
|
+
<DxcNumberInput label="Number input label" min={5} onBlur={onBlur} onChange={onChange} />
|
|
88
|
+
);
|
|
89
|
+
const number = getByLabelText("Number input label");
|
|
90
|
+
|
|
91
|
+
userEvent.type(number, "1");
|
|
92
|
+
fireEvent.blur(number);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("Cannot decrement the value if it is less than the min value", () => {
|
|
96
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" min={5} />);
|
|
97
|
+
const number = getByLabelText("Number input label");
|
|
98
|
+
userEvent.type(number, "1");
|
|
99
|
+
fireEvent.blur(number);
|
|
100
|
+
expect(number.value).toBe("1");
|
|
101
|
+
const decrement = getAllByRole("button")[0];
|
|
102
|
+
userEvent.click(decrement);
|
|
103
|
+
expect(number.value).toBe("1");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("Increment the value when it is less than the min value", () => {
|
|
107
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" min={5} />);
|
|
108
|
+
const number = getByLabelText("Number input label");
|
|
109
|
+
userEvent.type(number, "1");
|
|
110
|
+
fireEvent.blur(number);
|
|
111
|
+
expect(number.value).toBe("1");
|
|
112
|
+
const increment = getAllByRole("button")[1];
|
|
113
|
+
userEvent.click(increment);
|
|
114
|
+
expect(number.value).toBe("5");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("Error message is shown if the value is greater than the max value", () => {
|
|
118
|
+
const onChange = jest.fn();
|
|
119
|
+
const onBlur = jest.fn();
|
|
120
|
+
const { getByLabelText } = render(
|
|
121
|
+
<DxcNumberInput label="Number input label" max={10} onBlur={onBlur} onChange={onChange} />
|
|
122
|
+
);
|
|
123
|
+
const number = getByLabelText("Number input label");
|
|
124
|
+
|
|
125
|
+
userEvent.type(number, "12");
|
|
126
|
+
expect(onChange).toHaveBeenCalledTimes(2);
|
|
127
|
+
expect(onChange).toHaveBeenCalledWith({ value: "12", error: "Value must be less than or equal to 10." });
|
|
128
|
+
fireEvent.blur(number);
|
|
129
|
+
expect(onBlur).toHaveBeenCalled();
|
|
130
|
+
expect(onBlur).toHaveBeenCalledWith({ value: "12", error: "Value must be less than or equal to 10." });
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("Cannot increment the value if it is greater than the max value", () => {
|
|
134
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" max={10} />);
|
|
135
|
+
const number = getByLabelText("Number input label");
|
|
136
|
+
userEvent.type(number, "12");
|
|
137
|
+
fireEvent.blur(number);
|
|
138
|
+
expect(number.value).toBe("12");
|
|
139
|
+
const decrement = getAllByRole("button")[1];
|
|
140
|
+
userEvent.click(decrement);
|
|
141
|
+
expect(number.value).toBe("12");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test("Decrement the value when it is greater than the max value", () => {
|
|
145
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" max={10} />);
|
|
146
|
+
const number = getByLabelText("Number input label");
|
|
147
|
+
userEvent.type(number, "12");
|
|
148
|
+
fireEvent.blur(number);
|
|
149
|
+
expect(number.value).toBe("12");
|
|
150
|
+
const decrement = getAllByRole("button")[0];
|
|
151
|
+
userEvent.click(decrement);
|
|
152
|
+
expect(number.value).toBe("10");
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("Increment and decrement the value with min and max values", () => {
|
|
156
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" min={5} max={10} />);
|
|
157
|
+
const number = getByLabelText("Number input label");
|
|
158
|
+
userEvent.type(number, "1");
|
|
159
|
+
fireEvent.blur(number);
|
|
160
|
+
expect(number.value).toBe("1");
|
|
161
|
+
const decrement = getAllByRole("button")[0];
|
|
162
|
+
userEvent.click(decrement);
|
|
163
|
+
expect(number.value).toBe("1");
|
|
164
|
+
const increment = getAllByRole("button")[1];
|
|
165
|
+
userEvent.click(increment);
|
|
166
|
+
expect(number.value).toBe("5");
|
|
167
|
+
userEvent.click(increment);
|
|
168
|
+
userEvent.click(increment);
|
|
169
|
+
userEvent.click(increment);
|
|
170
|
+
userEvent.click(increment);
|
|
171
|
+
userEvent.click(increment);
|
|
172
|
+
expect(number.value).toBe("10");
|
|
173
|
+
userEvent.click(increment);
|
|
174
|
+
expect(number.value).toBe("10");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("Increment and decrement the value with step", () => {
|
|
178
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" step={5} />);
|
|
179
|
+
const number = getByLabelText("Number input label");
|
|
180
|
+
userEvent.type(number, "10");
|
|
181
|
+
fireEvent.blur(number);
|
|
182
|
+
expect(number.value).toBe("10");
|
|
183
|
+
const increment = getAllByRole("button")[1];
|
|
184
|
+
userEvent.click(increment);
|
|
185
|
+
expect(number.value).toBe("15");
|
|
186
|
+
userEvent.click(increment);
|
|
187
|
+
expect(number.value).toBe("20");
|
|
188
|
+
const decrement = getAllByRole("button")[0];
|
|
189
|
+
userEvent.click(decrement);
|
|
190
|
+
expect(number.value).toBe("15");
|
|
191
|
+
userEvent.click(decrement);
|
|
192
|
+
expect(number.value).toBe("10");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test("Increment and decrement the value with min, max and step", () => {
|
|
196
|
+
const onBlur = jest.fn(({ value, error }) => {
|
|
197
|
+
expect(value).toBe("1");
|
|
198
|
+
expect(error).toBe("Value must be greater than or equal to 5.");
|
|
199
|
+
});
|
|
200
|
+
const { getByLabelText, getAllByRole } = render(
|
|
201
|
+
<DxcNumberInput label="Number input label" min={5} max={20} step={8} onBlur={onBlur} />
|
|
202
|
+
);
|
|
203
|
+
const number = getByLabelText("Number input label");
|
|
204
|
+
userEvent.type(number, "1");
|
|
205
|
+
fireEvent.blur(number);
|
|
206
|
+
const increment = getAllByRole("button")[1];
|
|
207
|
+
userEvent.click(increment);
|
|
208
|
+
expect(number.value).toBe("5");
|
|
209
|
+
userEvent.click(increment);
|
|
210
|
+
expect(number.value).toBe("13");
|
|
211
|
+
userEvent.click(increment);
|
|
212
|
+
expect(number.value).toBe("20");
|
|
213
|
+
userEvent.click(increment);
|
|
214
|
+
expect(number.value).toBe("20");
|
|
215
|
+
const decrement = getAllByRole("button")[0];
|
|
216
|
+
userEvent.click(decrement);
|
|
217
|
+
expect(number.value).toBe("12");
|
|
218
|
+
userEvent.click(decrement);
|
|
219
|
+
expect(number.value).toBe("5");
|
|
220
|
+
userEvent.click(decrement);
|
|
221
|
+
expect(number.value).toBe("5");
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("Increment and decrement the value with min, max and step using the arrows in keyboard", () => {
|
|
225
|
+
const { getByLabelText } = render(<DxcNumberInput label="Number input label" min={5} max={20} step={5} />);
|
|
226
|
+
const number = getByLabelText("Number input label");
|
|
227
|
+
userEvent.type(number, "1");
|
|
228
|
+
fireEvent.keyDown(number, { keyCode: 38 });
|
|
229
|
+
expect(number.value).toBe("5");
|
|
230
|
+
fireEvent.keyDown(number, { keyCode: 38 });
|
|
231
|
+
expect(number.value).toBe("10");
|
|
232
|
+
fireEvent.keyDown(number, { keyCode: 38 });
|
|
233
|
+
expect(number.value).toBe("15");
|
|
234
|
+
fireEvent.keyDown(number, { keyCode: 38 });
|
|
235
|
+
expect(number.value).toBe("20");
|
|
236
|
+
fireEvent.keyDown(number, { keyCode: 38 });
|
|
237
|
+
expect(number.value).toBe("20");
|
|
238
|
+
fireEvent.keyDown(number, { keyCode: 40 });
|
|
239
|
+
expect(number.value).toBe("15");
|
|
240
|
+
fireEvent.keyDown(number, { keyCode: 40 });
|
|
241
|
+
expect(number.value).toBe("10");
|
|
242
|
+
fireEvent.keyDown(number, { keyCode: 40 });
|
|
243
|
+
expect(number.value).toBe("5");
|
|
244
|
+
fireEvent.keyDown(number, { keyCode: 40 });
|
|
245
|
+
expect(number.value).toBe("5");
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test("Number has correct accesibility attributes", () => {
|
|
249
|
+
const { getByLabelText, getAllByRole } = render(<DxcNumberInput label="Number input label" />);
|
|
250
|
+
const number = getByLabelText("Number input label");
|
|
251
|
+
expect(number.getAttribute("aria-autocomplete")).toBeNull();
|
|
252
|
+
expect(number.getAttribute("aria-controls")).toBeNull();
|
|
253
|
+
expect(number.getAttribute("aria-expanded")).toBeNull();
|
|
254
|
+
const decrement = getAllByRole("button")[0];
|
|
255
|
+
expect(decrement.getAttribute("aria-label")).toBe("Decrement");
|
|
256
|
+
const increment = getAllByRole("button")[1];
|
|
257
|
+
expect(increment.getAttribute("aria-label")).toBe("Increment");
|
|
258
|
+
});
|
|
259
|
+
});
|