@jmruthers/pace-core 0.2.7 → 0.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/dist/{DataTable-EEUDXPE5.js → DataTable-GX3XERFJ.js} +8 -4
- package/dist/{DataTable-C1AEm9Cx.d.ts → DataTable-ltTFXHS3.d.ts} +3 -1
- package/dist/{chunk-VYG4AXYW.js → chunk-5EL3KHOQ.js} +2 -2
- package/dist/{chunk-ETEJVKYK.js → chunk-6CR3MRZN.js} +1426 -62
- package/dist/chunk-6CR3MRZN.js.map +1 -0
- package/dist/chunk-AUE24LVR.js +268 -0
- package/dist/chunk-AUE24LVR.js.map +1 -0
- package/dist/chunk-COBPIXXQ.js +379 -0
- package/dist/chunk-COBPIXXQ.js.map +1 -0
- package/dist/{chunk-EWKPTNPO.js → chunk-GSNM5D6H.js} +388 -86
- package/dist/chunk-GSNM5D6H.js.map +1 -0
- package/dist/{chunk-2V3Y6YBC.js → chunk-OEGRKULD.js} +1 -42
- package/dist/chunk-OEGRKULD.js.map +1 -0
- package/dist/chunk-OYRY44Q2.js +62 -0
- package/dist/chunk-OYRY44Q2.js.map +1 -0
- package/dist/{chunk-RRUYHORU.js → chunk-T3XIA4AJ.js} +297 -433
- package/dist/chunk-T3XIA4AJ.js.map +1 -0
- package/dist/{chunk-HEMJ4SUJ.js → chunk-TGDCLPP2.js} +11 -7
- package/dist/{chunk-HEMJ4SUJ.js.map → chunk-TGDCLPP2.js.map} +1 -1
- package/dist/{chunk-HNDFPXUU.js → chunk-U6JDHVC2.js} +6 -4
- package/dist/{chunk-HNDFPXUU.js.map → chunk-U6JDHVC2.js.map} +1 -1
- package/dist/{chunk-TIVL4UQ7.js → chunk-XJK2J4N6.js} +6 -4
- package/dist/{chunk-TIVL4UQ7.js.map → chunk-XJK2J4N6.js.map} +1 -1
- package/dist/components.d.ts +2 -2
- package/dist/components.js +21 -20
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +7 -7
- package/dist/index.d.ts +2 -2
- package/dist/index.js +26 -25
- package/dist/index.js.map +1 -1
- package/dist/providers.js +8 -7
- package/dist/rbac/index.d.ts +806 -806
- package/dist/rbac/index.js +937 -1179
- package/dist/rbac/index.js.map +1 -1
- package/dist/{types-DiRQsGJs.d.ts → types-BRDU7N6w.d.ts} +12 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +6 -6
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +21 -8
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +46 -33
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +2 -2
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +3 -3
- package/package.json +5 -2
- package/src/__tests__/REBUILD_PLAN.md +223 -0
- package/src/__tests__/TESTING_GUIDELINES.md +341 -0
- package/src/__tests__/fixtures/mocks.ts +93 -0
- package/src/__tests__/helpers/component-test-utils.tsx +145 -0
- package/src/__tests__/helpers/test-utils.tsx +117 -0
- package/src/__tests__/integration/UserProfile.test.tsx +128 -0
- package/src/__tests__/setup.ts +37 -225
- package/src/__tests__/templates/component.test.template.tsx +97 -75
- package/src/__tests__/templates/hook.test.template.ts +173 -0
- package/src/__tests__/types/test.types.ts +106 -0
- package/src/components/Alert/Alert.test.tsx +496 -0
- package/src/components/Avatar/Avatar.test.tsx +484 -0
- package/src/components/Button/Button.test.tsx +662 -0
- package/src/components/Card/Card.test.tsx +593 -0
- package/src/components/Checkbox/Checkbox.test.tsx +461 -0
- package/src/components/DataTable/DataTable.tsx +9 -1
- package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
- package/src/components/DataTable/components/ActionButtons.tsx +18 -1
- package/src/components/DataTable/components/DataTableCore.tsx +97 -11
- package/src/components/DataTable/components/DataTableToolbar.tsx +22 -10
- package/src/components/DataTable/components/UnifiedTableBody.tsx +33 -4
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +3 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +3 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +3 -0
- package/src/components/DataTable/types.ts +39 -1
- package/src/components/Dialog/Dialog.test.tsx +1139 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
- package/src/components/FileUpload/FileUpload.test.tsx +665 -0
- package/src/hooks/useCounter.test.ts +135 -0
- package/src/rbac/index.ts +3 -3
- package/dist/chunk-2V3Y6YBC.js.map +0 -1
- package/dist/chunk-BEZRLNK3.js +0 -1744
- package/dist/chunk-BEZRLNK3.js.map +0 -1
- package/dist/chunk-ETEJVKYK.js.map +0 -1
- package/dist/chunk-EWKPTNPO.js.map +0 -1
- package/dist/chunk-OHXGNT3K.js +0 -21
- package/dist/chunk-OHXGNT3K.js.map +0 -1
- package/dist/chunk-RRUYHORU.js.map +0 -1
- package/src/__tests__/README.md +0 -404
- package/src/__tests__/debug-provider.unit.test.tsx +0 -67
- package/src/__tests__/e2e/workflows.test.tsx +0 -373
- package/src/__tests__/hybridPermissions.unit.test.tsx +0 -474
- package/src/__tests__/index.integration.test.ts +0 -491
- package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +0 -47
- package/src/__tests__/mocks/MockAuthProvider.tsx +0 -63
- package/src/__tests__/mocks/enhancedSupabaseMock.ts +0 -252
- package/src/__tests__/mocks/index.test.ts +0 -23
- package/src/__tests__/mocks/index.ts +0 -16
- package/src/__tests__/mocks/mockAuth.ts +0 -155
- package/src/__tests__/mocks/mockSupabase.ts +0 -83
- package/src/__tests__/mocks/mockSupabaseClient.ts +0 -63
- package/src/__tests__/mocks/providers.tsx +0 -22
- package/src/__tests__/patterns/__tests__/testPatterns.test.ts +0 -394
- package/src/__tests__/patterns/testPatterns.ts +0 -124
- package/src/__tests__/performance/componentPerformance.performance.test.ts +0 -27
- package/src/__tests__/performance/index.ts +0 -24
- package/src/__tests__/performance/performanceValidation.performance.test.ts +0 -15
- package/src/__tests__/security/security.unit.test.tsx +0 -7
- package/src/__tests__/security/securityValidation.security.test.tsx +0 -153
- package/src/__tests__/setupTests.d.ts +0 -1
- package/src/__tests__/shared/componentTestUtils.tsx +0 -475
- package/src/__tests__/shared/errorHandlingTestUtils.ts +0 -107
- package/src/__tests__/shared/index.ts +0 -81
- package/src/__tests__/shared/integrationTestUtils.tsx +0 -375
- package/src/__tests__/shared/performanceTestUtils.tsx +0 -476
- package/src/__tests__/shared/testUtils.optimized.tsx +0 -685
- package/src/__tests__/simple.test.tsx +0 -20
- package/src/__tests__/test-utils/dataFactories.ts +0 -60
- package/src/__tests__/test-utils/index.ts +0 -6
- package/src/__tests__/typeSafety.unit.test.ts +0 -65
- package/src/__tests__/unifiedAuth.unit.test.tsx +0 -151
- package/src/__tests__/utils/accessibilityHelpers.ts +0 -254
- package/src/__tests__/utils/assertions.ts +0 -50
- package/src/__tests__/utils/deterministicHelpers.ts +0 -31
- package/src/__tests__/utils/edgeCaseConfig.test.ts +0 -75
- package/src/__tests__/utils/edgeCaseConfig.ts +0 -98
- package/src/__tests__/utils/mockHelpers.ts +0 -149
- package/src/__tests__/utils/mockLoader.ts +0 -101
- package/src/__tests__/utils/performanceHelpers.ts +0 -55
- package/src/__tests__/utils/performanceTestHelpers.ts +0 -68
- package/src/__tests__/utils/testDataFactories.ts +0 -28
- package/src/__tests__/utils/testIsolation.ts +0 -67
- package/src/__tests__/utils/visualTestHelpers.ts +0 -20
- package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +0 -68
- package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +0 -14
- package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +0 -217
- package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +0 -24
- package/src/__tests__/visual/componentSnapshots.visual.test.tsx +0 -33
- package/src/__tests__/visual/componentVisuals.visual.test.tsx +0 -12
- package/src/__tests__/visual/visualRegression.visual.test.tsx +0 -20
- package/src/components/Alert/__tests__/Alert.unit.test.tsx +0 -381
- package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +0 -232
- package/src/components/Button/__tests__/Button.accessibility.test.tsx +0 -131
- package/src/components/Button/__tests__/Button.comprehensive.test.tsx +0 -721
- package/src/components/Button/__tests__/Button.unit.test.tsx +0 -189
- package/src/components/Button/__tests__/EventSelector.integration.test.tsx +0 -285
- package/src/components/Card/__tests__/Card.accessibility.test.tsx +0 -394
- package/src/components/Card/__tests__/Card.comprehensive.test.tsx +0 -599
- package/src/components/Card/__tests__/Card.integration.test.tsx +0 -673
- package/src/components/Card/__tests__/Card.performance.test.tsx +0 -546
- package/src/components/Card/__tests__/Card.unit.test.tsx +0 -330
- package/src/components/Card/__tests__/Card.visual.test.tsx +0 -599
- package/src/components/Card/__tests__/README.md +0 -211
- package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +0 -520
- package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +0 -251
- package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +0 -680
- package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +0 -323
- package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +0 -716
- package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +0 -589
- package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +0 -316
- package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +0 -546
- package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +0 -386
- package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +0 -338
- package/src/components/DataTable/__tests__/DataTable.sorting.test.tsx +0 -321
- package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +0 -320
- package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +0 -583
- package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +0 -711
- package/src/components/DataTable/__tests__/performance-regression.test.tsx +0 -777
- package/src/components/DataTable/__tests__/performance.test.tsx +0 -365
- package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +0 -150
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +0 -224
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +0 -244
- package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +0 -629
- package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +0 -470
- package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +0 -160
- package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +0 -251
- package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +0 -171
- package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +0 -290
- package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +0 -147
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +0 -182
- package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +0 -123
- package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +0 -660
- package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +0 -256
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -498
- package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +0 -112
- package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +0 -133
- package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +0 -172
- package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +0 -222
- package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +0 -780
- package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +0 -65
- package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +0 -634
- package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +0 -48
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +0 -541
- package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +0 -228
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +0 -568
- package/src/components/DataTable/core/__tests__/ActionManager.unit.test.ts +0 -405
- package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +0 -445
- package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +0 -288
- package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +0 -623
- package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +0 -431
- package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +0 -433
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +0 -422
- package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +0 -207
- package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +0 -278
- package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +0 -281
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +0 -407
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +0 -679
- package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +0 -267
- package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +0 -467
- package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +0 -380
- package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +0 -233
- package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +0 -414
- package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +0 -521
- package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +0 -157
- package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +0 -538
- package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +0 -1373
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -151
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +0 -517
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +0 -572
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +0 -579
- package/src/components/EventSelector/__tests__/EventSelector.test.tsx +0 -528
- package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +0 -992
- package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +0 -927
- package/src/components/FileUpload/__tests__/FileUpload.test.tsx +0 -855
- package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +0 -1311
- package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +0 -937
- package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +0 -359
- package/src/components/Footer/__tests__/Footer.integration.test.tsx +0 -353
- package/src/components/Footer/__tests__/Footer.performance.test.tsx +0 -309
- package/src/components/Footer/__tests__/Footer.unit.test.tsx +0 -309
- package/src/components/Footer/__tests__/Footer.visual.test.tsx +0 -335
- package/src/components/Form/__tests__/Form.accessibility.test.tsx +0 -820
- package/src/components/Form/__tests__/Form.unit.test.tsx +0 -305
- package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +0 -285
- package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +0 -241
- package/src/components/Header/__tests__/Header.accessibility.test.tsx +0 -382
- package/src/components/Header/__tests__/Header.comprehensive.test.tsx +0 -509
- package/src/components/Header/__tests__/Header.unit.test.tsx +0 -335
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +0 -196
- package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +0 -224
- package/src/components/Input/__tests__/Input.accessibility.test.tsx +0 -632
- package/src/components/Input/__tests__/Input.unit.test.tsx +0 -1121
- package/src/components/Label/__tests__/Label.accessibility.test.tsx +0 -239
- package/src/components/Label/__tests__/Label.unit.test.tsx +0 -331
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +0 -116
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +0 -144
- package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +0 -201
- package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +0 -119
- package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +0 -378
- package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +0 -768
- package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +0 -576
- package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +0 -585
- package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +0 -783
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +0 -810
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +0 -494
- package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +0 -331
- package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +0 -347
- package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +0 -584
- package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +0 -664
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -288
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -893
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +0 -629
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -782
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -904
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +0 -463
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +0 -586
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +0 -533
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.accessibility.test.tsx +0 -408
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +0 -561
- package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +0 -304
- package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +0 -20
- package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +0 -523
- package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +0 -29
- package/src/components/Print/__tests__/Print.comprehensive.test.tsx +0 -331
- package/src/components/PrintButton/__tests__/PrintButton.unit.test.tsx +0 -429
- package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +0 -277
- package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +0 -264
- package/src/components/PrintCard/__tests__/PrintCard.unit.test.tsx +0 -233
- package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +0 -284
- package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +0 -214
- package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +0 -264
- package/src/components/PrintDataTable/__tests__/PrintDataTable.unit.test.tsx +0 -361
- package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +0 -314
- package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +0 -362
- package/src/components/PrintFooter/__tests__/PrintFooter.unit.test.tsx +0 -500
- package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +0 -321
- package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +0 -335
- package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +0 -340
- package/src/components/PrintGrid/__tests__/PrintGrid.unit.test.tsx +0 -340
- package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +0 -261
- package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +0 -338
- package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +0 -338
- package/src/components/PrintHeader/__tests__/PrintCoverHeader.unit.test.tsx +0 -309
- package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +0 -202
- package/src/components/PrintLayout/__tests__/PrintLayout.unit.test.tsx +0 -238
- package/src/components/PrintPageBreak/__tests__/PrintPageBreak.unit.test.tsx +0 -263
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +0 -239
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +0 -235
- package/src/components/PrintSection/__tests__/PrintColumn.unit.test.tsx +0 -385
- package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +0 -373
- package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +0 -390
- package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +0 -321
- package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +0 -334
- package/src/components/PrintText/__tests__/PrintText.unit.test.tsx +0 -351
- package/src/components/Progress/__tests__/Progress.accessibility.test.tsx +0 -240
- package/src/components/Progress/__tests__/Progress.unit.test.tsx +0 -242
- package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +0 -761
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +0 -228
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -228
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -459
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -362
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -522
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -599
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -513
- package/src/components/RBAC/__tests__/PagePermissionGuard.unit.test.tsx +0 -683
- package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +0 -573
- package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +0 -467
- package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +0 -475
- package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +0 -569
- package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +0 -352
- package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +0 -128
- package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +0 -657
- package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +0 -437
- package/src/components/Select/__tests__/Select.accessibility.test.tsx +0 -1202
- package/src/components/Select/__tests__/Select.actual.test.tsx +0 -774
- package/src/components/Select/__tests__/Select.comprehensive.test.tsx +0 -837
- package/src/components/Select/__tests__/Select.enhanced.test.tsx +0 -1101
- package/src/components/Select/__tests__/Select.integration.test.tsx +0 -772
- package/src/components/Select/__tests__/Select.performance.test.tsx +0 -695
- package/src/components/Select/__tests__/Select.real-world.test.tsx +0 -1046
- package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +0 -968
- package/src/components/Select/__tests__/Select.unit.test.tsx +0 -647
- package/src/components/Select/__tests__/Select.utils.test.tsx +0 -890
- package/src/components/Table/__tests__/Table.accessibility.test.tsx +0 -233
- package/src/components/Table/__tests__/Table.unit.test.tsx +0 -235
- package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +0 -238
- package/src/components/Toast/__tests__/Toast.integration.test.tsx +0 -699
- package/src/components/Toast/__tests__/Toast.unit.test.tsx +0 -750
- package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +0 -121
- package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +0 -185
- package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +0 -139
- package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +0 -188
- package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +0 -458
- package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +0 -524
- package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +0 -455
- package/src/components/__tests__/SuperAdminGuard.test.tsx +0 -456
- package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +0 -456
- package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +0 -360
- package/src/hooks/__tests__/hooks.integration.test.tsx +0 -575
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +0 -115
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +0 -133
- package/src/hooks/__tests__/useDebounce.unit.test.ts +0 -82
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +0 -293
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +0 -385
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -286
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +0 -838
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -627
- package/src/hooks/__tests__/useRBAC.unit.test.ts +0 -911
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -537
- package/src/hooks/__tests__/useToast.unit.test.tsx +0 -62
- package/src/hooks/__tests__/useZodForm.unit.test.tsx +0 -37
- package/src/hooks/public/__tests__/usePublicEvent.test.tsx +0 -397
- package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +0 -690
- package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +0 -449
- package/src/providers/__tests__/EventProvider.unit.test.tsx +0 -768
- package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +0 -116
- package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +0 -1312
- package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +0 -601
- package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +0 -683
- package/src/providers/__tests__/index.unit.test.ts +0 -78
- package/src/rbac/__tests__/PagePermissionGuard.test.tsx +0 -673
- package/src/rbac/__tests__/README.md +0 -170
- package/src/rbac/__tests__/RoleBasedRouter.test.tsx +0 -709
- package/src/rbac/__tests__/TestContext.tsx +0 -72
- package/src/rbac/__tests__/__mocks__/cache.ts +0 -144
- package/src/rbac/__tests__/__mocks__/supabase.ts +0 -152
- package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +0 -782
- package/src/rbac/__tests__/adapters-hooks.test.tsx +0 -561
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +0 -963
- package/src/rbac/__tests__/adapters.test.tsx +0 -444
- package/src/rbac/__tests__/api.test.ts +0 -620
- package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +0 -792
- package/src/rbac/__tests__/audit-observability.test.ts +0 -549
- package/src/rbac/__tests__/audit.test.ts +0 -616
- package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +0 -230
- package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +0 -889
- package/src/rbac/__tests__/cache-invalidation.test.ts +0 -457
- package/src/rbac/__tests__/cache.test.ts +0 -458
- package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +0 -859
- package/src/rbac/__tests__/components-navigation-guard.test.tsx +0 -895
- package/src/rbac/__tests__/components-navigation-provider.test.tsx +0 -692
- package/src/rbac/__tests__/components-page-permission-guard.test.tsx +0 -673
- package/src/rbac/__tests__/components-page-permission-provider.test.tsx +0 -614
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +0 -836
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +0 -837
- package/src/rbac/__tests__/components-permission-enforcer.test.tsx +0 -825
- package/src/rbac/__tests__/components-role-based-router.test.tsx +0 -709
- package/src/rbac/__tests__/components-secure-data-provider.test.tsx +0 -607
- package/src/rbac/__tests__/config.test.ts +0 -583
- package/src/rbac/__tests__/core-logic-unit.test.ts +0 -190
- package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +0 -1467
- package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +0 -151
- package/src/rbac/__tests__/core-permission-logic-simple.test.ts +0 -968
- package/src/rbac/__tests__/core-permission-logic.test.ts +0 -966
- package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +0 -988
- package/src/rbac/__tests__/edge-cases.test.ts +0 -654
- package/src/rbac/__tests__/engine.test.ts +0 -361
- package/src/rbac/__tests__/engine.unit.test.ts +0 -361
- package/src/rbac/__tests__/hooks.enhanced.test.tsx +0 -979
- package/src/rbac/__tests__/hooks.fixed.test.tsx +0 -475
- package/src/rbac/__tests__/hooks.test.tsx +0 -385
- package/src/rbac/__tests__/index.test.ts +0 -269
- package/src/rbac/__tests__/integration.enhanced.test.tsx +0 -824
- package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +0 -261
- package/src/rbac/__tests__/performance.enhanced.test.tsx +0 -724
- package/src/rbac/__tests__/permissions.test.ts +0 -383
- package/src/rbac/__tests__/requires-event.test.ts +0 -330
- package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +0 -1349
- package/src/rbac/__tests__/scope-isolation.test.ts +0 -755
- package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +0 -592
- package/src/rbac/__tests__/secure-client-rls.test.ts +0 -377
- package/src/rbac/__tests__/security.test.ts +0 -296
- package/src/rbac/__tests__/setup.ts +0 -228
- package/src/rbac/__tests__/test-utils-enhanced.tsx +0 -400
- package/src/rbac/__tests__/types.test.ts +0 -685
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -631
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -667
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -647
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -496
- package/src/rbac/testing/__tests__/index.test.tsx +0 -342
- package/src/rbac/utils/__tests__/eventContext.test.ts +0 -428
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -428
- package/src/styles/__tests__/styles.unit.test.ts +0 -164
- package/src/test-dom-cleanup.test.tsx +0 -38
- package/src/theming/__tests__/README.md +0 -335
- package/src/theming/__tests__/runtime.accessibility.test.ts +0 -474
- package/src/theming/__tests__/runtime.error.test.ts +0 -616
- package/src/theming/__tests__/runtime.integration.test.ts +0 -376
- package/src/theming/__tests__/runtime.performance.test.ts +0 -411
- package/src/theming/__tests__/runtime.unit.test.ts +0 -470
- package/src/types/__tests__/database.unit.test.ts +0 -489
- package/src/types/__tests__/guards.unit.test.ts +0 -146
- package/src/types/__tests__/index.unit.test.ts +0 -77
- package/src/types/__tests__/organisation.unit.test.ts +0 -713
- package/src/types/__tests__/rbac.unit.test.ts +0 -621
- package/src/types/__tests__/security.unit.test.ts +0 -347
- package/src/types/__tests__/supabase.unit.test.ts +0 -658
- package/src/types/__tests__/theme.unit.test.ts +0 -218
- package/src/types/__tests__/unified.unit.test.ts +0 -537
- package/src/types/__tests__/validation.unit.test.ts +0 -616
- package/src/utils/__tests__/appConfig.unit.test.ts +0 -55
- package/src/utils/__tests__/appNameResolver.unit.test.ts +0 -137
- package/src/utils/__tests__/audit.unit.test.ts +0 -69
- package/src/utils/__tests__/auth-utils.unit.test.ts +0 -70
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +0 -317
- package/src/utils/__tests__/cn.unit.test.ts +0 -34
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +0 -480
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +0 -322
- package/src/utils/__tests__/formatDate.unit.test.ts +0 -109
- package/src/utils/__tests__/formatting.unit.test.ts +0 -66
- package/src/utils/__tests__/index.unit.test.ts +0 -251
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -304
- package/src/utils/__tests__/organisationContext.unit.test.ts +0 -192
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +0 -259
- package/src/utils/__tests__/permissionTypes.unit.test.ts +0 -250
- package/src/utils/__tests__/permissionUtils.unit.test.ts +0 -362
- package/src/utils/__tests__/sanitization.unit.test.ts +0 -346
- package/src/utils/__tests__/schemaUtils.unit.test.ts +0 -441
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -334
- package/src/utils/__tests__/secureErrors.unit.test.ts +0 -377
- package/src/utils/__tests__/secureStorage.unit.test.ts +0 -293
- package/src/utils/__tests__/security.unit.test.ts +0 -127
- package/src/utils/__tests__/securityMonitor.unit.test.ts +0 -280
- package/src/utils/__tests__/sessionTracking.unit.test.ts +0 -370
- package/src/utils/__tests__/validation.unit.test.ts +0 -84
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -571
- package/src/utils/print/__tests__/PrintDataProcessor.unit.test.ts +0 -219
- package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +0 -353
- package/src/utils/storage/__tests__/config.unit.test.ts +0 -206
- package/src/utils/storage/__tests__/helpers.unit.test.ts +0 -648
- package/src/utils/storage/__tests__/index.unit.test.ts +0 -167
- package/src/utils/storage/__tests__/types.unit.test.ts +0 -441
- package/src/validation/__tests__/common.unit.test.ts +0 -101
- package/src/validation/__tests__/csrf.unit.test.ts +0 -302
- package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -98
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -466
- /package/dist/{DataTable-EEUDXPE5.js.map → DataTable-GX3XERFJ.js.map} +0 -0
- /package/dist/{chunk-VYG4AXYW.js.map → chunk-5EL3KHOQ.js.map} +0 -0
|
@@ -1,1121 +0,0 @@
|
|
|
1
|
-
import { userEvent } from '@testing-library/user-event';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { screen, waitFor, fireEvent } from '@testing-library/react';
|
|
4
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
5
|
-
import { errorTestingUtils, TestErrorBoundary } from '../../__tests__/ErrorTesting.enhanced.test';
|
|
6
|
-
import { Input, InputGroup } from '../Input';
|
|
7
|
-
import { renderWithProviders, testComponentRendering, testComponentAccessibility, testComponentEvents, testFormComponent } from '../../../__tests__/shared';
|
|
8
|
-
|
|
9
|
-
describe('Input Component', () => {
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
vi.clearAllMocks();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
describe('Basic Rendering', () => {
|
|
15
|
-
it('renders input element', () => {
|
|
16
|
-
renderWithProviders(<Input />);
|
|
17
|
-
const input = screen.getByRole('textbox');
|
|
18
|
-
expect(input).toBeInTheDocument();
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('renders with placeholder', () => {
|
|
22
|
-
renderWithProviders(<Input placeholder="Enter text" />);
|
|
23
|
-
const input = screen.getByPlaceholderText('Enter text');
|
|
24
|
-
expect(input).toBeInTheDocument();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('renders with value', () => {
|
|
28
|
-
renderWithProviders(<Input value="test value" onChange={() => {}} />);
|
|
29
|
-
const input = screen.getByDisplayValue('test value');
|
|
30
|
-
expect(input).toBeInTheDocument();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('renders with type attribute', () => {
|
|
34
|
-
renderWithProviders(<Input type="email" />);
|
|
35
|
-
const input = screen.getByRole('textbox');
|
|
36
|
-
expect(input).toHaveAttribute('type', 'email');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('renders disabled input', () => {
|
|
40
|
-
renderWithProviders(<Input disabled />);
|
|
41
|
-
const input = screen.getByRole('textbox');
|
|
42
|
-
expect(input).toBeDisabled();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('renders required input', () => {
|
|
46
|
-
renderWithProviders(<Input required />);
|
|
47
|
-
const input = screen.getByRole('textbox');
|
|
48
|
-
expect(input).toBeRequired();
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('renders readOnly input', () => {
|
|
52
|
-
renderWithProviders(<Input readOnly />);
|
|
53
|
-
const input = screen.getByRole('textbox');
|
|
54
|
-
expect(input).toHaveAttribute('readOnly');
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('Variants', () => {
|
|
59
|
-
it('applies default variant styling', () => {
|
|
60
|
-
renderWithProviders(<Input variant="default" />);
|
|
61
|
-
const input = screen.getByRole('textbox');
|
|
62
|
-
expect(input).toHaveClass('border-input');
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('applies destructive variant styling', () => {
|
|
66
|
-
renderWithProviders(<Input variant="destructive" />);
|
|
67
|
-
const input = screen.getByRole('textbox');
|
|
68
|
-
expect(input).toHaveClass('border-destructive', 'focus-visible:ring-destructive');
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('applies destructive styling when error is true', () => {
|
|
72
|
-
renderWithProviders(<Input error={true} />);
|
|
73
|
-
const input = screen.getByRole('textbox');
|
|
74
|
-
expect(input).toHaveClass('border-destructive', 'focus-visible:ring-destructive');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('overrides default variant when error is true', () => {
|
|
78
|
-
renderWithProviders(<Input variant="default" error={true} />);
|
|
79
|
-
const input = screen.getByRole('textbox');
|
|
80
|
-
expect(input).toHaveClass('border-destructive', 'focus-visible:ring-destructive');
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
describe('Sizes', () => {
|
|
85
|
-
it('applies small size styling', () => {
|
|
86
|
-
renderWithProviders(<Input size="sm" />);
|
|
87
|
-
const input = screen.getByRole('textbox');
|
|
88
|
-
expect(input).toHaveClass('h-8', 'px-2', 'py-1', 'text-xs');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('applies medium size styling (default)', () => {
|
|
92
|
-
renderWithProviders(<Input size="md" />);
|
|
93
|
-
const input = screen.getByRole('textbox');
|
|
94
|
-
expect(input).toHaveClass('h-9', 'px-3', 'py-2', 'text-sm');
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('applies large size styling', () => {
|
|
98
|
-
renderWithProviders(<Input size="lg" />);
|
|
99
|
-
const input = screen.getByRole('textbox');
|
|
100
|
-
expect(input).toHaveClass('h-10', 'px-4', 'py-3', 'text-base');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('defaults to medium size when no size is specified', () => {
|
|
104
|
-
renderWithProviders(<Input />);
|
|
105
|
-
const input = screen.getByRole('textbox');
|
|
106
|
-
expect(input).toHaveClass('h-9', 'px-3', 'py-2', 'text-sm');
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
describe('Styling', () => {
|
|
111
|
-
it('applies default styling classes', () => {
|
|
112
|
-
renderWithProviders(<Input />);
|
|
113
|
-
const input = screen.getByRole('textbox');
|
|
114
|
-
expect(input).toHaveClass(
|
|
115
|
-
'flex',
|
|
116
|
-
'h-9',
|
|
117
|
-
'w-full',
|
|
118
|
-
'rounded-md',
|
|
119
|
-
'border',
|
|
120
|
-
'border-input',
|
|
121
|
-
'bg-background',
|
|
122
|
-
'px-3',
|
|
123
|
-
'py-2',
|
|
124
|
-
'text-sm',
|
|
125
|
-
'ring-offset-background'
|
|
126
|
-
);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('applies custom className', () => {
|
|
130
|
-
renderWithProviders(<Input className="custom-input" />);
|
|
131
|
-
const input = screen.getByRole('textbox');
|
|
132
|
-
expect(input).toHaveClass('custom-input');
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('applies focus styles', () => {
|
|
136
|
-
renderWithProviders(<Input />);
|
|
137
|
-
const input = screen.getByRole('textbox');
|
|
138
|
-
expect(input).toHaveClass('focus-visible:outline-none', 'focus-visible:ring-2', 'focus-visible:ring-ring', 'focus-visible:ring-offset-2');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('applies disabled styles', () => {
|
|
142
|
-
renderWithProviders(<Input disabled />);
|
|
143
|
-
const input = screen.getByRole('textbox');
|
|
144
|
-
expect(input).toHaveClass('disabled:cursor-not-allowed', 'disabled:opacity-50');
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it('applies file input styles', () => {
|
|
148
|
-
renderWithProviders(<Input type="file" />);
|
|
149
|
-
const input = screen.getByDisplayValue('');
|
|
150
|
-
expect(input).toHaveClass('file:border-0', 'file:bg-transparent', 'file:text-sm', 'file:font-medium');
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('applies placeholder styles', () => {
|
|
154
|
-
renderWithProviders(<Input placeholder="Enter text" />);
|
|
155
|
-
const input = screen.getByRole('textbox');
|
|
156
|
-
expect(input).toHaveClass('placeholder:text-muted-foreground');
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
describe('Interactions', () => {
|
|
161
|
-
it('handles onChange event', () => {
|
|
162
|
-
const handleChange = vi.fn();
|
|
163
|
-
renderWithProviders(<Input onChange={handleChange} />);
|
|
164
|
-
|
|
165
|
-
const input = screen.getByRole('textbox');
|
|
166
|
-
fireEvent.change(input, { target: { value: 'new value' } });
|
|
167
|
-
|
|
168
|
-
expect(handleChange).toHaveBeenCalled();
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('handles onFocus event', () => {
|
|
172
|
-
const handleFocus = vi.fn();
|
|
173
|
-
renderWithProviders(<Input onFocus={handleFocus} />);
|
|
174
|
-
|
|
175
|
-
const input = screen.getByRole('textbox');
|
|
176
|
-
fireEvent.focus(input);
|
|
177
|
-
|
|
178
|
-
expect(handleFocus).toHaveBeenCalled();
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('handles onBlur event', () => {
|
|
182
|
-
const handleBlur = vi.fn();
|
|
183
|
-
renderWithProviders(<Input onBlur={handleBlur} />);
|
|
184
|
-
|
|
185
|
-
const input = screen.getByRole('textbox');
|
|
186
|
-
fireEvent.blur(input);
|
|
187
|
-
|
|
188
|
-
expect(handleBlur).toHaveBeenCalled();
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('handles onKeyDown event', () => {
|
|
192
|
-
const handleKeyDown = vi.fn();
|
|
193
|
-
renderWithProviders(<Input onKeyDown={handleKeyDown} />);
|
|
194
|
-
|
|
195
|
-
const input = screen.getByRole('textbox');
|
|
196
|
-
fireEvent.keyDown(input, { key: 'Enter' });
|
|
197
|
-
|
|
198
|
-
expect(handleKeyDown).toHaveBeenCalled();
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('handles onKeyUp event', () => {
|
|
202
|
-
const handleKeyUp = vi.fn();
|
|
203
|
-
renderWithProviders(<Input onKeyUp={handleKeyUp} />);
|
|
204
|
-
|
|
205
|
-
const input = screen.getByRole('textbox');
|
|
206
|
-
fireEvent.keyUp(input, { key: 'Enter' });
|
|
207
|
-
|
|
208
|
-
expect(handleKeyUp).toHaveBeenCalled();
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
it('handles onClick event', () => {
|
|
214
|
-
const handleClick = vi.fn();
|
|
215
|
-
renderWithProviders(<Input onClick={handleClick} />);
|
|
216
|
-
|
|
217
|
-
const input = screen.getByRole('textbox');
|
|
218
|
-
fireEvent.click(input);
|
|
219
|
-
|
|
220
|
-
expect(handleClick).toHaveBeenCalled();
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('handles onDoubleClick event', () => {
|
|
224
|
-
const handleDoubleClick = vi.fn();
|
|
225
|
-
renderWithProviders(<Input onDoubleClick={handleDoubleClick} />);
|
|
226
|
-
|
|
227
|
-
const input = screen.getByRole('textbox');
|
|
228
|
-
fireEvent.doubleClick(input);
|
|
229
|
-
|
|
230
|
-
expect(handleDoubleClick).toHaveBeenCalled();
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it('handles onInput event', () => {
|
|
234
|
-
const handleInput = vi.fn();
|
|
235
|
-
renderWithProviders(<Input onInput={handleInput} />);
|
|
236
|
-
|
|
237
|
-
const input = screen.getByRole('textbox');
|
|
238
|
-
fireEvent.input(input, { target: { value: 'new value' } });
|
|
239
|
-
|
|
240
|
-
expect(handleInput).toHaveBeenCalled();
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
describe('Form Integration', () => {
|
|
245
|
-
it('works with form labels', () => {
|
|
246
|
-
renderWithProviders(
|
|
247
|
-
<div>
|
|
248
|
-
<label htmlFor="test-input">Test Label</label>
|
|
249
|
-
<Input id="test-input" />
|
|
250
|
-
</div>
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
const input = screen.getByLabelText('Test Label');
|
|
254
|
-
expect(input).toBeInTheDocument();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
it('supports form submission', () => {
|
|
258
|
-
const handleSubmit = vi.fn();
|
|
259
|
-
renderWithProviders(
|
|
260
|
-
<form onSubmit={handleSubmit}>
|
|
261
|
-
<Input name="test-field" />
|
|
262
|
-
<button type="submit">Submit</button>
|
|
263
|
-
</form>
|
|
264
|
-
);
|
|
265
|
-
|
|
266
|
-
const form = screen.getByRole('button', { name: 'Submit' }).closest('form');
|
|
267
|
-
if (form) {
|
|
268
|
-
fireEvent.submit(form);
|
|
269
|
-
expect(handleSubmit).toHaveBeenCalled();
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
it('works with form validation', () => {
|
|
274
|
-
renderWithProviders(<Input required aria-describedby="error" aria-invalid="true" />);
|
|
275
|
-
const input = screen.getByRole('textbox');
|
|
276
|
-
|
|
277
|
-
expect(input).toBeRequired();
|
|
278
|
-
expect(input).toHaveAttribute('aria-describedby', 'error');
|
|
279
|
-
expect(input).toHaveAttribute('aria-invalid', 'true');
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('supports form reset', () => {
|
|
283
|
-
const TestForm = () => {
|
|
284
|
-
const [value, setValue] = React.useState('initial');
|
|
285
|
-
return (
|
|
286
|
-
<form>
|
|
287
|
-
<Input value={value} onChange={(e) => setValue(e.target.value)} />
|
|
288
|
-
<button type="reset" onClick={() => setValue('')}>Reset</button>
|
|
289
|
-
</form>
|
|
290
|
-
);
|
|
291
|
-
};
|
|
292
|
-
|
|
293
|
-
renderWithProviders(<TestForm />);
|
|
294
|
-
const input = screen.getByRole('textbox');
|
|
295
|
-
const resetButton = screen.getByRole('button', { name: 'Reset' });
|
|
296
|
-
|
|
297
|
-
fireEvent.change(input, { target: { value: 'new value' } });
|
|
298
|
-
expect(input).toHaveValue('new value');
|
|
299
|
-
|
|
300
|
-
fireEvent.click(resetButton);
|
|
301
|
-
expect(input).toHaveValue('');
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
describe('Accessibility', () => {
|
|
306
|
-
it('has correct role', () => {
|
|
307
|
-
renderWithProviders(<Input />);
|
|
308
|
-
const input = screen.getByRole('textbox');
|
|
309
|
-
expect(input).toBeInTheDocument();
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
it('supports aria-label', () => {
|
|
313
|
-
renderWithProviders(<Input aria-label="Search input" />);
|
|
314
|
-
const input = screen.getByLabelText('Search input');
|
|
315
|
-
expect(input).toBeInTheDocument();
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
it('supports aria-describedby', () => {
|
|
319
|
-
renderWithProviders(<Input aria-describedby="help-text" />);
|
|
320
|
-
const input = screen.getByRole('textbox');
|
|
321
|
-
expect(input).toHaveAttribute('aria-describedby', 'help-text');
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
it('supports aria-invalid', () => {
|
|
325
|
-
renderWithProviders(<Input aria-invalid="true" />);
|
|
326
|
-
const input = screen.getByRole('textbox');
|
|
327
|
-
expect(input).toHaveAttribute('aria-invalid', 'true');
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
it('supports aria-required', () => {
|
|
331
|
-
renderWithProviders(<Input aria-required="true" />);
|
|
332
|
-
const input = screen.getByRole('textbox');
|
|
333
|
-
expect(input).toHaveAttribute('aria-required', 'true');
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
it('supports aria-disabled', () => {
|
|
337
|
-
renderWithProviders(<Input aria-disabled="true" />);
|
|
338
|
-
const input = screen.getByRole('textbox');
|
|
339
|
-
expect(input).toHaveAttribute('aria-disabled', 'true');
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
it('supports aria-readonly', () => {
|
|
343
|
-
renderWithProviders(<Input aria-readonly="true" />);
|
|
344
|
-
const input = screen.getByRole('textbox');
|
|
345
|
-
expect(input).toHaveAttribute('aria-readonly', 'true');
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
it('supports aria-placeholder', () => {
|
|
349
|
-
renderWithProviders(<Input aria-placeholder="Enter text" />);
|
|
350
|
-
const input = screen.getByRole('textbox');
|
|
351
|
-
expect(input).toHaveAttribute('aria-placeholder', 'Enter text');
|
|
352
|
-
});
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
describe('Different Input Types', () => {
|
|
356
|
-
it('renders email input', () => {
|
|
357
|
-
renderWithProviders(<Input type="email" placeholder="Enter email" />);
|
|
358
|
-
const input = screen.getByPlaceholderText('Enter email');
|
|
359
|
-
expect(input).toHaveAttribute('type', 'email');
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
it('renders password input', () => {
|
|
363
|
-
renderWithProviders(<Input type="password" placeholder="Enter password" />);
|
|
364
|
-
const input = screen.getByPlaceholderText('Enter password');
|
|
365
|
-
expect(input).toHaveAttribute('type', 'password');
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
it('renders number input', () => {
|
|
369
|
-
renderWithProviders(<Input type="number" placeholder="Enter number" />);
|
|
370
|
-
const input = screen.getByPlaceholderText('Enter number');
|
|
371
|
-
expect(input).toHaveAttribute('type', 'number');
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
it('renders search input', () => {
|
|
375
|
-
renderWithProviders(<Input type="search" placeholder="Search..." />);
|
|
376
|
-
const input = screen.getByPlaceholderText('Search...');
|
|
377
|
-
expect(input).toHaveAttribute('type', 'search');
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
it('renders tel input', () => {
|
|
381
|
-
renderWithProviders(<Input type="tel" placeholder="Enter phone" />);
|
|
382
|
-
const input = screen.getByPlaceholderText('Enter phone');
|
|
383
|
-
expect(input).toHaveAttribute('type', 'tel');
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
it('renders url input', () => {
|
|
387
|
-
renderWithProviders(<Input type="url" placeholder="Enter URL" />);
|
|
388
|
-
const input = screen.getByPlaceholderText('Enter URL');
|
|
389
|
-
expect(input).toHaveAttribute('type', 'url');
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
it('renders date input', () => {
|
|
393
|
-
renderWithProviders(<Input type="date" />);
|
|
394
|
-
const input = screen.getByDisplayValue('');
|
|
395
|
-
expect(input).toHaveAttribute('type', 'date');
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
it('renders time input', () => {
|
|
399
|
-
renderWithProviders(<Input type="time" />);
|
|
400
|
-
const input = screen.getByDisplayValue('');
|
|
401
|
-
expect(input).toHaveAttribute('type', 'time');
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
it('renders file input', () => {
|
|
405
|
-
renderWithProviders(<Input type="file" />);
|
|
406
|
-
const input = screen.getByDisplayValue('');
|
|
407
|
-
expect(input).toHaveAttribute('type', 'file');
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
it('renders hidden input', () => {
|
|
411
|
-
renderWithProviders(<Input type="hidden" />);
|
|
412
|
-
const input = screen.getByDisplayValue('');
|
|
413
|
-
expect(input).toHaveAttribute('type', 'hidden');
|
|
414
|
-
});
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
describe('Controlled Component', () => {
|
|
418
|
-
it('maintains controlled value', () => {
|
|
419
|
-
const TestComponent = () => {
|
|
420
|
-
const [value, setValue] = React.useState('');
|
|
421
|
-
return (
|
|
422
|
-
<Input
|
|
423
|
-
value={value}
|
|
424
|
-
onChange={(e) => setValue(e.target.value)}
|
|
425
|
-
placeholder="Enter text"
|
|
426
|
-
/>
|
|
427
|
-
);
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
renderWithProviders(<TestComponent />);
|
|
431
|
-
const input = screen.getByPlaceholderText('Enter text');
|
|
432
|
-
|
|
433
|
-
expect(input).toHaveValue('');
|
|
434
|
-
|
|
435
|
-
fireEvent.change(input, { target: { value: 'new value' } });
|
|
436
|
-
expect(input).toHaveValue('new value');
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
it('handles empty string value', () => {
|
|
440
|
-
renderWithProviders(<Input value="" onChange={() => {}} />);
|
|
441
|
-
const input = screen.getByRole('textbox');
|
|
442
|
-
expect(input).toHaveValue('');
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
it('handles null value', () => {
|
|
446
|
-
renderWithProviders(<Input value={null as any} onChange={() => {}} />);
|
|
447
|
-
const input = screen.getByRole('textbox');
|
|
448
|
-
expect(input).toHaveValue('');
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
it('handles undefined value', () => {
|
|
452
|
-
renderWithProviders(<Input value={undefined as any} onChange={() => {}} />);
|
|
453
|
-
const input = screen.getByRole('textbox');
|
|
454
|
-
expect(input).toHaveValue('');
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
describe('Ref Forwarding', () => {
|
|
459
|
-
it('forwards ref correctly', () => {
|
|
460
|
-
const ref = vi.fn();
|
|
461
|
-
renderWithProviders(<Input ref={ref} />);
|
|
462
|
-
expect(ref).toHaveBeenCalled();
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
it('allows focus via ref', () => {
|
|
466
|
-
const TestComponent = () => {
|
|
467
|
-
const inputRef = React.useRef<HTMLInputElement>(null);
|
|
468
|
-
|
|
469
|
-
React.useEffect(() => {
|
|
470
|
-
inputRef.current?.focus();
|
|
471
|
-
}, []);
|
|
472
|
-
|
|
473
|
-
return <Input ref={inputRef} />;
|
|
474
|
-
};
|
|
475
|
-
|
|
476
|
-
renderWithProviders(<TestComponent />);
|
|
477
|
-
const input = screen.getByRole('textbox');
|
|
478
|
-
expect(input).toBeInTheDocument();
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
it('allows programmatic value setting via ref', () => {
|
|
482
|
-
const TestComponent = () => {
|
|
483
|
-
const inputRef = React.useRef<HTMLInputElement>(null);
|
|
484
|
-
|
|
485
|
-
React.useEffect(() => {
|
|
486
|
-
if (inputRef.current) {
|
|
487
|
-
inputRef.current.value = 'programmatic value';
|
|
488
|
-
}
|
|
489
|
-
}, []);
|
|
490
|
-
|
|
491
|
-
return <Input ref={inputRef} />;
|
|
492
|
-
};
|
|
493
|
-
|
|
494
|
-
renderWithProviders(<TestComponent />);
|
|
495
|
-
const input = screen.getByRole('textbox');
|
|
496
|
-
expect(input).toHaveValue('programmatic value');
|
|
497
|
-
});
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
describe('Props Spreading', () => {
|
|
501
|
-
it('spreads additional props', () => {
|
|
502
|
-
renderWithProviders(
|
|
503
|
-
<Input
|
|
504
|
-
data-testid="custom-input"
|
|
505
|
-
aria-label="Custom input"
|
|
506
|
-
maxLength={10}
|
|
507
|
-
autoComplete="off"
|
|
508
|
-
/>
|
|
509
|
-
);
|
|
510
|
-
|
|
511
|
-
const input = screen.getByTestId('custom-input');
|
|
512
|
-
expect(input).toHaveAttribute('aria-label', 'Custom input');
|
|
513
|
-
expect(input).toHaveAttribute('maxLength', '10');
|
|
514
|
-
expect(input).toHaveAttribute('autoComplete', 'off');
|
|
515
|
-
});
|
|
516
|
-
|
|
517
|
-
it('handles data attributes', () => {
|
|
518
|
-
renderWithProviders(<Input data-testid="test-input" data-custom="value" />);
|
|
519
|
-
const input = screen.getByTestId('test-input');
|
|
520
|
-
expect(input).toHaveAttribute('data-custom', 'value');
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
it('handles style prop', () => {
|
|
524
|
-
renderWithProviders(<Input style={{ backgroundColor: 'red' }} />);
|
|
525
|
-
const input = screen.getByRole('textbox');
|
|
526
|
-
// Note: Inline styles might not be applied in test environment
|
|
527
|
-
expect(input).toHaveAttribute('style');
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
it('handles id prop', () => {
|
|
531
|
-
renderWithProviders(<Input id="test-id" />);
|
|
532
|
-
const input = screen.getByRole('textbox');
|
|
533
|
-
expect(input).toHaveAttribute('id', 'test-id');
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
it('handles name prop', () => {
|
|
537
|
-
renderWithProviders(<Input name="test-name" />);
|
|
538
|
-
const input = screen.getByRole('textbox');
|
|
539
|
-
expect(input).toHaveAttribute('name', 'test-name');
|
|
540
|
-
});
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
describe('Edge Cases', () => {
|
|
544
|
-
it('handles very long values', () => {
|
|
545
|
-
const longValue = 'a'.repeat(10000);
|
|
546
|
-
renderWithProviders(<Input value={longValue} onChange={() => {}} />);
|
|
547
|
-
const input = screen.getByRole('textbox');
|
|
548
|
-
expect(input).toHaveValue(longValue);
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
it('handles special characters in value', () => {
|
|
552
|
-
const specialValue = '!@#$%^&*()_+-=[]{}|;:,.<>?';
|
|
553
|
-
renderWithProviders(<Input value={specialValue} onChange={() => {}} />);
|
|
554
|
-
const input = screen.getByRole('textbox');
|
|
555
|
-
expect(input).toHaveValue(specialValue);
|
|
556
|
-
});
|
|
557
|
-
|
|
558
|
-
it('handles unicode characters', () => {
|
|
559
|
-
const unicodeValue = '🎉🚀🌟💫✨';
|
|
560
|
-
renderWithProviders(<Input value={unicodeValue} onChange={() => {}} />);
|
|
561
|
-
const input = screen.getByRole('textbox');
|
|
562
|
-
expect(input).toHaveValue(unicodeValue);
|
|
563
|
-
});
|
|
564
|
-
|
|
565
|
-
it('handles empty className', () => {
|
|
566
|
-
renderWithProviders(<Input className="" />);
|
|
567
|
-
const input = screen.getByRole('textbox');
|
|
568
|
-
expect(input).toBeInTheDocument();
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
it('handles undefined className', () => {
|
|
572
|
-
renderWithProviders(<Input className={undefined} />);
|
|
573
|
-
const input = screen.getByRole('textbox');
|
|
574
|
-
expect(input).toBeInTheDocument();
|
|
575
|
-
});
|
|
576
|
-
|
|
577
|
-
it('handles null className', () => {
|
|
578
|
-
renderWithProviders(<Input className={null as any} />);
|
|
579
|
-
const input = screen.getByRole('textbox');
|
|
580
|
-
expect(input).toBeInTheDocument();
|
|
581
|
-
});
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
describe('Performance', () => {
|
|
585
|
-
it('does not re-render unnecessarily', () => {
|
|
586
|
-
const renderCount = vi.fn();
|
|
587
|
-
const TestComponent = React.memo(() => {
|
|
588
|
-
renderCount();
|
|
589
|
-
return <Input placeholder="Test" />;
|
|
590
|
-
});
|
|
591
|
-
|
|
592
|
-
const { rerender } = renderWithProviders(<TestComponent />);
|
|
593
|
-
rerender(<TestComponent />);
|
|
594
|
-
|
|
595
|
-
// Should only render once due to memo
|
|
596
|
-
expect(renderCount).toHaveBeenCalledTimes(1);
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
it('handles rapid value changes', () => {
|
|
600
|
-
const TestComponent = () => {
|
|
601
|
-
const [value, setValue] = React.useState('');
|
|
602
|
-
return (
|
|
603
|
-
<Input
|
|
604
|
-
value={value}
|
|
605
|
-
onChange={(e) => setValue(e.target.value)}
|
|
606
|
-
placeholder="Test"
|
|
607
|
-
/>
|
|
608
|
-
);
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
renderWithProviders(<TestComponent />);
|
|
612
|
-
const input = screen.getByPlaceholderText('Test');
|
|
613
|
-
|
|
614
|
-
// Rapid changes
|
|
615
|
-
for (let i = 0; i < 10; i++) {
|
|
616
|
-
fireEvent.change(input, { target: { value: `value-${i}` } });
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
expect(input).toHaveValue('value-9');
|
|
620
|
-
});
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
it('renders without crashing', () => {
|
|
624
|
-
renderWithProviders(<Input />);
|
|
625
|
-
expect(screen.getByRole('textbox')).toBeInTheDocument();
|
|
626
|
-
});
|
|
627
|
-
|
|
628
|
-
it('renders with provided value', () => {
|
|
629
|
-
renderWithProviders(<Input value="test value" onChange={() => {}} />);
|
|
630
|
-
expect(screen.getByRole('textbox')).toHaveValue('test value');
|
|
631
|
-
});
|
|
632
|
-
});
|
|
633
|
-
|
|
634
|
-
describe('InputGroup Component', () => {
|
|
635
|
-
beforeEach(() => {
|
|
636
|
-
vi.clearAllMocks();
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
describe('Basic Rendering', () => {
|
|
640
|
-
it('renders InputGroup with children', () => {
|
|
641
|
-
renderWithProviders(
|
|
642
|
-
<InputGroup>
|
|
643
|
-
<Input placeholder="First name" />
|
|
644
|
-
<Input placeholder="Last name" />
|
|
645
|
-
</InputGroup>
|
|
646
|
-
);
|
|
647
|
-
|
|
648
|
-
expect(screen.getByPlaceholderText('First name')).toBeInTheDocument();
|
|
649
|
-
expect(screen.getByPlaceholderText('Last name')).toBeInTheDocument();
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
it('renders with custom className', () => {
|
|
653
|
-
renderWithProviders(
|
|
654
|
-
<InputGroup className="custom-group">
|
|
655
|
-
<Input placeholder="Test" />
|
|
656
|
-
</InputGroup>
|
|
657
|
-
);
|
|
658
|
-
|
|
659
|
-
const group = screen.getByPlaceholderText('Test').parentElement;
|
|
660
|
-
expect(group).toHaveClass('custom-group');
|
|
661
|
-
});
|
|
662
|
-
|
|
663
|
-
it('forwards ref correctly', () => {
|
|
664
|
-
const ref = vi.fn();
|
|
665
|
-
renderWithProviders(
|
|
666
|
-
<InputGroup ref={ref}>
|
|
667
|
-
<Input placeholder="Test" />
|
|
668
|
-
</InputGroup>
|
|
669
|
-
);
|
|
670
|
-
|
|
671
|
-
expect(ref).toHaveBeenCalled();
|
|
672
|
-
});
|
|
673
|
-
});
|
|
674
|
-
|
|
675
|
-
describe('Orientation', () => {
|
|
676
|
-
it('applies vertical orientation by default', () => {
|
|
677
|
-
renderWithProviders(
|
|
678
|
-
<InputGroup>
|
|
679
|
-
<Input placeholder="First" />
|
|
680
|
-
<Input placeholder="Second" />
|
|
681
|
-
</InputGroup>
|
|
682
|
-
);
|
|
683
|
-
|
|
684
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
685
|
-
expect(group).toHaveClass('flex-col');
|
|
686
|
-
});
|
|
687
|
-
|
|
688
|
-
it('applies horizontal orientation', () => {
|
|
689
|
-
renderWithProviders(
|
|
690
|
-
<InputGroup orientation="horizontal">
|
|
691
|
-
<Input placeholder="First" />
|
|
692
|
-
<Input placeholder="Second" />
|
|
693
|
-
</InputGroup>
|
|
694
|
-
);
|
|
695
|
-
|
|
696
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
697
|
-
expect(group).toHaveClass('flex-row', 'items-end');
|
|
698
|
-
});
|
|
699
|
-
|
|
700
|
-
it('applies vertical orientation explicitly', () => {
|
|
701
|
-
renderWithProviders(
|
|
702
|
-
<InputGroup orientation="vertical">
|
|
703
|
-
<Input placeholder="First" />
|
|
704
|
-
<Input placeholder="Second" />
|
|
705
|
-
</InputGroup>
|
|
706
|
-
);
|
|
707
|
-
|
|
708
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
709
|
-
expect(group).toHaveClass('flex-col');
|
|
710
|
-
});
|
|
711
|
-
});
|
|
712
|
-
|
|
713
|
-
describe('Spacing', () => {
|
|
714
|
-
it('applies small spacing', () => {
|
|
715
|
-
renderWithProviders(
|
|
716
|
-
<InputGroup spacing="sm">
|
|
717
|
-
<Input placeholder="First" />
|
|
718
|
-
<Input placeholder="Second" />
|
|
719
|
-
</InputGroup>
|
|
720
|
-
);
|
|
721
|
-
|
|
722
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
723
|
-
expect(group).toHaveClass('space-y-2');
|
|
724
|
-
});
|
|
725
|
-
|
|
726
|
-
it('applies medium spacing by default', () => {
|
|
727
|
-
renderWithProviders(
|
|
728
|
-
<InputGroup>
|
|
729
|
-
<Input placeholder="First" />
|
|
730
|
-
<Input placeholder="Second" />
|
|
731
|
-
</InputGroup>
|
|
732
|
-
);
|
|
733
|
-
|
|
734
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
735
|
-
expect(group).toHaveClass('space-y-4');
|
|
736
|
-
});
|
|
737
|
-
|
|
738
|
-
it('applies large spacing', () => {
|
|
739
|
-
renderWithProviders(
|
|
740
|
-
<InputGroup spacing="lg">
|
|
741
|
-
<Input placeholder="First" />
|
|
742
|
-
<Input placeholder="Second" />
|
|
743
|
-
</InputGroup>
|
|
744
|
-
);
|
|
745
|
-
|
|
746
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
747
|
-
expect(group).toHaveClass('space-y-6');
|
|
748
|
-
});
|
|
749
|
-
|
|
750
|
-
it('applies horizontal spacing when orientation is horizontal', () => {
|
|
751
|
-
renderWithProviders(
|
|
752
|
-
<InputGroup orientation="horizontal" spacing="lg">
|
|
753
|
-
<Input placeholder="First" />
|
|
754
|
-
<Input placeholder="Second" />
|
|
755
|
-
</InputGroup>
|
|
756
|
-
);
|
|
757
|
-
|
|
758
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
759
|
-
expect(group).toHaveClass('space-x-6');
|
|
760
|
-
});
|
|
761
|
-
});
|
|
762
|
-
|
|
763
|
-
describe('Combined Orientation and Spacing', () => {
|
|
764
|
-
it('applies correct classes for horizontal with small spacing', () => {
|
|
765
|
-
renderWithProviders(
|
|
766
|
-
<InputGroup orientation="horizontal" spacing="sm">
|
|
767
|
-
<Input placeholder="First" />
|
|
768
|
-
<Input placeholder="Second" />
|
|
769
|
-
</InputGroup>
|
|
770
|
-
);
|
|
771
|
-
|
|
772
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
773
|
-
expect(group).toHaveClass('flex', 'flex-row', 'items-end', 'space-x-2');
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
it('applies correct classes for vertical with large spacing', () => {
|
|
777
|
-
renderWithProviders(
|
|
778
|
-
<InputGroup orientation="vertical" spacing="lg">
|
|
779
|
-
<Input placeholder="First" />
|
|
780
|
-
<Input placeholder="Second" />
|
|
781
|
-
</InputGroup>
|
|
782
|
-
);
|
|
783
|
-
|
|
784
|
-
const group = screen.getByPlaceholderText('First').parentElement;
|
|
785
|
-
expect(group).toHaveClass('flex', 'flex-col', 'space-y-6');
|
|
786
|
-
});
|
|
787
|
-
});
|
|
788
|
-
|
|
789
|
-
describe('Props Spreading', () => {
|
|
790
|
-
it('spreads additional props to div element', () => {
|
|
791
|
-
renderWithProviders(
|
|
792
|
-
<InputGroup data-testid="test-group" aria-label="Input group">
|
|
793
|
-
<Input placeholder="Test" />
|
|
794
|
-
</InputGroup>
|
|
795
|
-
);
|
|
796
|
-
|
|
797
|
-
const group = screen.getByTestId('test-group');
|
|
798
|
-
expect(group).toHaveAttribute('aria-label', 'Input group');
|
|
799
|
-
});
|
|
800
|
-
|
|
801
|
-
it('handles style prop', () => {
|
|
802
|
-
renderWithProviders(
|
|
803
|
-
<InputGroup style={{ backgroundColor: 'blue' }}>
|
|
804
|
-
<Input placeholder="Test" />
|
|
805
|
-
</InputGroup>
|
|
806
|
-
);
|
|
807
|
-
|
|
808
|
-
const group = screen.getByPlaceholderText('Test').parentElement;
|
|
809
|
-
// Note: Inline styles might not be applied in test environment
|
|
810
|
-
expect(group).toHaveAttribute('style');
|
|
811
|
-
});
|
|
812
|
-
});
|
|
813
|
-
|
|
814
|
-
describe('Complex Children', () => {
|
|
815
|
-
it('renders with mixed content', () => {
|
|
816
|
-
renderWithProviders(
|
|
817
|
-
<InputGroup>
|
|
818
|
-
<Input placeholder="Email" type="email" />
|
|
819
|
-
<div>Some text</div>
|
|
820
|
-
<Input placeholder="Password" type="password" />
|
|
821
|
-
</InputGroup>
|
|
822
|
-
);
|
|
823
|
-
|
|
824
|
-
expect(screen.getByPlaceholderText('Email')).toBeInTheDocument();
|
|
825
|
-
expect(screen.getByText('Some text')).toBeInTheDocument();
|
|
826
|
-
expect(screen.getByPlaceholderText('Password')).toBeInTheDocument();
|
|
827
|
-
});
|
|
828
|
-
|
|
829
|
-
it('renders with conditional children', () => {
|
|
830
|
-
const TestComponent = ({ showSecond }: { showSecond: boolean }) => (
|
|
831
|
-
<InputGroup>
|
|
832
|
-
<Input placeholder="First" />
|
|
833
|
-
{showSecond && <Input placeholder="Second" />}
|
|
834
|
-
</InputGroup>
|
|
835
|
-
);
|
|
836
|
-
|
|
837
|
-
const { rerender } = renderWithProviders(<TestComponent showSecond={false} />);
|
|
838
|
-
expect(screen.getByPlaceholderText('First')).toBeInTheDocument();
|
|
839
|
-
expect(screen.queryByPlaceholderText('Second')).not.toBeInTheDocument();
|
|
840
|
-
|
|
841
|
-
rerender(<TestComponent showSecond={true} />);
|
|
842
|
-
expect(screen.getByPlaceholderText('First')).toBeInTheDocument();
|
|
843
|
-
expect(screen.getByPlaceholderText('Second')).toBeInTheDocument();
|
|
844
|
-
});
|
|
845
|
-
});
|
|
846
|
-
|
|
847
|
-
describe('Edge Cases', () => {
|
|
848
|
-
it('renders with no children', () => {
|
|
849
|
-
renderWithProviders(<InputGroup>{}</InputGroup>);
|
|
850
|
-
// Should not crash
|
|
851
|
-
expect(document.querySelector('div')).toBeInTheDocument();
|
|
852
|
-
});
|
|
853
|
-
|
|
854
|
-
it('renders with single child', () => {
|
|
855
|
-
renderWithProviders(
|
|
856
|
-
<InputGroup>
|
|
857
|
-
<Input placeholder="Single" />
|
|
858
|
-
</InputGroup>
|
|
859
|
-
);
|
|
860
|
-
|
|
861
|
-
expect(screen.getByPlaceholderText('Single')).toBeInTheDocument();
|
|
862
|
-
});
|
|
863
|
-
|
|
864
|
-
it('handles many children', () => {
|
|
865
|
-
renderWithProviders(
|
|
866
|
-
<InputGroup>
|
|
867
|
-
{Array.from({ length: 10 }, (_, i) => (
|
|
868
|
-
<Input key={i} placeholder={`Input ${i}`} />
|
|
869
|
-
))}
|
|
870
|
-
</InputGroup>
|
|
871
|
-
);
|
|
872
|
-
|
|
873
|
-
for (let i = 0; i < 10; i++) {
|
|
874
|
-
expect(screen.getByPlaceholderText(`Input ${i}`)).toBeInTheDocument();
|
|
875
|
-
}
|
|
876
|
-
});
|
|
877
|
-
|
|
878
|
-
it('handles invalid orientation value', () => {
|
|
879
|
-
renderWithProviders(
|
|
880
|
-
<InputGroup orientation={'invalid' as any}>
|
|
881
|
-
<Input placeholder="Test" />
|
|
882
|
-
</InputGroup>
|
|
883
|
-
);
|
|
884
|
-
|
|
885
|
-
// Should default to vertical
|
|
886
|
-
const group = screen.getByPlaceholderText('Test').parentElement;
|
|
887
|
-
expect(group).toHaveClass('flex-col');
|
|
888
|
-
});
|
|
889
|
-
|
|
890
|
-
it('handles invalid spacing value', () => {
|
|
891
|
-
renderWithProviders(
|
|
892
|
-
<InputGroup spacing={'invalid' as any}>
|
|
893
|
-
<Input placeholder="Test" />
|
|
894
|
-
</InputGroup>
|
|
895
|
-
);
|
|
896
|
-
|
|
897
|
-
// Should default to medium spacing
|
|
898
|
-
const group = screen.getByPlaceholderText('Test').parentElement;
|
|
899
|
-
expect(group).toHaveClass('flex', 'flex-col');
|
|
900
|
-
});
|
|
901
|
-
});
|
|
902
|
-
|
|
903
|
-
describe('Integration with Input Component', () => {
|
|
904
|
-
it('works with different Input variants', () => {
|
|
905
|
-
renderWithProviders(
|
|
906
|
-
<InputGroup>
|
|
907
|
-
<Input placeholder="Default" variant="default" />
|
|
908
|
-
<Input placeholder="Destructive" variant="destructive" />
|
|
909
|
-
</InputGroup>
|
|
910
|
-
);
|
|
911
|
-
|
|
912
|
-
expect(screen.getByPlaceholderText('Default')).toBeInTheDocument();
|
|
913
|
-
expect(screen.getByPlaceholderText('Destructive')).toBeInTheDocument();
|
|
914
|
-
});
|
|
915
|
-
|
|
916
|
-
it('works with different Input sizes', () => {
|
|
917
|
-
renderWithProviders(
|
|
918
|
-
<InputGroup>
|
|
919
|
-
<Input placeholder="Small" size="sm" />
|
|
920
|
-
<Input placeholder="Medium" size="md" />
|
|
921
|
-
<Input placeholder="Large" size="lg" />
|
|
922
|
-
</InputGroup>
|
|
923
|
-
);
|
|
924
|
-
|
|
925
|
-
expect(screen.getByPlaceholderText('Small')).toBeInTheDocument();
|
|
926
|
-
expect(screen.getByPlaceholderText('Medium')).toBeInTheDocument();
|
|
927
|
-
expect(screen.getByPlaceholderText('Large')).toBeInTheDocument();
|
|
928
|
-
});
|
|
929
|
-
|
|
930
|
-
it('works with Input error states', () => {
|
|
931
|
-
renderWithProviders(
|
|
932
|
-
<InputGroup>
|
|
933
|
-
<Input placeholder="Normal" />
|
|
934
|
-
<Input placeholder="Error" error={true} />
|
|
935
|
-
</InputGroup>
|
|
936
|
-
);
|
|
937
|
-
|
|
938
|
-
expect(screen.getByPlaceholderText('Normal')).toBeInTheDocument();
|
|
939
|
-
expect(screen.getByPlaceholderText('Error')).toBeInTheDocument();
|
|
940
|
-
});
|
|
941
|
-
});
|
|
942
|
-
|
|
943
|
-
describe('Performance', () => {
|
|
944
|
-
it('does not re-render unnecessarily', () => {
|
|
945
|
-
const renderCount = vi.fn();
|
|
946
|
-
const TestComponent = React.memo(() => {
|
|
947
|
-
renderCount();
|
|
948
|
-
return (
|
|
949
|
-
<InputGroup>
|
|
950
|
-
<Input placeholder="Test" />
|
|
951
|
-
</InputGroup>
|
|
952
|
-
);
|
|
953
|
-
});
|
|
954
|
-
|
|
955
|
-
const { rerender } = renderWithProviders(<TestComponent />);
|
|
956
|
-
rerender(<TestComponent />);
|
|
957
|
-
|
|
958
|
-
// Should only render once due to memo
|
|
959
|
-
expect(renderCount).toHaveBeenCalledTimes(1);
|
|
960
|
-
});
|
|
961
|
-
});
|
|
962
|
-
describe('Input Error Handling', () => {
|
|
963
|
-
const user = userEvent.setup();
|
|
964
|
-
let restoreConsole: (() => void) | null = null;
|
|
965
|
-
|
|
966
|
-
beforeEach(() => {
|
|
967
|
-
restoreConsole = errorTestingUtils.suppressConsoleErrors();
|
|
968
|
-
});
|
|
969
|
-
|
|
970
|
-
afterEach(() => {
|
|
971
|
-
if (restoreConsole) {
|
|
972
|
-
restoreConsole();
|
|
973
|
-
}
|
|
974
|
-
});
|
|
975
|
-
|
|
976
|
-
it('should handle component errors gracefully', () => {
|
|
977
|
-
const ErrorComponent = () => {
|
|
978
|
-
throw new Error('Input component error');
|
|
979
|
-
};
|
|
980
|
-
|
|
981
|
-
renderWithProviders(
|
|
982
|
-
<TestErrorBoundary>
|
|
983
|
-
<ErrorComponent />
|
|
984
|
-
</TestErrorBoundary>
|
|
985
|
-
);
|
|
986
|
-
|
|
987
|
-
expect(screen.getByTestId('error-boundary')).toBeInTheDocument();
|
|
988
|
-
expect(screen.getByText('Error: Input component error')).toBeInTheDocument();
|
|
989
|
-
});
|
|
990
|
-
|
|
991
|
-
it('should handle async errors', async () => {
|
|
992
|
-
const AsyncErrorComponent = ({ shouldFail }: { shouldFail: boolean }) => {
|
|
993
|
-
const [error, setError] = React.useState<Error | null>(null);
|
|
994
|
-
|
|
995
|
-
React.useEffect(() => {
|
|
996
|
-
if (shouldFail) {
|
|
997
|
-
setError(new Error('Async error'));
|
|
998
|
-
}
|
|
999
|
-
}, [shouldFail]);
|
|
1000
|
-
|
|
1001
|
-
if (error) {
|
|
1002
|
-
throw error;
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
return <div>Async component</div>;
|
|
1006
|
-
};
|
|
1007
|
-
|
|
1008
|
-
renderWithProviders(
|
|
1009
|
-
<TestErrorBoundary>
|
|
1010
|
-
<AsyncErrorComponent shouldFail={true} />
|
|
1011
|
-
</TestErrorBoundary>
|
|
1012
|
-
);
|
|
1013
|
-
|
|
1014
|
-
await waitFor(() => {
|
|
1015
|
-
expect(screen.getByTestId('error-boundary')).toBeInTheDocument();
|
|
1016
|
-
});
|
|
1017
|
-
});
|
|
1018
|
-
|
|
1019
|
-
it('should handle user interaction errors', async () => {
|
|
1020
|
-
const ErrorComponent = errorTestingUtils.createErrorThrowingComponent(
|
|
1021
|
-
'Input interaction error',
|
|
1022
|
-
'click'
|
|
1023
|
-
);
|
|
1024
|
-
|
|
1025
|
-
renderWithProviders(
|
|
1026
|
-
<TestErrorBoundary>
|
|
1027
|
-
<ErrorComponent />
|
|
1028
|
-
</TestErrorBoundary>
|
|
1029
|
-
);
|
|
1030
|
-
|
|
1031
|
-
await user.click(screen.getByTestId('error-button'));
|
|
1032
|
-
|
|
1033
|
-
await waitFor(() => {
|
|
1034
|
-
expect(screen.getByTestId('error-display')).toBeInTheDocument();
|
|
1035
|
-
});
|
|
1036
|
-
});
|
|
1037
|
-
|
|
1038
|
-
it('should recover from errors when props change', async () => {
|
|
1039
|
-
const TestComponent = ({ shouldError }: { shouldError: boolean }) => {
|
|
1040
|
-
if (shouldError) {
|
|
1041
|
-
throw new Error('Input prop error');
|
|
1042
|
-
}
|
|
1043
|
-
return <div>Normal content</div>;
|
|
1044
|
-
};
|
|
1045
|
-
|
|
1046
|
-
await errorTestingUtils.testErrorRecovery(
|
|
1047
|
-
TestComponent,
|
|
1048
|
-
{ shouldError: true },
|
|
1049
|
-
{ shouldError: false }
|
|
1050
|
-
);
|
|
1051
|
-
|
|
1052
|
-
expect(screen.getByText('Normal content')).toBeInTheDocument();
|
|
1053
|
-
});
|
|
1054
|
-
|
|
1055
|
-
// Shared Utilities Tests
|
|
1056
|
-
describe('Input - Shared Utilities Tests', () => {
|
|
1057
|
-
testComponentRendering(Input, [
|
|
1058
|
-
{
|
|
1059
|
-
name: 'default input',
|
|
1060
|
-
props: {},
|
|
1061
|
-
expectedText: '',
|
|
1062
|
-
expectedRole: 'textbox'
|
|
1063
|
-
},
|
|
1064
|
-
{
|
|
1065
|
-
name: 'input with placeholder',
|
|
1066
|
-
props: { placeholder: 'Enter text' },
|
|
1067
|
-
expectedText: '',
|
|
1068
|
-
expectedRole: 'textbox'
|
|
1069
|
-
},
|
|
1070
|
-
{
|
|
1071
|
-
name: 'input with value',
|
|
1072
|
-
props: { value: 'test value', onChange: () => {} },
|
|
1073
|
-
expectedText: '',
|
|
1074
|
-
expectedRole: 'textbox'
|
|
1075
|
-
}
|
|
1076
|
-
]);
|
|
1077
|
-
|
|
1078
|
-
testComponentAccessibility(Input, {
|
|
1079
|
-
placeholder: 'Accessible input'
|
|
1080
|
-
}, {
|
|
1081
|
-
requiredAttributes: [],
|
|
1082
|
-
shouldBeKeyboardAccessible: false,
|
|
1083
|
-
shouldHaveValidRole: false,
|
|
1084
|
-
shouldHaveValidAriaLabel: false
|
|
1085
|
-
});
|
|
1086
|
-
|
|
1087
|
-
testComponentEvents(Input, {
|
|
1088
|
-
placeholder: 'Clickable input'
|
|
1089
|
-
}, [
|
|
1090
|
-
{
|
|
1091
|
-
name: 'change event',
|
|
1092
|
-
event: 'change',
|
|
1093
|
-
element: 'textbox',
|
|
1094
|
-
expectedBehavior: () => {
|
|
1095
|
-
expect(screen.getByRole('textbox')).toBeInTheDocument();
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
]);
|
|
1099
|
-
|
|
1100
|
-
testFormComponent(Input, {
|
|
1101
|
-
validationTests: [
|
|
1102
|
-
{
|
|
1103
|
-
name: 'required validation',
|
|
1104
|
-
inputValue: '',
|
|
1105
|
-
expectedError: 'This field is required',
|
|
1106
|
-
shouldBeValid: false
|
|
1107
|
-
}
|
|
1108
|
-
],
|
|
1109
|
-
submissionTests: [
|
|
1110
|
-
{
|
|
1111
|
-
name: 'successful input',
|
|
1112
|
-
formData: { input: 'test value' },
|
|
1113
|
-
expectedBehavior: () => {
|
|
1114
|
-
expect(screen.getByDisplayValue('test value')).toBeInTheDocument();
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
]
|
|
1118
|
-
});
|
|
1119
|
-
});
|
|
1120
|
-
});
|
|
1121
|
-
});
|