@getmicdrop/svelte-components 5.5.4 → 5.5.5
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/calendar/AboutShow/AboutShow.spec.d.ts +2 -0
- package/dist/calendar/AboutShow/AboutShow.spec.d.ts.map +1 -0
- package/dist/calendar/AboutShow/AboutShow.spec.js +791 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts +2 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts.map +1 -0
- package/dist/calendar/Calendar/MiniMonthCalendar.spec.js +1191 -0
- package/dist/calendar/FAQs/FAQs.spec.d.ts +2 -0
- package/dist/calendar/FAQs/FAQs.spec.d.ts.map +1 -0
- package/dist/calendar/FAQs/FAQs.spec.js +238 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts +2 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts.map +1 -0
- package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.js +420 -0
- package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts +2 -0
- package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts.map +1 -0
- package/dist/calendar/OrderSummary/OrderSummary.spec.js +808 -0
- package/dist/calendar/PublicCard/PublicCard.spec.d.ts +2 -0
- package/dist/calendar/PublicCard/PublicCard.spec.d.ts.map +1 -0
- package/dist/calendar/PublicCard/PublicCard.spec.js +301 -0
- package/dist/calendar/ShowCard/ShowCard.spec.d.ts +2 -0
- package/dist/calendar/ShowCard/ShowCard.spec.d.ts.map +1 -0
- package/dist/calendar/ShowCard/ShowCard.spec.js +714 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts +2 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts.map +1 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.js +241 -0
- package/dist/components/Layout/Section.spec.d.ts +2 -0
- package/dist/components/Layout/Section.spec.d.ts.map +1 -0
- package/dist/components/Layout/Section.spec.js +149 -0
- package/dist/components/Layout/Sidebar.spec.d.ts +2 -0
- package/dist/components/Layout/Sidebar.spec.d.ts.map +1 -0
- package/dist/components/Layout/Sidebar.spec.js +186 -0
- package/dist/components/Layout/Stack.spec.js +3 -3
- package/dist/constants/formOptions.spec.js +9 -5
- package/dist/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +124 -2
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFieldTracker.spec.d.ts +2 -0
- package/dist/forms/createFieldTracker.spec.d.ts.map +1 -0
- package/dist/forms/createFieldTracker.spec.js +343 -0
- package/dist/forms/createFormStore.spec.d.ts +2 -0
- package/dist/forms/createFormStore.spec.d.ts.map +1 -0
- package/dist/forms/createFormStore.spec.js +689 -0
- package/dist/forms/createFormStore.svelte.js +0 -1
- package/dist/index.d.ts +4 -112
- package/dist/index.js +4 -190
- package/dist/patterns/data/DataGrid.spec.d.ts +2 -0
- package/dist/patterns/data/DataGrid.spec.d.ts.map +1 -0
- package/dist/patterns/data/DataGrid.spec.js +159 -0
- package/dist/patterns/data/DataList.spec.d.ts +2 -0
- package/dist/patterns/data/DataList.spec.d.ts.map +1 -0
- package/dist/patterns/data/DataList.spec.js +158 -0
- package/dist/patterns/data/DataTable.spec.d.ts +2 -0
- package/dist/patterns/data/DataTable.spec.d.ts.map +1 -0
- package/dist/patterns/data/DataTable.spec.js +196 -0
- package/dist/patterns/forms/FormActions.spec.js +10 -3
- package/dist/patterns/forms/FormGrid.spec.d.ts +2 -0
- package/dist/patterns/forms/FormGrid.spec.d.ts.map +1 -0
- package/dist/patterns/forms/FormGrid.spec.js +125 -0
- package/dist/patterns/forms/FormSection.spec.d.ts +2 -0
- package/dist/patterns/forms/FormSection.spec.d.ts.map +1 -0
- package/dist/patterns/forms/FormSection.spec.js +153 -0
- package/dist/patterns/layout/Sidebar.spec.d.ts +2 -0
- package/dist/patterns/layout/Sidebar.spec.d.ts.map +1 -0
- package/dist/patterns/layout/Sidebar.spec.js +159 -0
- package/dist/patterns/navigation/BottomNav.svelte +4 -4
- package/dist/patterns/navigation/Header.spec.js +33 -24
- package/dist/patterns/page/PageHeader.spec.d.ts +2 -0
- package/dist/patterns/page/PageHeader.spec.d.ts.map +1 -0
- package/dist/patterns/page/PageHeader.spec.js +167 -0
- package/dist/patterns/page/PageLayout.spec.d.ts +2 -0
- package/dist/patterns/page/PageLayout.spec.d.ts.map +1 -0
- package/dist/patterns/page/PageLayout.spec.js +145 -0
- package/dist/patterns/page/PageLoader.spec.js +5 -2
- package/dist/patterns/page/SectionHeader.spec.d.ts +2 -0
- package/dist/patterns/page/SectionHeader.spec.d.ts.map +1 -0
- package/dist/patterns/page/SectionHeader.spec.js +197 -0
- package/dist/presets/badges.spec.d.ts +2 -0
- package/dist/presets/badges.spec.d.ts.map +1 -0
- package/dist/presets/badges.spec.js +172 -0
- package/dist/presets/buttons.spec.d.ts +2 -0
- package/dist/presets/buttons.spec.d.ts.map +1 -0
- package/dist/presets/buttons.spec.js +135 -0
- package/dist/primitives/Accordion/Accordion.spec.d.ts +2 -0
- package/dist/primitives/Accordion/Accordion.spec.d.ts.map +1 -0
- package/dist/primitives/Accordion/Accordion.spec.js +83 -0
- package/dist/primitives/Accordion/AccordionItem.spec.d.ts +2 -0
- package/dist/primitives/Accordion/AccordionItem.spec.d.ts.map +1 -0
- package/dist/primitives/Accordion/AccordionItem.spec.js +661 -0
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -0
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts +35 -0
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Alert/Alert.spec.js +5 -2
- package/dist/primitives/Avatar/Avatar.spec.d.ts +2 -0
- package/dist/primitives/Avatar/Avatar.spec.d.ts.map +1 -0
- package/dist/primitives/Avatar/Avatar.spec.js +211 -0
- package/dist/primitives/Badges/Badge.spec.js +109 -68
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +36 -27
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte +13 -0
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts +7 -0
- package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +15 -13
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +5 -5
- package/dist/primitives/Button/Button.spec.js +83 -71
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +100 -2
- package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts +2 -0
- package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts.map +1 -0
- package/dist/primitives/Button/ButtonVariantShowcase.spec.js +202 -0
- package/dist/primitives/Card.spec.js +1 -1
- package/dist/primitives/Checkbox/Checkbox.spec.d.ts +2 -0
- package/dist/primitives/Checkbox/Checkbox.spec.d.ts.map +1 -0
- package/dist/primitives/Checkbox/Checkbox.spec.js +252 -0
- package/dist/primitives/DarkModeToggle.spec.js +84 -51
- package/dist/primitives/Drawer/Drawer.spec.d.ts +2 -0
- package/dist/primitives/Drawer/Drawer.spec.d.ts.map +1 -0
- package/dist/primitives/Drawer/Drawer.spec.js +212 -0
- package/dist/primitives/Dropdown/Dropdown.spec.d.ts +2 -0
- package/dist/primitives/Dropdown/Dropdown.spec.d.ts.map +1 -0
- package/dist/primitives/Dropdown/Dropdown.spec.js +366 -0
- package/dist/primitives/Dropdown/DropdownItem.spec.d.ts +2 -0
- package/dist/primitives/Dropdown/DropdownItem.spec.d.ts.map +1 -0
- package/dist/primitives/Dropdown/DropdownItem.spec.js +182 -0
- package/dist/primitives/Icons/iconTestUtils.spec.d.ts +2 -0
- package/dist/primitives/Icons/iconTestUtils.spec.d.ts.map +1 -0
- package/dist/primitives/Icons/iconTestUtils.spec.js +235 -0
- package/dist/primitives/Input/Input.spec.js +14 -14
- package/dist/primitives/Input/Input.svelte +1 -14
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Select.spec.js +11 -17
- package/dist/primitives/Input/Textarea.spec.d.ts +2 -0
- package/dist/primitives/Input/Textarea.spec.d.ts.map +1 -0
- package/dist/primitives/Input/Textarea.spec.js +255 -0
- package/dist/primitives/Label/Label.spec.d.ts +2 -0
- package/dist/primitives/Label/Label.spec.d.ts.map +1 -0
- package/dist/primitives/Label/Label.spec.js +157 -0
- package/dist/primitives/Modal/Modal.spec.js +29 -25
- package/dist/primitives/Modal/ModalTestWrapper.svelte +65 -0
- package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts +23 -0
- package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts.map +1 -0
- package/dist/primitives/NumberInput/NumberInput.spec.d.ts +2 -0
- package/dist/primitives/NumberInput/NumberInput.spec.d.ts.map +1 -0
- package/dist/primitives/NumberInput/NumberInput.spec.js +235 -0
- package/dist/primitives/Pagination/Pagination.spec.d.ts +2 -0
- package/dist/primitives/Pagination/Pagination.spec.d.ts.map +1 -0
- package/dist/primitives/Pagination/Pagination.spec.js +266 -0
- package/dist/primitives/Radio/Radio.spec.d.ts +2 -0
- package/dist/primitives/Radio/Radio.spec.d.ts.map +1 -0
- package/dist/primitives/Radio/Radio.spec.js +206 -0
- package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/CardPlaceholder.spec.js +156 -0
- package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/ImagePlaceholder.spec.js +120 -0
- package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/ListPlaceholder.spec.js +220 -0
- package/dist/primitives/Skeleton/Skeleton.spec.d.ts +2 -0
- package/dist/primitives/Skeleton/Skeleton.spec.d.ts.map +1 -0
- package/dist/primitives/Skeleton/Skeleton.spec.js +173 -0
- package/dist/primitives/Spinner/Spinner.spec.js +25 -29
- package/dist/primitives/Tabs/TabItem.spec.d.ts +2 -0
- package/dist/primitives/Tabs/TabItem.spec.d.ts.map +1 -0
- package/dist/primitives/Tabs/TabItem.spec.js +130 -0
- package/dist/primitives/Tabs/Tabs.spec.d.ts +2 -0
- package/dist/primitives/Tabs/Tabs.spec.d.ts.map +1 -0
- package/dist/primitives/Tabs/Tabs.spec.js +295 -0
- package/dist/primitives/Tabs/TabsWithItems.test.svelte +18 -0
- package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts +16 -0
- package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts.map +1 -0
- package/dist/primitives/Toggle.spec.js +93 -77
- package/dist/primitives/Typography/Typography.spec.d.ts +2 -0
- package/dist/primitives/Typography/Typography.spec.d.ts.map +1 -0
- package/dist/primitives/Typography/Typography.spec.js +183 -0
- package/dist/primitives/ValidationError.spec.js +1 -1
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +3 -0
- package/dist/recipes/CropImage/CropImage.spec.js +1 -9
- package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts +2 -0
- package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts.map +1 -0
- package/dist/recipes/ImageUploader/ImageUploader.spec.js +1351 -0
- package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts +2 -0
- package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts.map +1 -0
- package/dist/recipes/SuperLogin/SuperLogin.spec.js +1436 -0
- package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts +2 -0
- package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts.map +1 -0
- package/dist/recipes/feedback/EmptyState/EmptyState.spec.js +202 -0
- package/dist/recipes/feedback/ErrorDisplay.spec.js +6 -6
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +21 -17
- package/dist/recipes/fields/CheckboxField.spec.d.ts +2 -0
- package/dist/recipes/fields/CheckboxField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/CheckboxField.spec.js +135 -0
- package/dist/recipes/fields/FormField.spec.d.ts +2 -0
- package/dist/recipes/fields/FormField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/FormField.spec.js +159 -0
- package/dist/recipes/fields/RadioGroup.spec.d.ts +2 -0
- package/dist/recipes/fields/RadioGroup.spec.d.ts.map +1 -0
- package/dist/recipes/fields/RadioGroup.spec.js +199 -0
- package/dist/recipes/fields/SelectField.spec.d.ts +2 -0
- package/dist/recipes/fields/SelectField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/SelectField.spec.js +188 -0
- package/dist/recipes/fields/TextareaField.spec.d.ts +2 -0
- package/dist/recipes/fields/TextareaField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/TextareaField.spec.js +205 -0
- package/dist/recipes/fields/ToggleField.spec.d.ts +2 -0
- package/dist/recipes/fields/ToggleField.spec.d.ts.map +1 -0
- package/dist/recipes/fields/ToggleField.spec.js +153 -0
- package/dist/recipes/inputs/MultiSelect.spec.js +4 -3
- package/dist/recipes/inputs/MultiSelect.svelte +10 -3
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts +2 -0
- package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/recipes/inputs/OTPInput.spec.js +52 -39
- package/dist/recipes/inputs/PasswordInput.spec.d.ts +2 -0
- package/dist/recipes/inputs/PasswordInput.spec.d.ts.map +1 -0
- package/dist/recipes/inputs/PasswordInput.spec.js +410 -0
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +253 -173
- package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte +71 -0
- package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts +9 -0
- package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts.map +1 -0
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +1246 -300
- package/dist/recipes/inputs/Search.spec.d.ts +2 -0
- package/dist/recipes/inputs/Search.spec.d.ts.map +1 -0
- package/dist/recipes/inputs/Search.spec.js +177 -0
- package/dist/recipes/inputs/SelectDropdown.spec.d.ts +2 -0
- package/dist/recipes/inputs/SelectDropdown.spec.d.ts.map +1 -0
- package/dist/recipes/inputs/SelectDropdown.spec.js +512 -0
- package/dist/recipes/modals/AlertModal.spec.d.ts +2 -0
- package/dist/recipes/modals/AlertModal.spec.d.ts.map +1 -0
- package/dist/recipes/modals/AlertModal.spec.js +432 -0
- package/dist/recipes/modals/ConfirmationModal.spec.js +36 -21
- package/dist/recipes/modals/InputModal.spec.d.ts +2 -0
- package/dist/recipes/modals/InputModal.spec.d.ts.map +1 -0
- package/dist/recipes/modals/InputModal.spec.js +872 -0
- package/dist/recipes/modals/ModalTestWrapper.spec.d.ts +2 -0
- package/dist/recipes/modals/ModalTestWrapper.spec.d.ts.map +1 -0
- package/dist/recipes/modals/ModalTestWrapper.spec.js +502 -0
- package/dist/recipes/modals/StatusModal.spec.d.ts +2 -0
- package/dist/recipes/modals/StatusModal.spec.d.ts.map +1 -0
- package/dist/recipes/modals/StatusModal.spec.js +599 -0
- package/dist/services/ShowService.spec.js +18 -15
- package/dist/stories/ButtonAuditDashboard.spec.d.ts +2 -0
- package/dist/stories/ButtonAuditDashboard.spec.d.ts.map +1 -0
- package/dist/stories/ButtonAuditDashboard.spec.js +913 -0
- package/dist/stories/ButtonAuditReview.spec.d.ts +2 -0
- package/dist/stories/ButtonAuditReview.spec.d.ts.map +1 -0
- package/dist/stories/ButtonAuditReview.spec.js +422 -0
- package/dist/stories/ButtonGridView.spec.d.ts +2 -0
- package/dist/stories/ButtonGridView.spec.d.ts.map +1 -0
- package/dist/stories/ButtonGridView.spec.js +667 -0
- package/dist/stories/ButtonShowcase.spec.d.ts +2 -0
- package/dist/stories/ButtonShowcase.spec.d.ts.map +1 -0
- package/dist/stories/ButtonShowcase.spec.js +499 -0
- package/dist/stories/PatternsGallery.spec.d.ts +2 -0
- package/dist/stories/PatternsGallery.spec.d.ts.map +1 -0
- package/dist/stories/PatternsGallery.spec.js +514 -0
- package/dist/stories/PrimitivesGallery.spec.d.ts +2 -0
- package/dist/stories/PrimitivesGallery.spec.d.ts.map +1 -0
- package/dist/stories/PrimitivesGallery.spec.js +813 -0
- package/dist/stories/RecipesGallery.spec.d.ts +2 -0
- package/dist/stories/RecipesGallery.spec.d.ts.map +1 -0
- package/dist/stories/RecipesGallery.spec.js +299 -0
- package/dist/stripe/useStripeTheme.spec.d.ts +2 -0
- package/dist/stripe/useStripeTheme.spec.d.ts.map +1 -0
- package/dist/stripe/useStripeTheme.spec.js +793 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +6 -5
- package/dist/telemetry.spec.js +495 -12
- package/dist/tokens/__tests__/colors.test.d.ts +2 -0
- package/dist/tokens/__tests__/colors.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/colors.test.js +152 -0
- package/dist/tokens/__tests__/radius.test.d.ts +2 -0
- package/dist/tokens/__tests__/radius.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/radius.test.js +118 -0
- package/dist/tokens/__tests__/shadows.test.d.ts +2 -0
- package/dist/tokens/__tests__/shadows.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/shadows.test.js +105 -0
- package/dist/tokens/__tests__/spacing.test.js +11 -8
- package/dist/tokens/__tests__/typography.test.d.ts +2 -0
- package/dist/tokens/__tests__/typography.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/typography.test.js +156 -0
- package/dist/tokens/__tests__/z-index.test.d.ts +2 -0
- package/dist/tokens/__tests__/z-index.test.d.ts.map +1 -0
- package/dist/tokens/__tests__/z-index.test.js +121 -0
- package/dist/utils/apiConfig.spec.js +102 -1
- package/dist/utils/formatters.spec.d.ts +2 -0
- package/dist/utils/formatters.spec.d.ts.map +1 -0
- package/dist/utils/formatters.spec.js +82 -0
- package/dist/utils/transitions.spec.d.ts +2 -0
- package/dist/utils/transitions.spec.d.ts.map +1 -0
- package/dist/utils/transitions.spec.js +130 -0
- package/package.json +8 -3
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { expect, describe, test, vi, beforeEach, afterEach } from 'vitest';
|
|
4
|
+
import Dropdown from './Dropdown.svelte';
|
|
5
|
+
|
|
6
|
+
describe('Dropdown Component', () => {
|
|
7
|
+
test('does not render when open is false', () => {
|
|
8
|
+
const { container } = render(Dropdown, { props: { open: false } });
|
|
9
|
+
expect(container.querySelector('[role="menu"]')).not.toBeInTheDocument();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('renders when open is true', () => {
|
|
13
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
14
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('has role="menu"', () => {
|
|
18
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
19
|
+
const menu = container.querySelector('[role="menu"]');
|
|
20
|
+
expect(menu).toBeInTheDocument();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('applies default ariaLabel', () => {
|
|
24
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
25
|
+
const menu = container.querySelector('[role="menu"]');
|
|
26
|
+
expect(menu).toHaveAttribute('aria-label', 'Menu');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('applies custom ariaLabel', () => {
|
|
30
|
+
const { container } = render(Dropdown, { props: { open: true, ariaLabel: 'Options' } });
|
|
31
|
+
const menu = container.querySelector('[role="menu"]');
|
|
32
|
+
expect(menu).toHaveAttribute('aria-label', 'Options');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('applies custom className', () => {
|
|
36
|
+
const { container } = render(Dropdown, { props: { open: true, class: 'custom-dropdown' } });
|
|
37
|
+
const menu = container.querySelector('[role="menu"]');
|
|
38
|
+
expect(menu).toHaveClass('custom-dropdown');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('passes through additional props', () => {
|
|
42
|
+
const { container } = render(Dropdown, { props: { open: true, 'data-testid': 'my-dropdown' } });
|
|
43
|
+
const menu = container.querySelector('[data-testid="my-dropdown"]');
|
|
44
|
+
expect(menu).toBeInTheDocument();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('Dropdown Styling', () => {
|
|
49
|
+
test('has absolute positioning', () => {
|
|
50
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
51
|
+
const menu = container.querySelector('[role="menu"]');
|
|
52
|
+
expect(menu).toHaveClass('absolute');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('has z-10 for stacking', () => {
|
|
56
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
57
|
+
const menu = container.querySelector('[role="menu"]');
|
|
58
|
+
expect(menu).toHaveClass('z-10');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('has bg-white background', () => {
|
|
62
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
63
|
+
const menu = container.querySelector('[role="menu"]');
|
|
64
|
+
expect(menu).toHaveClass('bg-white');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('has dark mode background', () => {
|
|
68
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
69
|
+
const menu = container.querySelector('[role="menu"]');
|
|
70
|
+
expect(menu).toHaveClass('dark:bg-gray-700');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('has rounded-lg border radius', () => {
|
|
74
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
75
|
+
const menu = container.querySelector('[role="menu"]');
|
|
76
|
+
expect(menu).toHaveClass('rounded-lg');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('has shadow-lg for elevation', () => {
|
|
80
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
81
|
+
const menu = container.querySelector('[role="menu"]');
|
|
82
|
+
expect(menu).toHaveClass('shadow-lg');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('has w-44 default width', () => {
|
|
86
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
87
|
+
const menu = container.querySelector('[role="menu"]');
|
|
88
|
+
expect(menu).toHaveClass('w-44');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('has divider classes', () => {
|
|
92
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
93
|
+
const menu = container.querySelector('[role="menu"]');
|
|
94
|
+
expect(menu).toHaveClass('divide-y');
|
|
95
|
+
expect(menu).toHaveClass('divide-gray-100');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('Dropdown List', () => {
|
|
100
|
+
test('contains ul element', () => {
|
|
101
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
102
|
+
const ul = container.querySelector('ul');
|
|
103
|
+
expect(ul).toBeInTheDocument();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('ul has py-2 padding', () => {
|
|
107
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
108
|
+
const ul = container.querySelector('ul');
|
|
109
|
+
expect(ul).toHaveClass('py-2');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('ul has text-sm sizing', () => {
|
|
113
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
114
|
+
const ul = container.querySelector('ul');
|
|
115
|
+
expect(ul).toHaveClass('text-sm');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('ul has text-gray-700 color', () => {
|
|
119
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
120
|
+
const ul = container.querySelector('ul');
|
|
121
|
+
expect(ul).toHaveClass('text-gray-700');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('ul has dark mode text color', () => {
|
|
125
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
126
|
+
const ul = container.querySelector('ul');
|
|
127
|
+
expect(ul).toHaveClass('dark:text-gray-200');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('Dropdown Props', () => {
|
|
132
|
+
test('open defaults to false', () => {
|
|
133
|
+
const { container } = render(Dropdown);
|
|
134
|
+
expect(container.querySelector('[role="menu"]')).not.toBeInTheDocument();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('placement defaults to bottom', () => {
|
|
138
|
+
// Placement affects positioning classes
|
|
139
|
+
const { container } = render(Dropdown, { props: { open: true } });
|
|
140
|
+
const menu = container.querySelector('[role="menu"]');
|
|
141
|
+
// Default bottom placement should exist without explicit placement classes from other positions
|
|
142
|
+
expect(menu).toBeInTheDocument();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('activeUrl can be set', () => {
|
|
146
|
+
// activeUrl is passed via context to child items
|
|
147
|
+
const { container } = render(Dropdown, { props: { open: true, activeUrl: '/test' } });
|
|
148
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('Dropdown Callbacks', () => {
|
|
153
|
+
test('onclose callback prop is accepted', () => {
|
|
154
|
+
const onclose = vi.fn();
|
|
155
|
+
const { container } = render(Dropdown, { props: { open: true, onclose } });
|
|
156
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
157
|
+
// The onclose callback is triggered by keyboard/click events, tested in integration
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe('Dropdown Keyboard Navigation', () => {
|
|
162
|
+
let cleanup;
|
|
163
|
+
|
|
164
|
+
beforeEach(() => {
|
|
165
|
+
// Clean up any existing event listeners
|
|
166
|
+
cleanup = null;
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
afterEach(() => {
|
|
170
|
+
if (cleanup) {
|
|
171
|
+
cleanup();
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('Escape key closes dropdown and calls onclose', async () => {
|
|
176
|
+
const onclose = vi.fn();
|
|
177
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
178
|
+
cleanup = result.unmount;
|
|
179
|
+
|
|
180
|
+
const ul = result.container.querySelector('ul');
|
|
181
|
+
expect(ul).toBeInTheDocument();
|
|
182
|
+
|
|
183
|
+
// Simulate Escape key from within the dropdown ul (dropdownRef)
|
|
184
|
+
const event = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
|
|
185
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
186
|
+
document.dispatchEvent(event);
|
|
187
|
+
|
|
188
|
+
expect(onclose).toHaveBeenCalled();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('Tab key closes dropdown and calls onclose', async () => {
|
|
192
|
+
const onclose = vi.fn();
|
|
193
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
194
|
+
cleanup = result.unmount;
|
|
195
|
+
|
|
196
|
+
const ul = result.container.querySelector('ul');
|
|
197
|
+
|
|
198
|
+
// Simulate Tab key from within the dropdown ul (dropdownRef)
|
|
199
|
+
const event = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
|
|
200
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
201
|
+
document.dispatchEvent(event);
|
|
202
|
+
|
|
203
|
+
expect(onclose).toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test('ArrowDown key prevents default', async () => {
|
|
207
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
208
|
+
cleanup = result.unmount;
|
|
209
|
+
|
|
210
|
+
const ul = result.container.querySelector('ul');
|
|
211
|
+
const event = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true });
|
|
212
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
213
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
214
|
+
|
|
215
|
+
document.dispatchEvent(event);
|
|
216
|
+
|
|
217
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test('ArrowUp key prevents default', async () => {
|
|
221
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
222
|
+
cleanup = result.unmount;
|
|
223
|
+
|
|
224
|
+
const ul = result.container.querySelector('ul');
|
|
225
|
+
const event = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true, cancelable: true });
|
|
226
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
227
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
228
|
+
|
|
229
|
+
document.dispatchEvent(event);
|
|
230
|
+
|
|
231
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test('Home key prevents default', async () => {
|
|
235
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
236
|
+
cleanup = result.unmount;
|
|
237
|
+
|
|
238
|
+
const ul = result.container.querySelector('ul');
|
|
239
|
+
const event = new KeyboardEvent('keydown', { key: 'Home', bubbles: true, cancelable: true });
|
|
240
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
241
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
242
|
+
|
|
243
|
+
document.dispatchEvent(event);
|
|
244
|
+
|
|
245
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test('End key prevents default', async () => {
|
|
249
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
250
|
+
cleanup = result.unmount;
|
|
251
|
+
|
|
252
|
+
const ul = result.container.querySelector('ul');
|
|
253
|
+
const event = new KeyboardEvent('keydown', { key: 'End', bubbles: true, cancelable: true });
|
|
254
|
+
Object.defineProperty(event, 'target', { value: ul, enumerable: true });
|
|
255
|
+
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
256
|
+
|
|
257
|
+
document.dispatchEvent(event);
|
|
258
|
+
|
|
259
|
+
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('keyboard events do not trigger when dropdown is closed', async () => {
|
|
263
|
+
const onclose = vi.fn();
|
|
264
|
+
const result = render(Dropdown, { props: { open: false, onclose } });
|
|
265
|
+
cleanup = result.unmount;
|
|
266
|
+
|
|
267
|
+
// Simulate Escape key when closed
|
|
268
|
+
const event = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
|
|
269
|
+
document.dispatchEvent(event);
|
|
270
|
+
|
|
271
|
+
// onclose should not be called when dropdown is already closed
|
|
272
|
+
expect(onclose).not.toHaveBeenCalled();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
describe('Dropdown Click Outside', () => {
|
|
277
|
+
let cleanup;
|
|
278
|
+
|
|
279
|
+
afterEach(() => {
|
|
280
|
+
if (cleanup) {
|
|
281
|
+
cleanup();
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test('clicking outside closes dropdown and calls onclose', async () => {
|
|
286
|
+
const onclose = vi.fn();
|
|
287
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
288
|
+
cleanup = result.unmount;
|
|
289
|
+
|
|
290
|
+
const menu = result.container.querySelector('[role="menu"]');
|
|
291
|
+
expect(menu).toBeInTheDocument();
|
|
292
|
+
|
|
293
|
+
// Click outside the dropdown
|
|
294
|
+
const outsideElement = document.createElement('div');
|
|
295
|
+
document.body.appendChild(outsideElement);
|
|
296
|
+
|
|
297
|
+
const clickEvent = new MouseEvent('mousedown', { bubbles: true });
|
|
298
|
+
Object.defineProperty(clickEvent, 'target', { value: outsideElement, enumerable: true });
|
|
299
|
+
document.dispatchEvent(clickEvent);
|
|
300
|
+
|
|
301
|
+
expect(onclose).toHaveBeenCalled();
|
|
302
|
+
|
|
303
|
+
document.body.removeChild(outsideElement);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
test('clicking inside dropdown does not close it', async () => {
|
|
307
|
+
const onclose = vi.fn();
|
|
308
|
+
const result = render(Dropdown, { props: { open: true, onclose } });
|
|
309
|
+
cleanup = result.unmount;
|
|
310
|
+
|
|
311
|
+
const ul = result.container.querySelector('ul');
|
|
312
|
+
|
|
313
|
+
// Click inside the dropdown (on the ul element which is a child)
|
|
314
|
+
const clickEvent = new MouseEvent('mousedown', { bubbles: true });
|
|
315
|
+
Object.defineProperty(clickEvent, 'target', { value: ul, enumerable: true });
|
|
316
|
+
document.dispatchEvent(clickEvent);
|
|
317
|
+
|
|
318
|
+
expect(onclose).not.toHaveBeenCalled();
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test('does not handle click outside when dropdown is closed', async () => {
|
|
322
|
+
const onclose = vi.fn();
|
|
323
|
+
const result = render(Dropdown, { props: { open: false, onclose } });
|
|
324
|
+
cleanup = result.unmount;
|
|
325
|
+
|
|
326
|
+
// Click outside
|
|
327
|
+
const outsideElement = document.createElement('div');
|
|
328
|
+
document.body.appendChild(outsideElement);
|
|
329
|
+
|
|
330
|
+
const clickEvent = new MouseEvent('mousedown', { bubbles: true });
|
|
331
|
+
Object.defineProperty(clickEvent, 'target', { value: outsideElement, enumerable: true });
|
|
332
|
+
document.dispatchEvent(clickEvent);
|
|
333
|
+
|
|
334
|
+
expect(onclose).not.toHaveBeenCalled();
|
|
335
|
+
|
|
336
|
+
document.body.removeChild(outsideElement);
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
describe('Dropdown Context', () => {
|
|
341
|
+
test('sets up dropdown context with activeUrl', () => {
|
|
342
|
+
const { container } = render(Dropdown, { props: { open: true, activeUrl: '/test-url' } });
|
|
343
|
+
expect(container.querySelector('[role="menu"]')).toBeInTheDocument();
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
test('context close function calls onclose', () => {
|
|
347
|
+
const onclose = vi.fn();
|
|
348
|
+
render(Dropdown, { props: { open: true, onclose } });
|
|
349
|
+
// Context is tested through integration with child components
|
|
350
|
+
expect(onclose).not.toHaveBeenCalled(); // Not called until context.close() is invoked
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
describe('Dropdown Lifecycle', () => {
|
|
355
|
+
test('cleans up event listeners on destroy', () => {
|
|
356
|
+
const removeEventListenerSpy = vi.spyOn(document, 'removeEventListener');
|
|
357
|
+
const result = render(Dropdown, { props: { open: true } });
|
|
358
|
+
|
|
359
|
+
result.unmount();
|
|
360
|
+
|
|
361
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('mousedown', expect.any(Function), true);
|
|
362
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('keydown', expect.any(Function));
|
|
363
|
+
|
|
364
|
+
removeEventListenerSpy.mockRestore();
|
|
365
|
+
});
|
|
366
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownItem.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Dropdown/DropdownItem.spec.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { expect, describe, test, vi } from 'vitest';
|
|
4
|
+
import DropdownItem from './DropdownItem.svelte';
|
|
5
|
+
|
|
6
|
+
describe('DropdownItem Component', () => {
|
|
7
|
+
test('renders as button by default (no href)', () => {
|
|
8
|
+
const { container } = render(DropdownItem);
|
|
9
|
+
expect(container.querySelector('button')).toBeInTheDocument();
|
|
10
|
+
expect(container.querySelector('a')).not.toBeInTheDocument();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('renders as anchor when href is provided', () => {
|
|
14
|
+
const { container } = render(DropdownItem, { props: { href: '/test' } });
|
|
15
|
+
expect(container.querySelector('a')).toBeInTheDocument();
|
|
16
|
+
expect(container.querySelector('button')).not.toBeInTheDocument();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('anchor has correct href attribute', () => {
|
|
20
|
+
const { container } = render(DropdownItem, { props: { href: '/dashboard' } });
|
|
21
|
+
const anchor = container.querySelector('a');
|
|
22
|
+
expect(anchor).toHaveAttribute('href', '/dashboard');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('has role="menuitem"', () => {
|
|
26
|
+
const { container } = render(DropdownItem);
|
|
27
|
+
expect(container.querySelector('[role="menuitem"]')).toBeInTheDocument();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('applies custom className', () => {
|
|
31
|
+
const { container } = render(DropdownItem, { props: { class: 'custom-item' } });
|
|
32
|
+
const button = container.querySelector('button');
|
|
33
|
+
expect(button).toHaveClass('custom-item');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('is wrapped in li element', () => {
|
|
37
|
+
const { container } = render(DropdownItem);
|
|
38
|
+
expect(container.querySelector('li')).toBeInTheDocument();
|
|
39
|
+
expect(container.querySelector('li button')).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
describe('DropdownItem Disabled State', () => {
|
|
44
|
+
test('button is disabled when disabled prop is true', () => {
|
|
45
|
+
const { container } = render(DropdownItem, { props: { disabled: true } });
|
|
46
|
+
const button = container.querySelector('button');
|
|
47
|
+
expect(button).toBeDisabled();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('has tabindex=-1 when disabled', () => {
|
|
51
|
+
const { container } = render(DropdownItem, { props: { disabled: true } });
|
|
52
|
+
const button = container.querySelector('button');
|
|
53
|
+
expect(button).toHaveAttribute('tabindex', '-1');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('has tabindex=0 when not disabled', () => {
|
|
57
|
+
const { container } = render(DropdownItem, { props: { disabled: false } });
|
|
58
|
+
const button = container.querySelector('button');
|
|
59
|
+
expect(button).toHaveAttribute('tabindex', '0');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('has opacity-50 class when disabled', () => {
|
|
63
|
+
const { container } = render(DropdownItem, { props: { disabled: true } });
|
|
64
|
+
const button = container.querySelector('button');
|
|
65
|
+
expect(button).toHaveClass('opacity-50');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('has cursor-not-allowed when disabled', () => {
|
|
69
|
+
const { container } = render(DropdownItem, { props: { disabled: true } });
|
|
70
|
+
const button = container.querySelector('button');
|
|
71
|
+
expect(button).toHaveClass('cursor-not-allowed');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('has cursor-pointer when not disabled', () => {
|
|
75
|
+
const { container } = render(DropdownItem, { props: { disabled: false } });
|
|
76
|
+
const button = container.querySelector('button');
|
|
77
|
+
expect(button).toHaveClass('cursor-pointer');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('DropdownItem Click Handling', () => {
|
|
82
|
+
test('calls onclick when clicked', async () => {
|
|
83
|
+
const user = userEvent.setup();
|
|
84
|
+
const onclick = vi.fn();
|
|
85
|
+
const { container } = render(DropdownItem, { props: { onclick } });
|
|
86
|
+
|
|
87
|
+
const button = container.querySelector('button');
|
|
88
|
+
await user.click(button);
|
|
89
|
+
expect(onclick).toHaveBeenCalled();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('does not call onclick when disabled', async () => {
|
|
93
|
+
const user = userEvent.setup();
|
|
94
|
+
const onclick = vi.fn();
|
|
95
|
+
const { container } = render(DropdownItem, { props: { onclick, disabled: true } });
|
|
96
|
+
|
|
97
|
+
const button = container.querySelector('button');
|
|
98
|
+
await user.click(button);
|
|
99
|
+
expect(onclick).not.toHaveBeenCalled();
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('DropdownItem Styling', () => {
|
|
104
|
+
test('has block and w-full classes', () => {
|
|
105
|
+
const { container } = render(DropdownItem);
|
|
106
|
+
const button = container.querySelector('button');
|
|
107
|
+
expect(button).toHaveClass('block');
|
|
108
|
+
expect(button).toHaveClass('w-full');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('has text-left alignment', () => {
|
|
112
|
+
const { container } = render(DropdownItem);
|
|
113
|
+
const button = container.querySelector('button');
|
|
114
|
+
expect(button).toHaveClass('text-left');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('has correct padding', () => {
|
|
118
|
+
const { container } = render(DropdownItem);
|
|
119
|
+
const button = container.querySelector('button');
|
|
120
|
+
expect(button).toHaveClass('px-4');
|
|
121
|
+
expect(button).toHaveClass('py-2');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('has text-sm size', () => {
|
|
125
|
+
const { container } = render(DropdownItem);
|
|
126
|
+
const button = container.querySelector('button');
|
|
127
|
+
expect(button).toHaveClass('text-sm');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('has hover styles', () => {
|
|
131
|
+
const { container } = render(DropdownItem);
|
|
132
|
+
const button = container.querySelector('button');
|
|
133
|
+
expect(button).toHaveClass('hover:bg-gray-100');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('has dark mode hover styles', () => {
|
|
137
|
+
const { container } = render(DropdownItem);
|
|
138
|
+
const button = container.querySelector('button');
|
|
139
|
+
expect(button).toHaveClass('dark:hover:bg-gray-600');
|
|
140
|
+
expect(button).toHaveClass('dark:hover:text-white');
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('has default text color', () => {
|
|
144
|
+
const { container } = render(DropdownItem);
|
|
145
|
+
const button = container.querySelector('button');
|
|
146
|
+
expect(button).toHaveClass('text-gray-700');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('has dark mode text color', () => {
|
|
150
|
+
const { container } = render(DropdownItem);
|
|
151
|
+
const button = container.querySelector('button');
|
|
152
|
+
expect(button).toHaveClass('dark:text-gray-200');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe('DropdownItem as Link', () => {
|
|
157
|
+
test('link has role="menuitem"', () => {
|
|
158
|
+
const { container } = render(DropdownItem, { props: { href: '/test' } });
|
|
159
|
+
const anchor = container.querySelector('a');
|
|
160
|
+
expect(anchor).toHaveAttribute('role', 'menuitem');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('link has correct tabindex when not disabled', () => {
|
|
164
|
+
const { container } = render(DropdownItem, { props: { href: '/test' } });
|
|
165
|
+
const anchor = container.querySelector('a');
|
|
166
|
+
expect(anchor).toHaveAttribute('tabindex', '0');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test('link has tabindex=-1 when disabled', () => {
|
|
170
|
+
const { container } = render(DropdownItem, { props: { href: '/test', disabled: true } });
|
|
171
|
+
const anchor = container.querySelector('a');
|
|
172
|
+
expect(anchor).toHaveAttribute('tabindex', '-1');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe('DropdownItem Button Type', () => {
|
|
177
|
+
test('button has type="button"', () => {
|
|
178
|
+
const { container } = render(DropdownItem);
|
|
179
|
+
const button = container.querySelector('button');
|
|
180
|
+
expect(button).toHaveAttribute('type', 'button');
|
|
181
|
+
});
|
|
182
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iconTestUtils.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Icons/iconTestUtils.spec.js"],"names":[],"mappings":""}
|