@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,890 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Select Component Utility Tests
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/Select/Select.utils
|
|
5
|
-
* @since 0.1.0
|
|
6
|
-
*
|
|
7
|
-
* Tests for utility functions and hooks used in the Select component
|
|
8
|
-
* including search algorithms, text highlighting, and option parsing.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import React from 'react';
|
|
12
|
-
import { render, screen, waitFor, fireEvent } from '@testing-library/react';
|
|
13
|
-
import { edgeCaseUtils } from '../../__tests__/EdgeCaseTesting.enhanced.test';
|
|
14
|
-
import userEvent from '@testing-library/user-event';
|
|
15
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
16
|
-
import '@testing-library/jest-dom';
|
|
17
|
-
import { renderWithProviders } from "../../../__tests__/shared";
|
|
18
|
-
import {
|
|
19
|
-
Select,
|
|
20
|
-
SelectContent,
|
|
21
|
-
SelectItem,
|
|
22
|
-
SelectTrigger,
|
|
23
|
-
SelectValue,
|
|
24
|
-
} from '../Select';
|
|
25
|
-
|
|
26
|
-
// Mock lucide-react icons
|
|
27
|
-
vi.mock('lucide-react', () => ({
|
|
28
|
-
Search: () => <div data-testid="search-icon">🔍</div>,
|
|
29
|
-
X: () => <div data-testid="clear-icon">✕</div>,
|
|
30
|
-
ChevronDown: () => <div data-testid="chevron-down-icon">▼</div>,
|
|
31
|
-
Check: () => <div data-testid="check-icon">✓</div>,
|
|
32
|
-
}));
|
|
33
|
-
|
|
34
|
-
// Mock Radix UI Select to avoid jsdom compatibility issues
|
|
35
|
-
vi.mock('@radix-ui/react-select', async () => {
|
|
36
|
-
const actual = await vi.importActual('@radix-ui/react-select');
|
|
37
|
-
return {
|
|
38
|
-
...actual,
|
|
39
|
-
Root: ({ children, onValueChange, value, defaultValue, ...props }: any) => (
|
|
40
|
-
<div data-testid="select-root" data-value={value || defaultValue} {...props}>
|
|
41
|
-
{children}
|
|
42
|
-
</div>
|
|
43
|
-
),
|
|
44
|
-
Trigger: React.forwardRef(({ children, disabled, ...props }: any, ref) => (
|
|
45
|
-
<button
|
|
46
|
-
ref={ref}
|
|
47
|
-
data-testid="select-trigger"
|
|
48
|
-
disabled={disabled}
|
|
49
|
-
onClick={() => {
|
|
50
|
-
// Simulate opening the dropdown
|
|
51
|
-
const event = new CustomEvent('select-open');
|
|
52
|
-
document.dispatchEvent(event);
|
|
53
|
-
}}
|
|
54
|
-
{...props}
|
|
55
|
-
>
|
|
56
|
-
{children}
|
|
57
|
-
</button>
|
|
58
|
-
)),
|
|
59
|
-
Content: ({ children, searchable, ...props }: any) => (
|
|
60
|
-
<div data-testid="select-content" data-searchable={searchable} {...props}>
|
|
61
|
-
{searchable && (
|
|
62
|
-
<div data-testid="search-container">
|
|
63
|
-
<div data-testid="search-icon">🔍</div>
|
|
64
|
-
<input
|
|
65
|
-
data-testid="select-search-input"
|
|
66
|
-
type="text"
|
|
67
|
-
placeholder="Search..."
|
|
68
|
-
aria-label="Search options"
|
|
69
|
-
/>
|
|
70
|
-
<button data-testid="select-clear-search" aria-label="Clear search">
|
|
71
|
-
✕
|
|
72
|
-
</button>
|
|
73
|
-
</div>
|
|
74
|
-
)}
|
|
75
|
-
<div data-testid="select-viewport">
|
|
76
|
-
{children}
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
),
|
|
80
|
-
Viewport: ({ children, ...props }: any) => (
|
|
81
|
-
<div data-testid="select-viewport" {...props}>
|
|
82
|
-
{children}
|
|
83
|
-
</div>
|
|
84
|
-
),
|
|
85
|
-
Item: ({ children, value, disabled, ...props }: any) => (
|
|
86
|
-
<div
|
|
87
|
-
data-testid="select-item"
|
|
88
|
-
data-value={value}
|
|
89
|
-
aria-disabled={disabled}
|
|
90
|
-
onClick={() => {
|
|
91
|
-
if (!disabled) {
|
|
92
|
-
// Simulate value change
|
|
93
|
-
const event = new CustomEvent('select-value-change', { detail: value });
|
|
94
|
-
document.dispatchEvent(event);
|
|
95
|
-
}
|
|
96
|
-
}}
|
|
97
|
-
{...props}
|
|
98
|
-
>
|
|
99
|
-
{children}
|
|
100
|
-
</div>
|
|
101
|
-
),
|
|
102
|
-
ItemText: ({ children, ...props }: any) => (
|
|
103
|
-
<span data-testid="select-item-text" {...props}>
|
|
104
|
-
{children}
|
|
105
|
-
</span>
|
|
106
|
-
),
|
|
107
|
-
ItemIndicator: ({ children, ...props }: any) => (
|
|
108
|
-
<span data-testid="select-item-indicator" {...props}>
|
|
109
|
-
{children}
|
|
110
|
-
</span>
|
|
111
|
-
),
|
|
112
|
-
Value: ({ children, ...props }: any) => (
|
|
113
|
-
<span data-testid="select-value" {...props}>
|
|
114
|
-
{children}
|
|
115
|
-
</span>
|
|
116
|
-
),
|
|
117
|
-
Label: ({ children, ...props }: any) => (
|
|
118
|
-
<div data-testid="select-label" {...props}>
|
|
119
|
-
{children}
|
|
120
|
-
</div>
|
|
121
|
-
),
|
|
122
|
-
Group: ({ children, ...props }: any) => (
|
|
123
|
-
<div data-testid="select-group" {...props}>
|
|
124
|
-
{children}
|
|
125
|
-
</div>
|
|
126
|
-
),
|
|
127
|
-
Separator: ({ ...props }: any) => (
|
|
128
|
-
<div data-testid="select-separator" {...props} />
|
|
129
|
-
),
|
|
130
|
-
Icon: ({ children, ...props }: any) => (
|
|
131
|
-
<span data-testid="select-icon" {...props}>
|
|
132
|
-
{children}
|
|
133
|
-
</span>
|
|
134
|
-
),
|
|
135
|
-
Portal: ({ children }: any) => <>{children}</>,
|
|
136
|
-
};
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
describe('Select Utility Functions', () => {
|
|
140
|
-
let user: ReturnType<typeof userEvent.setup>;
|
|
141
|
-
|
|
142
|
-
beforeEach(() => {
|
|
143
|
-
vi.clearAllMocks();
|
|
144
|
-
user = userEvent.setup();
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe('Text Extraction Utilities', () => {
|
|
148
|
-
it('extracts text from simple string children', async () => {
|
|
149
|
-
renderWithProviders(
|
|
150
|
-
<Select>
|
|
151
|
-
<SelectTrigger>
|
|
152
|
-
<SelectValue placeholder="Select an option" />
|
|
153
|
-
</SelectTrigger>
|
|
154
|
-
<SelectContent>
|
|
155
|
-
<SelectItem value="test">Simple Text</SelectItem>
|
|
156
|
-
</SelectContent>
|
|
157
|
-
</Select>
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
// Click trigger to open the select
|
|
161
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
162
|
-
await user.click(trigger);
|
|
163
|
-
|
|
164
|
-
const item = screen.getByTestId('select-item');
|
|
165
|
-
expect(item).toHaveTextContent('Simple Text');
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it('extracts text from complex React elements', async () => {
|
|
169
|
-
renderWithProviders(
|
|
170
|
-
<Select>
|
|
171
|
-
<SelectTrigger>
|
|
172
|
-
<SelectValue placeholder="Select an option" />
|
|
173
|
-
</SelectTrigger>
|
|
174
|
-
<SelectContent>
|
|
175
|
-
<SelectItem value="test">
|
|
176
|
-
<span>🍎</span>
|
|
177
|
-
<strong>Apple</strong>
|
|
178
|
-
<span>(Fruit)</span>
|
|
179
|
-
</SelectItem>
|
|
180
|
-
</SelectContent>
|
|
181
|
-
</Select>
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
// Click trigger to open the select
|
|
185
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
186
|
-
await user.click(trigger);
|
|
187
|
-
|
|
188
|
-
const item = screen.getByTestId('select-item');
|
|
189
|
-
expect(item).toHaveTextContent('🍎Apple(Fruit)');
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it('handles array of React elements', async () => {
|
|
193
|
-
renderWithProviders(
|
|
194
|
-
<Select>
|
|
195
|
-
<SelectTrigger>
|
|
196
|
-
<SelectValue placeholder="Select an option" />
|
|
197
|
-
</SelectTrigger>
|
|
198
|
-
<SelectContent>
|
|
199
|
-
<SelectItem value="test">
|
|
200
|
-
{[
|
|
201
|
-
<span key="1">Part 1</span>,
|
|
202
|
-
" and ",
|
|
203
|
-
<span key="2">Part 2</span>
|
|
204
|
-
]}
|
|
205
|
-
</SelectItem>
|
|
206
|
-
</SelectContent>
|
|
207
|
-
</Select>
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
// Click trigger to open the select
|
|
211
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
212
|
-
await user.click(trigger);
|
|
213
|
-
|
|
214
|
-
const item = screen.getByTestId('select-item');
|
|
215
|
-
expect(item).toHaveTextContent('Part 1 and Part 2');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('handles null and undefined children', async () => {
|
|
219
|
-
renderWithProviders(
|
|
220
|
-
<Select>
|
|
221
|
-
<SelectTrigger>
|
|
222
|
-
<SelectValue placeholder="Select an option" />
|
|
223
|
-
</SelectTrigger>
|
|
224
|
-
<SelectContent>
|
|
225
|
-
<SelectItem value="test">{null}</SelectItem>
|
|
226
|
-
<SelectItem value="test2">{undefined}</SelectItem>
|
|
227
|
-
</SelectContent>
|
|
228
|
-
</Select>
|
|
229
|
-
);
|
|
230
|
-
|
|
231
|
-
// Click trigger to open the select
|
|
232
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
233
|
-
await user.click(trigger);
|
|
234
|
-
|
|
235
|
-
const items = screen.getAllByTestId('select-item');
|
|
236
|
-
expect(items).toHaveLength(2);
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
describe('Search Algorithm Tests', () => {
|
|
241
|
-
it('performs contains search correctly', async () => {
|
|
242
|
-
renderWithProviders(
|
|
243
|
-
<Select>
|
|
244
|
-
<SelectTrigger>
|
|
245
|
-
<SelectValue placeholder="Select an option" />
|
|
246
|
-
</SelectTrigger>
|
|
247
|
-
<SelectContent searchable searchStrategy="contains">
|
|
248
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
249
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
250
|
-
<SelectItem value="pineapple">Pineapple</SelectItem>
|
|
251
|
-
</SelectContent>
|
|
252
|
-
</Select>
|
|
253
|
-
);
|
|
254
|
-
|
|
255
|
-
// Click trigger to open the select
|
|
256
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
257
|
-
await user.click(trigger);
|
|
258
|
-
|
|
259
|
-
// The search functionality is tested in the comprehensive tests
|
|
260
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
it('performs startsWith search correctly', async () => {
|
|
264
|
-
renderWithProviders(
|
|
265
|
-
<Select>
|
|
266
|
-
<SelectTrigger>
|
|
267
|
-
<SelectValue placeholder="Select an option" />
|
|
268
|
-
</SelectTrigger>
|
|
269
|
-
<SelectContent searchable searchStrategy="startsWith">
|
|
270
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
271
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
272
|
-
<SelectItem value="pineapple">Pineapple</SelectItem>
|
|
273
|
-
</SelectContent>
|
|
274
|
-
</Select>
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
// Click trigger to open the select
|
|
278
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
279
|
-
await user.click(trigger);
|
|
280
|
-
|
|
281
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it('performs fuzzy search correctly', async () => {
|
|
285
|
-
renderWithProviders(
|
|
286
|
-
<Select>
|
|
287
|
-
<SelectTrigger>
|
|
288
|
-
<SelectValue placeholder="Select an option" />
|
|
289
|
-
</SelectTrigger>
|
|
290
|
-
<SelectContent searchable searchStrategy="fuzzy">
|
|
291
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
292
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
293
|
-
<SelectItem value="pineapple">Pineapple</SelectItem>
|
|
294
|
-
</SelectContent>
|
|
295
|
-
</Select>
|
|
296
|
-
);
|
|
297
|
-
|
|
298
|
-
// Click trigger to open the select
|
|
299
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
300
|
-
await user.click(trigger);
|
|
301
|
-
|
|
302
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
it('performs exact search correctly', async () => {
|
|
306
|
-
renderWithProviders(
|
|
307
|
-
<Select>
|
|
308
|
-
<SelectTrigger>
|
|
309
|
-
<SelectValue placeholder="Select an option" />
|
|
310
|
-
</SelectTrigger>
|
|
311
|
-
<SelectContent searchable searchStrategy="exact">
|
|
312
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
313
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
314
|
-
<SelectItem value="pineapple">Pineapple</SelectItem>
|
|
315
|
-
</SelectContent>
|
|
316
|
-
</Select>
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
// Click trigger to open the select
|
|
320
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
321
|
-
await user.click(trigger);
|
|
322
|
-
|
|
323
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
describe('Debounce Hook Tests', () => {
|
|
328
|
-
it('debounces search input correctly', async () => {
|
|
329
|
-
const onSearchChange = vi.fn();
|
|
330
|
-
|
|
331
|
-
renderWithProviders(
|
|
332
|
-
<Select>
|
|
333
|
-
<SelectTrigger>
|
|
334
|
-
<SelectValue placeholder="Select an option" />
|
|
335
|
-
</SelectTrigger>
|
|
336
|
-
<SelectContent searchable debounceMs={100} onSearchChange={onSearchChange}>
|
|
337
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
338
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
339
|
-
</SelectContent>
|
|
340
|
-
</Select>
|
|
341
|
-
);
|
|
342
|
-
|
|
343
|
-
// Click trigger to open the select
|
|
344
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
345
|
-
await user.click(trigger);
|
|
346
|
-
|
|
347
|
-
const searchInput = screen.getByTestId('select-search-input');
|
|
348
|
-
|
|
349
|
-
// Type rapidly
|
|
350
|
-
searchInput.focus();
|
|
351
|
-
searchInput.value = 'a';
|
|
352
|
-
searchInput.dispatchEvent(new Event('input', { bubbles: true }));
|
|
353
|
-
|
|
354
|
-
searchInput.value = 'ap';
|
|
355
|
-
searchInput.dispatchEvent(new Event('input', { bubbles: true }));
|
|
356
|
-
|
|
357
|
-
searchInput.value = 'app';
|
|
358
|
-
searchInput.dispatchEvent(new Event('input', { bubbles: true }));
|
|
359
|
-
|
|
360
|
-
// Should not call immediately due to debouncing
|
|
361
|
-
expect(onSearchChange).not.toHaveBeenCalledWith('app');
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
describe('Option Parsing Tests', () => {
|
|
366
|
-
it('parses simple options correctly', async () => {
|
|
367
|
-
renderWithProviders(
|
|
368
|
-
<Select>
|
|
369
|
-
<SelectTrigger>
|
|
370
|
-
<SelectValue placeholder="Select an option" />
|
|
371
|
-
</SelectTrigger>
|
|
372
|
-
<SelectContent>
|
|
373
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
374
|
-
<SelectItem value="option2">Option 2</SelectItem>
|
|
375
|
-
</SelectContent>
|
|
376
|
-
</Select>
|
|
377
|
-
);
|
|
378
|
-
|
|
379
|
-
// Click trigger to open the select
|
|
380
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
381
|
-
await user.click(trigger);
|
|
382
|
-
|
|
383
|
-
const items = screen.getAllByTestId('select-item');
|
|
384
|
-
expect(items).toHaveLength(2);
|
|
385
|
-
expect(items[0]).toHaveAttribute('data-value', 'option1');
|
|
386
|
-
expect(items[1]).toHaveAttribute('data-value', 'option2');
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
it('parses grouped options correctly', async () => {
|
|
390
|
-
renderWithProviders(
|
|
391
|
-
<Select>
|
|
392
|
-
<SelectTrigger>
|
|
393
|
-
<SelectValue placeholder="Select an option" />
|
|
394
|
-
</SelectTrigger>
|
|
395
|
-
<SelectContent>
|
|
396
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
397
|
-
<SelectItem value="option2">Option 2</SelectItem>
|
|
398
|
-
</SelectContent>
|
|
399
|
-
</Select>
|
|
400
|
-
);
|
|
401
|
-
|
|
402
|
-
// Click trigger to open the select
|
|
403
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
404
|
-
await user.click(trigger);
|
|
405
|
-
|
|
406
|
-
const items = screen.getAllByTestId('select-item');
|
|
407
|
-
expect(items).toHaveLength(2);
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
it('handles options with complex children', async () => {
|
|
411
|
-
renderWithProviders(
|
|
412
|
-
<Select>
|
|
413
|
-
<SelectTrigger>
|
|
414
|
-
<SelectValue placeholder="Select an option" />
|
|
415
|
-
</SelectTrigger>
|
|
416
|
-
<SelectContent>
|
|
417
|
-
<SelectItem value="complex">
|
|
418
|
-
<span>🚀</span>
|
|
419
|
-
<strong>Complex</strong>
|
|
420
|
-
<span>Option</span>
|
|
421
|
-
</SelectItem>
|
|
422
|
-
</SelectContent>
|
|
423
|
-
</Select>
|
|
424
|
-
);
|
|
425
|
-
|
|
426
|
-
// Click trigger to open the select
|
|
427
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
428
|
-
await user.click(trigger);
|
|
429
|
-
|
|
430
|
-
const item = screen.getByTestId('select-item');
|
|
431
|
-
expect(item).toHaveTextContent('🚀ComplexOption');
|
|
432
|
-
});
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
describe('Text Highlighting Tests', () => {
|
|
436
|
-
it('highlights matching text in simple strings', async () => {
|
|
437
|
-
renderWithProviders(
|
|
438
|
-
<Select>
|
|
439
|
-
<SelectTrigger>
|
|
440
|
-
<SelectValue placeholder="Select an option" />
|
|
441
|
-
</SelectTrigger>
|
|
442
|
-
<SelectContent searchable highlightMatches>
|
|
443
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
444
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
445
|
-
</SelectContent>
|
|
446
|
-
</Select>
|
|
447
|
-
);
|
|
448
|
-
|
|
449
|
-
// Click trigger to open the select
|
|
450
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
451
|
-
await user.click(trigger);
|
|
452
|
-
|
|
453
|
-
const searchInput = screen.getByTestId('select-search-input');
|
|
454
|
-
searchInput.value = 'app';
|
|
455
|
-
searchInput.dispatchEvent(new Event('input', { bubbles: true }));
|
|
456
|
-
|
|
457
|
-
// The highlighting functionality is tested in the comprehensive tests
|
|
458
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
it('handles case insensitive highlighting', async () => {
|
|
462
|
-
renderWithProviders(
|
|
463
|
-
<Select>
|
|
464
|
-
<SelectTrigger>
|
|
465
|
-
<SelectValue placeholder="Select an option" />
|
|
466
|
-
</SelectTrigger>
|
|
467
|
-
<SelectContent searchable highlightMatches caseSensitive={false}>
|
|
468
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
469
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
470
|
-
</SelectContent>
|
|
471
|
-
</Select>
|
|
472
|
-
);
|
|
473
|
-
|
|
474
|
-
// Click trigger to open the select
|
|
475
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
476
|
-
await user.click(trigger);
|
|
477
|
-
|
|
478
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
479
|
-
});
|
|
480
|
-
});
|
|
481
|
-
|
|
482
|
-
describe('Keyboard Navigation Tests', () => {
|
|
483
|
-
it('supports global keyboard shortcuts', async () => {
|
|
484
|
-
renderWithProviders(
|
|
485
|
-
<Select>
|
|
486
|
-
<SelectTrigger>
|
|
487
|
-
<SelectValue placeholder="Select an option" />
|
|
488
|
-
</SelectTrigger>
|
|
489
|
-
<SelectContent searchable>
|
|
490
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
491
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
492
|
-
</SelectContent>
|
|
493
|
-
</Select>
|
|
494
|
-
);
|
|
495
|
-
|
|
496
|
-
// Click trigger to open the select
|
|
497
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
498
|
-
await user.click(trigger);
|
|
499
|
-
|
|
500
|
-
// Test that keyboard event listeners are set up
|
|
501
|
-
expect(screen.getByTestId('select-search-input')).toBeInTheDocument();
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
it('handles search input keyboard events', async () => {
|
|
505
|
-
renderWithProviders(
|
|
506
|
-
<Select>
|
|
507
|
-
<SelectTrigger>
|
|
508
|
-
<SelectValue placeholder="Select an option" />
|
|
509
|
-
</SelectTrigger>
|
|
510
|
-
<SelectContent searchable>
|
|
511
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
512
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
513
|
-
</SelectContent>
|
|
514
|
-
</Select>
|
|
515
|
-
);
|
|
516
|
-
|
|
517
|
-
// Click trigger to open the select
|
|
518
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
519
|
-
await user.click(trigger);
|
|
520
|
-
|
|
521
|
-
const searchInput = screen.getByTestId('select-search-input');
|
|
522
|
-
|
|
523
|
-
// Test that the input can receive keyboard events
|
|
524
|
-
searchInput.focus();
|
|
525
|
-
expect(searchInput).toHaveFocus();
|
|
526
|
-
});
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
describe('Accessibility Utility Tests', () => {
|
|
530
|
-
it('provides proper ARIA attributes for search input', async () => {
|
|
531
|
-
renderWithProviders(
|
|
532
|
-
<Select>
|
|
533
|
-
<SelectTrigger>
|
|
534
|
-
<SelectValue placeholder="Select an option" />
|
|
535
|
-
</SelectTrigger>
|
|
536
|
-
<SelectContent searchable>
|
|
537
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
538
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
539
|
-
</SelectContent>
|
|
540
|
-
</Select>
|
|
541
|
-
);
|
|
542
|
-
|
|
543
|
-
// Click trigger to open the select
|
|
544
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
545
|
-
await user.click(trigger);
|
|
546
|
-
|
|
547
|
-
const searchInput = screen.getByTestId('select-search-input');
|
|
548
|
-
expect(searchInput).toHaveAttribute('aria-label', 'Search options');
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
it('provides screen reader announcements', async () => {
|
|
552
|
-
renderWithProviders(
|
|
553
|
-
<Select>
|
|
554
|
-
<SelectTrigger>
|
|
555
|
-
<SelectValue placeholder="Select an option" />
|
|
556
|
-
</SelectTrigger>
|
|
557
|
-
<SelectContent searchable>
|
|
558
|
-
<SelectItem value="apple">Apple</SelectItem>
|
|
559
|
-
<SelectItem value="banana">Banana</SelectItem>
|
|
560
|
-
</SelectContent>
|
|
561
|
-
</Select>
|
|
562
|
-
);
|
|
563
|
-
|
|
564
|
-
// Click trigger to open the select
|
|
565
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
566
|
-
await user.click(trigger);
|
|
567
|
-
|
|
568
|
-
// The search input should be present and accessible
|
|
569
|
-
const searchInput = screen.getByTestId('select-search-input');
|
|
570
|
-
expect(searchInput).toBeInTheDocument();
|
|
571
|
-
expect(searchInput).toHaveAttribute('aria-label', 'Search options');
|
|
572
|
-
});
|
|
573
|
-
|
|
574
|
-
it('provides proper roles for accessibility', async () => {
|
|
575
|
-
renderWithProviders(
|
|
576
|
-
<Select>
|
|
577
|
-
<SelectTrigger>
|
|
578
|
-
<SelectValue placeholder="Select an option" />
|
|
579
|
-
</SelectTrigger>
|
|
580
|
-
<SelectContent>
|
|
581
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
582
|
-
<SelectItem value="option2">Option 2</SelectItem>
|
|
583
|
-
</SelectContent>
|
|
584
|
-
</Select>
|
|
585
|
-
);
|
|
586
|
-
|
|
587
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
588
|
-
|
|
589
|
-
// Click trigger to open the select
|
|
590
|
-
await user.click(trigger);
|
|
591
|
-
|
|
592
|
-
const content = screen.getByTestId('select-content');
|
|
593
|
-
|
|
594
|
-
expect(trigger).toBeInTheDocument();
|
|
595
|
-
expect(content).toBeInTheDocument();
|
|
596
|
-
});
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
describe('Performance Utility Tests', () => {
|
|
600
|
-
it('handles large datasets efficiently', () => {
|
|
601
|
-
const manyOptions = Array.from({ length: 100 }, (_, i) => (
|
|
602
|
-
<SelectItem key={i} value={`option-${i}`}>
|
|
603
|
-
Option {i + 1}
|
|
604
|
-
</SelectItem>
|
|
605
|
-
));
|
|
606
|
-
|
|
607
|
-
expect(() => {
|
|
608
|
-
renderWithProviders(
|
|
609
|
-
<Select>
|
|
610
|
-
<SelectTrigger>
|
|
611
|
-
<SelectValue placeholder="Select an option" />
|
|
612
|
-
</SelectTrigger>
|
|
613
|
-
<SelectContent searchable debounceMs={50}>
|
|
614
|
-
{manyOptions}
|
|
615
|
-
</SelectContent>
|
|
616
|
-
</Select>
|
|
617
|
-
);
|
|
618
|
-
}).not.toThrow();
|
|
619
|
-
});
|
|
620
|
-
|
|
621
|
-
it('memoizes option parsing correctly', async () => {
|
|
622
|
-
const { rerender } = renderWithProviders(
|
|
623
|
-
<Select>
|
|
624
|
-
<SelectTrigger>
|
|
625
|
-
<SelectValue placeholder="Select an option" />
|
|
626
|
-
</SelectTrigger>
|
|
627
|
-
<SelectContent>
|
|
628
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
629
|
-
<SelectItem value="option2">Option 2</SelectItem>
|
|
630
|
-
</SelectContent>
|
|
631
|
-
</Select>
|
|
632
|
-
);
|
|
633
|
-
|
|
634
|
-
// Click trigger to open the select
|
|
635
|
-
const trigger = screen.getByTestId('select-trigger');
|
|
636
|
-
await user.click(trigger);
|
|
637
|
-
|
|
638
|
-
// Re-render with same options
|
|
639
|
-
rerender(
|
|
640
|
-
<Select>
|
|
641
|
-
<SelectTrigger>
|
|
642
|
-
<SelectValue placeholder="Select an option" />
|
|
643
|
-
</SelectTrigger>
|
|
644
|
-
<SelectContent>
|
|
645
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
646
|
-
<SelectItem value="option2">Option 2</SelectItem>
|
|
647
|
-
</SelectContent>
|
|
648
|
-
</Select>
|
|
649
|
-
);
|
|
650
|
-
|
|
651
|
-
const items = screen.getAllByTestId('select-item');
|
|
652
|
-
expect(items).toHaveLength(2);
|
|
653
|
-
});
|
|
654
|
-
});
|
|
655
|
-
|
|
656
|
-
describe('Error Handling Tests', () => {
|
|
657
|
-
it('handles invalid search strategies gracefully', () => {
|
|
658
|
-
expect(() => {
|
|
659
|
-
renderWithProviders(
|
|
660
|
-
<Select>
|
|
661
|
-
<SelectTrigger>
|
|
662
|
-
<SelectValue placeholder="Select an option" />
|
|
663
|
-
</SelectTrigger>
|
|
664
|
-
<SelectContent searchable searchStrategy="invalid" as any>
|
|
665
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
666
|
-
</SelectContent>
|
|
667
|
-
</Select>
|
|
668
|
-
);
|
|
669
|
-
}).not.toThrow();
|
|
670
|
-
});
|
|
671
|
-
|
|
672
|
-
it('handles invalid search fields gracefully', () => {
|
|
673
|
-
expect(() => {
|
|
674
|
-
renderWithProviders(
|
|
675
|
-
<Select>
|
|
676
|
-
<SelectTrigger>
|
|
677
|
-
<SelectValue placeholder="Select an option" />
|
|
678
|
-
</SelectTrigger>
|
|
679
|
-
<SelectContent searchable searchFields={['invalid'] as any}>
|
|
680
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
681
|
-
</SelectContent>
|
|
682
|
-
</Select>
|
|
683
|
-
);
|
|
684
|
-
}).not.toThrow();
|
|
685
|
-
});
|
|
686
|
-
|
|
687
|
-
it('handles negative debounce values', () => {
|
|
688
|
-
expect(() => {
|
|
689
|
-
renderWithProviders(
|
|
690
|
-
<Select>
|
|
691
|
-
<SelectTrigger>
|
|
692
|
-
<SelectValue placeholder="Select an option" />
|
|
693
|
-
</SelectTrigger>
|
|
694
|
-
<SelectContent searchable debounceMs={-100}>
|
|
695
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
696
|
-
</SelectContent>
|
|
697
|
-
</Select>
|
|
698
|
-
);
|
|
699
|
-
}).not.toThrow();
|
|
700
|
-
});
|
|
701
|
-
|
|
702
|
-
it('handles null and undefined children gracefully', () => {
|
|
703
|
-
expect(() => {
|
|
704
|
-
renderWithProviders(
|
|
705
|
-
<Select>
|
|
706
|
-
<SelectTrigger>
|
|
707
|
-
<SelectValue placeholder="Select an option" />
|
|
708
|
-
</SelectTrigger>
|
|
709
|
-
<SelectContent>
|
|
710
|
-
{null}
|
|
711
|
-
{undefined}
|
|
712
|
-
</SelectContent>
|
|
713
|
-
</Select>
|
|
714
|
-
);
|
|
715
|
-
}).not.toThrow();
|
|
716
|
-
});
|
|
717
|
-
});
|
|
718
|
-
|
|
719
|
-
describe('Type Safety Tests', () => {
|
|
720
|
-
it('enforces proper TypeScript types for search props', () => {
|
|
721
|
-
const validSearchProps = {
|
|
722
|
-
searchable: true,
|
|
723
|
-
searchPlaceholder: "Search...",
|
|
724
|
-
searchStrategy: "contains" as const,
|
|
725
|
-
caseSensitive: false,
|
|
726
|
-
debounceMs: 300,
|
|
727
|
-
showClearButton: true,
|
|
728
|
-
searchFields: ['label', 'value'] as const,
|
|
729
|
-
maxHeight: "20rem",
|
|
730
|
-
highlightMatches: true,
|
|
731
|
-
noResultsText: "No results found",
|
|
732
|
-
onSearchChange: vi.fn(),
|
|
733
|
-
filterFunction: vi.fn(),
|
|
734
|
-
};
|
|
735
|
-
|
|
736
|
-
expect(() => {
|
|
737
|
-
renderWithProviders(
|
|
738
|
-
<Select>
|
|
739
|
-
<SelectTrigger>
|
|
740
|
-
<SelectValue placeholder="Select an option" />
|
|
741
|
-
</SelectTrigger>
|
|
742
|
-
<SelectContent {...validSearchProps}>
|
|
743
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
744
|
-
</SelectContent>
|
|
745
|
-
</Select>
|
|
746
|
-
);
|
|
747
|
-
}).not.toThrow();
|
|
748
|
-
});
|
|
749
|
-
|
|
750
|
-
it('handles optional search props correctly', () => {
|
|
751
|
-
expect(() => {
|
|
752
|
-
renderWithProviders(
|
|
753
|
-
<Select>
|
|
754
|
-
<SelectTrigger>
|
|
755
|
-
<SelectValue placeholder="Select an option" />
|
|
756
|
-
</SelectTrigger>
|
|
757
|
-
<SelectContent searchable>
|
|
758
|
-
<SelectItem value="option1">Option 1</SelectItem>
|
|
759
|
-
</SelectContent>
|
|
760
|
-
</Select>
|
|
761
|
-
);
|
|
762
|
-
}).not.toThrow();
|
|
763
|
-
});
|
|
764
|
-
});
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
describe('Select Edge Cases', () => {
|
|
768
|
-
describe('Extreme Data Values', () => {
|
|
769
|
-
it('should handle very long strings', () => {
|
|
770
|
-
const longString = edgeCaseUtils.generateExtremeData.longString(1000);
|
|
771
|
-
|
|
772
|
-
const { container } = renderWithProviders(<Select>{longString}</Select>);
|
|
773
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
it('should handle empty and null values', () => {
|
|
777
|
-
const emptyValues = edgeCaseUtils.generateExtremeData.emptyValues();
|
|
778
|
-
|
|
779
|
-
emptyValues.forEach(value => {
|
|
780
|
-
const { container, unmount } = renderWithProviders(<Select>{value as any}</Select>);
|
|
781
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
782
|
-
unmount();
|
|
783
|
-
});
|
|
784
|
-
});
|
|
785
|
-
|
|
786
|
-
it('should handle special characters', () => {
|
|
787
|
-
const specialChars = edgeCaseUtils.generateExtremeData.specialChars();
|
|
788
|
-
|
|
789
|
-
const { container } = renderWithProviders(<Select>{specialChars}</Select>);
|
|
790
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
791
|
-
});
|
|
792
|
-
|
|
793
|
-
it('should handle unicode characters', () => {
|
|
794
|
-
const unicodeChars = edgeCaseUtils.generateExtremeData.unicodeChars();
|
|
795
|
-
|
|
796
|
-
const { container } = renderWithProviders(<Select>{unicodeChars}</Select>);
|
|
797
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
798
|
-
});
|
|
799
|
-
});
|
|
800
|
-
|
|
801
|
-
describe('Extreme Numbers', () => {
|
|
802
|
-
it('should handle very large numbers', () => {
|
|
803
|
-
const largeNumbers = edgeCaseUtils.generateExtremeData.largeNumbers();
|
|
804
|
-
|
|
805
|
-
largeNumbers.forEach(number => {
|
|
806
|
-
const { container, unmount } = renderWithProviders(<Select value={number} />);
|
|
807
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
808
|
-
unmount();
|
|
809
|
-
});
|
|
810
|
-
});
|
|
811
|
-
|
|
812
|
-
it('should handle very small numbers', () => {
|
|
813
|
-
const smallNumbers = edgeCaseUtils.generateExtremeData.smallNumbers();
|
|
814
|
-
|
|
815
|
-
smallNumbers.forEach(number => {
|
|
816
|
-
const { container, unmount } = renderWithProviders(<Select value={number} />);
|
|
817
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
818
|
-
unmount();
|
|
819
|
-
});
|
|
820
|
-
});
|
|
821
|
-
});
|
|
822
|
-
|
|
823
|
-
describe('Rapid State Changes', () => {
|
|
824
|
-
it('should handle rapid prop changes', async () => {
|
|
825
|
-
const stateProps = [
|
|
826
|
-
{ children: 'State 1' },
|
|
827
|
-
{ children: 'State 2' },
|
|
828
|
-
{ children: 'State 3' },
|
|
829
|
-
{ children: 'State 4' },
|
|
830
|
-
{ children: 'State 5' },
|
|
831
|
-
];
|
|
832
|
-
|
|
833
|
-
await edgeCaseUtils.testRapidStateChanges(Select, stateProps);
|
|
834
|
-
});
|
|
835
|
-
|
|
836
|
-
it('should handle rapid user interactions', async () => {
|
|
837
|
-
const { container } = renderWithProviders(<Select />);
|
|
838
|
-
|
|
839
|
-
const select = container.querySelector('[data-testid="select-root"]');
|
|
840
|
-
expect(select).toBeInTheDocument();
|
|
841
|
-
|
|
842
|
-
// Rapidly interact with the component
|
|
843
|
-
for (let i = 0; i < 10; i++) {
|
|
844
|
-
if (select) {
|
|
845
|
-
fireEvent.click(select);
|
|
846
|
-
}
|
|
847
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
expect(select).toBeInTheDocument();
|
|
851
|
-
});
|
|
852
|
-
});
|
|
853
|
-
|
|
854
|
-
describe('Memory Management', () => {
|
|
855
|
-
it('should not leak memory with repeated renders', () => {
|
|
856
|
-
edgeCaseUtils.testMemoryLeaks(Select, { children: 'Memory test' });
|
|
857
|
-
});
|
|
858
|
-
});
|
|
859
|
-
|
|
860
|
-
describe('Boundary Conditions', () => {
|
|
861
|
-
it('should handle boundary prop values', () => {
|
|
862
|
-
const boundaryProps = [
|
|
863
|
-
{ children: '' },
|
|
864
|
-
{ children: 0 },
|
|
865
|
-
{ children: false },
|
|
866
|
-
{ children: [] },{ className: '' },
|
|
867
|
-
{ 'data-testid': '' },
|
|
868
|
-
];
|
|
869
|
-
|
|
870
|
-
edgeCaseUtils.testBoundaryConditions(Select, boundaryProps);
|
|
871
|
-
});
|
|
872
|
-
});
|
|
873
|
-
|
|
874
|
-
describe('Complex Data Structures', () => {
|
|
875
|
-
it('should handle deeply nested objects', () => {
|
|
876
|
-
const deepObject = edgeCaseUtils.generateExtremeData.deepObject(5);
|
|
877
|
-
|
|
878
|
-
const { container } = renderWithProviders(<Select data={deepObject} />);
|
|
879
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
880
|
-
});
|
|
881
|
-
|
|
882
|
-
it('should handle large arrays', () => {
|
|
883
|
-
const largeArray = edgeCaseUtils.generateExtremeData.largeArray(1000);
|
|
884
|
-
|
|
885
|
-
const { container } = renderWithProviders(<Select items={largeArray} />);
|
|
886
|
-
expect(container.querySelector('[data-testid="select-root"]')).toBeInTheDocument();
|
|
887
|
-
});
|
|
888
|
-
});
|
|
889
|
-
});
|
|
890
|
-
});
|