@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,666 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { expect, fn, userEvent, waitFor, within } from 'storybook/test';
|
|
3
|
-
|
|
4
|
-
import { PhoneInput } from './PhoneInput';
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof PhoneInput> = {
|
|
7
|
-
title: 'Form/PhoneInput/Tests',
|
|
8
|
-
component: PhoneInput,
|
|
9
|
-
parameters: {
|
|
10
|
-
layout: 'centered',
|
|
11
|
-
chromatic: { disableSnapshot: false },
|
|
12
|
-
docs: {
|
|
13
|
-
description: {
|
|
14
|
-
component: 'Test stories for PhoneInput component validation and interactions',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
tags: ['autodocs', 'test'],
|
|
19
|
-
args: {
|
|
20
|
-
label: 'Phone Number',
|
|
21
|
-
placeholder: 'Enter phone number',
|
|
22
|
-
countryCode: 'US',
|
|
23
|
-
onChange: fn(),
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export default meta;
|
|
28
|
-
export type Story = StoryObj<typeof meta>;
|
|
29
|
-
|
|
30
|
-
// 1. Interaction Tests
|
|
31
|
-
export const BasicInteraction: Story = {
|
|
32
|
-
args: {
|
|
33
|
-
label: 'Phone Number',
|
|
34
|
-
onChange: fn(),
|
|
35
|
-
},
|
|
36
|
-
play: async ({ canvasElement, args }) => {
|
|
37
|
-
const canvas = within(canvasElement);
|
|
38
|
-
|
|
39
|
-
// Find input field
|
|
40
|
-
const input = canvas.getByRole('textbox');
|
|
41
|
-
await expect(input).toBeInTheDocument();
|
|
42
|
-
await expect(input).toHaveAttribute('type', 'tel');
|
|
43
|
-
|
|
44
|
-
// Clear any existing value
|
|
45
|
-
await userEvent.clear(input);
|
|
46
|
-
|
|
47
|
-
// Type a US phone number
|
|
48
|
-
await userEvent.type(input, '5551234567');
|
|
49
|
-
|
|
50
|
-
// Verify onChange was called with each keystroke
|
|
51
|
-
await waitFor(() => {
|
|
52
|
-
expect(args.onChange).toHaveBeenCalled();
|
|
53
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
54
|
-
expect(lastCall[0]).toContain('5551234567');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// Blur to trigger formatting
|
|
58
|
-
await userEvent.tab();
|
|
59
|
-
|
|
60
|
-
// Verify the value is formatted after blur - use longer timeout for formatting
|
|
61
|
-
await waitFor(() => {
|
|
62
|
-
const formattedValue = input.getAttribute('value');
|
|
63
|
-
expect(formattedValue).toMatch(/\+1.*555.*123.*4567/);
|
|
64
|
-
}, { timeout: 3000 });
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// 2. Form Interaction Tests
|
|
69
|
-
export const FormInteraction: Story = {
|
|
70
|
-
args: {
|
|
71
|
-
required: true,
|
|
72
|
-
error: false,
|
|
73
|
-
},
|
|
74
|
-
play: async ({ canvasElement }) => {
|
|
75
|
-
const canvas = within(canvasElement);
|
|
76
|
-
|
|
77
|
-
const input = canvas.getByRole('textbox');
|
|
78
|
-
await expect(input).toBeInTheDocument();
|
|
79
|
-
|
|
80
|
-
// Clear any existing value
|
|
81
|
-
await userEvent.clear(input);
|
|
82
|
-
|
|
83
|
-
// Type an invalid phone number
|
|
84
|
-
await userEvent.type(input, '123');
|
|
85
|
-
|
|
86
|
-
// Blur to trigger validation
|
|
87
|
-
await userEvent.tab();
|
|
88
|
-
|
|
89
|
-
// Should show validation error - use regex to match partial text
|
|
90
|
-
await waitFor(() => {
|
|
91
|
-
const helperText = canvas.getByText(/Invalid phone number/i);
|
|
92
|
-
expect(helperText).toBeVisible();
|
|
93
|
-
}, { timeout: 3000 });
|
|
94
|
-
|
|
95
|
-
// Clear and type a valid number
|
|
96
|
-
await userEvent.click(input);
|
|
97
|
-
await userEvent.clear(input);
|
|
98
|
-
await userEvent.type(input, '5551234567');
|
|
99
|
-
await userEvent.tab();
|
|
100
|
-
|
|
101
|
-
// Error should be gone
|
|
102
|
-
await waitFor(() => {
|
|
103
|
-
const errorText = canvas.queryByText(/Invalid phone number/i);
|
|
104
|
-
expect(errorText).not.toBeInTheDocument();
|
|
105
|
-
}, { timeout: 3000 });
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
// 3. Keyboard Navigation Tests
|
|
110
|
-
export const KeyboardNavigation: Story = {
|
|
111
|
-
play: async ({ canvasElement }) => {
|
|
112
|
-
const canvas = within(canvasElement);
|
|
113
|
-
const menuScope = within(document.body);
|
|
114
|
-
|
|
115
|
-
// Find country selector button using testId
|
|
116
|
-
const countrySelector = canvas.getByTestId('country-selector');
|
|
117
|
-
await expect(countrySelector).toBeInTheDocument();
|
|
118
|
-
|
|
119
|
-
// Tab to country selector
|
|
120
|
-
await userEvent.tab();
|
|
121
|
-
await waitFor(() => expect(countrySelector).toHaveFocus());
|
|
122
|
-
|
|
123
|
-
// Press Enter to open country menu
|
|
124
|
-
await userEvent.keyboard('[Enter]');
|
|
125
|
-
|
|
126
|
-
// Verify menu is open and contains countries - use menuScope for portal
|
|
127
|
-
await waitFor(() => {
|
|
128
|
-
const unitedStates = menuScope.getByText('United States');
|
|
129
|
-
expect(unitedStates).toBeVisible();
|
|
130
|
-
|
|
131
|
-
const unitedKingdom = menuScope.getByText('United Kingdom');
|
|
132
|
-
expect(unitedKingdom).toBeVisible();
|
|
133
|
-
}, { timeout: 3000 });
|
|
134
|
-
|
|
135
|
-
// Navigate with arrow keys
|
|
136
|
-
await userEvent.keyboard('[ArrowDown]');
|
|
137
|
-
await userEvent.keyboard('[ArrowDown]');
|
|
138
|
-
|
|
139
|
-
// Select with Enter
|
|
140
|
-
await userEvent.keyboard('[Enter]');
|
|
141
|
-
|
|
142
|
-
// Menu should close
|
|
143
|
-
await waitFor(() => {
|
|
144
|
-
const menu = menuScope.queryByRole('menu');
|
|
145
|
-
expect(menu).not.toBeInTheDocument();
|
|
146
|
-
}, { timeout: 3000 });
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
// 4. Screen Reader Tests
|
|
151
|
-
export const ScreenReader: Story = {
|
|
152
|
-
play: async ({ canvasElement }) => {
|
|
153
|
-
const canvas = within(canvasElement);
|
|
154
|
-
|
|
155
|
-
// Check for proper ARIA labels
|
|
156
|
-
const input = canvas.getByRole('textbox');
|
|
157
|
-
await expect(input).toHaveAttribute('type', 'tel');
|
|
158
|
-
|
|
159
|
-
// Check label association - use getByLabelText to verify label is properly associated
|
|
160
|
-
const inputByLabel = canvas.getByLabelText('Phone Number');
|
|
161
|
-
await expect(inputByLabel).toBeInTheDocument();
|
|
162
|
-
await expect(inputByLabel).toBe(input);
|
|
163
|
-
|
|
164
|
-
// Check for country selector accessibility using testId
|
|
165
|
-
const countryButton = canvas.getByTestId('country-selector');
|
|
166
|
-
await expect(countryButton).toHaveAttribute('aria-expanded', 'false');
|
|
167
|
-
await expect(countryButton).toHaveAttribute('aria-label', 'Select country');
|
|
168
|
-
|
|
169
|
-
// Open menu and check expanded state
|
|
170
|
-
await userEvent.click(countryButton);
|
|
171
|
-
await waitFor(() => {
|
|
172
|
-
expect(countryButton).toHaveAttribute('aria-expanded', 'true');
|
|
173
|
-
}, { timeout: 3000 });
|
|
174
|
-
|
|
175
|
-
// Close menu
|
|
176
|
-
await userEvent.keyboard('[Escape]');
|
|
177
|
-
await waitFor(() => {
|
|
178
|
-
expect(countryButton).toHaveAttribute('aria-expanded', 'false');
|
|
179
|
-
}, { timeout: 3000 });
|
|
180
|
-
},
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
// 5. Focus Management Tests
|
|
184
|
-
export const FocusManagement: Story = {
|
|
185
|
-
play: async ({ canvasElement }) => {
|
|
186
|
-
const canvas = within(canvasElement);
|
|
187
|
-
|
|
188
|
-
const input = canvas.getByRole('textbox');
|
|
189
|
-
|
|
190
|
-
// Focus the input
|
|
191
|
-
await userEvent.click(input);
|
|
192
|
-
await waitFor(() => expect(input).toHaveFocus());
|
|
193
|
-
|
|
194
|
-
// Tab away and back
|
|
195
|
-
await userEvent.tab();
|
|
196
|
-
await userEvent.tab({ shift: true });
|
|
197
|
-
await waitFor(() => expect(input).toHaveFocus());
|
|
198
|
-
},
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
// 6. Responsive Design Tests
|
|
202
|
-
export const ResponsiveDesign: Story = {
|
|
203
|
-
parameters: {
|
|
204
|
-
viewport: {
|
|
205
|
-
viewports: {
|
|
206
|
-
mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
|
|
207
|
-
},
|
|
208
|
-
defaultViewport: 'mobile',
|
|
209
|
-
},
|
|
210
|
-
},
|
|
211
|
-
play: async ({ canvasElement }) => {
|
|
212
|
-
const canvas = within(canvasElement);
|
|
213
|
-
const menuScope = within(document.body);
|
|
214
|
-
|
|
215
|
-
const input = canvas.getByRole('textbox');
|
|
216
|
-
await expect(input).toBeVisible();
|
|
217
|
-
|
|
218
|
-
// Verify component renders properly on mobile using testId
|
|
219
|
-
const container = canvas.getByTestId('phone-input-container');
|
|
220
|
-
expect(container).toBeInTheDocument();
|
|
221
|
-
|
|
222
|
-
// Verify country selector is accessible on mobile using testId
|
|
223
|
-
const countryButton = canvas.getByTestId('country-selector');
|
|
224
|
-
await expect(countryButton).toBeVisible();
|
|
225
|
-
|
|
226
|
-
// Test input functionality on mobile
|
|
227
|
-
await userEvent.clear(input);
|
|
228
|
-
await userEvent.click(input);
|
|
229
|
-
await waitFor(() => expect(input).toHaveFocus());
|
|
230
|
-
|
|
231
|
-
// Type phone number on mobile viewport
|
|
232
|
-
await userEvent.type(input, '5551234567');
|
|
233
|
-
await waitFor(() => {
|
|
234
|
-
expect(input).toHaveValue('5551234567');
|
|
235
|
-
}, { timeout: 3000 });
|
|
236
|
-
|
|
237
|
-
// Test country selection on mobile - use menuScope for portal
|
|
238
|
-
await userEvent.click(countryButton);
|
|
239
|
-
await waitFor(() => {
|
|
240
|
-
expect(menuScope.getByText('United States')).toBeVisible();
|
|
241
|
-
}, { timeout: 3000 });
|
|
242
|
-
|
|
243
|
-
// Close menu by clicking outside
|
|
244
|
-
await userEvent.click(input);
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
// 7. Theme Variation Tests
|
|
249
|
-
export const ThemeVariations: Story = {
|
|
250
|
-
args: {
|
|
251
|
-
variant: 'glass',
|
|
252
|
-
},
|
|
253
|
-
play: async ({ canvasElement }) => {
|
|
254
|
-
const canvas = within(canvasElement);
|
|
255
|
-
|
|
256
|
-
const input = canvas.getByRole('textbox');
|
|
257
|
-
await expect(input).toBeInTheDocument();
|
|
258
|
-
|
|
259
|
-
// Use testId to get the container instead of querySelector
|
|
260
|
-
const container = canvas.getByTestId('phone-input-container');
|
|
261
|
-
expect(container).toBeInTheDocument();
|
|
262
|
-
|
|
263
|
-
// Check if glass variant applies styles to the input field
|
|
264
|
-
const inputField = canvas.getByTestId('phone-input-field');
|
|
265
|
-
// Get the MuiOutlinedInput-root element which has the glass styling
|
|
266
|
-
const inputRoot = inputField.querySelector('.MuiOutlinedInput-root');
|
|
267
|
-
expect(inputRoot).toBeTruthy();
|
|
268
|
-
|
|
269
|
-
const styles = window.getComputedStyle(inputRoot!);
|
|
270
|
-
// Glass effect should have backdrop blur
|
|
271
|
-
expect(styles.backdropFilter || styles.webkitBackdropFilter).toMatch(/blur/);
|
|
272
|
-
|
|
273
|
-
// Check hover effect
|
|
274
|
-
await userEvent.hover(inputRoot!);
|
|
275
|
-
await waitFor(() => {
|
|
276
|
-
const hoverStyles = window.getComputedStyle(inputRoot!);
|
|
277
|
-
expect(hoverStyles.background).toBeTruthy();
|
|
278
|
-
}, { timeout: 3000 });
|
|
279
|
-
},
|
|
280
|
-
};
|
|
281
|
-
|
|
282
|
-
// 8. Visual State Tests
|
|
283
|
-
export const VisualStates: Story = {
|
|
284
|
-
args: {
|
|
285
|
-
error: true,
|
|
286
|
-
errorMessage: 'Invalid phone number',
|
|
287
|
-
},
|
|
288
|
-
play: async ({ canvasElement }) => {
|
|
289
|
-
const canvas = within(canvasElement);
|
|
290
|
-
|
|
291
|
-
// Check error state
|
|
292
|
-
const input = canvas.getByRole('textbox');
|
|
293
|
-
await expect(input).toHaveAttribute('aria-invalid', 'true');
|
|
294
|
-
|
|
295
|
-
const errorText = canvas.getByText('Invalid phone number');
|
|
296
|
-
await expect(errorText).toBeVisible();
|
|
297
|
-
},
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
// 9. Performance Tests
|
|
301
|
-
export const Performance: Story = {
|
|
302
|
-
play: async ({ canvasElement }) => {
|
|
303
|
-
const canvas = within(canvasElement);
|
|
304
|
-
const menuScope = within(document.body);
|
|
305
|
-
|
|
306
|
-
const input = canvas.getByRole('textbox');
|
|
307
|
-
|
|
308
|
-
// Test rapid input - verify input responsiveness
|
|
309
|
-
await userEvent.clear(input);
|
|
310
|
-
const testNumber = '5551234567';
|
|
311
|
-
|
|
312
|
-
await userEvent.type(input, testNumber);
|
|
313
|
-
|
|
314
|
-
// Verify all digits were entered correctly
|
|
315
|
-
await waitFor(() => {
|
|
316
|
-
expect(input).toHaveValue(testNumber);
|
|
317
|
-
}, { timeout: 3000 });
|
|
318
|
-
|
|
319
|
-
// Test country switching functionality using testId
|
|
320
|
-
const countryButton = canvas.getByTestId('country-selector');
|
|
321
|
-
await userEvent.click(countryButton);
|
|
322
|
-
|
|
323
|
-
// Wait for menu to appear - use menuScope for portal
|
|
324
|
-
await waitFor(() => {
|
|
325
|
-
const ukOption = menuScope.getByText('United Kingdom');
|
|
326
|
-
expect(ukOption).toBeVisible();
|
|
327
|
-
}, { timeout: 3000 });
|
|
328
|
-
|
|
329
|
-
// Select UK - use menuScope
|
|
330
|
-
await userEvent.click(menuScope.getByText('United Kingdom'));
|
|
331
|
-
|
|
332
|
-
// Verify country changed successfully using testId
|
|
333
|
-
await waitFor(() => {
|
|
334
|
-
const dialCode = canvas.getByTestId('country-dial-code');
|
|
335
|
-
expect(dialCode).toHaveTextContent('+44');
|
|
336
|
-
}, { timeout: 3000 });
|
|
337
|
-
},
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
// 10. Edge Cases Tests
|
|
341
|
-
export const EdgeCases: Story = {
|
|
342
|
-
play: async ({ canvasElement }) => {
|
|
343
|
-
const canvas = within(canvasElement);
|
|
344
|
-
|
|
345
|
-
const input = canvas.getByRole('textbox');
|
|
346
|
-
|
|
347
|
-
// Test with letters - should accept them as phone numbers can contain letters
|
|
348
|
-
await userEvent.clear(input);
|
|
349
|
-
await userEvent.type(input, 'abc123');
|
|
350
|
-
await waitFor(() => {
|
|
351
|
-
const value = input.getAttribute('value');
|
|
352
|
-
expect(value).toBe('abc123');
|
|
353
|
-
}, { timeout: 3000 });
|
|
354
|
-
|
|
355
|
-
// Test with very long input - should accept up to reasonable length
|
|
356
|
-
await userEvent.clear(input);
|
|
357
|
-
const longNumber = '12345678901234567890';
|
|
358
|
-
await userEvent.type(input, longNumber);
|
|
359
|
-
|
|
360
|
-
await waitFor(() => {
|
|
361
|
-
const value = input.getAttribute('value');
|
|
362
|
-
expect(value).toBe(longNumber);
|
|
363
|
-
expect(value?.length).toBe(20);
|
|
364
|
-
}, { timeout: 3000 });
|
|
365
|
-
|
|
366
|
-
// Test with formatted input characters
|
|
367
|
-
await userEvent.clear(input);
|
|
368
|
-
await userEvent.type(input, '555-123-4567');
|
|
369
|
-
await userEvent.tab();
|
|
370
|
-
|
|
371
|
-
// Should format the number with international format
|
|
372
|
-
await waitFor(() => {
|
|
373
|
-
const value = input.getAttribute('value');
|
|
374
|
-
expect(value).toMatch(/\+1.*555.*123.*4567/);
|
|
375
|
-
}, { timeout: 5000 });
|
|
376
|
-
|
|
377
|
-
// Test paste event with formatted number
|
|
378
|
-
await userEvent.clear(input);
|
|
379
|
-
await userEvent.paste('+1 (555) 123-4567');
|
|
380
|
-
|
|
381
|
-
// Should handle pasted formatted numbers
|
|
382
|
-
await waitFor(() => {
|
|
383
|
-
const value = input.getAttribute('value');
|
|
384
|
-
expect(value).toBe('+1 (555) 123-4567');
|
|
385
|
-
}, { timeout: 3000 });
|
|
386
|
-
},
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
// 11. Country Code Selection Test
|
|
390
|
-
export const CountryCodeSelection: Story = {
|
|
391
|
-
args: {
|
|
392
|
-
countryCode: 'US',
|
|
393
|
-
onChange: fn(),
|
|
394
|
-
},
|
|
395
|
-
play: async ({ canvasElement, args }) => {
|
|
396
|
-
const canvas = within(canvasElement);
|
|
397
|
-
const menuScope = within(document.body);
|
|
398
|
-
|
|
399
|
-
// Verify initial US country using testId
|
|
400
|
-
const dialCode = canvas.getByTestId('country-dial-code');
|
|
401
|
-
await expect(dialCode).toHaveTextContent('+1');
|
|
402
|
-
|
|
403
|
-
// Open country selector using testId
|
|
404
|
-
const countryButton = canvas.getByTestId('country-selector');
|
|
405
|
-
await userEvent.click(countryButton);
|
|
406
|
-
|
|
407
|
-
// Verify key countries are shown - use menuScope for portal
|
|
408
|
-
await waitFor(() => {
|
|
409
|
-
expect(menuScope.getByText('United States')).toBeVisible();
|
|
410
|
-
expect(menuScope.getByText('United Kingdom')).toBeVisible();
|
|
411
|
-
}, { timeout: 3000 });
|
|
412
|
-
|
|
413
|
-
// Verify Germany exists in the menu (may not be visible due to scroll)
|
|
414
|
-
const germanyOption = menuScope.getByText('Germany');
|
|
415
|
-
expect(germanyOption).toBeInTheDocument();
|
|
416
|
-
|
|
417
|
-
// Select Germany
|
|
418
|
-
await userEvent.click(germanyOption);
|
|
419
|
-
|
|
420
|
-
// Verify country changed using testId
|
|
421
|
-
await waitFor(() => {
|
|
422
|
-
const germanDialCode = canvas.getByTestId('country-dial-code');
|
|
423
|
-
expect(germanDialCode).toHaveTextContent('+49');
|
|
424
|
-
}, { timeout: 3000 });
|
|
425
|
-
|
|
426
|
-
// Type a German phone number
|
|
427
|
-
const input = canvas.getByRole('textbox');
|
|
428
|
-
await userEvent.type(input, '30123456789');
|
|
429
|
-
|
|
430
|
-
// Verify onChange called with German country code
|
|
431
|
-
await waitFor(() => {
|
|
432
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
433
|
-
expect(lastCall[2]).toBe('DE');
|
|
434
|
-
}, { timeout: 3000 });
|
|
435
|
-
},
|
|
436
|
-
};
|
|
437
|
-
|
|
438
|
-
// 12. Phone Number Formatting Test
|
|
439
|
-
export const PhoneNumberFormatting: Story = {
|
|
440
|
-
args: {
|
|
441
|
-
onChange: fn(),
|
|
442
|
-
},
|
|
443
|
-
play: async ({ canvasElement, args }) => {
|
|
444
|
-
const canvas = within(canvasElement);
|
|
445
|
-
const menuScope = within(document.body);
|
|
446
|
-
const input = canvas.getByRole('textbox');
|
|
447
|
-
|
|
448
|
-
// Test US number formatting
|
|
449
|
-
await userEvent.type(input, '2125551234');
|
|
450
|
-
await userEvent.tab();
|
|
451
|
-
|
|
452
|
-
await waitFor(() => {
|
|
453
|
-
const value = input.getAttribute('value');
|
|
454
|
-
expect(value).toMatch(/\+1.*212.*555.*1234/);
|
|
455
|
-
}, { timeout: 5000 });
|
|
456
|
-
|
|
457
|
-
// Change to UK and test UK formatting using testId
|
|
458
|
-
const countryButton = canvas.getByTestId('country-selector');
|
|
459
|
-
await userEvent.click(countryButton);
|
|
460
|
-
await waitFor(() => {
|
|
461
|
-
expect(menuScope.getByText('United Kingdom')).toBeVisible();
|
|
462
|
-
}, { timeout: 3000 });
|
|
463
|
-
await userEvent.click(menuScope.getByText('United Kingdom'));
|
|
464
|
-
|
|
465
|
-
// Clear and type UK number
|
|
466
|
-
await userEvent.clear(input);
|
|
467
|
-
await userEvent.type(input, '2079460958');
|
|
468
|
-
await userEvent.tab();
|
|
469
|
-
|
|
470
|
-
await waitFor(() => {
|
|
471
|
-
const value = input.getAttribute('value');
|
|
472
|
-
expect(value).toMatch(/\+44.*20.*7946.*0958/);
|
|
473
|
-
}, { timeout: 5000 });
|
|
474
|
-
|
|
475
|
-
// Verify validation status in onChange
|
|
476
|
-
await waitFor(() => {
|
|
477
|
-
const calls = args.onChange.mock.calls;
|
|
478
|
-
const lastCall = calls[calls.length - 1];
|
|
479
|
-
expect(lastCall[1]).toBe(true); // Should be valid
|
|
480
|
-
}, { timeout: 3000 });
|
|
481
|
-
},
|
|
482
|
-
};
|
|
483
|
-
|
|
484
|
-
// 13. Integration Tests
|
|
485
|
-
export const Integration: Story = {
|
|
486
|
-
args: {
|
|
487
|
-
countryCode: 'GB',
|
|
488
|
-
defaultValue: '+44 20 7946 0958',
|
|
489
|
-
},
|
|
490
|
-
play: async ({ canvasElement, args }) => {
|
|
491
|
-
const canvas = within(canvasElement);
|
|
492
|
-
const menuScope = within(document.body);
|
|
493
|
-
|
|
494
|
-
const input = canvas.getByRole('textbox');
|
|
495
|
-
|
|
496
|
-
// Verify initial value is set
|
|
497
|
-
await expect(input).toHaveValue('+44 20 7946 0958');
|
|
498
|
-
|
|
499
|
-
// Verify UK country is selected initially using testId
|
|
500
|
-
const countrySelector = canvas.getByTestId('country-selector');
|
|
501
|
-
const dialCode = canvas.getByTestId('country-dial-code');
|
|
502
|
-
await expect(dialCode).toHaveTextContent('+44');
|
|
503
|
-
|
|
504
|
-
// Change country to United States
|
|
505
|
-
await userEvent.click(countrySelector);
|
|
506
|
-
|
|
507
|
-
// Wait for menu to open - use menuScope for portal
|
|
508
|
-
await waitFor(() => {
|
|
509
|
-
const usOption = menuScope.getByText('United States');
|
|
510
|
-
expect(usOption).toBeVisible();
|
|
511
|
-
}, { timeout: 3000 });
|
|
512
|
-
|
|
513
|
-
// Select United States - use menuScope
|
|
514
|
-
await userEvent.click(menuScope.getByText('United States'));
|
|
515
|
-
|
|
516
|
-
// Verify country changed using testId
|
|
517
|
-
await waitFor(() => {
|
|
518
|
-
const newDialCode = canvas.getByTestId('country-dial-code');
|
|
519
|
-
expect(newDialCode).toHaveTextContent('+1');
|
|
520
|
-
}, { timeout: 3000 });
|
|
521
|
-
|
|
522
|
-
// Verify onChange was called with country change
|
|
523
|
-
await waitFor(() => {
|
|
524
|
-
expect(args.onChange).toHaveBeenCalled();
|
|
525
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
526
|
-
expect(lastCall[2]).toBe('US'); // Country code should be US
|
|
527
|
-
}, { timeout: 3000 });
|
|
528
|
-
|
|
529
|
-
// Type a new number with US format
|
|
530
|
-
await userEvent.clear(input);
|
|
531
|
-
await userEvent.type(input, '2125551234');
|
|
532
|
-
await userEvent.tab();
|
|
533
|
-
|
|
534
|
-
// Verify US formatting is applied
|
|
535
|
-
await waitFor(() => {
|
|
536
|
-
const value = input.getAttribute('value');
|
|
537
|
-
expect(value).toMatch(/\+1.*212.*555.*1234/);
|
|
538
|
-
}, { timeout: 5000 });
|
|
539
|
-
},
|
|
540
|
-
};
|
|
541
|
-
|
|
542
|
-
// 14. Enhanced Validation Tests
|
|
543
|
-
export const EnhancedValidation: Story = {
|
|
544
|
-
args: {
|
|
545
|
-
onChange: fn(),
|
|
546
|
-
},
|
|
547
|
-
play: async ({ canvasElement, args }) => {
|
|
548
|
-
const canvas = within(canvasElement);
|
|
549
|
-
const input = canvas.getByRole('textbox');
|
|
550
|
-
|
|
551
|
-
// Test invalid US number
|
|
552
|
-
await userEvent.clear(input);
|
|
553
|
-
await userEvent.type(input, '123');
|
|
554
|
-
await userEvent.tab();
|
|
555
|
-
|
|
556
|
-
await waitFor(() => {
|
|
557
|
-
const helperText = canvas.getByText(/Invalid phone number for United States/);
|
|
558
|
-
expect(helperText).toBeVisible();
|
|
559
|
-
});
|
|
560
|
-
|
|
561
|
-
// Test valid US number
|
|
562
|
-
await userEvent.clear(input);
|
|
563
|
-
await userEvent.type(input, '2125551234');
|
|
564
|
-
await userEvent.tab();
|
|
565
|
-
|
|
566
|
-
await waitFor(() => {
|
|
567
|
-
const errorText = canvas.queryByText(/Invalid phone number/);
|
|
568
|
-
expect(errorText).not.toBeInTheDocument();
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
// Verify onChange called with validation result
|
|
572
|
-
await waitFor(() => {
|
|
573
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
574
|
-
expect(lastCall[1]).toBe(true); // Should be valid
|
|
575
|
-
expect(lastCall[2]).toBe('US'); // Country code
|
|
576
|
-
});
|
|
577
|
-
},
|
|
578
|
-
};
|
|
579
|
-
|
|
580
|
-
// 15. Auto-Country Detection Tests
|
|
581
|
-
export const AutoCountryDetection: Story = {
|
|
582
|
-
args: {
|
|
583
|
-
onChange: fn(),
|
|
584
|
-
},
|
|
585
|
-
play: async ({ canvasElement, args }) => {
|
|
586
|
-
const canvas = within(canvasElement);
|
|
587
|
-
const input = canvas.getByRole('textbox');
|
|
588
|
-
|
|
589
|
-
// Type German international number
|
|
590
|
-
await userEvent.clear(input);
|
|
591
|
-
await userEvent.type(input, '+49301234567');
|
|
592
|
-
|
|
593
|
-
// Should auto-detect Germany using testId
|
|
594
|
-
await waitFor(() => {
|
|
595
|
-
const germanDialCode = canvas.getByTestId('country-dial-code');
|
|
596
|
-
expect(germanDialCode).toHaveTextContent('+49');
|
|
597
|
-
}, { timeout: 3000 });
|
|
598
|
-
|
|
599
|
-
// Verify onChange called with German country
|
|
600
|
-
await waitFor(() => {
|
|
601
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
602
|
-
expect(lastCall[2]).toBe('DE');
|
|
603
|
-
}, { timeout: 3000 });
|
|
604
|
-
|
|
605
|
-
// Type UK international number
|
|
606
|
-
await userEvent.clear(input);
|
|
607
|
-
await userEvent.type(input, '+442079460958');
|
|
608
|
-
|
|
609
|
-
// Should auto-detect UK using testId
|
|
610
|
-
await waitFor(() => {
|
|
611
|
-
const ukDialCode = canvas.getByTestId('country-dial-code');
|
|
612
|
-
expect(ukDialCode).toHaveTextContent('+44');
|
|
613
|
-
}, { timeout: 3000 });
|
|
614
|
-
|
|
615
|
-
// Verify onChange called with UK country
|
|
616
|
-
await waitFor(() => {
|
|
617
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
618
|
-
expect(lastCall[2]).toBe('GB');
|
|
619
|
-
}, { timeout: 3000 });
|
|
620
|
-
},
|
|
621
|
-
};
|
|
622
|
-
|
|
623
|
-
// 16. Extended Country Support Tests
|
|
624
|
-
export const ExtendedCountrySupport: Story = {
|
|
625
|
-
args: {
|
|
626
|
-
onChange: fn(),
|
|
627
|
-
},
|
|
628
|
-
play: async ({ canvasElement, args }) => {
|
|
629
|
-
const canvas = within(canvasElement);
|
|
630
|
-
const menuScope = within(document.body);
|
|
631
|
-
|
|
632
|
-
// Test country selection from extended list using testId
|
|
633
|
-
const countryButton = canvas.getByTestId('country-selector');
|
|
634
|
-
await userEvent.click(countryButton);
|
|
635
|
-
|
|
636
|
-
// Verify key extended countries are available - use menuScope for portal
|
|
637
|
-
await waitFor(() => {
|
|
638
|
-
expect(menuScope.getByText('Argentina')).toBeInTheDocument();
|
|
639
|
-
expect(menuScope.getByText('Belgium')).toBeInTheDocument();
|
|
640
|
-
expect(menuScope.getByText('Denmark')).toBeInTheDocument();
|
|
641
|
-
expect(menuScope.getByText('Finland')).toBeInTheDocument();
|
|
642
|
-
expect(menuScope.getByText('Singapore')).toBeInTheDocument();
|
|
643
|
-
expect(menuScope.getByText('Sweden')).toBeInTheDocument();
|
|
644
|
-
expect(menuScope.getByText('United Arab Emirates')).toBeInTheDocument();
|
|
645
|
-
}, { timeout: 3000 });
|
|
646
|
-
|
|
647
|
-
// Select Singapore - use menuScope
|
|
648
|
-
await userEvent.click(menuScope.getByText('Singapore'));
|
|
649
|
-
|
|
650
|
-
// Verify Singapore dial code appears using testId
|
|
651
|
-
await waitFor(() => {
|
|
652
|
-
const singaporeDialCode = canvas.getByTestId('country-dial-code');
|
|
653
|
-
expect(singaporeDialCode).toHaveTextContent('+65');
|
|
654
|
-
}, { timeout: 3000 });
|
|
655
|
-
|
|
656
|
-
// Type Singapore number
|
|
657
|
-
const input = canvas.getByRole('textbox');
|
|
658
|
-
await userEvent.type(input, '81234567');
|
|
659
|
-
|
|
660
|
-
// Verify onChange called with Singapore country code
|
|
661
|
-
await waitFor(() => {
|
|
662
|
-
const lastCall = args.onChange.mock.calls[args.onChange.mock.calls.length - 1];
|
|
663
|
-
expect(lastCall[2]).toBe('SG');
|
|
664
|
-
}, { timeout: 3000 });
|
|
665
|
-
},
|
|
666
|
-
};
|