@getmicdrop/svelte-components 2.0.4 → 2.0.6
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/dist/components/Alert/Alert.spec.js +170 -170
- package/dist/components/Badges/Badge.spec.js +103 -103
- package/dist/components/BottomSheet/BottomSheet.spec.js +127 -127
- package/dist/components/Breadcrumb/Breadcrumb.spec.js +120 -120
- package/dist/components/Button/Button.spec.js +211 -211
- package/dist/components/Button/ButtonSaveDemo.spec.js +48 -48
- package/dist/components/Calendar/Calendar.spec.js +131 -131
- package/dist/components/Calendar/QuarterView.spec.js +394 -394
- package/dist/components/Card.spec.js +47 -47
- package/dist/components/CropImage/CropImage.spec.js +216 -216
- package/dist/components/DarkModeToggle.spec.js +357 -357
- package/dist/components/ErrorDisplay.spec.js +69 -69
- package/dist/components/FormActions.spec.js +88 -88
- package/dist/components/FormValidationSummary.spec.js +203 -203
- package/dist/components/Icons/Icon.spec.js +175 -175
- package/dist/components/Icons/MoreHori.spec.js +67 -67
- package/dist/components/Icons/WarningIcon.spec.js +30 -30
- package/dist/components/Input/Input.spec.js +573 -573
- package/dist/components/Input/MultiSelect.spec.js +257 -257
- package/dist/components/Input/OTPInput.spec.js +238 -238
- package/dist/components/Input/Select.spec.js +218 -218
- package/dist/components/Layout/BottomNav.spec.js +130 -130
- package/dist/components/Layout/Header.spec.js +203 -203
- package/dist/components/Modal/ConfirmationModal.spec.js +191 -191
- package/dist/components/Modal/Modal.spec.js +95 -95
- package/dist/components/Modal/ModalStateManager.spec.js +100 -100
- package/dist/components/PageLoader.spec.js +54 -54
- package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
- package/dist/components/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
- package/dist/components/Spinner/Spinner.spec.js +75 -75
- package/dist/components/StatusIndicator/StatusIndicator.spec.js +129 -129
- package/dist/components/Toaster/Toaster.stories.svelte +1 -1
- package/dist/components/Toggle.spec.js +158 -158
- package/dist/components/ValidationError.spec.js +79 -79
- package/dist/components/pages/performers/AvailabilityCalendarModal.spec.js +606 -606
- package/dist/components/pages/performers/AvailabilityCalendarModal.svelte +4 -4
- package/dist/components/pages/performers/ModalShowInfo.spec.js +124 -124
- package/dist/components/pages/performers/ModalShowInfo.svelte +1 -1
- package/dist/components/pages/performers/PageBackButton.spec.js +89 -89
- package/dist/components/pages/performers/SectionHeader.spec.js +75 -75
- package/dist/components/pages/performers/ShowDetails.spec.js +166 -166
- package/dist/components/pages/performers/ShowItemCard.spec.js +793 -793
- package/dist/components/pages/performers/ShowItemCard.svelte +4 -4
- package/dist/components/pages/performers/SwitchOption.spec.js +127 -127
- package/dist/components/pages/performers/VenueInfo.spec.js +167 -167
- package/dist/components/pages/performers/VenueInfo.svelte +1 -1
- package/dist/components/pages/performers/VenueItemCard.spec.js +763 -763
- package/dist/components/pages/performers/VenueItemCard.svelte +4 -4
- package/dist/components/pages/profile/profile-form.spec.js +9 -9
- package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte +3 -3
- package/dist/components/pages/shows/ShowList.spec.js +33 -33
- package/dist/components/pages/shows/TabContent.spec.js +90 -90
- package/dist/components/pages/shows/TabNavigation.spec.js +143 -143
- package/dist/config.js +5 -5
- package/dist/config.spec.js +29 -29
- package/dist/constants/formOptions.js +25 -25
- package/dist/constants/formOptions.spec.js +88 -88
- package/dist/index.js +111 -111
- package/dist/stores/auth.d.ts +9 -0
- package/dist/stores/auth.d.ts.map +1 -0
- package/dist/stores/auth.js +36 -0
- package/dist/stores/auth.spec.d.ts +2 -0
- package/dist/stores/auth.spec.d.ts.map +1 -0
- package/dist/stores/auth.spec.js +139 -0
- package/dist/stores/formDataStore.d.ts +17 -0
- package/dist/stores/formDataStore.d.ts.map +1 -0
- package/dist/stores/formDataStore.js +25 -0
- package/dist/stores/formDataStore.spec.d.ts +2 -0
- package/dist/stores/formDataStore.spec.d.ts.map +1 -0
- package/dist/stores/formDataStore.spec.js +257 -0
- package/dist/stores/formSave.d.ts +24 -0
- package/dist/stores/formSave.d.ts.map +1 -0
- package/dist/stores/formSave.js +132 -0
- package/dist/stores/formSave.spec.d.ts +2 -0
- package/dist/stores/formSave.spec.d.ts.map +1 -0
- package/dist/stores/formSave.spec.js +296 -0
- package/dist/stores/index.d.ts +1 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +0 -0
- package/dist/stores/navigation.d.ts +5 -0
- package/dist/stores/navigation.d.ts.map +1 -0
- package/dist/stores/navigation.js +12 -0
- package/dist/stores/navigation.spec.d.ts +2 -0
- package/dist/stores/navigation.spec.d.ts.map +1 -0
- package/dist/stores/navigation.spec.js +136 -0
- package/dist/stores/toaster.d.ts +4 -0
- package/dist/stores/toaster.d.ts.map +1 -0
- package/dist/stores/toaster.js +13 -0
- package/dist/stores/toaster.spec.d.ts +2 -0
- package/dist/stores/toaster.spec.d.ts.map +1 -0
- package/dist/stores/toaster.spec.js +59 -0
- package/dist/telemetry.js +357 -357
- package/dist/telemetry.server.js +211 -211
- package/dist/telemetry.server.spec.js +434 -434
- package/dist/telemetry.spec.js +660 -660
- package/dist/utils/apiConfig.js +49 -49
- package/dist/utils/apiConfig.spec.js +118 -118
- package/dist/utils/greetings.js +187 -187
- package/dist/utils/greetings.spec.js +337 -337
- package/dist/utils/imageValidation.js +121 -121
- package/dist/utils/imageValidation.spec.js +220 -220
- package/dist/utils/portal.js +25 -25
- package/dist/utils/portal.spec.js +143 -143
- package/dist/utils/utils/utils.js +323 -323
- package/dist/utils/utils/utils.spec.js +698 -698
- package/dist/utils/utils.spec.js +643 -643
- package/package.json +1 -1
|
@@ -1,218 +1,218 @@
|
|
|
1
|
-
import { render, screen, fireEvent } from "@testing-library/svelte";
|
|
2
|
-
import userEvent from "@testing-library/user-event";
|
|
3
|
-
import { expect, describe, test, vi } from "vitest";
|
|
4
|
-
import Select from "./Select.svelte";
|
|
5
|
-
|
|
6
|
-
const sampleItems = [
|
|
7
|
-
{ name: "Option 1", value: "opt1" },
|
|
8
|
-
{ name: "Option 2", value: "opt2" },
|
|
9
|
-
{ name: "Option 3", value: "opt3" },
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
function setupTest(args = {}) {
|
|
13
|
-
const user = userEvent.setup();
|
|
14
|
-
const { component } = render(Select, {
|
|
15
|
-
props: {
|
|
16
|
-
items: sampleItems,
|
|
17
|
-
...args,
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
return { user, component };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe("Select Component Tests", () => {
|
|
24
|
-
test("Renders select with label", () => {
|
|
25
|
-
setupTest({
|
|
26
|
-
label: "Test Label",
|
|
27
|
-
id: "test-select",
|
|
28
|
-
});
|
|
29
|
-
expect(screen.getByText("Test Label")).toBeInTheDocument();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test("Shows placeholder when no value selected", () => {
|
|
33
|
-
setupTest({
|
|
34
|
-
placeholder: "Select an option",
|
|
35
|
-
});
|
|
36
|
-
expect(screen.getByText("Select an option")).toBeInTheDocument();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test("Opens dropdown on click", async () => {
|
|
40
|
-
const { user } = setupTest();
|
|
41
|
-
const trigger = screen.getByRole("button");
|
|
42
|
-
|
|
43
|
-
await user.click(trigger);
|
|
44
|
-
|
|
45
|
-
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
46
|
-
expect(screen.getByText("Option 1")).toBeInTheDocument();
|
|
47
|
-
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
48
|
-
expect(screen.getByText("Option 3")).toBeInTheDocument();
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("Selects item on click", async () => {
|
|
52
|
-
const { user } = setupTest();
|
|
53
|
-
const trigger = screen.getByRole("button");
|
|
54
|
-
|
|
55
|
-
await user.click(trigger);
|
|
56
|
-
await user.click(screen.getByText("Option 2"));
|
|
57
|
-
|
|
58
|
-
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
59
|
-
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("Closes dropdown after selection", async () => {
|
|
63
|
-
const { user } = setupTest();
|
|
64
|
-
const trigger = screen.getByRole("button");
|
|
65
|
-
|
|
66
|
-
await user.click(trigger);
|
|
67
|
-
await user.click(screen.getByText("Option 1"));
|
|
68
|
-
|
|
69
|
-
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("Shows selected value", () => {
|
|
73
|
-
setupTest({
|
|
74
|
-
value: "opt2",
|
|
75
|
-
});
|
|
76
|
-
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("Dispatches change event on selection", async () => {
|
|
80
|
-
const { user, component } = setupTest();
|
|
81
|
-
const changeSpy = vi.fn();
|
|
82
|
-
component.$on("change", changeSpy);
|
|
83
|
-
|
|
84
|
-
const trigger = screen.getByRole("button");
|
|
85
|
-
await user.click(trigger);
|
|
86
|
-
await user.click(screen.getByText("Option 3"));
|
|
87
|
-
|
|
88
|
-
expect(changeSpy).toHaveBeenCalled();
|
|
89
|
-
expect(changeSpy.mock.calls[0][0].detail).toEqual({
|
|
90
|
-
value: "opt3",
|
|
91
|
-
item: { name: "Option 3", value: "opt3" },
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
test("Shows required indicator when required", () => {
|
|
96
|
-
setupTest({
|
|
97
|
-
label: "Required Field",
|
|
98
|
-
required: true,
|
|
99
|
-
});
|
|
100
|
-
expect(screen.getByText("*")).toBeInTheDocument();
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("Displays error state", () => {
|
|
104
|
-
setupTest({
|
|
105
|
-
error: "This field is required",
|
|
106
|
-
});
|
|
107
|
-
expect(screen.getByText("This field is required")).toBeInTheDocument();
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("Disables select when disabled prop is true", async () => {
|
|
111
|
-
const { user } = setupTest({
|
|
112
|
-
disabled: true,
|
|
113
|
-
});
|
|
114
|
-
const trigger = screen.getByRole("button");
|
|
115
|
-
|
|
116
|
-
expect(trigger).toBeDisabled();
|
|
117
|
-
await user.click(trigger);
|
|
118
|
-
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test("Navigates options with keyboard", async () => {
|
|
122
|
-
const { user } = setupTest();
|
|
123
|
-
const trigger = screen.getByRole("button");
|
|
124
|
-
|
|
125
|
-
await user.click(trigger);
|
|
126
|
-
await user.keyboard("{ArrowDown}");
|
|
127
|
-
await user.keyboard("{ArrowDown}");
|
|
128
|
-
await user.keyboard("{Enter}");
|
|
129
|
-
|
|
130
|
-
// Second option should be selected (started at 0, moved down twice)
|
|
131
|
-
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
test("Closes dropdown on Escape key", async () => {
|
|
135
|
-
const { user } = setupTest();
|
|
136
|
-
const trigger = screen.getByRole("button");
|
|
137
|
-
|
|
138
|
-
await user.click(trigger);
|
|
139
|
-
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
140
|
-
|
|
141
|
-
await user.keyboard("{Escape}");
|
|
142
|
-
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("Opens dropdown with Enter key", async () => {
|
|
146
|
-
const { user } = setupTest();
|
|
147
|
-
const trigger = screen.getByRole("button");
|
|
148
|
-
|
|
149
|
-
trigger.focus();
|
|
150
|
-
await user.keyboard("{Enter}");
|
|
151
|
-
|
|
152
|
-
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
test("Opens dropdown with Space key", async () => {
|
|
156
|
-
const { user } = setupTest();
|
|
157
|
-
const trigger = screen.getByRole("button");
|
|
158
|
-
|
|
159
|
-
trigger.focus();
|
|
160
|
-
await user.keyboard(" ");
|
|
161
|
-
|
|
162
|
-
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
test("Applies animate focus class by default", () => {
|
|
166
|
-
setupTest();
|
|
167
|
-
const trigger = screen.getByRole("button");
|
|
168
|
-
expect(trigger).toHaveClass("select-animate-focus");
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test("Does not apply animate focus when disabled", () => {
|
|
172
|
-
setupTest({
|
|
173
|
-
animateFocus: false,
|
|
174
|
-
});
|
|
175
|
-
const trigger = screen.getByRole("button");
|
|
176
|
-
expect(trigger).not.toHaveClass("select-animate-focus");
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test("Closes dropdown when clicking outside", async () => {
|
|
180
|
-
const { user } = setupTest();
|
|
181
|
-
const trigger = screen.getByRole("button");
|
|
182
|
-
|
|
183
|
-
await user.click(trigger);
|
|
184
|
-
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
185
|
-
|
|
186
|
-
// Click outside by clicking on body
|
|
187
|
-
await user.click(document.body);
|
|
188
|
-
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
test("Shows checkmark for selected option", async () => {
|
|
192
|
-
const { user } = setupTest({
|
|
193
|
-
value: "opt1",
|
|
194
|
-
});
|
|
195
|
-
const trigger = screen.getByRole("button");
|
|
196
|
-
|
|
197
|
-
await user.click(trigger);
|
|
198
|
-
|
|
199
|
-
// The selected option should have a checkmark SVG
|
|
200
|
-
const options = screen.getAllByRole("option");
|
|
201
|
-
const selectedOption = options.find(opt => opt.getAttribute("aria-selected") === "true");
|
|
202
|
-
expect(selectedOption).toBeInTheDocument();
|
|
203
|
-
expect(selectedOption.querySelector("svg")).toBeInTheDocument();
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
test("Sets aria-expanded correctly", async () => {
|
|
207
|
-
const { user } = setupTest();
|
|
208
|
-
const trigger = screen.getByRole("button");
|
|
209
|
-
|
|
210
|
-
expect(trigger).toHaveAttribute("aria-expanded", "false");
|
|
211
|
-
|
|
212
|
-
await user.click(trigger);
|
|
213
|
-
expect(trigger).toHaveAttribute("aria-expanded", "true");
|
|
214
|
-
|
|
215
|
-
await user.click(trigger);
|
|
216
|
-
expect(trigger).toHaveAttribute("aria-expanded", "false");
|
|
217
|
-
});
|
|
218
|
-
});
|
|
1
|
+
import { render, screen, fireEvent } from "@testing-library/svelte";
|
|
2
|
+
import userEvent from "@testing-library/user-event";
|
|
3
|
+
import { expect, describe, test, vi } from "vitest";
|
|
4
|
+
import Select from "./Select.svelte";
|
|
5
|
+
|
|
6
|
+
const sampleItems = [
|
|
7
|
+
{ name: "Option 1", value: "opt1" },
|
|
8
|
+
{ name: "Option 2", value: "opt2" },
|
|
9
|
+
{ name: "Option 3", value: "opt3" },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
function setupTest(args = {}) {
|
|
13
|
+
const user = userEvent.setup();
|
|
14
|
+
const { component } = render(Select, {
|
|
15
|
+
props: {
|
|
16
|
+
items: sampleItems,
|
|
17
|
+
...args,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
return { user, component };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe("Select Component Tests", () => {
|
|
24
|
+
test("Renders select with label", () => {
|
|
25
|
+
setupTest({
|
|
26
|
+
label: "Test Label",
|
|
27
|
+
id: "test-select",
|
|
28
|
+
});
|
|
29
|
+
expect(screen.getByText("Test Label")).toBeInTheDocument();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("Shows placeholder when no value selected", () => {
|
|
33
|
+
setupTest({
|
|
34
|
+
placeholder: "Select an option",
|
|
35
|
+
});
|
|
36
|
+
expect(screen.getByText("Select an option")).toBeInTheDocument();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("Opens dropdown on click", async () => {
|
|
40
|
+
const { user } = setupTest();
|
|
41
|
+
const trigger = screen.getByRole("button");
|
|
42
|
+
|
|
43
|
+
await user.click(trigger);
|
|
44
|
+
|
|
45
|
+
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
46
|
+
expect(screen.getByText("Option 1")).toBeInTheDocument();
|
|
47
|
+
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
48
|
+
expect(screen.getByText("Option 3")).toBeInTheDocument();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("Selects item on click", async () => {
|
|
52
|
+
const { user } = setupTest();
|
|
53
|
+
const trigger = screen.getByRole("button");
|
|
54
|
+
|
|
55
|
+
await user.click(trigger);
|
|
56
|
+
await user.click(screen.getByText("Option 2"));
|
|
57
|
+
|
|
58
|
+
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
59
|
+
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("Closes dropdown after selection", async () => {
|
|
63
|
+
const { user } = setupTest();
|
|
64
|
+
const trigger = screen.getByRole("button");
|
|
65
|
+
|
|
66
|
+
await user.click(trigger);
|
|
67
|
+
await user.click(screen.getByText("Option 1"));
|
|
68
|
+
|
|
69
|
+
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("Shows selected value", () => {
|
|
73
|
+
setupTest({
|
|
74
|
+
value: "opt2",
|
|
75
|
+
});
|
|
76
|
+
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("Dispatches change event on selection", async () => {
|
|
80
|
+
const { user, component } = setupTest();
|
|
81
|
+
const changeSpy = vi.fn();
|
|
82
|
+
component.$on("change", changeSpy);
|
|
83
|
+
|
|
84
|
+
const trigger = screen.getByRole("button");
|
|
85
|
+
await user.click(trigger);
|
|
86
|
+
await user.click(screen.getByText("Option 3"));
|
|
87
|
+
|
|
88
|
+
expect(changeSpy).toHaveBeenCalled();
|
|
89
|
+
expect(changeSpy.mock.calls[0][0].detail).toEqual({
|
|
90
|
+
value: "opt3",
|
|
91
|
+
item: { name: "Option 3", value: "opt3" },
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("Shows required indicator when required", () => {
|
|
96
|
+
setupTest({
|
|
97
|
+
label: "Required Field",
|
|
98
|
+
required: true,
|
|
99
|
+
});
|
|
100
|
+
expect(screen.getByText("*")).toBeInTheDocument();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("Displays error state", () => {
|
|
104
|
+
setupTest({
|
|
105
|
+
error: "This field is required",
|
|
106
|
+
});
|
|
107
|
+
expect(screen.getByText("This field is required")).toBeInTheDocument();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("Disables select when disabled prop is true", async () => {
|
|
111
|
+
const { user } = setupTest({
|
|
112
|
+
disabled: true,
|
|
113
|
+
});
|
|
114
|
+
const trigger = screen.getByRole("button");
|
|
115
|
+
|
|
116
|
+
expect(trigger).toBeDisabled();
|
|
117
|
+
await user.click(trigger);
|
|
118
|
+
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test("Navigates options with keyboard", async () => {
|
|
122
|
+
const { user } = setupTest();
|
|
123
|
+
const trigger = screen.getByRole("button");
|
|
124
|
+
|
|
125
|
+
await user.click(trigger);
|
|
126
|
+
await user.keyboard("{ArrowDown}");
|
|
127
|
+
await user.keyboard("{ArrowDown}");
|
|
128
|
+
await user.keyboard("{Enter}");
|
|
129
|
+
|
|
130
|
+
// Second option should be selected (started at 0, moved down twice)
|
|
131
|
+
expect(screen.getByText("Option 2")).toBeInTheDocument();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("Closes dropdown on Escape key", async () => {
|
|
135
|
+
const { user } = setupTest();
|
|
136
|
+
const trigger = screen.getByRole("button");
|
|
137
|
+
|
|
138
|
+
await user.click(trigger);
|
|
139
|
+
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
140
|
+
|
|
141
|
+
await user.keyboard("{Escape}");
|
|
142
|
+
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("Opens dropdown with Enter key", async () => {
|
|
146
|
+
const { user } = setupTest();
|
|
147
|
+
const trigger = screen.getByRole("button");
|
|
148
|
+
|
|
149
|
+
trigger.focus();
|
|
150
|
+
await user.keyboard("{Enter}");
|
|
151
|
+
|
|
152
|
+
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("Opens dropdown with Space key", async () => {
|
|
156
|
+
const { user } = setupTest();
|
|
157
|
+
const trigger = screen.getByRole("button");
|
|
158
|
+
|
|
159
|
+
trigger.focus();
|
|
160
|
+
await user.keyboard(" ");
|
|
161
|
+
|
|
162
|
+
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test("Applies animate focus class by default", () => {
|
|
166
|
+
setupTest();
|
|
167
|
+
const trigger = screen.getByRole("button");
|
|
168
|
+
expect(trigger).toHaveClass("select-animate-focus");
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test("Does not apply animate focus when disabled", () => {
|
|
172
|
+
setupTest({
|
|
173
|
+
animateFocus: false,
|
|
174
|
+
});
|
|
175
|
+
const trigger = screen.getByRole("button");
|
|
176
|
+
expect(trigger).not.toHaveClass("select-animate-focus");
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test("Closes dropdown when clicking outside", async () => {
|
|
180
|
+
const { user } = setupTest();
|
|
181
|
+
const trigger = screen.getByRole("button");
|
|
182
|
+
|
|
183
|
+
await user.click(trigger);
|
|
184
|
+
expect(screen.getByRole("listbox")).toBeInTheDocument();
|
|
185
|
+
|
|
186
|
+
// Click outside by clicking on body
|
|
187
|
+
await user.click(document.body);
|
|
188
|
+
expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test("Shows checkmark for selected option", async () => {
|
|
192
|
+
const { user } = setupTest({
|
|
193
|
+
value: "opt1",
|
|
194
|
+
});
|
|
195
|
+
const trigger = screen.getByRole("button");
|
|
196
|
+
|
|
197
|
+
await user.click(trigger);
|
|
198
|
+
|
|
199
|
+
// The selected option should have a checkmark SVG
|
|
200
|
+
const options = screen.getAllByRole("option");
|
|
201
|
+
const selectedOption = options.find(opt => opt.getAttribute("aria-selected") === "true");
|
|
202
|
+
expect(selectedOption).toBeInTheDocument();
|
|
203
|
+
expect(selectedOption.querySelector("svg")).toBeInTheDocument();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("Sets aria-expanded correctly", async () => {
|
|
207
|
+
const { user } = setupTest();
|
|
208
|
+
const trigger = screen.getByRole("button");
|
|
209
|
+
|
|
210
|
+
expect(trigger).toHaveAttribute("aria-expanded", "false");
|
|
211
|
+
|
|
212
|
+
await user.click(trigger);
|
|
213
|
+
expect(trigger).toHaveAttribute("aria-expanded", "true");
|
|
214
|
+
|
|
215
|
+
await user.click(trigger);
|
|
216
|
+
expect(trigger).toHaveAttribute("aria-expanded", "false");
|
|
217
|
+
});
|
|
218
|
+
});
|