@12-apps/ui 1.4.1 → 1.5.1
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 -8
- 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 -77
- 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 -753
- 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 -503
- package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -691
- 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 -1101
- 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 -955
- 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 -975
- 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 -909
- 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 -918
- 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 -750
- 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 -472
- 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 -762
- 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,327 +0,0 @@
|
|
|
1
|
-
import { Stack, TextField } from '@mui/material';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
-
import { expect, userEvent, waitFor, within } from 'storybook/test';
|
|
4
|
-
import React, { useState } from 'react';
|
|
5
|
-
|
|
6
|
-
import { PasswordStrength } from './PasswordStrength';
|
|
7
|
-
|
|
8
|
-
const meta: Meta<typeof PasswordStrength> = {
|
|
9
|
-
title: 'Form/PasswordStrength/Tests',
|
|
10
|
-
component: PasswordStrength,
|
|
11
|
-
parameters: {
|
|
12
|
-
layout: 'centered',
|
|
13
|
-
},
|
|
14
|
-
tags: ['autodocs', 'test', 'component:PasswordStrength'],
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export default meta;
|
|
18
|
-
type Story = StoryObj<typeof meta>;
|
|
19
|
-
|
|
20
|
-
// Basic Interaction Test
|
|
21
|
-
export const BasicInteraction: Story = {
|
|
22
|
-
name: '🧪 Basic Interaction Test',
|
|
23
|
-
render: () => (
|
|
24
|
-
<Stack spacing={2} sx={{ width: 400 }}>
|
|
25
|
-
<PasswordStrength
|
|
26
|
-
data-testid="password-strength"
|
|
27
|
-
value="weak"
|
|
28
|
-
variant="linear"
|
|
29
|
-
showRequirements={true}
|
|
30
|
-
showStrengthLabel={true}
|
|
31
|
-
/>
|
|
32
|
-
</Stack>
|
|
33
|
-
),
|
|
34
|
-
play: async ({ canvasElement, step }) => {
|
|
35
|
-
const canvas = within(canvasElement);
|
|
36
|
-
|
|
37
|
-
await step('Verify component renders', async () => {
|
|
38
|
-
const component = await canvas.findByTestId('password-strength');
|
|
39
|
-
expect(component).toBeInTheDocument();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
await step('Verify strength label is shown', async () => {
|
|
43
|
-
const strengthText = await canvas.findByText(/Password Strength/i);
|
|
44
|
-
expect(strengthText).toBeInTheDocument();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
await step('Verify requirements section is present', async () => {
|
|
48
|
-
const requirementsText = await canvas.findByText(/Requirements:/i);
|
|
49
|
-
expect(requirementsText).toBeInTheDocument();
|
|
50
|
-
});
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// A stateful wrapper to test user input
|
|
55
|
-
const InteractivePasswordStrength = () => {
|
|
56
|
-
const [password, setPassword] = useState('');
|
|
57
|
-
return (
|
|
58
|
-
<Stack spacing={3} sx={{ width: 400, padding: 2 }}>
|
|
59
|
-
<TextField
|
|
60
|
-
label="Password"
|
|
61
|
-
type="password"
|
|
62
|
-
value={password}
|
|
63
|
-
onChange={(e) => setPassword(e.target.value)}
|
|
64
|
-
inputProps={{ 'data-testid': 'password-input' }}
|
|
65
|
-
variant="outlined"
|
|
66
|
-
/>
|
|
67
|
-
<PasswordStrength
|
|
68
|
-
data-testid="password-strength-indicator"
|
|
69
|
-
value={password}
|
|
70
|
-
showRequirements={true}
|
|
71
|
-
showStrengthLabel={true}
|
|
72
|
-
/>
|
|
73
|
-
</Stack>
|
|
74
|
-
);
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// Keyboard Navigation Test
|
|
78
|
-
export const KeyboardNavigation: Story = {
|
|
79
|
-
name: '🧪 Keyboard Navigation Test',
|
|
80
|
-
render: () => <InteractivePasswordStrength />,
|
|
81
|
-
play: async ({ canvasElement, step }) => {
|
|
82
|
-
const canvas = within(canvasElement);
|
|
83
|
-
const input = canvas.getByTestId('password-input');
|
|
84
|
-
|
|
85
|
-
await step('User types a weak password', async () => {
|
|
86
|
-
await userEvent.type(input, 'test');
|
|
87
|
-
const strengthLabel = await canvas.findByText(/Weak/i);
|
|
88
|
-
expect(strengthLabel).toBeInTheDocument();
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
await step('User types a stronger password', async () => {
|
|
92
|
-
// Clear and type a new password
|
|
93
|
-
await userEvent.clear(input);
|
|
94
|
-
await userEvent.type(input, 'test1234');
|
|
95
|
-
const strengthLabel = await canvas.findByText(/Good/i);
|
|
96
|
-
expect(strengthLabel).toBeInTheDocument();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
await step('User clears the input', async () => {
|
|
100
|
-
await userEvent.clear(input);
|
|
101
|
-
await waitFor(() => expect(canvas.queryByText(/Weak|Fair|Good|Strong/i)).not.toBeInTheDocument());
|
|
102
|
-
});
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// Screen Reader Test
|
|
107
|
-
export const ScreenReader: Story = {
|
|
108
|
-
name: '🧪 Screen Reader Test',
|
|
109
|
-
render: () => (
|
|
110
|
-
<Stack spacing={2} sx={{ width: 400 }}>
|
|
111
|
-
<PasswordStrength
|
|
112
|
-
data-testid="password-strength"
|
|
113
|
-
value="MyStrongP@ssw0rd123!"
|
|
114
|
-
variant="linear"
|
|
115
|
-
showRequirements={true}
|
|
116
|
-
showStrengthLabel={true}
|
|
117
|
-
/>
|
|
118
|
-
</Stack>
|
|
119
|
-
),
|
|
120
|
-
play: async ({ canvasElement, step }) => {
|
|
121
|
-
const canvas = within(canvasElement);
|
|
122
|
-
|
|
123
|
-
await step('Verify progressbar role and ARIA attributes are present', async () => {
|
|
124
|
-
const progressBar = await canvas.findByRole('progressbar');
|
|
125
|
-
expect(progressBar).toBeInTheDocument();
|
|
126
|
-
expect(progressBar).toHaveAttribute('aria-valuenow', '100');
|
|
127
|
-
expect(progressBar).toHaveAttribute('aria-valuemin', '0');
|
|
128
|
-
expect(progressBar).toHaveAttribute('aria-valuemax', '100');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
await step('Verify strong password strength is announced', async () => {
|
|
132
|
-
const strongLabel = await canvas.findByText(/Strong/i);
|
|
133
|
-
expect(strongLabel).toBeInTheDocument();
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
await step('Verify all requirements are visibly met with check icons', async () => {
|
|
137
|
-
const metRequirements = await canvas.findAllByTestId('check-icon');
|
|
138
|
-
expect(metRequirements).toHaveLength(5);
|
|
139
|
-
});
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
// Responsive Design Test
|
|
144
|
-
export const ResponsiveDesign: Story = {
|
|
145
|
-
name: '🧪 Responsive Design Test',
|
|
146
|
-
render: () => (
|
|
147
|
-
<Stack spacing={2} sx={{ width: '90vw' }}>
|
|
148
|
-
<PasswordStrength
|
|
149
|
-
data-testid="password-strength-responsive"
|
|
150
|
-
value="MyStrongP@ssw0rd123!"
|
|
151
|
-
variant="linear"
|
|
152
|
-
/>
|
|
153
|
-
</Stack>
|
|
154
|
-
),
|
|
155
|
-
play: async ({ canvasElement, step }) => {
|
|
156
|
-
const canvas = within(canvasElement);
|
|
157
|
-
|
|
158
|
-
await step('Verify component renders', async () => {
|
|
159
|
-
const component = await canvas.findByTestId('password-strength-responsive');
|
|
160
|
-
expect(component).toBeInTheDocument();
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
await step('Verify component takes up parent width', async () => {
|
|
164
|
-
const component = await canvas.findByTestId('password-strength-responsive');
|
|
165
|
-
const parent = canvasElement.querySelector('.MuiStack-root') as HTMLElement;
|
|
166
|
-
const componentWidth = component.getBoundingClientRect().width;
|
|
167
|
-
const parentWidth = parent.getBoundingClientRect().width;
|
|
168
|
-
// Check that component width is close to parent's width
|
|
169
|
-
expect(componentWidth).toBeCloseTo(parentWidth, -1);
|
|
170
|
-
});
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
// Visual States Test
|
|
175
|
-
export const VisualStates: Story = {
|
|
176
|
-
name: '🧪 Visual States Test',
|
|
177
|
-
render: () => (
|
|
178
|
-
<Stack spacing={3}>
|
|
179
|
-
<PasswordStrength data-testid="very-weak-password" value="1" showStrengthLabel={true} />
|
|
180
|
-
<PasswordStrength data-testid="weak-password" value="pass" showStrengthLabel={true} />
|
|
181
|
-
<PasswordStrength data-testid="fair-password" value="password" showStrengthLabel={true} />
|
|
182
|
-
<PasswordStrength data-testid="good-password" value="password123" showStrengthLabel={true} />
|
|
183
|
-
<PasswordStrength data-testid="strong-password" value="MyStrongP@ssw0rd123!" showStrengthLabel={true} />
|
|
184
|
-
</Stack>
|
|
185
|
-
),
|
|
186
|
-
play: async ({ canvasElement, step }) => {
|
|
187
|
-
const canvas = within(canvasElement);
|
|
188
|
-
|
|
189
|
-
await step('Verify very weak password state and label', async () => {
|
|
190
|
-
const veryWeakContainer = await canvas.findByTestId('very-weak-password');
|
|
191
|
-
const label = within(veryWeakContainer).getByText('Very Weak');
|
|
192
|
-
expect(label).toBeInTheDocument();
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
await step('Verify weak password state and label', async () => {
|
|
196
|
-
const weakContainer = await canvas.findByTestId('weak-password');
|
|
197
|
-
const label = within(weakContainer).getByText('Weak');
|
|
198
|
-
expect(label).toBeInTheDocument();
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
await step('Verify fair password state and label', async () => {
|
|
202
|
-
const fairContainer = await canvas.findByTestId('fair-password');
|
|
203
|
-
const label = within(fairContainer).getByText('Fair');
|
|
204
|
-
expect(label).toBeInTheDocument();
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
await step('Verify good password state and label', async () => {
|
|
208
|
-
const goodContainer = await canvas.findByTestId('good-password');
|
|
209
|
-
const label = within(goodContainer).getByText('Good');
|
|
210
|
-
expect(label).toBeInTheDocument();
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
await step('Verify strong password state and label', async () => {
|
|
214
|
-
const strongContainer = await canvas.findByTestId('strong-password');
|
|
215
|
-
const label = within(strongContainer).getByText('Strong');
|
|
216
|
-
expect(label).toBeInTheDocument();
|
|
217
|
-
});
|
|
218
|
-
},
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
// This test is commented out because client-side performance checks in a test
|
|
222
|
-
// environment are inherently flaky and unreliable. They can be affected by system load,
|
|
223
|
-
// Storybook overhead, and other factors, leading to inconsistent results.
|
|
224
|
-
// Performance profiling should be done with dedicated browser developer tools.
|
|
225
|
-
/*
|
|
226
|
-
export const Performance: Story = {
|
|
227
|
-
name: '🧪 Performance Test',
|
|
228
|
-
render: () => (
|
|
229
|
-
<Stack spacing={2} sx={{ width: 400 }}>
|
|
230
|
-
<PasswordStrength
|
|
231
|
-
data-testid="performance-strength"
|
|
232
|
-
value="MyPassword123!"
|
|
233
|
-
animated={true}
|
|
234
|
-
/>
|
|
235
|
-
</Stack>
|
|
236
|
-
),
|
|
237
|
-
play: async ({ canvasElement, step }) => {
|
|
238
|
-
const canvas = within(canvasElement);
|
|
239
|
-
await step('Measure render performance', async () => {
|
|
240
|
-
const startTime = window.performance.now();
|
|
241
|
-
const component = await canvas.findByTestId('performance-strength');
|
|
242
|
-
const endTime = window.performance.now();
|
|
243
|
-
expect(component).toBeInTheDocument();
|
|
244
|
-
const renderTime = endTime - startTime;
|
|
245
|
-
console.log(`Render time: ${renderTime}ms`);
|
|
246
|
-
expect(renderTime).toBeLessThan(100); // This is not a reliable assertion
|
|
247
|
-
});
|
|
248
|
-
},
|
|
249
|
-
};
|
|
250
|
-
*/
|
|
251
|
-
|
|
252
|
-
// Edge Cases Test
|
|
253
|
-
export const EdgeCases: Story = {
|
|
254
|
-
name: '🧪 Edge Cases Test',
|
|
255
|
-
render: () => (
|
|
256
|
-
<Stack spacing={3}>
|
|
257
|
-
<PasswordStrength
|
|
258
|
-
data-testid="empty-password"
|
|
259
|
-
value=""
|
|
260
|
-
showRequirements={true}
|
|
261
|
-
showStrengthLabel={true}
|
|
262
|
-
/>
|
|
263
|
-
<PasswordStrength
|
|
264
|
-
data-testid="very-long-password"
|
|
265
|
-
value="ThisIsAnExtremelyLongPasswordThatExceedsTypicalLengthRequirementsAndShouldStillWork123!@#"
|
|
266
|
-
showStrengthLabel={true}
|
|
267
|
-
/>
|
|
268
|
-
</Stack>
|
|
269
|
-
),
|
|
270
|
-
play: async ({ canvasElement, step }) => {
|
|
271
|
-
const canvas = within(canvasElement);
|
|
272
|
-
|
|
273
|
-
await step('Verify empty password state shows no strength label', async () => {
|
|
274
|
-
const emptyContainer = await canvas.findByTestId('empty-password');
|
|
275
|
-
expect(emptyContainer).toBeInTheDocument();
|
|
276
|
-
const label = within(emptyContainer).queryByText(/Very Weak|Weak|Fair|Good|Strong/i);
|
|
277
|
-
await waitFor(() => expect(label).not.toBeInTheDocument());
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
await step('Verify very long password state shows "Strong"', async () => {
|
|
281
|
-
const veryLongContainer = await canvas.findByTestId('very-long-password');
|
|
282
|
-
const label = await within(veryLongContainer).findByText('Strong');
|
|
283
|
-
expect(label).toBeInTheDocument();
|
|
284
|
-
});
|
|
285
|
-
},
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
// Integration Test
|
|
289
|
-
export const Integration: Story = {
|
|
290
|
-
name: '🧪 Integration Test',
|
|
291
|
-
render: () => (
|
|
292
|
-
<Stack spacing={2} sx={{ width: 500 }}>
|
|
293
|
-
<PasswordStrength
|
|
294
|
-
data-testid="integration-strength"
|
|
295
|
-
value="Pass123"
|
|
296
|
-
variant="linear"
|
|
297
|
-
showRequirements={true}
|
|
298
|
-
showStrengthLabel={true}
|
|
299
|
-
animated={true}
|
|
300
|
-
/>
|
|
301
|
-
</Stack>
|
|
302
|
-
),
|
|
303
|
-
play: async ({ canvasElement, step }) => {
|
|
304
|
-
const canvas = within(canvasElement);
|
|
305
|
-
|
|
306
|
-
await step('Verify all features render together', async () => {
|
|
307
|
-
const component = await canvas.findByTestId('integration-strength');
|
|
308
|
-
expect(component).toBeInTheDocument();
|
|
309
|
-
expect(await canvas.findByText(/Password Strength/i)).toBeInTheDocument();
|
|
310
|
-
expect(await canvas.findByText(/Requirements:/i)).toBeInTheDocument();
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
await step('Verify password strength is calculated correctly as "Fair"', async () => {
|
|
314
|
-
const strengthIndicator = await canvas.findByText('Fair');
|
|
315
|
-
expect(strengthIndicator).toBeInTheDocument();
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
await step('Verify correct requirements are met', async () => {
|
|
319
|
-
const metIcons = await canvas.findAllByTestId('check-icon');
|
|
320
|
-
const unmetIcons = await canvas.findAllByTestId('close-icon');
|
|
321
|
-
// Password "Pass123" meets: length (7), uppercase, lowercase, numbers
|
|
322
|
-
// Missing: special character
|
|
323
|
-
expect(unmetIcons).toHaveLength(2); // minLength requires 8, missing special
|
|
324
|
-
expect(metIcons).toHaveLength(3); // uppercase, lowercase, numbers
|
|
325
|
-
});
|
|
326
|
-
},
|
|
327
|
-
};
|