@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,121 +0,0 @@
|
|
|
1
|
-
import { errorTestingUtils, TestErrorBoundary } from '../../__tests__/ErrorTesting.enhanced.test';
|
|
2
|
-
import { userEvent } from '@testing-library/user-event';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { screen, waitFor } from '@testing-library/react';
|
|
5
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
6
|
-
import { Tooltip } from '../Tooltip';
|
|
7
|
-
import { renderWithProviders } from "../../../__tests__/shared";
|
|
8
|
-
|
|
9
|
-
describe('Tooltip Accessibility', () => {
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
vi.clearAllMocks();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('renders tooltip with proper structure', () => {
|
|
15
|
-
renderWithProviders(
|
|
16
|
-
<Tooltip content="Tooltip text">
|
|
17
|
-
<button>Hover me</button>
|
|
18
|
-
</Tooltip>
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
// Check that the trigger content is rendered
|
|
22
|
-
const trigger = screen.getByText('Hover me');
|
|
23
|
-
expect(trigger).toBeInTheDocument();
|
|
24
|
-
|
|
25
|
-
// Tooltip content is not immediately available in DOM due to Radix UI behavior
|
|
26
|
-
// This is expected behavior for accessibility-first tooltips
|
|
27
|
-
});
|
|
28
|
-
describe('Tooltip Error Handling', () => {
|
|
29
|
-
const user = userEvent.setup();
|
|
30
|
-
let restoreConsole: (() => void) | null = null;
|
|
31
|
-
|
|
32
|
-
beforeEach(() => {
|
|
33
|
-
restoreConsole = errorTestingUtils.suppressConsoleErrors();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
afterEach(() => {
|
|
37
|
-
if (restoreConsole) {
|
|
38
|
-
restoreConsole();
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should handle component errors gracefully', () => {
|
|
43
|
-
const ErrorComponent = () => {
|
|
44
|
-
throw new Error('Tooltip component error');
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
renderWithProviders(
|
|
48
|
-
<TestErrorBoundary>
|
|
49
|
-
<ErrorComponent />
|
|
50
|
-
</TestErrorBoundary>
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
expect(screen.getByTestId('error-boundary')).toBeInTheDocument();
|
|
54
|
-
expect(screen.getByText('Error: Tooltip component error')).toBeInTheDocument();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should handle async errors', async () => {
|
|
58
|
-
const AsyncErrorComponent = ({ shouldFail }: { shouldFail: boolean }) => {
|
|
59
|
-
const [error, setError] = React.useState<Error | null>(null);
|
|
60
|
-
|
|
61
|
-
React.useEffect(() => {
|
|
62
|
-
if (shouldFail) {
|
|
63
|
-
setError(new Error('Async error'));
|
|
64
|
-
}
|
|
65
|
-
}, [shouldFail]);
|
|
66
|
-
|
|
67
|
-
if (error) {
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return <div>Async component</div>;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
renderWithProviders(
|
|
75
|
-
<TestErrorBoundary>
|
|
76
|
-
<AsyncErrorComponent shouldFail={true} />
|
|
77
|
-
</TestErrorBoundary>
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
await waitFor(() => {
|
|
81
|
-
expect(screen.getByTestId('error-boundary')).toBeInTheDocument();
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('should handle user interaction errors', async () => {
|
|
86
|
-
const ErrorComponent = errorTestingUtils.createErrorThrowingComponent(
|
|
87
|
-
'Tooltip interaction error',
|
|
88
|
-
'click'
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
renderWithProviders(
|
|
92
|
-
<TestErrorBoundary>
|
|
93
|
-
<ErrorComponent />
|
|
94
|
-
</TestErrorBoundary>
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
await user.click(screen.getByTestId('error-button'));
|
|
98
|
-
|
|
99
|
-
await waitFor(() => {
|
|
100
|
-
expect(screen.getByTestId('error-display')).toBeInTheDocument();
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('should recover from errors when props change', async () => {
|
|
105
|
-
const TestComponent = ({ shouldError }: { shouldError: boolean }) => {
|
|
106
|
-
if (shouldError) {
|
|
107
|
-
throw new Error('Tooltip prop error');
|
|
108
|
-
}
|
|
109
|
-
return <div>Normal content</div>;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
await errorTestingUtils.testErrorRecovery(
|
|
113
|
-
TestComponent,
|
|
114
|
-
{ shouldError: true },
|
|
115
|
-
{ shouldError: false }
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
expect(screen.getByText('Normal content')).toBeInTheDocument();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { errorTestingUtils, TestErrorBoundary } from '../../__tests__/ErrorTesting.enhanced.test';
|
|
2
|
-
import { userEvent } from '@testing-library/user-event';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { screen, waitFor } from '@testing-library/react';
|
|
5
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
6
|
-
import { Tooltip } from '../Tooltip';
|
|
7
|
-
import { renderWithProviders } from "../../../__tests__/shared";
|
|
8
|
-
|
|
9
|
-
describe('Tooltip Component', () => {
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
vi.clearAllMocks();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('renders without crashing', () => {
|
|
15
|
-
renderWithProviders(
|
|
16
|
-
<Tooltip content="Tooltip text">
|
|
17
|
-
<button>Hover me</button>
|
|
18
|
-
</Tooltip>
|
|
19
|
-
);
|
|
20
|
-
expect(screen.getByText('Hover me')).toBeInTheDocument();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should render with basic content', () => {
|
|
24
|
-
renderWithProviders(
|
|
25
|
-
<Tooltip content="Test tooltip">
|
|
26
|
-
<button>Hover me</button>
|
|
27
|
-
</Tooltip>
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
expect(screen.getByRole('button', { name: 'Hover me' })).toBeInTheDocument();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should handle accessibility', () => {
|
|
34
|
-
renderWithProviders(
|
|
35
|
-
<Tooltip content="Accessible tooltip">
|
|
36
|
-
<span>Accessible content</span>
|
|
37
|
-
</Tooltip>
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
expect(screen.getByText('Accessible content')).toBeInTheDocument();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should support custom content', () => {
|
|
44
|
-
renderWithProviders(
|
|
45
|
-
<Tooltip content="Custom tooltip content">
|
|
46
|
-
<div>Custom trigger</div>
|
|
47
|
-
</Tooltip>
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
expect(screen.getByText('Custom trigger')).toBeInTheDocument();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should handle dynamic content', () => {
|
|
54
|
-
renderWithProviders(
|
|
55
|
-
<Tooltip content="Dynamic tooltip">
|
|
56
|
-
<span>Dynamic content</span>
|
|
57
|
-
</Tooltip>
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
expect(screen.getByText('Dynamic content')).toBeInTheDocument();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('should support complex interactions', () => {
|
|
64
|
-
renderWithProviders(
|
|
65
|
-
<Tooltip content="Interactive tooltip">
|
|
66
|
-
<button>Interactive button</button>
|
|
67
|
-
</Tooltip>
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
expect(screen.getByRole('button', { name: 'Interactive button' })).toBeInTheDocument();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should handle multiple instances', () => {
|
|
74
|
-
renderWithProviders(
|
|
75
|
-
<Tooltip content="Multiple tooltip">
|
|
76
|
-
<span>Multiple instance</span>
|
|
77
|
-
</Tooltip>
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
expect(screen.getByText('Multiple instance')).toBeInTheDocument();
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('should support custom styling', () => {
|
|
84
|
-
renderWithProviders(
|
|
85
|
-
<Tooltip content="Styled tooltip">
|
|
86
|
-
<div>Styled content</div>
|
|
87
|
-
</Tooltip>
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
expect(screen.getByText('Styled content')).toBeInTheDocument();
|
|
91
|
-
});
|
|
92
|
-
describe('Tooltip Error Handling', () => {
|
|
93
|
-
const user = userEvent.setup();
|
|
94
|
-
let restoreConsole: (() => void) | null = null;
|
|
95
|
-
|
|
96
|
-
beforeEach(() => {
|
|
97
|
-
restoreConsole = errorTestingUtils.suppressConsoleErrors();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
afterEach(() => {
|
|
101
|
-
if (restoreConsole) {
|
|
102
|
-
restoreConsole();
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('should handle component errors gracefully', () => {
|
|
107
|
-
const ErrorComponent = () => {
|
|
108
|
-
throw new Error('Tooltip component error');
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
renderWithProviders(
|
|
112
|
-
<TestErrorBoundary>
|
|
113
|
-
<ErrorComponent />
|
|
114
|
-
</TestErrorBoundary>
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
expect(screen.getByTestId('error-boundary')).toBeInTheDocument();
|
|
118
|
-
expect(screen.getByText('Error: Tooltip component error')).toBeInTheDocument();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('should handle async errors', async () => {
|
|
122
|
-
const AsyncErrorComponent = ({ shouldFail }: { shouldFail: boolean }) => {
|
|
123
|
-
const [error, setError] = React.useState<Error | null>(null);
|
|
124
|
-
|
|
125
|
-
React.useEffect(() => {
|
|
126
|
-
if (shouldFail) {
|
|
127
|
-
setError(new Error('Async error'));
|
|
128
|
-
}
|
|
129
|
-
}, [shouldFail]);
|
|
130
|
-
|
|
131
|
-
if (error) {
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return <div>Async component</div>;
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
renderWithProviders(
|
|
139
|
-
<TestErrorBoundary>
|
|
140
|
-
<AsyncErrorComponent shouldFail={true} />
|
|
141
|
-
</TestErrorBoundary>
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
await waitFor(() => {
|
|
145
|
-
expect(screen.getByTestId('error-boundary')).toBeInTheDocument();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('should handle user interaction errors', async () => {
|
|
150
|
-
const ErrorComponent = errorTestingUtils.createErrorThrowingComponent(
|
|
151
|
-
'Tooltip interaction error',
|
|
152
|
-
'click'
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
renderWithProviders(
|
|
156
|
-
<TestErrorBoundary>
|
|
157
|
-
<ErrorComponent />
|
|
158
|
-
</TestErrorBoundary>
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
await user.click(screen.getByTestId('error-button'));
|
|
162
|
-
|
|
163
|
-
await waitFor(() => {
|
|
164
|
-
expect(screen.getByTestId('error-display')).toBeInTheDocument();
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it('should recover from errors when props change', async () => {
|
|
169
|
-
const TestComponent = ({ shouldError }: { shouldError: boolean }) => {
|
|
170
|
-
if (shouldError) {
|
|
171
|
-
throw new Error('Tooltip prop error');
|
|
172
|
-
}
|
|
173
|
-
return <div>Normal content</div>;
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
await errorTestingUtils.testErrorRecovery(
|
|
177
|
-
TestComponent,
|
|
178
|
-
{ shouldError: true },
|
|
179
|
-
{ shouldError: false }
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
expect(screen.getByText('Normal content')).toBeInTheDocument();
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
});
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { screen, within, waitFor } from '@testing-library/react';
|
|
4
|
-
import userEvent from '@testing-library/user-event';
|
|
5
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
6
|
-
import { UserMenu, UserMenuLoading } from '../UserMenu';
|
|
7
|
-
import { renderWithProviders } from "../../../__tests__/shared";
|
|
8
|
-
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
9
|
-
|
|
10
|
-
const mockUser = {
|
|
11
|
-
id: '1',
|
|
12
|
-
email: 'a11y@example.com',
|
|
13
|
-
app_metadata: {},
|
|
14
|
-
user_metadata: {
|
|
15
|
-
display_name: 'A11y User',
|
|
16
|
-
full_name: 'A11y User Full',
|
|
17
|
-
avatar_url: 'https://example.com/avatar.jpg'
|
|
18
|
-
},
|
|
19
|
-
aud: 'authenticated',
|
|
20
|
-
created_at: '2023-01-01T00:00:00Z'
|
|
21
|
-
} as any;
|
|
22
|
-
|
|
23
|
-
describe('UserMenu Accessibility Tests', () => {
|
|
24
|
-
const user = userEvent.setup();
|
|
25
|
-
|
|
26
|
-
beforeEach(() => {
|
|
27
|
-
vi.clearAllMocks();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('has a button trigger with accessible name', () => {
|
|
31
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
32
|
-
const trigger = screen.getByRole('combobox', { name: /a11y user/i });
|
|
33
|
-
expect(trigger).toBeInTheDocument();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('menu and menuitems have correct roles and labels', async () => {
|
|
37
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
38
|
-
const trigger = screen.getByRole('combobox', { name: /a11y user/i });
|
|
39
|
-
await user.click(trigger);
|
|
40
|
-
const menu = screen.getByRole('listbox');
|
|
41
|
-
expect(menu).toBeInTheDocument();
|
|
42
|
-
const items = within(menu).getAllByRole('option');
|
|
43
|
-
expect(items.length).toBeGreaterThan(0);
|
|
44
|
-
expect(screen.getByText('Change Password')).toBeInTheDocument();
|
|
45
|
-
expect(screen.getByText('Sign out')).toBeInTheDocument();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('dropdown label is accessible and contains user info', async () => {
|
|
49
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
50
|
-
const trigger = screen.getByRole('combobox', { name: /a11y user/i });
|
|
51
|
-
await user.click(trigger);
|
|
52
|
-
// There may be multiple elements with the text 'A11y User'
|
|
53
|
-
expect(screen.getAllByText('A11y User').length).toBeGreaterThan(0);
|
|
54
|
-
expect(screen.getByText('a11y@example.com')).toBeInTheDocument();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('avatar has meaningful alt text or fallback initial', () => {
|
|
58
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
59
|
-
// AvatarImage alt is displayName, but fallback may be rendered in test
|
|
60
|
-
const img = screen.queryByAltText('A11y User');
|
|
61
|
-
if (img) {
|
|
62
|
-
expect(img).toBeInTheDocument();
|
|
63
|
-
} else {
|
|
64
|
-
// Fallback initial 'A' should be present
|
|
65
|
-
expect(screen.getAllByText('A').length).toBeGreaterThan(0);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('supports tab navigation and keyboard activation', async () => {
|
|
70
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
71
|
-
const trigger = screen.getByRole('combobox', { name: /a11y user/i });
|
|
72
|
-
trigger.focus();
|
|
73
|
-
expect(trigger).toHaveFocus();
|
|
74
|
-
await user.keyboard('[Enter]');
|
|
75
|
-
const menu = screen.getByRole('listbox');
|
|
76
|
-
expect(menu).toBeInTheDocument();
|
|
77
|
-
// Tab to first menuitem
|
|
78
|
-
await user.tab();
|
|
79
|
-
const items = within(menu).getAllByRole('option');
|
|
80
|
-
expect(items[0]).toBeInTheDocument();
|
|
81
|
-
// Note: Focus management in Select component may not move focus to individual options
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('supports arrow key navigation in menu', async () => {
|
|
85
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
86
|
-
const trigger = screen.getByRole('combobox', { name: /a11y user/i });
|
|
87
|
-
await user.click(trigger);
|
|
88
|
-
const menu = screen.getByRole('listbox');
|
|
89
|
-
const items = within(menu).getAllByRole('option');
|
|
90
|
-
expect(items[0]).toBeInTheDocument();
|
|
91
|
-
expect(items[1]).toBeInTheDocument();
|
|
92
|
-
// Note: Arrow key navigation in Select component may not move focus to individual options
|
|
93
|
-
await user.keyboard('[ArrowUp]');
|
|
94
|
-
expect(items[0]).toBeInTheDocument();
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('traps focus in password dialog and supports Escape to close', async () => {
|
|
98
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
99
|
-
const trigger = screen.getByRole('combobox', { name: /a11y user/i });
|
|
100
|
-
await user.click(trigger);
|
|
101
|
-
// Open dialog
|
|
102
|
-
const changePasswordButton = screen.getByText('Change Password');
|
|
103
|
-
await user.click(changePasswordButton);
|
|
104
|
-
|
|
105
|
-
// Wait for dialog to open
|
|
106
|
-
await waitFor(() => {
|
|
107
|
-
const dialog = screen.getByRole('dialog', { hidden: true });
|
|
108
|
-
expect(dialog).toBeInTheDocument();
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
// Focus should be on the first input in the dialog
|
|
112
|
-
const passwordInput = screen.getByLabelText('New Password');
|
|
113
|
-
expect(passwordInput).toHaveFocus();
|
|
114
|
-
|
|
115
|
-
// Close dialog
|
|
116
|
-
await user.keyboard('[Escape]');
|
|
117
|
-
await waitFor(() => {
|
|
118
|
-
expect(screen.queryByRole('dialog', { hidden: true })).not.toBeInTheDocument();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('announces loading state in UserMenu.Loading', () => {
|
|
123
|
-
renderWithProviders(<UserMenuLoading />);
|
|
124
|
-
const status = screen.getByRole('status');
|
|
125
|
-
expect(status).toHaveAttribute('aria-live', 'polite');
|
|
126
|
-
expect(status).toHaveAttribute('aria-label', 'Loading user menu');
|
|
127
|
-
expect(screen.getByText(/loading/i)).toBeInTheDocument();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// Automated axe check if available
|
|
131
|
-
// Uncomment if jest-axe or @axe-core/react is installed
|
|
132
|
-
// import { axe, toHaveNoViolations } from 'jest-axe';
|
|
133
|
-
// expect.extend(toHaveNoViolations);
|
|
134
|
-
// it('has no axe violations', async () => {
|
|
135
|
-
// const { container } = renderWithProviders(<UserMenu user={mockUser} />);
|
|
136
|
-
// const results = await axe(container);
|
|
137
|
-
// expect(results).toHaveNoViolations();
|
|
138
|
-
// });
|
|
139
|
-
});
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { screen, waitFor, within } from '@testing-library/react';
|
|
4
|
-
import userEvent from '@testing-library/user-event';
|
|
5
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
6
|
-
import { UserMenu } from '../UserMenu';
|
|
7
|
-
import { renderWithProviders } from "../../../__tests__/shared";
|
|
8
|
-
import { UnifiedAuthProvider } from '../../../providers/UnifiedAuthProvider';
|
|
9
|
-
|
|
10
|
-
const mockUser = {
|
|
11
|
-
id: '1',
|
|
12
|
-
email: 'integration@example.com',
|
|
13
|
-
app_metadata: {},
|
|
14
|
-
user_metadata: {
|
|
15
|
-
display_name: 'Integration User',
|
|
16
|
-
full_name: 'Integration User Full',
|
|
17
|
-
avatar_url: 'https://example.com/avatar.jpg'
|
|
18
|
-
},
|
|
19
|
-
aud: 'authenticated',
|
|
20
|
-
created_at: '2023-01-01T00:00:00Z'
|
|
21
|
-
} as any;
|
|
22
|
-
|
|
23
|
-
describe('UserMenu Integration Tests', () => {
|
|
24
|
-
const user = userEvent.setup();
|
|
25
|
-
|
|
26
|
-
beforeEach(() => {
|
|
27
|
-
vi.clearAllMocks();
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('full user flow: open menu, change password, sign out', async () => {
|
|
31
|
-
const onSignOut = vi.fn().mockResolvedValue(undefined);
|
|
32
|
-
const onChangePassword = vi.fn().mockResolvedValue({ error: null });
|
|
33
|
-
|
|
34
|
-
renderWithProviders(<UserMenu user={mockUser} onSignOut={onSignOut} onChangePassword={onChangePassword} />);
|
|
35
|
-
|
|
36
|
-
// Open menu
|
|
37
|
-
const trigger = screen.getByRole('combobox', { name: /integration user/i });
|
|
38
|
-
await user.click(trigger);
|
|
39
|
-
|
|
40
|
-
// Change password
|
|
41
|
-
const changePasswordButton = screen.getByText('Change Password');
|
|
42
|
-
await user.click(changePasswordButton);
|
|
43
|
-
|
|
44
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
45
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
46
|
-
await user.type(newPasswordInput, 'integration123');
|
|
47
|
-
await user.type(confirmPasswordInput, 'integration123');
|
|
48
|
-
|
|
49
|
-
const submitButton = screen.getByRole('button', { name: /change password/i, hidden: true });
|
|
50
|
-
await user.click(submitButton);
|
|
51
|
-
|
|
52
|
-
await waitFor(() => {
|
|
53
|
-
expect(onChangePassword).toHaveBeenCalledWith('integration123', 'integration123');
|
|
54
|
-
}, { timeout: 3000 });
|
|
55
|
-
|
|
56
|
-
// Open menu again and sign out
|
|
57
|
-
await user.click(trigger);
|
|
58
|
-
const signOutButton = screen.getByText('Sign out');
|
|
59
|
-
await user.click(signOutButton);
|
|
60
|
-
|
|
61
|
-
expect(onSignOut).toHaveBeenCalled();
|
|
62
|
-
}, 10000);
|
|
63
|
-
|
|
64
|
-
it('menu closes after sign out', async () => {
|
|
65
|
-
const onSignOut = vi.fn().mockResolvedValue(undefined);
|
|
66
|
-
renderWithProviders(<UserMenu user={mockUser} onSignOut={onSignOut} />);
|
|
67
|
-
const trigger = screen.getByRole('combobox', { name: /integration user/i });
|
|
68
|
-
await user.click(trigger);
|
|
69
|
-
expect(screen.getByText('Sign out')).toBeInTheDocument();
|
|
70
|
-
const signOutButton = screen.getByText('Sign out');
|
|
71
|
-
await user.click(signOutButton);
|
|
72
|
-
// Menu should close (menu not in DOM)
|
|
73
|
-
await waitFor(() => {
|
|
74
|
-
expect(screen.queryByText('Sign out')).not.toBeInTheDocument();
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('password dialog closes on success, stays open on error', async () => {
|
|
79
|
-
const onChangePassword = vi.fn()
|
|
80
|
-
.mockResolvedValueOnce({ error: { message: 'fail' } })
|
|
81
|
-
.mockResolvedValueOnce({ error: null });
|
|
82
|
-
renderWithProviders(<UserMenu user={mockUser} onChangePassword={onChangePassword} />);
|
|
83
|
-
const trigger = screen.getByRole('combobox', { name: /integration user/i });
|
|
84
|
-
await user.click(trigger);
|
|
85
|
-
const changePasswordButton = screen.getByText('Change Password');
|
|
86
|
-
await user.click(changePasswordButton);
|
|
87
|
-
|
|
88
|
-
// Wait for dialog to open
|
|
89
|
-
await waitFor(() => {
|
|
90
|
-
expect(screen.getByRole('dialog', { hidden: true })).toBeInTheDocument();
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// First attempt - should fail and dialog stays open
|
|
94
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
95
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
96
|
-
await user.type(newPasswordInput, 'failpassword');
|
|
97
|
-
await user.type(confirmPasswordInput, 'failpassword');
|
|
98
|
-
const submitButton = screen.getByRole('button', { name: /change password/i, hidden: true });
|
|
99
|
-
await user.click(submitButton);
|
|
100
|
-
|
|
101
|
-
// Dialog should remain open after error
|
|
102
|
-
await waitFor(() => {
|
|
103
|
-
expect(onChangePassword).toHaveBeenCalledWith('failpassword', 'failpassword');
|
|
104
|
-
expect(screen.getByRole('dialog', { hidden: true })).toBeInTheDocument();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// Second attempt - should succeed and dialog closes
|
|
108
|
-
await user.clear(newPasswordInput);
|
|
109
|
-
await user.clear(confirmPasswordInput);
|
|
110
|
-
await user.type(newPasswordInput, 'successpassword');
|
|
111
|
-
await user.type(confirmPasswordInput, 'successpassword');
|
|
112
|
-
await user.click(submitButton);
|
|
113
|
-
|
|
114
|
-
// Dialog should close after success
|
|
115
|
-
await waitFor(() => {
|
|
116
|
-
expect(onChangePassword).toHaveBeenCalledWith('successpassword', 'successpassword');
|
|
117
|
-
expect(screen.queryByRole('dialog', { hidden: true })).not.toBeInTheDocument();
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('shows error message for password change failure', async () => {
|
|
122
|
-
const mockChangePassword = vi.fn().mockResolvedValue({
|
|
123
|
-
error: { message: 'Password change failed' }
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
renderWithProviders(
|
|
127
|
-
<UserMenu
|
|
128
|
-
user={mockUser}
|
|
129
|
-
onChangePassword={mockChangePassword}
|
|
130
|
-
/>
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
const trigger = screen.getByRole('combobox', { name: /integration user/i });
|
|
134
|
-
await user.click(trigger);
|
|
135
|
-
|
|
136
|
-
const changePasswordButton = screen.getByText('Change Password');
|
|
137
|
-
await user.click(changePasswordButton);
|
|
138
|
-
|
|
139
|
-
// Wait for dialog to open and fill form
|
|
140
|
-
await waitFor(() => {
|
|
141
|
-
expect(screen.getByRole('dialog', { hidden: true })).toBeInTheDocument();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
145
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
146
|
-
await user.type(newPasswordInput, 'failpassword');
|
|
147
|
-
await user.type(confirmPasswordInput, 'failpassword');
|
|
148
|
-
const submitButton = screen.getByRole('button', { name: /change password/i, hidden: true });
|
|
149
|
-
await user.click(submitButton);
|
|
150
|
-
await waitFor(() => {
|
|
151
|
-
expect(screen.getByText('Password change failed')).toBeInTheDocument();
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// Dialog should remain open
|
|
155
|
-
expect(screen.getByRole('dialog', { hidden: true })).toBeInTheDocument();
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('keyboard navigation through menu and dialog', async () => {
|
|
159
|
-
renderWithProviders(<UserMenu user={mockUser} />);
|
|
160
|
-
|
|
161
|
-
const trigger = screen.getByRole('combobox', { name: /integration user/i });
|
|
162
|
-
await user.click(trigger);
|
|
163
|
-
|
|
164
|
-
// Click on Change Password option to open dialog
|
|
165
|
-
const changePasswordOption = screen.getByText('Change Password');
|
|
166
|
-
await user.click(changePasswordOption);
|
|
167
|
-
|
|
168
|
-
// Wait for dialog to appear
|
|
169
|
-
const dialog = await screen.findByRole('dialog', { hidden: true });
|
|
170
|
-
expect(dialog).toBeInTheDocument();
|
|
171
|
-
const passwordInput = screen.getByLabelText('New Password');
|
|
172
|
-
expect(passwordInput).toHaveFocus();
|
|
173
|
-
|
|
174
|
-
// Close dialog with Escape
|
|
175
|
-
await user.keyboard('[Escape]');
|
|
176
|
-
expect(screen.queryByRole('dialog', { hidden: true })).not.toBeInTheDocument();
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('works with providers (renderWithProviders)', () => {
|
|
180
|
-
renderWithProviders(<UserMenu user={mockUser} />, { user: mockUser, isAuthenticated: true });
|
|
181
|
-
expect(screen.getByRole('combobox', { name: /integration user/i })).toBeInTheDocument();
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('does not open menu if user is null', () => {
|
|
185
|
-
renderWithProviders(<UserMenu user={null} />);
|
|
186
|
-
expect(screen.queryByRole('button')).not.toBeInTheDocument();
|
|
187
|
-
});
|
|
188
|
-
});
|