@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,667 @@
|
|
|
1
|
+
import { render, screen, fireEvent } from '@testing-library/svelte';
|
|
2
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
3
|
+
import ButtonGridView from './ButtonGridView.svelte';
|
|
4
|
+
|
|
5
|
+
// Mock manifest data
|
|
6
|
+
vi.mock('./button-audit-manifest.json', () => ({
|
|
7
|
+
default: {
|
|
8
|
+
generated: '2025-01-06T00:00:00.000Z',
|
|
9
|
+
totalButtons: 10,
|
|
10
|
+
categories: {
|
|
11
|
+
'Test Category': [
|
|
12
|
+
{
|
|
13
|
+
route: 'test-route',
|
|
14
|
+
file: 'components/TestComponent/TestComponent.svelte',
|
|
15
|
+
fullPath: '/Users/test/repos/micdrop-frontend/src/components/TestComponent/TestComponent.svelte',
|
|
16
|
+
buttons: [
|
|
17
|
+
{
|
|
18
|
+
line: 10,
|
|
19
|
+
variant: 'blue-solid',
|
|
20
|
+
size: 'md',
|
|
21
|
+
loading: false,
|
|
22
|
+
disabled: false,
|
|
23
|
+
danger: false,
|
|
24
|
+
deemphasized: false,
|
|
25
|
+
text: 'Test Button 1'
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
line: 20,
|
|
29
|
+
variant: 'gray-outline',
|
|
30
|
+
size: 'lg',
|
|
31
|
+
loading: false,
|
|
32
|
+
disabled: false,
|
|
33
|
+
danger: false,
|
|
34
|
+
deemphasized: false,
|
|
35
|
+
text: 'Test Button 2'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
line: 30,
|
|
39
|
+
variant: 'blue-outline',
|
|
40
|
+
size: 'sm',
|
|
41
|
+
loading: true,
|
|
42
|
+
disabled: false,
|
|
43
|
+
danger: false,
|
|
44
|
+
deemphasized: false,
|
|
45
|
+
text: 'Loading Button'
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
line: 40,
|
|
49
|
+
variant: 'red-solid',
|
|
50
|
+
size: 'xs',
|
|
51
|
+
loading: false,
|
|
52
|
+
disabled: true,
|
|
53
|
+
danger: false,
|
|
54
|
+
deemphasized: false,
|
|
55
|
+
text: 'Disabled Button'
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
line: 50,
|
|
59
|
+
variant: 'red-outline',
|
|
60
|
+
size: 'md',
|
|
61
|
+
loading: false,
|
|
62
|
+
disabled: false,
|
|
63
|
+
danger: true,
|
|
64
|
+
deemphasized: false,
|
|
65
|
+
text: 'Danger Button'
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
route: 'another-route',
|
|
71
|
+
file: 'components/AnotherComponent/Another.svelte',
|
|
72
|
+
fullPath: '/Users/test/repos/micdrop-frontend/src/components/AnotherComponent/Another.svelte',
|
|
73
|
+
buttons: [
|
|
74
|
+
{
|
|
75
|
+
line: 15,
|
|
76
|
+
variant: 'green-solid',
|
|
77
|
+
size: 'md',
|
|
78
|
+
loading: false,
|
|
79
|
+
disabled: false,
|
|
80
|
+
danger: false,
|
|
81
|
+
deemphasized: true,
|
|
82
|
+
text: 'Green Button'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
line: 25,
|
|
86
|
+
variant: 'icon',
|
|
87
|
+
size: 'xs',
|
|
88
|
+
loading: false,
|
|
89
|
+
disabled: false,
|
|
90
|
+
danger: false,
|
|
91
|
+
deemphasized: false,
|
|
92
|
+
text: '...'
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
line: 35,
|
|
96
|
+
variant: 'ghost',
|
|
97
|
+
size: 'md',
|
|
98
|
+
loading: false,
|
|
99
|
+
disabled: false,
|
|
100
|
+
danger: false,
|
|
101
|
+
deemphasized: false,
|
|
102
|
+
text: 'Ghost Button'
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
line: 45,
|
|
106
|
+
variant: 'gray-text',
|
|
107
|
+
size: 'sm',
|
|
108
|
+
loading: false,
|
|
109
|
+
disabled: false,
|
|
110
|
+
danger: false,
|
|
111
|
+
deemphasized: false,
|
|
112
|
+
text: 'This is a very long button text that should be truncated'
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
line: 55,
|
|
116
|
+
variant: 'blue-solid',
|
|
117
|
+
size: 'md',
|
|
118
|
+
loading: false,
|
|
119
|
+
disabled: false,
|
|
120
|
+
danger: false,
|
|
121
|
+
deemphasized: false,
|
|
122
|
+
text: '(no text)'
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
|
|
131
|
+
describe('ButtonGridView Component', () => {
|
|
132
|
+
let classListToggleSpy;
|
|
133
|
+
|
|
134
|
+
beforeEach(() => {
|
|
135
|
+
// Mock classList.toggle on document.documentElement
|
|
136
|
+
classListToggleSpy = vi.spyOn(document.documentElement.classList, 'toggle');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
afterEach(() => {
|
|
140
|
+
// Restore spy
|
|
141
|
+
classListToggleSpy?.mockRestore();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe('Initial Render', () => {
|
|
145
|
+
it('renders the component', () => {
|
|
146
|
+
render(ButtonGridView);
|
|
147
|
+
expect(screen.getByText('Button Grid View')).toBeInTheDocument();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('displays correct button count', () => {
|
|
151
|
+
render(ButtonGridView);
|
|
152
|
+
expect(screen.getByText(/Showing 10 of 10 buttons/i)).toBeInTheDocument();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('renders all buttons from manifest', () => {
|
|
156
|
+
const { container } = render(ButtonGridView);
|
|
157
|
+
// Each button is in a card with specific structure
|
|
158
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
159
|
+
expect(buttonCards.length).toBe(10);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('renders header with sticky positioning', () => {
|
|
163
|
+
const { container } = render(ButtonGridView);
|
|
164
|
+
const header = container.querySelector('.sticky');
|
|
165
|
+
expect(header).toBeInTheDocument();
|
|
166
|
+
expect(header).toHaveClass('top-0', 'z-50');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('renders grid with responsive columns', () => {
|
|
170
|
+
const { container } = render(ButtonGridView);
|
|
171
|
+
const grid = container.querySelector('.grid');
|
|
172
|
+
expect(grid).toHaveClass(
|
|
173
|
+
'grid-cols-2',
|
|
174
|
+
'sm:grid-cols-3',
|
|
175
|
+
'md:grid-cols-4',
|
|
176
|
+
'lg:grid-cols-5',
|
|
177
|
+
'xl:grid-cols-6',
|
|
178
|
+
'2xl:grid-cols-8'
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe('Dark Mode Toggle', () => {
|
|
184
|
+
it('renders dark mode toggle button', () => {
|
|
185
|
+
render(ButtonGridView);
|
|
186
|
+
const toggleButton = screen.getByRole('button', { name: /☀️/i });
|
|
187
|
+
expect(toggleButton).toBeInTheDocument();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('toggles dark mode when clicked', async () => {
|
|
191
|
+
render(ButtonGridView);
|
|
192
|
+
const toggleButton = screen.getByRole('button', { name: /☀️/i });
|
|
193
|
+
|
|
194
|
+
await fireEvent.click(toggleButton);
|
|
195
|
+
|
|
196
|
+
expect(classListToggleSpy).toHaveBeenCalledWith('dark', true);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('changes icon after toggle', async () => {
|
|
200
|
+
render(ButtonGridView);
|
|
201
|
+
let toggleButton = screen.getByRole('button', { name: /☀️/i });
|
|
202
|
+
|
|
203
|
+
await fireEvent.click(toggleButton);
|
|
204
|
+
|
|
205
|
+
toggleButton = screen.getByRole('button', { name: /🌙/i });
|
|
206
|
+
expect(toggleButton).toBeInTheDocument();
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('applies correct background class when dark', async () => {
|
|
210
|
+
render(ButtonGridView);
|
|
211
|
+
const toggleButton = screen.getByRole('button', { name: /☀️/i });
|
|
212
|
+
|
|
213
|
+
await fireEvent.click(toggleButton);
|
|
214
|
+
|
|
215
|
+
const darkButton = screen.getByRole('button', { name: /🌙/i });
|
|
216
|
+
expect(darkButton).toHaveClass('bg-gray-800', 'text-white');
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
describe('Search Functionality', () => {
|
|
221
|
+
it('renders search input', () => {
|
|
222
|
+
render(ButtonGridView);
|
|
223
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
224
|
+
expect(searchInput).toBeInTheDocument();
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('filters buttons by text', async () => {
|
|
228
|
+
const { container } = render(ButtonGridView);
|
|
229
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
230
|
+
|
|
231
|
+
await fireEvent.input(searchInput, { target: { value: 'Green' } });
|
|
232
|
+
|
|
233
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
234
|
+
expect(buttonCards.length).toBe(1);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('filters buttons by file name', async () => {
|
|
238
|
+
const { container } = render(ButtonGridView);
|
|
239
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
240
|
+
|
|
241
|
+
await fireEvent.input(searchInput, { target: { value: 'AnotherComponent' } });
|
|
242
|
+
|
|
243
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
244
|
+
expect(buttonCards.length).toBe(5);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('filters buttons by variant', async () => {
|
|
248
|
+
const { container } = render(ButtonGridView);
|
|
249
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
250
|
+
|
|
251
|
+
await fireEvent.input(searchInput, { target: { value: 'ghost' } });
|
|
252
|
+
|
|
253
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
254
|
+
expect(buttonCards.length).toBe(1);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('is case insensitive', async () => {
|
|
258
|
+
const { container } = render(ButtonGridView);
|
|
259
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
260
|
+
|
|
261
|
+
await fireEvent.input(searchInput, { target: { value: 'GREEN' } });
|
|
262
|
+
|
|
263
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
264
|
+
expect(buttonCards.length).toBe(1);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it('updates button count when filtering', async () => {
|
|
268
|
+
render(ButtonGridView);
|
|
269
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
270
|
+
|
|
271
|
+
await fireEvent.input(searchInput, { target: { value: 'Green' } });
|
|
272
|
+
|
|
273
|
+
expect(screen.getByText(/Showing 1 of 10 buttons/i)).toBeInTheDocument();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it('shows all buttons when search is cleared', async () => {
|
|
277
|
+
const { container } = render(ButtonGridView);
|
|
278
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
279
|
+
|
|
280
|
+
await fireEvent.input(searchInput, { target: { value: 'Green' } });
|
|
281
|
+
await fireEvent.input(searchInput, { target: { value: '' } });
|
|
282
|
+
|
|
283
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
284
|
+
expect(buttonCards.length).toBe(10);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
describe('Variant Filter', () => {
|
|
289
|
+
it('renders variant filter dropdown', () => {
|
|
290
|
+
const { container } = render(ButtonGridView);
|
|
291
|
+
const selects = container.querySelectorAll('select');
|
|
292
|
+
expect(selects.length).toBe(2);
|
|
293
|
+
expect(selects[0]).toBeInTheDocument();
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('shows all unique variants as options', () => {
|
|
297
|
+
const { container } = render(ButtonGridView);
|
|
298
|
+
const variantSelect = container.querySelectorAll('select')[0];
|
|
299
|
+
const options = variantSelect.querySelectorAll('option');
|
|
300
|
+
|
|
301
|
+
// Should have "All Variants" plus unique variants
|
|
302
|
+
expect(options.length).toBeGreaterThan(1);
|
|
303
|
+
expect(options[0]).toHaveTextContent('All Variants');
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it('filters buttons by selected variant', async () => {
|
|
307
|
+
const { container } = render(ButtonGridView);
|
|
308
|
+
const variantSelect = container.querySelectorAll('select')[0];
|
|
309
|
+
|
|
310
|
+
await fireEvent.change(variantSelect, { target: { value: 'blue-solid' } });
|
|
311
|
+
|
|
312
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
313
|
+
expect(buttonCards.length).toBe(2);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('updates button count when filtering by variant', async () => {
|
|
317
|
+
const { container } = render(ButtonGridView);
|
|
318
|
+
const variantSelect = container.querySelectorAll('select')[0];
|
|
319
|
+
|
|
320
|
+
await fireEvent.change(variantSelect, { target: { value: 'icon' } });
|
|
321
|
+
|
|
322
|
+
expect(screen.getByText(/Showing 1 of 10 buttons/i)).toBeInTheDocument();
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
describe('Size Filter', () => {
|
|
327
|
+
it('renders size filter dropdown', () => {
|
|
328
|
+
const { container } = render(ButtonGridView);
|
|
329
|
+
const sizeSelects = container.querySelectorAll('select');
|
|
330
|
+
expect(sizeSelects.length).toBe(2); // variant and size dropdowns
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('shows all unique sizes as options', () => {
|
|
334
|
+
const { container } = render(ButtonGridView);
|
|
335
|
+
const selects = container.querySelectorAll('select');
|
|
336
|
+
const sizeSelect = selects[1];
|
|
337
|
+
const options = sizeSelect.querySelectorAll('option');
|
|
338
|
+
|
|
339
|
+
// Should have "All Sizes" plus unique sizes
|
|
340
|
+
expect(options.length).toBeGreaterThan(1);
|
|
341
|
+
expect(options[0]).toHaveTextContent('All Sizes');
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it('filters buttons by selected size', async () => {
|
|
345
|
+
const { container } = render(ButtonGridView);
|
|
346
|
+
const selects = container.querySelectorAll('select');
|
|
347
|
+
const sizeSelect = selects[1];
|
|
348
|
+
|
|
349
|
+
await fireEvent.change(sizeSelect, { target: { value: 'xs' } });
|
|
350
|
+
|
|
351
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
352
|
+
expect(buttonCards.length).toBe(2);
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it('updates button count when filtering by size', async () => {
|
|
356
|
+
const { container } = render(ButtonGridView);
|
|
357
|
+
const selects = container.querySelectorAll('select');
|
|
358
|
+
const sizeSelect = selects[1];
|
|
359
|
+
|
|
360
|
+
await fireEvent.change(sizeSelect, { target: { value: 'lg' } });
|
|
361
|
+
|
|
362
|
+
expect(screen.getByText(/Showing 1 of 10 buttons/i)).toBeInTheDocument();
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
describe('Combined Filters', () => {
|
|
367
|
+
it('applies variant and size filters together', async () => {
|
|
368
|
+
const { container } = render(ButtonGridView);
|
|
369
|
+
const selects = container.querySelectorAll('select');
|
|
370
|
+
const variantSelect = selects[0];
|
|
371
|
+
const sizeSelect = selects[1];
|
|
372
|
+
|
|
373
|
+
await fireEvent.change(variantSelect, { target: { value: 'blue-solid' } });
|
|
374
|
+
await fireEvent.change(sizeSelect, { target: { value: 'md' } });
|
|
375
|
+
|
|
376
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
377
|
+
expect(buttonCards.length).toBe(2);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
it('applies search and variant filter together', async () => {
|
|
381
|
+
const { container } = render(ButtonGridView);
|
|
382
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
383
|
+
const variantSelect = container.querySelectorAll('select')[0];
|
|
384
|
+
|
|
385
|
+
await fireEvent.input(searchInput, { target: { value: 'Button' } });
|
|
386
|
+
await fireEvent.change(variantSelect, { target: { value: 'red-solid' } });
|
|
387
|
+
|
|
388
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
389
|
+
expect(buttonCards.length).toBe(1);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it('applies all three filters together', async () => {
|
|
393
|
+
const { container } = render(ButtonGridView);
|
|
394
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
395
|
+
const selects = container.querySelectorAll('select');
|
|
396
|
+
const variantSelect = selects[0];
|
|
397
|
+
const sizeSelect = selects[1];
|
|
398
|
+
|
|
399
|
+
await fireEvent.input(searchInput, { target: { value: 'Test' } });
|
|
400
|
+
await fireEvent.change(variantSelect, { target: { value: 'blue-solid' } });
|
|
401
|
+
await fireEvent.change(sizeSelect, { target: { value: 'md' } });
|
|
402
|
+
|
|
403
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
404
|
+
expect(buttonCards.length).toBe(1);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
describe('Button Rendering', () => {
|
|
409
|
+
it('renders buttons with correct variants', () => {
|
|
410
|
+
const { container } = render(ButtonGridView);
|
|
411
|
+
const variantBadges = container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded');
|
|
412
|
+
|
|
413
|
+
// Check that variant badges are rendered
|
|
414
|
+
expect(variantBadges.length).toBeGreaterThan(0);
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
it('renders buttons with correct sizes', () => {
|
|
418
|
+
const { container } = render(ButtonGridView);
|
|
419
|
+
|
|
420
|
+
// Check that size badges exist in the metadata sections
|
|
421
|
+
const sizeBadges = container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded.bg-gray-100');
|
|
422
|
+
expect(sizeBadges.length).toBeGreaterThan(0);
|
|
423
|
+
|
|
424
|
+
// Check for specific size values
|
|
425
|
+
const sizeTexts = Array.from(sizeBadges).map(el => el.textContent);
|
|
426
|
+
expect(sizeTexts).toContain('md');
|
|
427
|
+
expect(sizeTexts).toContain('lg');
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
it('renders loading state buttons', () => {
|
|
431
|
+
const { container } = render(ButtonGridView);
|
|
432
|
+
|
|
433
|
+
// Should have buttons with loading prop
|
|
434
|
+
const buttons = container.querySelectorAll('button');
|
|
435
|
+
expect(buttons.length).toBeGreaterThan(0);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
it('renders disabled state buttons', () => {
|
|
439
|
+
const { container } = render(ButtonGridView);
|
|
440
|
+
|
|
441
|
+
// Should have buttons with disabled prop
|
|
442
|
+
const buttons = container.querySelectorAll('button');
|
|
443
|
+
expect(buttons.length).toBeGreaterThan(0);
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
it('truncates long button text', () => {
|
|
447
|
+
render(ButtonGridView);
|
|
448
|
+
|
|
449
|
+
// Button with long text should be truncated
|
|
450
|
+
const truncatedText = screen.getByText(/This is a very long/i);
|
|
451
|
+
expect(truncatedText.textContent).toContain('…');
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
it('handles buttons with no text', () => {
|
|
455
|
+
const { container } = render(ButtonGridView);
|
|
456
|
+
|
|
457
|
+
// Should render all button cards including those with (no text)
|
|
458
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
459
|
+
expect(buttonCards.length).toBe(10);
|
|
460
|
+
|
|
461
|
+
// Check that we have actual button elements inside
|
|
462
|
+
const actualButtons = container.querySelectorAll('button[type="button"]');
|
|
463
|
+
expect(actualButtons.length).toBeGreaterThan(0);
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
describe('Button Metadata', () => {
|
|
468
|
+
it('displays file name and line number', () => {
|
|
469
|
+
render(ButtonGridView);
|
|
470
|
+
|
|
471
|
+
expect(screen.getByText(/TestComponent.svelte:10/i)).toBeInTheDocument();
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
it('generates correct VS Code links', () => {
|
|
475
|
+
const { container } = render(ButtonGridView);
|
|
476
|
+
const links = container.querySelectorAll('a[href^="vscode://"]');
|
|
477
|
+
|
|
478
|
+
expect(links.length).toBe(10);
|
|
479
|
+
expect(links[0]).toHaveAttribute('href', 'vscode://file/Users/test/repos/micdrop-frontend/src/components/TestComponent/TestComponent.svelte:10');
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it('shows short file path in metadata', () => {
|
|
483
|
+
const { container } = render(ButtonGridView);
|
|
484
|
+
|
|
485
|
+
// Should show last two parts of path in the links
|
|
486
|
+
const links = container.querySelectorAll('a[href^="vscode://"]');
|
|
487
|
+
const linkTexts = Array.from(links).map(link => link.textContent);
|
|
488
|
+
|
|
489
|
+
// Check that at least one link contains the expected format
|
|
490
|
+
const hasExpectedFormat = linkTexts.some(text =>
|
|
491
|
+
text.includes('TestComponent/TestComponent.svelte') || text.includes('AnotherComponent/Another.svelte')
|
|
492
|
+
);
|
|
493
|
+
expect(hasExpectedFormat).toBe(true);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
it('includes full path in link title', () => {
|
|
497
|
+
const { container } = render(ButtonGridView);
|
|
498
|
+
const links = container.querySelectorAll('a[href^="vscode://"]');
|
|
499
|
+
|
|
500
|
+
expect(links[0]).toHaveAttribute('title', 'components/TestComponent/TestComponent.svelte');
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
describe('Variant Color Function', () => {
|
|
505
|
+
it('applies correct color for blue-solid variant', () => {
|
|
506
|
+
const { container } = render(ButtonGridView);
|
|
507
|
+
const blueSolidBadge = Array.from(container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded'))
|
|
508
|
+
.find(el => el.textContent === 'blue-solid');
|
|
509
|
+
|
|
510
|
+
expect(blueSolidBadge).toHaveClass('bg-blue-100', 'text-blue-700');
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
it('applies correct color for gray-outline variant', () => {
|
|
514
|
+
const { container } = render(ButtonGridView);
|
|
515
|
+
const grayOutlineBadge = Array.from(container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded'))
|
|
516
|
+
.find(el => el.textContent === 'gray-outline');
|
|
517
|
+
|
|
518
|
+
expect(grayOutlineBadge).toHaveClass('bg-gray-100', 'text-gray-700');
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
it('applies correct color for red-solid variant', () => {
|
|
522
|
+
const { container } = render(ButtonGridView);
|
|
523
|
+
const redSolidBadge = Array.from(container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded'))
|
|
524
|
+
.find(el => el.textContent === 'red-solid');
|
|
525
|
+
|
|
526
|
+
expect(redSolidBadge).toHaveClass('bg-red-100', 'text-red-700');
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
it('applies correct color for green-solid variant', () => {
|
|
530
|
+
const { container } = render(ButtonGridView);
|
|
531
|
+
const greenSolidBadge = Array.from(container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded'))
|
|
532
|
+
.find(el => el.textContent === 'green-solid');
|
|
533
|
+
|
|
534
|
+
expect(greenSolidBadge).toHaveClass('bg-green-100', 'text-green-700');
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
it('applies correct color for icon variant', () => {
|
|
538
|
+
const { container } = render(ButtonGridView);
|
|
539
|
+
const iconBadge = Array.from(container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded'))
|
|
540
|
+
.find(el => el.textContent === 'icon');
|
|
541
|
+
|
|
542
|
+
expect(iconBadge).toHaveClass('bg-purple-100', 'text-purple-700');
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
it('applies correct color for ghost variant', () => {
|
|
546
|
+
const { container } = render(ButtonGridView);
|
|
547
|
+
const ghostBadge = Array.from(container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded'))
|
|
548
|
+
.find(el => el.textContent === 'ghost');
|
|
549
|
+
|
|
550
|
+
expect(ghostBadge).toHaveClass('bg-yellow-100', 'text-yellow-700');
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
describe('ShortFile Function', () => {
|
|
555
|
+
it('returns last two parts of file path', () => {
|
|
556
|
+
const { container } = render(ButtonGridView);
|
|
557
|
+
|
|
558
|
+
// Check that short paths are displayed in links
|
|
559
|
+
const links = container.querySelectorAll('a[href^="vscode://"]');
|
|
560
|
+
const linkTexts = Array.from(links).map(link => link.textContent);
|
|
561
|
+
|
|
562
|
+
// At least one link should contain the short path format
|
|
563
|
+
const hasShortPath = linkTexts.some(text => text.includes('/'));
|
|
564
|
+
expect(hasShortPath).toBe(true);
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
it('handles different path depths', () => {
|
|
568
|
+
const { container } = render(ButtonGridView);
|
|
569
|
+
|
|
570
|
+
// Check that multiple file paths are displayed
|
|
571
|
+
const links = container.querySelectorAll('a[href^="vscode://"]');
|
|
572
|
+
expect(links.length).toBe(10);
|
|
573
|
+
|
|
574
|
+
// Each link should have some path information
|
|
575
|
+
links.forEach(link => {
|
|
576
|
+
expect(link.textContent).toBeTruthy();
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
describe('Responsive Design', () => {
|
|
582
|
+
it('applies responsive grid classes', () => {
|
|
583
|
+
const { container } = render(ButtonGridView);
|
|
584
|
+
const grid = container.querySelector('.grid');
|
|
585
|
+
|
|
586
|
+
expect(grid).toHaveClass(
|
|
587
|
+
'grid-cols-2', // mobile
|
|
588
|
+
'sm:grid-cols-3', // small
|
|
589
|
+
'md:grid-cols-4', // medium
|
|
590
|
+
'lg:grid-cols-5', // large
|
|
591
|
+
'xl:grid-cols-6', // extra large
|
|
592
|
+
'2xl:grid-cols-8' // 2x extra large
|
|
593
|
+
);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
it('applies dark mode classes throughout', () => {
|
|
597
|
+
const { container } = render(ButtonGridView);
|
|
598
|
+
|
|
599
|
+
// Check various elements have dark mode classes
|
|
600
|
+
const darkElements = container.querySelectorAll('[class*="dark:"]');
|
|
601
|
+
expect(darkElements.length).toBeGreaterThan(0);
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
describe('Edge Cases', () => {
|
|
606
|
+
it('handles empty search result', async () => {
|
|
607
|
+
const { container } = render(ButtonGridView);
|
|
608
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
609
|
+
|
|
610
|
+
await fireEvent.input(searchInput, { target: { value: 'nonexistent' } });
|
|
611
|
+
|
|
612
|
+
expect(screen.getByText(/Showing 0 of 10 buttons/i)).toBeInTheDocument();
|
|
613
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
614
|
+
expect(buttonCards.length).toBe(0);
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it('handles reset filters to show all buttons', async () => {
|
|
618
|
+
const { container } = render(ButtonGridView);
|
|
619
|
+
const searchInput = screen.getByPlaceholderText('Search...');
|
|
620
|
+
const selects = container.querySelectorAll('select');
|
|
621
|
+
const variantSelect = selects[0];
|
|
622
|
+
const sizeSelect = selects[1];
|
|
623
|
+
|
|
624
|
+
// Apply filters
|
|
625
|
+
await fireEvent.input(searchInput, { target: { value: 'Test' } });
|
|
626
|
+
await fireEvent.change(variantSelect, { target: { value: 'blue-solid' } });
|
|
627
|
+
await fireEvent.change(sizeSelect, { target: { value: 'md' } });
|
|
628
|
+
|
|
629
|
+
// Reset filters
|
|
630
|
+
await fireEvent.input(searchInput, { target: { value: '' } });
|
|
631
|
+
await fireEvent.change(variantSelect, { target: { value: 'all' } });
|
|
632
|
+
await fireEvent.change(sizeSelect, { target: { value: 'all' } });
|
|
633
|
+
|
|
634
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
635
|
+
expect(buttonCards.length).toBe(10);
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
describe('Data Processing', () => {
|
|
640
|
+
it('flattens manifest categories correctly', () => {
|
|
641
|
+
const { container } = render(ButtonGridView);
|
|
642
|
+
|
|
643
|
+
// Should have 10 buttons total from 2 routes
|
|
644
|
+
const buttonCards = container.querySelectorAll('.bg-white.dark\\:bg-gray-800.rounded-lg.p-3');
|
|
645
|
+
expect(buttonCards.length).toBe(10);
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
it('preserves button properties from manifest', () => {
|
|
649
|
+
const { container } = render(ButtonGridView);
|
|
650
|
+
|
|
651
|
+
// Check that various properties are rendered in badges
|
|
652
|
+
const badges = container.querySelectorAll('.px-1\\.5.py-0\\.5.rounded');
|
|
653
|
+
const badgeTexts = Array.from(badges).map(el => el.textContent);
|
|
654
|
+
|
|
655
|
+
// Should include variant and size values from manifest
|
|
656
|
+
expect(badgeTexts).toContain('blue-solid');
|
|
657
|
+
expect(badgeTexts.some(text => text === 'md')).toBe(true);
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
it('includes source information with each button', () => {
|
|
661
|
+
render(ButtonGridView);
|
|
662
|
+
|
|
663
|
+
// Check that file info is included
|
|
664
|
+
expect(screen.getByText(/TestComponent.svelte:10/i)).toBeInTheDocument();
|
|
665
|
+
});
|
|
666
|
+
});
|
|
667
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonShowcase.spec.d.ts","sourceRoot":"","sources":["../../src/lib/stories/ButtonShowcase.spec.js"],"names":[],"mappings":""}
|