@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,199 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import { expect, describe, test } from 'vitest';
|
|
3
|
+
import RadioGroup from './RadioGroup.svelte';
|
|
4
|
+
|
|
5
|
+
const testOptions = [
|
|
6
|
+
{ value: 'a', label: 'Option A' },
|
|
7
|
+
{ value: 'b', label: 'Option B' },
|
|
8
|
+
{ value: 'c', label: 'Option C' }
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
describe('RadioGroup Component', () => {
|
|
12
|
+
test('renders a fieldset', () => {
|
|
13
|
+
const { container } = render(RadioGroup);
|
|
14
|
+
expect(container.querySelector('fieldset')).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('applies custom className to fieldset', () => {
|
|
18
|
+
const { container } = render(RadioGroup, { props: { class: 'custom-radio-group' } });
|
|
19
|
+
const fieldset = container.querySelector('fieldset');
|
|
20
|
+
expect(fieldset).toHaveClass('custom-radio-group');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('renders radio inputs for each option', () => {
|
|
24
|
+
const { container } = render(RadioGroup, { props: { options: testOptions } });
|
|
25
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
26
|
+
expect(radios.length).toBe(3);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('empty options renders no radios', () => {
|
|
30
|
+
const { container } = render(RadioGroup);
|
|
31
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
32
|
+
expect(radios.length).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('RadioGroup Label', () => {
|
|
37
|
+
test('no label renders no legend', () => {
|
|
38
|
+
const { container } = render(RadioGroup);
|
|
39
|
+
expect(container.querySelector('legend')).not.toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('label prop displays legend text', () => {
|
|
43
|
+
render(RadioGroup, { props: { label: 'Select your preference' } });
|
|
44
|
+
expect(screen.getByText('Select your preference')).toBeInTheDocument();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('legend is rendered in fieldset', () => {
|
|
48
|
+
const { container } = render(RadioGroup, { props: { label: 'Choose one' } });
|
|
49
|
+
const legend = container.querySelector('legend');
|
|
50
|
+
expect(legend).toBeInTheDocument();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('required shows asterisk', () => {
|
|
54
|
+
render(RadioGroup, { props: { label: 'Selection', required: true } });
|
|
55
|
+
expect(screen.getByText('*')).toBeInTheDocument();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('error state applies red text to legend', () => {
|
|
59
|
+
const { container } = render(RadioGroup, { props: { label: 'Test', error: 'Required' } });
|
|
60
|
+
const legend = container.querySelector('legend');
|
|
61
|
+
expect(legend).toHaveClass('text-red-500');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe('RadioGroup Hint', () => {
|
|
66
|
+
test('no hint renders no hint text', () => {
|
|
67
|
+
const { container } = render(RadioGroup, { props: { label: 'Test' } });
|
|
68
|
+
const paragraphs = container.querySelectorAll('p');
|
|
69
|
+
expect(paragraphs.length).toBe(0);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('hint prop displays hint text', () => {
|
|
73
|
+
render(RadioGroup, { props: { hint: 'Select one option' } });
|
|
74
|
+
expect(screen.getByText('Select one option')).toBeInTheDocument();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test('hint is hidden when error is present', () => {
|
|
78
|
+
render(RadioGroup, { props: { hint: 'Helper text', error: 'Error' } });
|
|
79
|
+
expect(screen.queryByText('Helper text')).not.toBeInTheDocument();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('RadioGroup Error', () => {
|
|
84
|
+
test('no error shows no validation message', () => {
|
|
85
|
+
const { container } = render(RadioGroup);
|
|
86
|
+
expect(container.querySelector('[role="alert"]')).not.toBeInTheDocument();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('error prop shows validation message', () => {
|
|
90
|
+
render(RadioGroup, { props: { error: 'Please select an option' } });
|
|
91
|
+
expect(screen.getByText('Please select an option')).toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('RadioGroup Direction', () => {
|
|
96
|
+
test('default direction is vertical', () => {
|
|
97
|
+
const { container } = render(RadioGroup, { props: { options: testOptions } });
|
|
98
|
+
const optionsDiv = container.querySelector('.flex.flex-col');
|
|
99
|
+
expect(optionsDiv).toBeInTheDocument();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('vertical direction has gap-2', () => {
|
|
103
|
+
const { container } = render(RadioGroup, { props: { options: testOptions, direction: 'vertical' } });
|
|
104
|
+
const optionsDiv = container.querySelector('.flex.flex-col');
|
|
105
|
+
expect(optionsDiv).toHaveClass('gap-2');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('horizontal direction uses flex wrap', () => {
|
|
109
|
+
const { container } = render(RadioGroup, { props: { options: testOptions, direction: 'horizontal' } });
|
|
110
|
+
const optionsDiv = container.querySelector('.flex.flex-wrap');
|
|
111
|
+
expect(optionsDiv).toBeInTheDocument();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('horizontal direction has gap-4', () => {
|
|
115
|
+
const { container } = render(RadioGroup, { props: { options: testOptions, direction: 'horizontal' } });
|
|
116
|
+
const optionsDiv = container.querySelector('.flex.flex-wrap');
|
|
117
|
+
expect(optionsDiv).toHaveClass('gap-4');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe('RadioGroup Props', () => {
|
|
122
|
+
test('name prop is passed to radios', () => {
|
|
123
|
+
const { container } = render(RadioGroup, { props: { options: testOptions, name: 'preference' } });
|
|
124
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
125
|
+
radios.forEach((radio) => {
|
|
126
|
+
expect(radio).toHaveAttribute('name', 'preference');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('disabled prop disables all radios', () => {
|
|
131
|
+
const { container } = render(RadioGroup, { props: { options: testOptions, disabled: true } });
|
|
132
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
133
|
+
radios.forEach((radio) => {
|
|
134
|
+
expect(radio).toBeDisabled();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('radios are not disabled by default', () => {
|
|
139
|
+
const { container } = render(RadioGroup, { props: { options: testOptions } });
|
|
140
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
141
|
+
radios.forEach((radio) => {
|
|
142
|
+
expect(radio).not.toBeDisabled();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('RadioGroup Options', () => {
|
|
148
|
+
test('option labels are displayed', () => {
|
|
149
|
+
render(RadioGroup, { props: { options: testOptions } });
|
|
150
|
+
expect(screen.getByText('Option A')).toBeInTheDocument();
|
|
151
|
+
expect(screen.getByText('Option B')).toBeInTheDocument();
|
|
152
|
+
expect(screen.getByText('Option C')).toBeInTheDocument();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('option values are set on radios', () => {
|
|
156
|
+
const { container } = render(RadioGroup, { props: { options: testOptions } });
|
|
157
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
158
|
+
expect(radios[0]).toHaveAttribute('value', 'a');
|
|
159
|
+
expect(radios[1]).toHaveAttribute('value', 'b');
|
|
160
|
+
expect(radios[2]).toHaveAttribute('value', 'c');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('RadioGroup Combinations', () => {
|
|
165
|
+
test('label with options horizontal', () => {
|
|
166
|
+
render(RadioGroup, {
|
|
167
|
+
props: { label: 'Size', options: testOptions, direction: 'horizontal' }
|
|
168
|
+
});
|
|
169
|
+
expect(screen.getByText('Size')).toBeInTheDocument();
|
|
170
|
+
expect(screen.getByText('Option A')).toBeInTheDocument();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('all props together', () => {
|
|
174
|
+
const { container } = render(RadioGroup, {
|
|
175
|
+
props: {
|
|
176
|
+
label: 'Choose Color',
|
|
177
|
+
options: testOptions,
|
|
178
|
+
name: 'color',
|
|
179
|
+
disabled: true,
|
|
180
|
+
hint: 'Pick one color',
|
|
181
|
+
error: 'Selection required',
|
|
182
|
+
required: true,
|
|
183
|
+
direction: 'horizontal',
|
|
184
|
+
class: 'custom-group'
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
const fieldset = container.querySelector('fieldset');
|
|
188
|
+
expect(fieldset).toHaveClass('custom-group');
|
|
189
|
+
expect(screen.getByText('Choose Color')).toBeInTheDocument();
|
|
190
|
+
expect(screen.getByText('*')).toBeInTheDocument();
|
|
191
|
+
expect(screen.getByText('Selection required')).toBeInTheDocument();
|
|
192
|
+
// Hint hidden when error present
|
|
193
|
+
expect(screen.queryByText('Pick one color')).not.toBeInTheDocument();
|
|
194
|
+
const radios = container.querySelectorAll('input[type="radio"]');
|
|
195
|
+
radios.forEach((radio) => {
|
|
196
|
+
expect(radio).toBeDisabled();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectField.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/fields/SelectField.spec.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import { expect, describe, test } from 'vitest';
|
|
3
|
+
import SelectField from './SelectField.svelte';
|
|
4
|
+
|
|
5
|
+
const testItems = [
|
|
6
|
+
{ value: '1', name: 'First Option' },
|
|
7
|
+
{ value: '2', name: 'Second Option' },
|
|
8
|
+
{ value: '3', name: 'Third Option' }
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
describe('SelectField Component', () => {
|
|
12
|
+
test('renders a wrapper div', () => {
|
|
13
|
+
const { container } = render(SelectField);
|
|
14
|
+
expect(container.querySelector('div')).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('applies custom className', () => {
|
|
18
|
+
const { container } = render(SelectField, { props: { class: 'custom-select-field' } });
|
|
19
|
+
const wrapper = container.firstElementChild;
|
|
20
|
+
expect(wrapper).toHaveClass('custom-select-field');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('renders a button trigger (custom select)', () => {
|
|
24
|
+
const { container } = render(SelectField);
|
|
25
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
26
|
+
expect(button).toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('SelectField Label', () => {
|
|
31
|
+
test('no label renders no label text', () => {
|
|
32
|
+
const { container } = render(SelectField);
|
|
33
|
+
expect(container.querySelector('label')).not.toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('label prop displays label text', () => {
|
|
37
|
+
render(SelectField, { props: { label: 'Choose Country' } });
|
|
38
|
+
expect(screen.getByText('Choose Country')).toBeInTheDocument();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('required shows asterisk', () => {
|
|
42
|
+
render(SelectField, { props: { label: 'Country', required: true } });
|
|
43
|
+
expect(screen.getByText('*')).toBeInTheDocument();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('SelectField Placeholder', () => {
|
|
48
|
+
test('default placeholder is "Select an option"', () => {
|
|
49
|
+
render(SelectField);
|
|
50
|
+
expect(screen.getByText('Select an option')).toBeInTheDocument();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('custom placeholder is displayed', () => {
|
|
54
|
+
render(SelectField, { props: { placeholder: 'Pick a country' } });
|
|
55
|
+
expect(screen.getByText('Pick a country')).toBeInTheDocument();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('SelectField Items', () => {
|
|
60
|
+
// Note: Items are only rendered when dropdown is open
|
|
61
|
+
// We can test that items prop is accepted
|
|
62
|
+
test('accepts items prop', () => {
|
|
63
|
+
const { container } = render(SelectField, { props: { items: testItems } });
|
|
64
|
+
expect(container.querySelector('button[aria-haspopup="listbox"]')).toBeInTheDocument();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('empty items renders select with placeholder only', () => {
|
|
68
|
+
const { container } = render(SelectField, { props: { items: [] } });
|
|
69
|
+
expect(screen.getByText('Select an option')).toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe('SelectField Hint', () => {
|
|
74
|
+
test('no hint renders no hint text', () => {
|
|
75
|
+
const { container } = render(SelectField, { props: { label: 'Test' } });
|
|
76
|
+
// The Select component itself may have paragraphs for errors
|
|
77
|
+
// We look specifically for our hint
|
|
78
|
+
expect(screen.queryByText('Select your preferred option')).not.toBeInTheDocument();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('hint prop displays hint text', () => {
|
|
82
|
+
render(SelectField, { props: { hint: 'Select your preferred option' } });
|
|
83
|
+
expect(screen.getByText('Select your preferred option')).toBeInTheDocument();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('hint is hidden when error is present', () => {
|
|
87
|
+
render(SelectField, { props: { hint: 'Helper text', error: 'Error message' } });
|
|
88
|
+
expect(screen.queryByText('Helper text')).not.toBeInTheDocument();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe('SelectField Error', () => {
|
|
93
|
+
test('error prop shows validation message', () => {
|
|
94
|
+
render(SelectField, { props: { error: 'Please select an option' } });
|
|
95
|
+
expect(screen.getByText('Please select an option')).toBeInTheDocument();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('error applies error border to button', () => {
|
|
99
|
+
const { container } = render(SelectField, { props: { error: 'Required' } });
|
|
100
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
101
|
+
expect(button).toHaveClass('border-red-500');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('no error means no error border', () => {
|
|
105
|
+
const { container } = render(SelectField);
|
|
106
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
107
|
+
expect(button).not.toHaveClass('border-red-500');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe('SelectField Props', () => {
|
|
112
|
+
test('name prop is passed to button', () => {
|
|
113
|
+
const { container } = render(SelectField, { props: { name: 'country' } });
|
|
114
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
115
|
+
expect(button).toHaveAttribute('name', 'country');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('id prop is passed to button', () => {
|
|
119
|
+
const { container } = render(SelectField, { props: { id: 'country-select' } });
|
|
120
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
121
|
+
expect(button).toHaveAttribute('id', 'country-select');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('disabled prop disables button', () => {
|
|
125
|
+
const { container } = render(SelectField, { props: { disabled: true } });
|
|
126
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
127
|
+
expect(button).toBeDisabled();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('button is not disabled by default', () => {
|
|
131
|
+
const { container } = render(SelectField);
|
|
132
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
133
|
+
expect(button).not.toBeDisabled();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('SelectField Size', () => {
|
|
138
|
+
test('default size renders button', () => {
|
|
139
|
+
const { container } = render(SelectField);
|
|
140
|
+
expect(container.querySelector('button[aria-haspopup="listbox"]')).toBeInTheDocument();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('size sm works', () => {
|
|
144
|
+
const { container } = render(SelectField, { props: { size: 'sm' } });
|
|
145
|
+
expect(container.querySelector('button[aria-haspopup="listbox"]')).toBeInTheDocument();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('size lg works', () => {
|
|
149
|
+
const { container } = render(SelectField, { props: { size: 'lg' } });
|
|
150
|
+
expect(container.querySelector('button[aria-haspopup="listbox"]')).toBeInTheDocument();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
describe('SelectField Combinations', () => {
|
|
155
|
+
test('label with items', () => {
|
|
156
|
+
render(SelectField, { props: { label: 'Country', items: testItems } });
|
|
157
|
+
expect(screen.getByText('Country')).toBeInTheDocument();
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test('all props together', () => {
|
|
161
|
+
const { container } = render(SelectField, {
|
|
162
|
+
props: {
|
|
163
|
+
label: 'Region',
|
|
164
|
+
items: testItems,
|
|
165
|
+
placeholder: 'Pick a region',
|
|
166
|
+
hint: 'Select your region',
|
|
167
|
+
error: 'Region is required',
|
|
168
|
+
name: 'region',
|
|
169
|
+
id: 'region-select',
|
|
170
|
+
disabled: true,
|
|
171
|
+
required: true,
|
|
172
|
+
size: 'lg',
|
|
173
|
+
class: 'custom-select'
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
const wrapper = container.firstElementChild;
|
|
177
|
+
expect(wrapper).toHaveClass('custom-select');
|
|
178
|
+
expect(screen.getByText('Region')).toBeInTheDocument();
|
|
179
|
+
expect(screen.getByText('*')).toBeInTheDocument();
|
|
180
|
+
expect(screen.getByText('Region is required')).toBeInTheDocument();
|
|
181
|
+
// Hint hidden when error present
|
|
182
|
+
expect(screen.queryByText('Select your region')).not.toBeInTheDocument();
|
|
183
|
+
const button = container.querySelector('button[aria-haspopup="listbox"]');
|
|
184
|
+
expect(button).toBeDisabled();
|
|
185
|
+
expect(button).toHaveAttribute('name', 'region');
|
|
186
|
+
expect(button).toHaveAttribute('id', 'region-select');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextareaField.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/fields/TextareaField.spec.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/svelte';
|
|
2
|
+
import { expect, describe, test } from 'vitest';
|
|
3
|
+
import TextareaField from './TextareaField.svelte';
|
|
4
|
+
|
|
5
|
+
describe('TextareaField Component', () => {
|
|
6
|
+
test('renders a wrapper div', () => {
|
|
7
|
+
const { container } = render(TextareaField);
|
|
8
|
+
expect(container.querySelector('div')).toBeInTheDocument();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('applies custom className', () => {
|
|
12
|
+
const { container } = render(TextareaField, { props: { class: 'custom-textarea-field' } });
|
|
13
|
+
const wrapper = container.firstElementChild;
|
|
14
|
+
expect(wrapper).toHaveClass('custom-textarea-field');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('renders a textarea element', () => {
|
|
18
|
+
const { container } = render(TextareaField);
|
|
19
|
+
expect(container.querySelector('textarea')).toBeInTheDocument();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('TextareaField Label', () => {
|
|
24
|
+
test('no label renders no label text', () => {
|
|
25
|
+
const { container } = render(TextareaField);
|
|
26
|
+
expect(container.querySelector('label')).not.toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('label prop displays label text', () => {
|
|
30
|
+
render(TextareaField, { props: { label: 'Description' } });
|
|
31
|
+
expect(screen.getByText('Description')).toBeInTheDocument();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('required shows asterisk', () => {
|
|
35
|
+
render(TextareaField, { props: { label: 'Bio', required: true } });
|
|
36
|
+
expect(screen.getByText('*')).toBeInTheDocument();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('error state shows error message', () => {
|
|
40
|
+
render(TextareaField, { props: { label: 'Test', error: 'Required' } });
|
|
41
|
+
expect(screen.getByText('Required')).toBeInTheDocument();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('TextareaField Placeholder', () => {
|
|
46
|
+
test('no placeholder by default', () => {
|
|
47
|
+
const { container } = render(TextareaField);
|
|
48
|
+
const textarea = container.querySelector('textarea');
|
|
49
|
+
expect(textarea.placeholder).toBe('');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('placeholder prop is displayed', () => {
|
|
53
|
+
const { container } = render(TextareaField, { props: { placeholder: 'Enter description...' } });
|
|
54
|
+
const textarea = container.querySelector('textarea');
|
|
55
|
+
expect(textarea.placeholder).toBe('Enter description...');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('TextareaField Rows', () => {
|
|
60
|
+
test('default rows is 4', () => {
|
|
61
|
+
const { container } = render(TextareaField);
|
|
62
|
+
const textarea = container.querySelector('textarea');
|
|
63
|
+
expect(textarea).toHaveAttribute('rows', '4');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('custom rows value', () => {
|
|
67
|
+
const { container } = render(TextareaField, { props: { rows: 8 } });
|
|
68
|
+
const textarea = container.querySelector('textarea');
|
|
69
|
+
expect(textarea).toHaveAttribute('rows', '8');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe('TextareaField Hint', () => {
|
|
74
|
+
test('no hint renders no hint text', () => {
|
|
75
|
+
const { container } = render(TextareaField, { props: { label: 'Test' } });
|
|
76
|
+
const paragraphs = container.querySelectorAll('p');
|
|
77
|
+
expect(paragraphs.length).toBe(0);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('hint prop displays hint text', () => {
|
|
81
|
+
render(TextareaField, { props: { hint: 'Max 500 characters' } });
|
|
82
|
+
expect(screen.getByText('Max 500 characters')).toBeInTheDocument();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('hint is hidden when error is present', () => {
|
|
86
|
+
render(TextareaField, { props: { hint: 'Helper text', error: 'Error message' } });
|
|
87
|
+
expect(screen.queryByText('Helper text')).not.toBeInTheDocument();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
describe('TextareaField Error', () => {
|
|
92
|
+
test('no error shows no validation styling', () => {
|
|
93
|
+
const { container } = render(TextareaField);
|
|
94
|
+
const textarea = container.querySelector('textarea');
|
|
95
|
+
expect(textarea).not.toHaveClass('border-red-500');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('error prop shows validation message', () => {
|
|
99
|
+
render(TextareaField, { props: { error: 'This field is required' } });
|
|
100
|
+
expect(screen.getByText('This field is required')).toBeInTheDocument();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('error applies error border to textarea', () => {
|
|
104
|
+
const { container } = render(TextareaField, { props: { error: 'Required' } });
|
|
105
|
+
const textarea = container.querySelector('textarea');
|
|
106
|
+
expect(textarea).toHaveClass('border-red-500');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('TextareaField Props', () => {
|
|
111
|
+
test('name prop is passed to textarea', () => {
|
|
112
|
+
const { container } = render(TextareaField, { props: { name: 'bio' } });
|
|
113
|
+
const textarea = container.querySelector('textarea');
|
|
114
|
+
expect(textarea).toHaveAttribute('name', 'bio');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('id prop is passed to textarea', () => {
|
|
118
|
+
const { container } = render(TextareaField, { props: { id: 'bio-textarea' } });
|
|
119
|
+
const textarea = container.querySelector('textarea');
|
|
120
|
+
expect(textarea).toHaveAttribute('id', 'bio-textarea');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('disabled prop disables textarea', () => {
|
|
124
|
+
const { container } = render(TextareaField, { props: { disabled: true } });
|
|
125
|
+
const textarea = container.querySelector('textarea');
|
|
126
|
+
expect(textarea).toBeDisabled();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('textarea is not disabled by default', () => {
|
|
130
|
+
const { container } = render(TextareaField);
|
|
131
|
+
const textarea = container.querySelector('textarea');
|
|
132
|
+
expect(textarea).not.toBeDisabled();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test('readonly prop makes textarea readonly', () => {
|
|
136
|
+
const { container } = render(TextareaField, { props: { readonly: true } });
|
|
137
|
+
const textarea = container.querySelector('textarea');
|
|
138
|
+
expect(textarea).toHaveAttribute('readonly');
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe('TextareaField Length Constraints', () => {
|
|
143
|
+
test('maxlength prop is passed to textarea', () => {
|
|
144
|
+
const { container } = render(TextareaField, { props: { maxlength: 500 } });
|
|
145
|
+
const textarea = container.querySelector('textarea');
|
|
146
|
+
expect(textarea).toHaveAttribute('maxlength', '500');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('minlength prop is passed to textarea', () => {
|
|
150
|
+
const { container } = render(TextareaField, { props: { minlength: 10 } });
|
|
151
|
+
const textarea = container.querySelector('textarea');
|
|
152
|
+
expect(textarea).toHaveAttribute('minlength', '10');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('no maxlength by default', () => {
|
|
156
|
+
const { container } = render(TextareaField);
|
|
157
|
+
const textarea = container.querySelector('textarea');
|
|
158
|
+
expect(textarea).not.toHaveAttribute('maxlength');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe('TextareaField Combinations', () => {
|
|
163
|
+
test('label with placeholder and rows', () => {
|
|
164
|
+
const { container } = render(TextareaField, {
|
|
165
|
+
props: { label: 'Notes', placeholder: 'Add notes...', rows: 6 }
|
|
166
|
+
});
|
|
167
|
+
expect(screen.getByText('Notes')).toBeInTheDocument();
|
|
168
|
+
const textarea = container.querySelector('textarea');
|
|
169
|
+
expect(textarea.placeholder).toBe('Add notes...');
|
|
170
|
+
expect(textarea).toHaveAttribute('rows', '6');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('all props together', () => {
|
|
174
|
+
const { container } = render(TextareaField, {
|
|
175
|
+
props: {
|
|
176
|
+
label: 'Biography',
|
|
177
|
+
placeholder: 'Tell us about yourself',
|
|
178
|
+
rows: 10,
|
|
179
|
+
hint: 'Min 50, max 1000 characters',
|
|
180
|
+
error: 'Too short',
|
|
181
|
+
name: 'bio',
|
|
182
|
+
id: 'bio-field',
|
|
183
|
+
disabled: true,
|
|
184
|
+
required: true,
|
|
185
|
+
maxlength: 1000,
|
|
186
|
+
minlength: 50,
|
|
187
|
+
class: 'custom-textarea'
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
const wrapper = container.firstElementChild;
|
|
191
|
+
expect(wrapper).toHaveClass('custom-textarea');
|
|
192
|
+
expect(screen.getByText('Biography')).toBeInTheDocument();
|
|
193
|
+
expect(screen.getByText('*')).toBeInTheDocument();
|
|
194
|
+
expect(screen.getByText('Too short')).toBeInTheDocument();
|
|
195
|
+
// Hint hidden when error present
|
|
196
|
+
expect(screen.queryByText('Min 50, max 1000 characters')).not.toBeInTheDocument();
|
|
197
|
+
const textarea = container.querySelector('textarea');
|
|
198
|
+
expect(textarea).toBeDisabled();
|
|
199
|
+
expect(textarea).toHaveAttribute('name', 'bio');
|
|
200
|
+
expect(textarea).toHaveAttribute('id', 'bio-field');
|
|
201
|
+
expect(textarea).toHaveAttribute('rows', '10');
|
|
202
|
+
expect(textarea).toHaveAttribute('maxlength', '1000');
|
|
203
|
+
expect(textarea).toHaveAttribute('minlength', '50');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleField.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/fields/ToggleField.spec.js"],"names":[],"mappings":""}
|