@12-apps/ui 1.5.0 → 1.5.2
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/package.json +17 -9
- package/src/button/index.ts +1 -0
- package/src/social-login-button/index.ts +1 -0
- package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
- package/src/user-avatar/index.ts +1 -0
- package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
- package/eslint.config.js +0 -89
- package/src/__tests__/data-grid.test.tsx +0 -125
- package/src/__tests__/package-wiring.test.ts +0 -41
- package/src/__tests__/setup.ts +0 -1
- package/src/__tests__/social-login-button.test.tsx +0 -186
- package/src/__tests__/user-avatar.test.tsx +0 -195
- package/src/__tests__/viewport.test.ts +0 -50
- package/src/components/command/__tests__/command.test.tsx +0 -112
- package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
- package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -763
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
- package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
- package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
- package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
- package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
- package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -511
- package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -701
- package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
- package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
- package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
- package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
- package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
- package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
- package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
- package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
- package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
- package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
- package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
- package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
- package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
- package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
- package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
- package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
- package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
- package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
- package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
- package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
- package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1105
- package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
- package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
- package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
- package/src/components/data-display/Table/Table.stories.tsx +0 -803
- package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
- package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
- package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
- package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
- package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
- package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -964
- package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
- package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
- package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
- package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -973
- package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
- package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
- package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
- package/src/components/form/Button/Button.stories.tsx +0 -365
- package/src/components/form/Button/Button.test.stories.tsx +0 -607
- package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
- package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
- package/src/components/form/CepField/CepField.stories.tsx +0 -138
- package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
- package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
- package/src/components/form/Command/Command.stories.tsx +0 -580
- package/src/components/form/Command/Command.test.stories.tsx +0 -215
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
- package/src/components/form/Form/Form.stories.tsx +0 -687
- package/src/components/form/Form/Form.test.stories.tsx +0 -601
- package/src/components/form/Input/Input.stories.tsx +0 -260
- package/src/components/form/Input/Input.test.stories.tsx +0 -1191
- package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
- package/src/components/form/Label/Label.stories.tsx +0 -473
- package/src/components/form/Label/Label.test.stories.tsx +0 -915
- package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
- package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
- package/src/components/form/Select/Select.stories.tsx +0 -364
- package/src/components/form/Select/Select.test.stories.tsx +0 -985
- package/src/components/form/Slider/Slider.stories.tsx +0 -418
- package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
- package/src/components/form/Switch/Switch.stories.tsx +0 -697
- package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
- package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
- package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
- package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
- package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -915
- package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
- package/src/components/form/total-form/total-form.test.tsx +0 -214
- package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
- package/src/components/layout/Card/Card.stories.tsx +0 -591
- package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
- package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
- package/src/components/layout/Container/Container.stories.tsx +0 -557
- package/src/components/layout/Container/Container.test.stories.tsx +0 -745
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
- package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
- package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -754
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
- package/src/components/layout/Separator/Separator.stories.tsx +0 -563
- package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
- package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -474
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
- package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
- package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
- package/src/components/typography/Code/Code.stories.tsx +0 -686
- package/src/components/typography/Code/Code.test.stories.tsx +0 -703
- package/src/components/typography/Heading/Heading.stories.tsx +0 -451
- package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
- package/src/components/typography/Text/Text.stories.tsx +0 -359
- package/src/components/typography/Text/Text.test.stories.tsx +0 -759
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
- package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
- package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
- package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
- package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
- package/src/components/utility/Portal/Portal.stories.tsx +0 -340
- package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
- package/src/components/utility/Transition/Transition.stories.tsx +0 -493
- package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
- /package/src/{button.tsx → button/button.tsx} +0 -0
|
@@ -1,600 +0,0 @@
|
|
|
1
|
-
import { Box } from '@mui/material';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
-
import { useState } from 'react';
|
|
4
|
-
import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
|
|
5
|
-
|
|
6
|
-
import { Stepper } from './Stepper';
|
|
7
|
-
import type { Step } from './Stepper.types';
|
|
8
|
-
|
|
9
|
-
const meta: Meta<typeof Stepper> = {
|
|
10
|
-
title: 'DataDisplay/Stepper/Tests',
|
|
11
|
-
component: Stepper,
|
|
12
|
-
parameters: {
|
|
13
|
-
layout: 'centered',
|
|
14
|
-
chromatic: { disableSnapshot: false },
|
|
15
|
-
},
|
|
16
|
-
tags: ['autodocs', 'test', 'component:Stepper', 'checked'],
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export default meta;
|
|
20
|
-
type Story = StoryObj<typeof meta>;
|
|
21
|
-
|
|
22
|
-
const defaultSteps: Step[] = [
|
|
23
|
-
{ id: 'step1', label: 'Personal Info', description: 'Enter your details' },
|
|
24
|
-
{ id: 'step2', label: 'Address', description: 'Provide address' },
|
|
25
|
-
{ id: 'step3', label: 'Payment', description: 'Payment method' },
|
|
26
|
-
{ id: 'step4', label: 'Review', description: 'Review order' },
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
// Test 1: Basic Interaction
|
|
30
|
-
export const BasicInteraction: Story = {
|
|
31
|
-
args: {
|
|
32
|
-
steps: defaultSteps,
|
|
33
|
-
activeId: 'step2',
|
|
34
|
-
completed: new Set(['step1']),
|
|
35
|
-
variant: 'non-linear',
|
|
36
|
-
clickable: true,
|
|
37
|
-
onStepChange: fn(),
|
|
38
|
-
},
|
|
39
|
-
play: async ({ args, canvasElement }) => {
|
|
40
|
-
const canvas = within(canvasElement);
|
|
41
|
-
|
|
42
|
-
// Find and click on first step
|
|
43
|
-
const firstStepButton = canvas.getByLabelText(/Step 1.*Personal Info/);
|
|
44
|
-
await expect(firstStepButton).toBeInTheDocument();
|
|
45
|
-
|
|
46
|
-
await userEvent.click(firstStepButton);
|
|
47
|
-
await waitFor(() => {
|
|
48
|
-
expect(args.onStepChange).toHaveBeenCalledWith('step1');
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
// Verify step is marked as completed
|
|
52
|
-
const completedIcon = canvas.getByTestId('CheckCircleIcon');
|
|
53
|
-
await expect(completedIcon).toBeInTheDocument();
|
|
54
|
-
|
|
55
|
-
// Click on third step
|
|
56
|
-
const thirdStepButton = canvas.getByLabelText(/Step 3.*Payment/);
|
|
57
|
-
await userEvent.click(thirdStepButton);
|
|
58
|
-
await waitFor(() => {
|
|
59
|
-
expect(args.onStepChange).toHaveBeenCalledWith('step3');
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
// Test 2: State Change Test
|
|
65
|
-
export const StateChangeTest: Story = {
|
|
66
|
-
render: () => {
|
|
67
|
-
const TestComponent = () => {
|
|
68
|
-
const [activeId, setActiveId] = useState('step1');
|
|
69
|
-
const [completed, setCompleted] = useState(new Set<string>());
|
|
70
|
-
|
|
71
|
-
const handleStepChange = (stepId: string) => {
|
|
72
|
-
setActiveId(stepId);
|
|
73
|
-
// Mark previous steps as completed
|
|
74
|
-
const stepIndex = defaultSteps.findIndex((s) => s.id === stepId);
|
|
75
|
-
const newCompleted = new Set(completed);
|
|
76
|
-
for (let i = 0; i < stepIndex; i++) {
|
|
77
|
-
newCompleted.add(defaultSteps[i].id);
|
|
78
|
-
}
|
|
79
|
-
setCompleted(newCompleted);
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
return (
|
|
83
|
-
<Box data-testid="state-change-container">
|
|
84
|
-
<Stepper
|
|
85
|
-
steps={defaultSteps}
|
|
86
|
-
activeId={activeId}
|
|
87
|
-
completed={completed}
|
|
88
|
-
variant="non-linear"
|
|
89
|
-
clickable
|
|
90
|
-
onStepChange={handleStepChange}
|
|
91
|
-
/>
|
|
92
|
-
<div data-testid="active-step">{activeId}</div>
|
|
93
|
-
<div data-testid="completed-count">{completed.size}</div>
|
|
94
|
-
</Box>
|
|
95
|
-
);
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
return <TestComponent />;
|
|
99
|
-
},
|
|
100
|
-
play: async ({ canvasElement }) => {
|
|
101
|
-
const canvas = within(canvasElement);
|
|
102
|
-
|
|
103
|
-
// Initially should be on step1 with 0 completed
|
|
104
|
-
await expect(canvas.getByTestId('active-step')).toHaveTextContent('step1');
|
|
105
|
-
await expect(canvas.getByTestId('completed-count')).toHaveTextContent('0');
|
|
106
|
-
|
|
107
|
-
// Click on step 3
|
|
108
|
-
const step3Button = canvas.getByLabelText(/Step 3.*Payment/);
|
|
109
|
-
await userEvent.click(step3Button);
|
|
110
|
-
|
|
111
|
-
await waitFor(() => {
|
|
112
|
-
expect(canvas.getByTestId('active-step')).toHaveTextContent('step3');
|
|
113
|
-
expect(canvas.getByTestId('completed-count')).toHaveTextContent('2');
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
// Verify completed steps have check icons
|
|
117
|
-
const checkIcons = canvas.getAllByTestId('CheckCircleIcon');
|
|
118
|
-
await expect(checkIcons).toHaveLength(2);
|
|
119
|
-
},
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
// Test 3: Keyboard Navigation
|
|
123
|
-
export const KeyboardNavigation: Story = {
|
|
124
|
-
args: {
|
|
125
|
-
steps: defaultSteps,
|
|
126
|
-
activeId: 'step2',
|
|
127
|
-
completed: new Set(['step1']),
|
|
128
|
-
variant: 'non-linear',
|
|
129
|
-
clickable: true,
|
|
130
|
-
onStepChange: fn(),
|
|
131
|
-
},
|
|
132
|
-
play: async ({ args, canvasElement }) => {
|
|
133
|
-
const canvas = within(canvasElement);
|
|
134
|
-
|
|
135
|
-
const firstStepButton = canvas.getByLabelText(/Step 1.*Personal Info/);
|
|
136
|
-
|
|
137
|
-
// Focus the first step button
|
|
138
|
-
await userEvent.click(firstStepButton);
|
|
139
|
-
await waitFor(() => expect(firstStepButton).toHaveFocus());
|
|
140
|
-
|
|
141
|
-
// Press Enter to activate
|
|
142
|
-
await userEvent.keyboard('{Enter}');
|
|
143
|
-
await waitFor(() => {
|
|
144
|
-
expect(args.onStepChange).toHaveBeenCalledWith('step1');
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
// Test Space key
|
|
148
|
-
const thirdStepButton = canvas.getByLabelText(/Step 3.*Payment/);
|
|
149
|
-
await userEvent.click(thirdStepButton);
|
|
150
|
-
await userEvent.keyboard(' ');
|
|
151
|
-
await waitFor(() => {
|
|
152
|
-
expect(args.onStepChange).toHaveBeenCalledWith('step3');
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
// Test Tab navigation
|
|
156
|
-
await userEvent.click(firstStepButton);
|
|
157
|
-
await userEvent.tab();
|
|
158
|
-
const nextButton = canvas.getByLabelText(/Step 2.*Address/);
|
|
159
|
-
await waitFor(() => expect(nextButton).toHaveFocus());
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
// Test 4: Screen Reader Test
|
|
164
|
-
export const ScreenReader: Story = {
|
|
165
|
-
args: {
|
|
166
|
-
steps: [
|
|
167
|
-
{ id: 'step1', label: 'Personal Info', description: 'Enter details' },
|
|
168
|
-
{ id: 'step2', label: 'Address', description: 'Provide address', optional: true },
|
|
169
|
-
{ id: 'step3', label: 'Payment', description: 'Payment method', disabled: true },
|
|
170
|
-
],
|
|
171
|
-
activeId: 'step2',
|
|
172
|
-
completed: new Set(['step1']),
|
|
173
|
-
variant: 'non-linear',
|
|
174
|
-
clickable: true,
|
|
175
|
-
},
|
|
176
|
-
play: async ({ canvasElement }) => {
|
|
177
|
-
const canvas = within(canvasElement);
|
|
178
|
-
|
|
179
|
-
// Check ordered list structure for screen readers
|
|
180
|
-
const stepperList = canvas.getByRole('list');
|
|
181
|
-
await expect(stepperList).toBeInTheDocument();
|
|
182
|
-
await expect(stepperList.tagName).toBe('OL');
|
|
183
|
-
|
|
184
|
-
// Check aria-current on active step
|
|
185
|
-
const activeStepButton = canvas.getByLabelText(/Step 2.*Address.*current/);
|
|
186
|
-
await expect(activeStepButton).toHaveAttribute('aria-current', 'step');
|
|
187
|
-
|
|
188
|
-
// Check completed step accessibility
|
|
189
|
-
const completedStepButton = canvas.getByLabelText(/Step 1.*Personal Info.*completed/);
|
|
190
|
-
await expect(completedStepButton).toBeInTheDocument();
|
|
191
|
-
|
|
192
|
-
// Check optional step labeling
|
|
193
|
-
const optionalStepButton = canvas.getByLabelText(/Step 2.*Address.*optional/);
|
|
194
|
-
await expect(optionalStepButton).toBeInTheDocument();
|
|
195
|
-
|
|
196
|
-
// Check disabled step
|
|
197
|
-
const disabledStepButton = canvas.getByLabelText(/Step 3.*Payment/);
|
|
198
|
-
await expect(disabledStepButton).toBeDisabled();
|
|
199
|
-
|
|
200
|
-
// Verify list items
|
|
201
|
-
const listItems = canvas.getAllByRole('listitem');
|
|
202
|
-
await expect(listItems).toHaveLength(3);
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// Test 5: Focus Management
|
|
207
|
-
export const FocusManagement: Story = {
|
|
208
|
-
render: () => {
|
|
209
|
-
const TestComponent = () => {
|
|
210
|
-
const [activeId, setActiveId] = useState('step1');
|
|
211
|
-
|
|
212
|
-
return (
|
|
213
|
-
<Box>
|
|
214
|
-
<button data-testid="external-button">External Button</button>
|
|
215
|
-
<Stepper
|
|
216
|
-
steps={defaultSteps}
|
|
217
|
-
activeId={activeId}
|
|
218
|
-
completed={new Set()}
|
|
219
|
-
variant="non-linear"
|
|
220
|
-
clickable
|
|
221
|
-
onStepChange={setActiveId}
|
|
222
|
-
/>
|
|
223
|
-
</Box>
|
|
224
|
-
);
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
return <TestComponent />;
|
|
228
|
-
},
|
|
229
|
-
play: async ({ canvasElement }) => {
|
|
230
|
-
const canvas = within(canvasElement);
|
|
231
|
-
|
|
232
|
-
const externalButton = canvas.getByTestId('external-button');
|
|
233
|
-
const firstStepButton = canvas.getByLabelText(/Step 1.*Personal Info/);
|
|
234
|
-
|
|
235
|
-
// Focus external element first
|
|
236
|
-
await userEvent.click(externalButton);
|
|
237
|
-
await waitFor(() => expect(externalButton).toHaveFocus());
|
|
238
|
-
|
|
239
|
-
// Tab to first step
|
|
240
|
-
await userEvent.tab();
|
|
241
|
-
await waitFor(() => expect(firstStepButton).toHaveFocus());
|
|
242
|
-
|
|
243
|
-
// Click step and verify focus remains
|
|
244
|
-
await userEvent.click(firstStepButton);
|
|
245
|
-
await waitFor(() => expect(firstStepButton).toHaveFocus());
|
|
246
|
-
|
|
247
|
-
// Test that disabled steps don't receive focus
|
|
248
|
-
const steps = canvas.getAllByRole('button');
|
|
249
|
-
for (const step of steps) {
|
|
250
|
-
if (!step.hasAttribute('disabled')) {
|
|
251
|
-
await userEvent.click(step);
|
|
252
|
-
await waitFor(() => expect(step).toHaveFocus());
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
},
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
// Test 6: Responsive Design
|
|
259
|
-
export const ResponsiveDesign: Story = {
|
|
260
|
-
args: {
|
|
261
|
-
steps: defaultSteps,
|
|
262
|
-
activeId: 'step2',
|
|
263
|
-
completed: new Set(['step1']),
|
|
264
|
-
},
|
|
265
|
-
parameters: {
|
|
266
|
-
viewport: { defaultViewport: 'mobile1' },
|
|
267
|
-
},
|
|
268
|
-
decorators: [
|
|
269
|
-
(Story) => (
|
|
270
|
-
<Box sx={{ width: 320, height: 400 }}>
|
|
271
|
-
<Story orientation="vertical" />
|
|
272
|
-
</Box>
|
|
273
|
-
),
|
|
274
|
-
],
|
|
275
|
-
play: async ({ canvasElement }) => {
|
|
276
|
-
const canvas = within(canvasElement);
|
|
277
|
-
|
|
278
|
-
// In mobile viewport, check vertical layout
|
|
279
|
-
const stepperList = canvas.getByRole('list');
|
|
280
|
-
await expect(stepperList).toBeInTheDocument();
|
|
281
|
-
|
|
282
|
-
// Verify all steps are visible and accessible
|
|
283
|
-
const stepButtons = canvas.getAllByRole('button');
|
|
284
|
-
await expect(stepButtons).toHaveLength(4);
|
|
285
|
-
|
|
286
|
-
// Check step labels are still readable
|
|
287
|
-
const step1Label = canvas.getByText('Personal Info');
|
|
288
|
-
const step2Label = canvas.getByText('Address');
|
|
289
|
-
await expect(step1Label).toBeVisible();
|
|
290
|
-
await expect(step2Label).toBeVisible();
|
|
291
|
-
|
|
292
|
-
// Check descriptions are present
|
|
293
|
-
const description1 = canvas.getByText('Enter your details');
|
|
294
|
-
const description2 = canvas.getByText('Provide address');
|
|
295
|
-
await expect(description1).toBeVisible();
|
|
296
|
-
await expect(description2).toBeVisible();
|
|
297
|
-
},
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
// Test 7: Theme Variations
|
|
301
|
-
export const ThemeVariations: Story = {
|
|
302
|
-
args: {
|
|
303
|
-
steps: defaultSteps,
|
|
304
|
-
activeId: 'step2',
|
|
305
|
-
completed: new Set(['step1']),
|
|
306
|
-
variant: 'non-linear',
|
|
307
|
-
clickable: true,
|
|
308
|
-
},
|
|
309
|
-
play: async ({ canvasElement }) => {
|
|
310
|
-
const canvas = within(canvasElement);
|
|
311
|
-
|
|
312
|
-
// Check that theme colors are applied
|
|
313
|
-
const activeStepButton = canvas.getByLabelText(/Step 2.*Address.*current/);
|
|
314
|
-
const completedStepButton = canvas.getByLabelText(/Step 1.*Personal Info.*completed/);
|
|
315
|
-
|
|
316
|
-
// Verify buttons exist and are styled
|
|
317
|
-
await expect(activeStepButton).toBeInTheDocument();
|
|
318
|
-
await expect(completedStepButton).toBeInTheDocument();
|
|
319
|
-
|
|
320
|
-
// Test hover states by focusing and checking for style changes
|
|
321
|
-
await userEvent.hover(activeStepButton);
|
|
322
|
-
await expect(activeStepButton).toBeInTheDocument();
|
|
323
|
-
|
|
324
|
-
// Check completed step has check icon
|
|
325
|
-
const checkIcon = canvas.getByTestId('CheckCircleIcon');
|
|
326
|
-
await expect(checkIcon).toBeInTheDocument();
|
|
327
|
-
|
|
328
|
-
// Test connector styling
|
|
329
|
-
const stepperContainer = canvas.getByRole('list');
|
|
330
|
-
await expect(stepperContainer).toBeInTheDocument();
|
|
331
|
-
},
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
// Test 8: Visual States
|
|
335
|
-
export const VisualStates: Story = {
|
|
336
|
-
args: {
|
|
337
|
-
steps: [
|
|
338
|
-
{ id: 'completed', label: 'Completed', description: 'Done' },
|
|
339
|
-
{ id: 'active', label: 'Active', description: 'Current step' },
|
|
340
|
-
{ id: 'optional', label: 'Optional', description: 'Optional step', optional: true },
|
|
341
|
-
{ id: 'disabled', label: 'Disabled', description: 'Cannot access', disabled: true },
|
|
342
|
-
{ id: 'pending', label: 'Pending', description: 'Future step' },
|
|
343
|
-
],
|
|
344
|
-
activeId: 'active',
|
|
345
|
-
completed: new Set(['completed']),
|
|
346
|
-
variant: 'non-linear',
|
|
347
|
-
clickable: true,
|
|
348
|
-
},
|
|
349
|
-
play: async ({ canvasElement }) => {
|
|
350
|
-
const canvas = within(canvasElement);
|
|
351
|
-
|
|
352
|
-
// Check completed step has check icon
|
|
353
|
-
const completedButton = canvas.getByLabelText(/Step 1.*Completed.*completed/);
|
|
354
|
-
await expect(completedButton).toBeInTheDocument();
|
|
355
|
-
const checkIcon = canvas.getByTestId('CheckCircleIcon');
|
|
356
|
-
await expect(checkIcon).toBeInTheDocument();
|
|
357
|
-
|
|
358
|
-
// Check active step is marked current
|
|
359
|
-
const activeButton = canvas.getByLabelText(/Step 2.*Active.*current/);
|
|
360
|
-
await expect(activeButton).toHaveAttribute('aria-current', 'step');
|
|
361
|
-
|
|
362
|
-
// Check optional step labeling
|
|
363
|
-
const optionalButton = canvas.getByLabelText(/Step 3.*Optional.*optional/);
|
|
364
|
-
await expect(optionalButton).toBeInTheDocument();
|
|
365
|
-
|
|
366
|
-
// Check disabled step
|
|
367
|
-
const disabledButton = canvas.getByLabelText(/Step 4.*Disabled/);
|
|
368
|
-
await expect(disabledButton).toBeDisabled();
|
|
369
|
-
|
|
370
|
-
// Check pending step (should be clickable in non-linear mode)
|
|
371
|
-
const pendingButton = canvas.getByLabelText(/Step 5.*Pending/);
|
|
372
|
-
await expect(pendingButton).toBeInTheDocument();
|
|
373
|
-
await expect(pendingButton).not.toBeDisabled();
|
|
374
|
-
},
|
|
375
|
-
};
|
|
376
|
-
|
|
377
|
-
// Test 9: Performance Test
|
|
378
|
-
export const Performance: Story = {
|
|
379
|
-
args: {
|
|
380
|
-
steps: Array.from({ length: 10 }, (_, i) => ({
|
|
381
|
-
id: `step${i + 1}`,
|
|
382
|
-
label: `Step ${i + 1}`,
|
|
383
|
-
description: `Description for step ${i + 1}`,
|
|
384
|
-
})),
|
|
385
|
-
activeId: 'step5',
|
|
386
|
-
completed: new Set(['step1', 'step2', 'step3', 'step4']),
|
|
387
|
-
variant: 'non-linear',
|
|
388
|
-
clickable: true,
|
|
389
|
-
onStepChange: fn(),
|
|
390
|
-
},
|
|
391
|
-
play: async ({ args, canvasElement }) => {
|
|
392
|
-
const canvas = within(canvasElement);
|
|
393
|
-
|
|
394
|
-
// Verify all 10 steps render
|
|
395
|
-
const stepButtons = canvas.getAllByRole('button');
|
|
396
|
-
await expect(stepButtons).toHaveLength(10);
|
|
397
|
-
|
|
398
|
-
// Test rapid clicking performance
|
|
399
|
-
const step8Button = canvas.getByLabelText(/Step 8/);
|
|
400
|
-
const step3Button = canvas.getByLabelText(/Step 3/);
|
|
401
|
-
const step7Button = canvas.getByLabelText(/Step 7/);
|
|
402
|
-
|
|
403
|
-
await userEvent.click(step8Button);
|
|
404
|
-
await userEvent.click(step3Button);
|
|
405
|
-
await userEvent.click(step7Button);
|
|
406
|
-
|
|
407
|
-
// Verify callback was called for all clicks
|
|
408
|
-
await waitFor(() => {
|
|
409
|
-
expect(args.onStepChange).toHaveBeenCalledTimes(3);
|
|
410
|
-
});
|
|
411
|
-
},
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
// Test 10: Edge Cases
|
|
415
|
-
export const EdgeCases: Story = {
|
|
416
|
-
render: () => {
|
|
417
|
-
const TestComponent = () => {
|
|
418
|
-
const [testCase, setTestCase] = useState<'empty' | 'single' | 'invalid'>('empty');
|
|
419
|
-
|
|
420
|
-
const getStepsForCase = () => {
|
|
421
|
-
switch (testCase) {
|
|
422
|
-
case 'empty':
|
|
423
|
-
return [];
|
|
424
|
-
case 'single':
|
|
425
|
-
return [{ id: 'only', label: 'Only Step', description: 'Single step' }];
|
|
426
|
-
case 'invalid':
|
|
427
|
-
return defaultSteps;
|
|
428
|
-
default:
|
|
429
|
-
return [];
|
|
430
|
-
}
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
const getActiveId = () => {
|
|
434
|
-
switch (testCase) {
|
|
435
|
-
case 'single':
|
|
436
|
-
return 'only';
|
|
437
|
-
case 'invalid':
|
|
438
|
-
return 'nonexistent';
|
|
439
|
-
default:
|
|
440
|
-
return '';
|
|
441
|
-
}
|
|
442
|
-
};
|
|
443
|
-
|
|
444
|
-
return (
|
|
445
|
-
<Box data-testid="edge-cases-container">
|
|
446
|
-
<div>
|
|
447
|
-
<button onClick={() => setTestCase('empty')} data-testid="test-empty">
|
|
448
|
-
Empty
|
|
449
|
-
</button>
|
|
450
|
-
<button onClick={() => setTestCase('single')} data-testid="test-single">
|
|
451
|
-
Single
|
|
452
|
-
</button>
|
|
453
|
-
<button onClick={() => setTestCase('invalid')} data-testid="test-invalid">
|
|
454
|
-
Invalid
|
|
455
|
-
</button>
|
|
456
|
-
</div>
|
|
457
|
-
<div data-testid="current-case">{testCase}</div>
|
|
458
|
-
<Stepper steps={getStepsForCase()} activeId={getActiveId()} completed={new Set()} />
|
|
459
|
-
</Box>
|
|
460
|
-
);
|
|
461
|
-
};
|
|
462
|
-
|
|
463
|
-
return <TestComponent />;
|
|
464
|
-
},
|
|
465
|
-
play: async ({ canvasElement }) => {
|
|
466
|
-
const canvas = within(canvasElement);
|
|
467
|
-
|
|
468
|
-
// Test empty steps array
|
|
469
|
-
await expect(canvas.getByTestId('current-case')).toHaveTextContent('empty');
|
|
470
|
-
|
|
471
|
-
// Test single step
|
|
472
|
-
const singleButton = canvas.getByTestId('test-single');
|
|
473
|
-
await userEvent.click(singleButton);
|
|
474
|
-
await waitFor(() => {
|
|
475
|
-
expect(canvas.getByTestId('current-case')).toHaveTextContent('single');
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
const singleStepButton = canvas.getByLabelText(/Step 1.*Only Step/);
|
|
479
|
-
await expect(singleStepButton).toBeInTheDocument();
|
|
480
|
-
|
|
481
|
-
// Test invalid activeId
|
|
482
|
-
const invalidButton = canvas.getByTestId('test-invalid');
|
|
483
|
-
await userEvent.click(invalidButton);
|
|
484
|
-
await waitFor(() => {
|
|
485
|
-
expect(canvas.getByTestId('current-case')).toHaveTextContent('invalid');
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
// Should still render all steps even with invalid activeId
|
|
489
|
-
const stepButtons = canvas
|
|
490
|
-
.getAllByRole('button')
|
|
491
|
-
.filter((btn) => btn.getAttribute('aria-label')?.includes('Step'));
|
|
492
|
-
await expect(stepButtons).toHaveLength(4);
|
|
493
|
-
},
|
|
494
|
-
};
|
|
495
|
-
|
|
496
|
-
// Test 11: Integration Test
|
|
497
|
-
export const Integration: Story = {
|
|
498
|
-
render: () => {
|
|
499
|
-
const TestComponent = () => {
|
|
500
|
-
const [activeId, setActiveId] = useState('step1');
|
|
501
|
-
const [completed, setCompleted] = useState(new Set<string>());
|
|
502
|
-
const [formData, setFormData] = useState<Record<string, string>>({});
|
|
503
|
-
|
|
504
|
-
const handleStepChange = (stepId: string) => {
|
|
505
|
-
// Simulate form validation
|
|
506
|
-
if (stepId === 'step2' && !formData.name) {
|
|
507
|
-
return; // Don't allow progression without name
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
setActiveId(stepId);
|
|
511
|
-
|
|
512
|
-
// Mark previous steps as completed
|
|
513
|
-
const stepIndex = defaultSteps.findIndex((s) => s.id === stepId);
|
|
514
|
-
const newCompleted = new Set(completed);
|
|
515
|
-
for (let i = 0; i < stepIndex; i++) {
|
|
516
|
-
newCompleted.add(defaultSteps[i].id);
|
|
517
|
-
}
|
|
518
|
-
setCompleted(newCompleted);
|
|
519
|
-
};
|
|
520
|
-
|
|
521
|
-
return (
|
|
522
|
-
<Box data-testid="integration-container">
|
|
523
|
-
<Stepper
|
|
524
|
-
steps={defaultSteps}
|
|
525
|
-
activeId={activeId}
|
|
526
|
-
completed={completed}
|
|
527
|
-
variant="linear"
|
|
528
|
-
onStepChange={handleStepChange}
|
|
529
|
-
/>
|
|
530
|
-
|
|
531
|
-
<Box sx={{ mt: 2 }}>
|
|
532
|
-
{activeId === 'step1' && (
|
|
533
|
-
<div>
|
|
534
|
-
<input
|
|
535
|
-
data-testid="name-input"
|
|
536
|
-
placeholder="Enter name"
|
|
537
|
-
value={formData.name || ''}
|
|
538
|
-
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
|
|
539
|
-
/>
|
|
540
|
-
<button
|
|
541
|
-
data-testid="next-button"
|
|
542
|
-
onClick={() => formData.name && handleStepChange('step2')}
|
|
543
|
-
disabled={!formData.name}
|
|
544
|
-
>
|
|
545
|
-
Next
|
|
546
|
-
</button>
|
|
547
|
-
</div>
|
|
548
|
-
)}
|
|
549
|
-
|
|
550
|
-
{activeId === 'step2' && (
|
|
551
|
-
<div data-testid="step2-content">
|
|
552
|
-
<p>Welcome, {formData.name}!</p>
|
|
553
|
-
<button onClick={() => handleStepChange('step3')}>Continue</button>
|
|
554
|
-
</div>
|
|
555
|
-
)}
|
|
556
|
-
</Box>
|
|
557
|
-
|
|
558
|
-
<div data-testid="active-step-id">{activeId}</div>
|
|
559
|
-
</Box>
|
|
560
|
-
);
|
|
561
|
-
};
|
|
562
|
-
|
|
563
|
-
return <TestComponent />;
|
|
564
|
-
},
|
|
565
|
-
play: async ({ canvasElement }) => {
|
|
566
|
-
const canvas = within(canvasElement);
|
|
567
|
-
|
|
568
|
-
// Initially on step 1
|
|
569
|
-
await expect(canvas.getByTestId('active-step-id')).toHaveTextContent('step1');
|
|
570
|
-
|
|
571
|
-
// In linear mode, step buttons should not be clickable
|
|
572
|
-
const step2Button = canvas.getByLabelText(/Step 2.*Address/);
|
|
573
|
-
// Step 2 should not be clickable in linear mode when not active
|
|
574
|
-
await expect(step2Button).toHaveStyle('pointer-events: none');
|
|
575
|
-
// Should still be on step 1
|
|
576
|
-
await expect(canvas.getByTestId('active-step-id')).toHaveTextContent('step1');
|
|
577
|
-
|
|
578
|
-
// Fill in the form
|
|
579
|
-
const nameInput = canvas.getByTestId('name-input');
|
|
580
|
-
await userEvent.type(nameInput, 'John Doe');
|
|
581
|
-
|
|
582
|
-
// Now click next button
|
|
583
|
-
const nextButton = canvas.getByTestId('next-button');
|
|
584
|
-
await expect(nextButton).not.toBeDisabled();
|
|
585
|
-
await userEvent.click(nextButton);
|
|
586
|
-
|
|
587
|
-
// Should now be on step 2
|
|
588
|
-
await waitFor(() => {
|
|
589
|
-
expect(canvas.getByTestId('active-step-id')).toHaveTextContent('step2');
|
|
590
|
-
});
|
|
591
|
-
|
|
592
|
-
// Check step 1 is marked as completed
|
|
593
|
-
const completedStep = canvas.getByLabelText(/Step 1.*Personal Info.*completed/);
|
|
594
|
-
await expect(completedStep).toBeInTheDocument();
|
|
595
|
-
|
|
596
|
-
// Verify step 2 content shows
|
|
597
|
-
const step2Content = canvas.getByTestId('step2-content');
|
|
598
|
-
await expect(step2Content).toHaveTextContent('Welcome, John Doe!');
|
|
599
|
-
},
|
|
600
|
-
};
|