@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.
Files changed (107) hide show
  1. package/dist/components/Alert/Alert.spec.js +170 -170
  2. package/dist/components/Badges/Badge.spec.js +103 -103
  3. package/dist/components/BottomSheet/BottomSheet.spec.js +127 -127
  4. package/dist/components/Breadcrumb/Breadcrumb.spec.js +120 -120
  5. package/dist/components/Button/Button.spec.js +211 -211
  6. package/dist/components/Button/ButtonSaveDemo.spec.js +48 -48
  7. package/dist/components/Calendar/Calendar.spec.js +131 -131
  8. package/dist/components/Calendar/QuarterView.spec.js +394 -394
  9. package/dist/components/Card.spec.js +47 -47
  10. package/dist/components/CropImage/CropImage.spec.js +216 -216
  11. package/dist/components/DarkModeToggle.spec.js +357 -357
  12. package/dist/components/ErrorDisplay.spec.js +69 -69
  13. package/dist/components/FormActions.spec.js +88 -88
  14. package/dist/components/FormValidationSummary.spec.js +203 -203
  15. package/dist/components/Icons/Icon.spec.js +175 -175
  16. package/dist/components/Icons/MoreHori.spec.js +67 -67
  17. package/dist/components/Icons/WarningIcon.spec.js +30 -30
  18. package/dist/components/Input/Input.spec.js +573 -573
  19. package/dist/components/Input/MultiSelect.spec.js +257 -257
  20. package/dist/components/Input/OTPInput.spec.js +238 -238
  21. package/dist/components/Input/Select.spec.js +218 -218
  22. package/dist/components/Layout/BottomNav.spec.js +130 -130
  23. package/dist/components/Layout/Header.spec.js +203 -203
  24. package/dist/components/Modal/ConfirmationModal.spec.js +191 -191
  25. package/dist/components/Modal/Modal.spec.js +95 -95
  26. package/dist/components/Modal/ModalStateManager.spec.js +100 -100
  27. package/dist/components/PageLoader.spec.js +54 -54
  28. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
  29. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
  30. package/dist/components/Spinner/Spinner.spec.js +75 -75
  31. package/dist/components/StatusIndicator/StatusIndicator.spec.js +129 -129
  32. package/dist/components/Toaster/Toaster.stories.svelte +1 -1
  33. package/dist/components/Toggle.spec.js +158 -158
  34. package/dist/components/ValidationError.spec.js +79 -79
  35. package/dist/components/pages/performers/AvailabilityCalendarModal.spec.js +606 -606
  36. package/dist/components/pages/performers/AvailabilityCalendarModal.svelte +4 -4
  37. package/dist/components/pages/performers/ModalShowInfo.spec.js +124 -124
  38. package/dist/components/pages/performers/ModalShowInfo.svelte +1 -1
  39. package/dist/components/pages/performers/PageBackButton.spec.js +89 -89
  40. package/dist/components/pages/performers/SectionHeader.spec.js +75 -75
  41. package/dist/components/pages/performers/ShowDetails.spec.js +166 -166
  42. package/dist/components/pages/performers/ShowItemCard.spec.js +793 -793
  43. package/dist/components/pages/performers/ShowItemCard.svelte +4 -4
  44. package/dist/components/pages/performers/SwitchOption.spec.js +127 -127
  45. package/dist/components/pages/performers/VenueInfo.spec.js +167 -167
  46. package/dist/components/pages/performers/VenueInfo.svelte +1 -1
  47. package/dist/components/pages/performers/VenueItemCard.spec.js +763 -763
  48. package/dist/components/pages/performers/VenueItemCard.svelte +4 -4
  49. package/dist/components/pages/profile/profile-form.spec.js +9 -9
  50. package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte +3 -3
  51. package/dist/components/pages/shows/ShowList.spec.js +33 -33
  52. package/dist/components/pages/shows/TabContent.spec.js +90 -90
  53. package/dist/components/pages/shows/TabNavigation.spec.js +143 -143
  54. package/dist/config.js +5 -5
  55. package/dist/config.spec.js +29 -29
  56. package/dist/constants/formOptions.js +25 -25
  57. package/dist/constants/formOptions.spec.js +88 -88
  58. package/dist/index.js +111 -111
  59. package/dist/stores/auth.d.ts +9 -0
  60. package/dist/stores/auth.d.ts.map +1 -0
  61. package/dist/stores/auth.js +36 -0
  62. package/dist/stores/auth.spec.d.ts +2 -0
  63. package/dist/stores/auth.spec.d.ts.map +1 -0
  64. package/dist/stores/auth.spec.js +139 -0
  65. package/dist/stores/formDataStore.d.ts +17 -0
  66. package/dist/stores/formDataStore.d.ts.map +1 -0
  67. package/dist/stores/formDataStore.js +25 -0
  68. package/dist/stores/formDataStore.spec.d.ts +2 -0
  69. package/dist/stores/formDataStore.spec.d.ts.map +1 -0
  70. package/dist/stores/formDataStore.spec.js +257 -0
  71. package/dist/stores/formSave.d.ts +24 -0
  72. package/dist/stores/formSave.d.ts.map +1 -0
  73. package/dist/stores/formSave.js +132 -0
  74. package/dist/stores/formSave.spec.d.ts +2 -0
  75. package/dist/stores/formSave.spec.d.ts.map +1 -0
  76. package/dist/stores/formSave.spec.js +296 -0
  77. package/dist/stores/index.d.ts +1 -0
  78. package/dist/stores/index.d.ts.map +1 -0
  79. package/dist/stores/index.js +0 -0
  80. package/dist/stores/navigation.d.ts +5 -0
  81. package/dist/stores/navigation.d.ts.map +1 -0
  82. package/dist/stores/navigation.js +12 -0
  83. package/dist/stores/navigation.spec.d.ts +2 -0
  84. package/dist/stores/navigation.spec.d.ts.map +1 -0
  85. package/dist/stores/navigation.spec.js +136 -0
  86. package/dist/stores/toaster.d.ts +4 -0
  87. package/dist/stores/toaster.d.ts.map +1 -0
  88. package/dist/stores/toaster.js +13 -0
  89. package/dist/stores/toaster.spec.d.ts +2 -0
  90. package/dist/stores/toaster.spec.d.ts.map +1 -0
  91. package/dist/stores/toaster.spec.js +59 -0
  92. package/dist/telemetry.js +357 -357
  93. package/dist/telemetry.server.js +211 -211
  94. package/dist/telemetry.server.spec.js +434 -434
  95. package/dist/telemetry.spec.js +660 -660
  96. package/dist/utils/apiConfig.js +49 -49
  97. package/dist/utils/apiConfig.spec.js +118 -118
  98. package/dist/utils/greetings.js +187 -187
  99. package/dist/utils/greetings.spec.js +337 -337
  100. package/dist/utils/imageValidation.js +121 -121
  101. package/dist/utils/imageValidation.spec.js +220 -220
  102. package/dist/utils/portal.js +25 -25
  103. package/dist/utils/portal.spec.js +143 -143
  104. package/dist/utils/utils/utils.js +323 -323
  105. package/dist/utils/utils/utils.spec.js +698 -698
  106. package/dist/utils/utils.spec.js +643 -643
  107. package/package.json +1 -1
@@ -1,191 +1,191 @@
1
- import { render, screen, fireEvent, waitFor } from "@testing-library/svelte";
2
- import userEvent from "@testing-library/user-event";
3
- import { expect, describe, test, vi } from "vitest";
4
- import ConfirmationModal from "./ConfirmationModal.svelte";
5
-
6
- const defaultActions = [
7
- { label: "Cancel", onClick: vi.fn(), variant: "gray-outline" },
8
- { label: "Confirm", onClick: vi.fn(), variant: "blue-solid" },
9
- ];
10
-
11
- function setupTest(args = {}) {
12
- const user = userEvent.setup();
13
- const { component } = render(ConfirmationModal, {
14
- props: {
15
- show: true,
16
- title: "Test Modal",
17
- description: "This is a test description",
18
- actions: defaultActions.map((a) => ({ ...a, onClick: vi.fn() })),
19
- ...args,
20
- },
21
- });
22
- return { user, component };
23
- }
24
-
25
- describe("ConfirmationModal Component Tests", () => {
26
- // Note: Modal renders both mobile sheet and desktop centered versions
27
- // CSS hides one based on viewport, but in tests both are in DOM
28
- // Use getAllByText/queryAllByText and check length or first element
29
-
30
- test("Does not render when show is false", () => {
31
- render(ConfirmationModal, { props: { show: false } });
32
- expect(screen.queryByText("Test Modal")).not.toBeInTheDocument();
33
- });
34
-
35
- test("Renders when show is true", () => {
36
- setupTest();
37
- // Modal renders both mobile and desktop versions
38
- expect(screen.getAllByText("Test Modal").length).toBeGreaterThan(0);
39
- });
40
-
41
- test("Displays title", () => {
42
- setupTest({ title: "Confirm Delete" });
43
- expect(screen.getAllByText("Confirm Delete").length).toBeGreaterThan(0);
44
- });
45
-
46
- test("Displays description", () => {
47
- setupTest({ description: "Are you sure you want to proceed?" });
48
- expect(
49
- screen.getAllByText("Are you sure you want to proceed?").length
50
- ).toBeGreaterThan(0);
51
- });
52
-
53
- test("Displays warning text when provided", () => {
54
- setupTest({ warningText: "This action cannot be undone" });
55
- expect(
56
- screen.getAllByText("This action cannot be undone").length
57
- ).toBeGreaterThan(0);
58
- });
59
-
60
- test("Warning text has danger styling", () => {
61
- setupTest({ warningText: "Warning!" });
62
- const warning = screen.getAllByText("Warning!")[0];
63
- expect(warning).toHaveClass("text-accent-Danger");
64
- expect(warning).toHaveClass("font-bold");
65
- });
66
-
67
- test("Renders action buttons", () => {
68
- const actions = [
69
- { label: "No", onClick: vi.fn() },
70
- { label: "Yes", onClick: vi.fn() },
71
- ];
72
- setupTest({ actions });
73
- expect(screen.getAllByText("No").length).toBeGreaterThan(0);
74
- expect(screen.getAllByText("Yes").length).toBeGreaterThan(0);
75
- });
76
-
77
- test("Calls action onClick when button clicked", async () => {
78
- const cancelFn = vi.fn();
79
- const confirmFn = vi.fn();
80
- const actions = [
81
- { label: "Cancel", onClick: cancelFn },
82
- { label: "Confirm", onClick: confirmFn },
83
- ];
84
- const { user } = setupTest({ actions });
85
-
86
- // Click the first Confirm button (both mobile and desktop versions exist)
87
- await user.click(screen.getAllByText("Confirm")[0]);
88
- expect(confirmFn).toHaveBeenCalled();
89
- });
90
-
91
- test("Dispatches event with action label", async () => {
92
- const confirmFn = vi.fn();
93
- const actions = [{ label: "Delete", onClick: confirmFn }];
94
- const { user, component } = setupTest({ actions });
95
-
96
- const deleteSpy = vi.fn();
97
- component.$on("delete", deleteSpy);
98
-
99
- await user.click(screen.getAllByText("Delete")[0]);
100
- expect(deleteSpy).toHaveBeenCalled();
101
- });
102
-
103
- test("Shows close button when closeBtn is true", () => {
104
- setupTest({ closeBtn: true });
105
- const closeImg = document.querySelector('img[alt="Close Icon"]');
106
- expect(closeImg).toBeInTheDocument();
107
- });
108
-
109
- test("Does not show close button by default", () => {
110
- setupTest({ closeBtn: false });
111
- const closeImg = document.querySelector('img[alt="Close Icon"]');
112
- expect(closeImg).not.toBeInTheDocument();
113
- });
114
-
115
- test("Shows icon when provided", () => {
116
- setupTest({ icon: "/test-icon.svg" });
117
- const icon = document.querySelector('img[alt="Icon here"]');
118
- expect(icon).toBeInTheDocument();
119
- expect(icon).toHaveAttribute("src", "/test-icon.svg");
120
- });
121
-
122
- test("Does not show icon by default", () => {
123
- setupTest();
124
- const icon = document.querySelector('img[alt="Icon here"]');
125
- expect(icon).not.toBeInTheDocument();
126
- });
127
-
128
- test("Maps danger action to red-solid variant", async () => {
129
- const actions = [{ label: "Delete", onClick: vi.fn(), danger: true }];
130
- setupTest({ actions });
131
- const button = screen.getAllByText("Delete")[0].closest("button");
132
- expect(button).toHaveClass("btn-red-solid");
133
- });
134
-
135
- test("Maps strokebtn + danger to red-outline variant", async () => {
136
- const actions = [
137
- { label: "Remove", onClick: vi.fn(), strokebtn: true, danger: true },
138
- ];
139
- setupTest({ actions });
140
- const button = screen.getAllByText("Remove")[0].closest("button, a");
141
- expect(button).toHaveClass("btn-red-outline");
142
- });
143
-
144
- test("Maps strokebtn + deemphasized to gray-outline variant", async () => {
145
- const actions = [
146
- { label: "Cancel", onClick: vi.fn(), strokebtn: true, deemphasized: true },
147
- ];
148
- setupTest({ actions });
149
- const button = screen.getAllByText("Cancel")[0].closest("button, a");
150
- expect(button).toHaveClass("btn-gray-outline");
151
- });
152
-
153
- test("Maps textBtn + danger to red-text variant", async () => {
154
- const actions = [
155
- { label: "Delete Text", onClick: vi.fn(), textBtn: true, danger: true },
156
- ];
157
- setupTest({ actions });
158
- const button = screen.getAllByText("Delete Text")[0].closest("button, a");
159
- expect(button).toHaveClass("btn-red-text");
160
- });
161
-
162
- test("Uses explicit variant when provided", async () => {
163
- const actions = [
164
- { label: "Custom", onClick: vi.fn(), variant: "blue-outline" },
165
- ];
166
- setupTest({ actions });
167
- const button = screen.getAllByText("Custom")[0].closest("button, a");
168
- expect(button).toHaveClass("btn-blue-outline");
169
- });
170
-
171
- test("Auto-maps Delete label to red-solid variant", async () => {
172
- const actions = [{ label: "Delete", onClick: vi.fn() }];
173
- setupTest({ actions });
174
- const button = screen.getAllByText("Delete")[0].closest("button, a");
175
- expect(button).toHaveClass("btn-red-solid");
176
- });
177
-
178
- test("Title has proper styling", () => {
179
- setupTest({ title: "Modal Title" });
180
- const title = screen.getAllByText("Modal Title")[0];
181
- expect(title.tagName).toBe("H2");
182
- expect(title).toHaveClass("text-xl");
183
- });
184
-
185
- test("Description has proper styling", () => {
186
- setupTest({ description: "Description text" });
187
- const desc = screen.getAllByText("Description text")[0];
188
- expect(desc).toHaveClass("text-Text-Tartiary");
189
- expect(desc).toHaveClass("text-sm");
190
- });
191
- });
1
+ import { render, screen, fireEvent, waitFor } from "@testing-library/svelte";
2
+ import userEvent from "@testing-library/user-event";
3
+ import { expect, describe, test, vi } from "vitest";
4
+ import ConfirmationModal from "./ConfirmationModal.svelte";
5
+
6
+ const defaultActions = [
7
+ { label: "Cancel", onClick: vi.fn(), variant: "gray-outline" },
8
+ { label: "Confirm", onClick: vi.fn(), variant: "blue-solid" },
9
+ ];
10
+
11
+ function setupTest(args = {}) {
12
+ const user = userEvent.setup();
13
+ const { component } = render(ConfirmationModal, {
14
+ props: {
15
+ show: true,
16
+ title: "Test Modal",
17
+ description: "This is a test description",
18
+ actions: defaultActions.map((a) => ({ ...a, onClick: vi.fn() })),
19
+ ...args,
20
+ },
21
+ });
22
+ return { user, component };
23
+ }
24
+
25
+ describe("ConfirmationModal Component Tests", () => {
26
+ // Note: Modal renders both mobile sheet and desktop centered versions
27
+ // CSS hides one based on viewport, but in tests both are in DOM
28
+ // Use getAllByText/queryAllByText and check length or first element
29
+
30
+ test("Does not render when show is false", () => {
31
+ render(ConfirmationModal, { props: { show: false } });
32
+ expect(screen.queryByText("Test Modal")).not.toBeInTheDocument();
33
+ });
34
+
35
+ test("Renders when show is true", () => {
36
+ setupTest();
37
+ // Modal renders both mobile and desktop versions
38
+ expect(screen.getAllByText("Test Modal").length).toBeGreaterThan(0);
39
+ });
40
+
41
+ test("Displays title", () => {
42
+ setupTest({ title: "Confirm Delete" });
43
+ expect(screen.getAllByText("Confirm Delete").length).toBeGreaterThan(0);
44
+ });
45
+
46
+ test("Displays description", () => {
47
+ setupTest({ description: "Are you sure you want to proceed?" });
48
+ expect(
49
+ screen.getAllByText("Are you sure you want to proceed?").length
50
+ ).toBeGreaterThan(0);
51
+ });
52
+
53
+ test("Displays warning text when provided", () => {
54
+ setupTest({ warningText: "This action cannot be undone" });
55
+ expect(
56
+ screen.getAllByText("This action cannot be undone").length
57
+ ).toBeGreaterThan(0);
58
+ });
59
+
60
+ test("Warning text has danger styling", () => {
61
+ setupTest({ warningText: "Warning!" });
62
+ const warning = screen.getAllByText("Warning!")[0];
63
+ expect(warning).toHaveClass("text-accent-Danger");
64
+ expect(warning).toHaveClass("font-bold");
65
+ });
66
+
67
+ test("Renders action buttons", () => {
68
+ const actions = [
69
+ { label: "No", onClick: vi.fn() },
70
+ { label: "Yes", onClick: vi.fn() },
71
+ ];
72
+ setupTest({ actions });
73
+ expect(screen.getAllByText("No").length).toBeGreaterThan(0);
74
+ expect(screen.getAllByText("Yes").length).toBeGreaterThan(0);
75
+ });
76
+
77
+ test("Calls action onClick when button clicked", async () => {
78
+ const cancelFn = vi.fn();
79
+ const confirmFn = vi.fn();
80
+ const actions = [
81
+ { label: "Cancel", onClick: cancelFn },
82
+ { label: "Confirm", onClick: confirmFn },
83
+ ];
84
+ const { user } = setupTest({ actions });
85
+
86
+ // Click the first Confirm button (both mobile and desktop versions exist)
87
+ await user.click(screen.getAllByText("Confirm")[0]);
88
+ expect(confirmFn).toHaveBeenCalled();
89
+ });
90
+
91
+ test("Dispatches event with action label", async () => {
92
+ const confirmFn = vi.fn();
93
+ const actions = [{ label: "Delete", onClick: confirmFn }];
94
+ const { user, component } = setupTest({ actions });
95
+
96
+ const deleteSpy = vi.fn();
97
+ component.$on("delete", deleteSpy);
98
+
99
+ await user.click(screen.getAllByText("Delete")[0]);
100
+ expect(deleteSpy).toHaveBeenCalled();
101
+ });
102
+
103
+ test("Shows close button when closeBtn is true", () => {
104
+ setupTest({ closeBtn: true });
105
+ const closeImg = document.querySelector('img[alt="Close Icon"]');
106
+ expect(closeImg).toBeInTheDocument();
107
+ });
108
+
109
+ test("Does not show close button by default", () => {
110
+ setupTest({ closeBtn: false });
111
+ const closeImg = document.querySelector('img[alt="Close Icon"]');
112
+ expect(closeImg).not.toBeInTheDocument();
113
+ });
114
+
115
+ test("Shows icon when provided", () => {
116
+ setupTest({ icon: "/test-icon.svg" });
117
+ const icon = document.querySelector('img[alt="Icon here"]');
118
+ expect(icon).toBeInTheDocument();
119
+ expect(icon).toHaveAttribute("src", "/test-icon.svg");
120
+ });
121
+
122
+ test("Does not show icon by default", () => {
123
+ setupTest();
124
+ const icon = document.querySelector('img[alt="Icon here"]');
125
+ expect(icon).not.toBeInTheDocument();
126
+ });
127
+
128
+ test("Maps danger action to red-solid variant", async () => {
129
+ const actions = [{ label: "Delete", onClick: vi.fn(), danger: true }];
130
+ setupTest({ actions });
131
+ const button = screen.getAllByText("Delete")[0].closest("button");
132
+ expect(button).toHaveClass("btn-red-solid");
133
+ });
134
+
135
+ test("Maps strokebtn + danger to red-outline variant", async () => {
136
+ const actions = [
137
+ { label: "Remove", onClick: vi.fn(), strokebtn: true, danger: true },
138
+ ];
139
+ setupTest({ actions });
140
+ const button = screen.getAllByText("Remove")[0].closest("button, a");
141
+ expect(button).toHaveClass("btn-red-outline");
142
+ });
143
+
144
+ test("Maps strokebtn + deemphasized to gray-outline variant", async () => {
145
+ const actions = [
146
+ { label: "Cancel", onClick: vi.fn(), strokebtn: true, deemphasized: true },
147
+ ];
148
+ setupTest({ actions });
149
+ const button = screen.getAllByText("Cancel")[0].closest("button, a");
150
+ expect(button).toHaveClass("btn-gray-outline");
151
+ });
152
+
153
+ test("Maps textBtn + danger to red-text variant", async () => {
154
+ const actions = [
155
+ { label: "Delete Text", onClick: vi.fn(), textBtn: true, danger: true },
156
+ ];
157
+ setupTest({ actions });
158
+ const button = screen.getAllByText("Delete Text")[0].closest("button, a");
159
+ expect(button).toHaveClass("btn-red-text");
160
+ });
161
+
162
+ test("Uses explicit variant when provided", async () => {
163
+ const actions = [
164
+ { label: "Custom", onClick: vi.fn(), variant: "blue-outline" },
165
+ ];
166
+ setupTest({ actions });
167
+ const button = screen.getAllByText("Custom")[0].closest("button, a");
168
+ expect(button).toHaveClass("btn-blue-outline");
169
+ });
170
+
171
+ test("Auto-maps Delete label to red-solid variant", async () => {
172
+ const actions = [{ label: "Delete", onClick: vi.fn() }];
173
+ setupTest({ actions });
174
+ const button = screen.getAllByText("Delete")[0].closest("button, a");
175
+ expect(button).toHaveClass("btn-red-solid");
176
+ });
177
+
178
+ test("Title has proper styling", () => {
179
+ setupTest({ title: "Modal Title" });
180
+ const title = screen.getAllByText("Modal Title")[0];
181
+ expect(title.tagName).toBe("H2");
182
+ expect(title).toHaveClass("text-xl");
183
+ });
184
+
185
+ test("Description has proper styling", () => {
186
+ setupTest({ description: "Description text" });
187
+ const desc = screen.getAllByText("Description text")[0];
188
+ expect(desc).toHaveClass("text-Text-Tartiary");
189
+ expect(desc).toHaveClass("text-sm");
190
+ });
191
+ });
@@ -1,95 +1,95 @@
1
- import { render, screen, fireEvent } from '@testing-library/svelte';
2
- import userEvent from '@testing-library/user-event';
3
- import { expect, describe, test } from 'vitest';
4
- import ModalTestWrapper from './ModalTestWrapper.svelte';
5
-
6
- function setupTest(args) {
7
- const user = userEvent.setup();
8
- const { component } = render(ModalTestWrapper, { props: { ...args } });
9
- return { user, component };
10
- }
11
-
12
- describe('Modal Component Tests', () => {
13
- // Note: Modal renders both mobile sheet and desktop centered versions
14
- // CSS hides one based on viewport, but in tests both are in DOM
15
- // Use getAllByText and check that at least one exists
16
-
17
- test('Renders Modal when show is true', () => {
18
- setupTest({
19
- show: true,
20
- title: 'Test Title',
21
- description: 'Test Description',
22
- warningText: 'Test Warning'
23
- });
24
- // Modal renders both mobile and desktop versions, so use getAllByText
25
- expect(screen.getAllByText('Test Title').length).toBeGreaterThan(0);
26
- expect(screen.getAllByText(/Test Description/).length).toBeGreaterThan(0);
27
- expect(screen.getAllByText(/Test Warning/).length).toBeGreaterThan(0);
28
- expect(screen.getAllByRole('button', { name: /Cancel/i }).length).toBeGreaterThan(0);
29
- expect(screen.getAllByRole('button', { name: /Confirm/i }).length).toBeGreaterThan(0);
30
- });
31
-
32
- test('Does not render Modal when show is false', () => {
33
- setupTest({
34
- show: false,
35
- title: 'Test Title',
36
- description: 'Test Description',
37
- warningText: 'Test Warning'
38
- });
39
- expect(screen.queryByText('Test Title')).not.toBeInTheDocument();
40
- expect(screen.queryByText('Test Description')).not.toBeInTheDocument();
41
- expect(screen.queryByText('Test Warning')).not.toBeInTheDocument();
42
- });
43
-
44
- test('Displays the correct title, description, and warning text', () => {
45
- const title = 'Correct Title';
46
- const description = 'Correct Description';
47
- const warningText = 'Correct Warning';
48
- setupTest({
49
- show: true,
50
- title,
51
- description,
52
- warningText,
53
- });
54
- // Modal renders both mobile and desktop versions
55
- expect(screen.getAllByText(title).length).toBeGreaterThan(0);
56
- expect(screen.getAllByText(new RegExp(description)).length).toBeGreaterThan(0);
57
- expect(screen.getAllByText(new RegExp(warningText)).length).toBeGreaterThan(0);
58
- });
59
-
60
- test('Dispatches cancel event on escape key press', async () => {
61
- const { user, component } = setupTest({
62
- show: true,
63
- title: 'Test Title'
64
- });
65
-
66
- // Verify modal is open
67
- expect(screen.getAllByText('Test Title').length).toBeGreaterThan(0);
68
-
69
- // Listen for the cancel event
70
- let cancelCalled = false;
71
- component.$on('cancel', () => { cancelCalled = true; });
72
-
73
- // Press Escape key
74
- await fireEvent.keyDown(window, { key: 'Escape' });
75
-
76
- // Cancel event should be dispatched
77
- expect(cancelCalled).toBe(true);
78
- });
79
-
80
- test('Prevents propagation of click events within modal', async () => {
81
- const { user } = setupTest({
82
- show: true,
83
- title: 'Test Title'
84
- });
85
-
86
- // Find the modal sheet content (first instance)
87
- const modalText = screen.getAllByText('Test Title')[0];
88
- const modalContent = modalText.closest('.modal-sheet') || modalText.closest('.modal-centered');
89
- const clickEvent = new MouseEvent('click', { bubbles: true });
90
- modalContent.dispatchEvent(clickEvent);
91
-
92
- // Modal should still be visible
93
- expect(screen.getAllByText('Test Title').length).toBeGreaterThan(0);
94
- });
95
- });
1
+ import { render, screen, fireEvent } from '@testing-library/svelte';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { expect, describe, test } from 'vitest';
4
+ import ModalTestWrapper from './ModalTestWrapper.svelte';
5
+
6
+ function setupTest(args) {
7
+ const user = userEvent.setup();
8
+ const { component } = render(ModalTestWrapper, { props: { ...args } });
9
+ return { user, component };
10
+ }
11
+
12
+ describe('Modal Component Tests', () => {
13
+ // Note: Modal renders both mobile sheet and desktop centered versions
14
+ // CSS hides one based on viewport, but in tests both are in DOM
15
+ // Use getAllByText and check that at least one exists
16
+
17
+ test('Renders Modal when show is true', () => {
18
+ setupTest({
19
+ show: true,
20
+ title: 'Test Title',
21
+ description: 'Test Description',
22
+ warningText: 'Test Warning'
23
+ });
24
+ // Modal renders both mobile and desktop versions, so use getAllByText
25
+ expect(screen.getAllByText('Test Title').length).toBeGreaterThan(0);
26
+ expect(screen.getAllByText(/Test Description/).length).toBeGreaterThan(0);
27
+ expect(screen.getAllByText(/Test Warning/).length).toBeGreaterThan(0);
28
+ expect(screen.getAllByRole('button', { name: /Cancel/i }).length).toBeGreaterThan(0);
29
+ expect(screen.getAllByRole('button', { name: /Confirm/i }).length).toBeGreaterThan(0);
30
+ });
31
+
32
+ test('Does not render Modal when show is false', () => {
33
+ setupTest({
34
+ show: false,
35
+ title: 'Test Title',
36
+ description: 'Test Description',
37
+ warningText: 'Test Warning'
38
+ });
39
+ expect(screen.queryByText('Test Title')).not.toBeInTheDocument();
40
+ expect(screen.queryByText('Test Description')).not.toBeInTheDocument();
41
+ expect(screen.queryByText('Test Warning')).not.toBeInTheDocument();
42
+ });
43
+
44
+ test('Displays the correct title, description, and warning text', () => {
45
+ const title = 'Correct Title';
46
+ const description = 'Correct Description';
47
+ const warningText = 'Correct Warning';
48
+ setupTest({
49
+ show: true,
50
+ title,
51
+ description,
52
+ warningText,
53
+ });
54
+ // Modal renders both mobile and desktop versions
55
+ expect(screen.getAllByText(title).length).toBeGreaterThan(0);
56
+ expect(screen.getAllByText(new RegExp(description)).length).toBeGreaterThan(0);
57
+ expect(screen.getAllByText(new RegExp(warningText)).length).toBeGreaterThan(0);
58
+ });
59
+
60
+ test('Dispatches cancel event on escape key press', async () => {
61
+ const { user, component } = setupTest({
62
+ show: true,
63
+ title: 'Test Title'
64
+ });
65
+
66
+ // Verify modal is open
67
+ expect(screen.getAllByText('Test Title').length).toBeGreaterThan(0);
68
+
69
+ // Listen for the cancel event
70
+ let cancelCalled = false;
71
+ component.$on('cancel', () => { cancelCalled = true; });
72
+
73
+ // Press Escape key
74
+ await fireEvent.keyDown(window, { key: 'Escape' });
75
+
76
+ // Cancel event should be dispatched
77
+ expect(cancelCalled).toBe(true);
78
+ });
79
+
80
+ test('Prevents propagation of click events within modal', async () => {
81
+ const { user } = setupTest({
82
+ show: true,
83
+ title: 'Test Title'
84
+ });
85
+
86
+ // Find the modal sheet content (first instance)
87
+ const modalText = screen.getAllByText('Test Title')[0];
88
+ const modalContent = modalText.closest('.modal-sheet') || modalText.closest('.modal-centered');
89
+ const clickEvent = new MouseEvent('click', { bubbles: true });
90
+ modalContent.dispatchEvent(clickEvent);
91
+
92
+ // Modal should still be visible
93
+ expect(screen.getAllByText('Test Title').length).toBeGreaterThan(0);
94
+ });
95
+ });