@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,408 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { screen } from '@testing-library/react';
|
|
3
|
-
import { renderWithProviders } from '../../../__tests__/shared';
|
|
4
|
-
import userEvent from '@testing-library/user-event';
|
|
5
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
6
|
-
import { PasswordChangeForm } from '../PasswordChangeForm';
|
|
7
|
-
|
|
8
|
-
describe('PasswordChangeForm Accessibility', () => {
|
|
9
|
-
const user = userEvent.setup();
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
vi.clearAllMocks();
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
const renderPasswordChangeForm = (props = {}) => {
|
|
16
|
-
const defaultProps = {
|
|
17
|
-
onSubmit: vi.fn(),
|
|
18
|
-
...props
|
|
19
|
-
};
|
|
20
|
-
return renderWithProviders(<PasswordChangeForm {...defaultProps} />);
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
describe('WCAG 2.1 AA Compliance', () => {
|
|
24
|
-
it('has proper form structure with semantic HTML', () => {
|
|
25
|
-
renderPasswordChangeForm();
|
|
26
|
-
|
|
27
|
-
// Check for proper form elements
|
|
28
|
-
expect(screen.getByLabelText('New Password')).toBeInTheDocument();
|
|
29
|
-
expect(screen.getByLabelText('Confirm Password')).toBeInTheDocument();
|
|
30
|
-
expect(screen.getByRole('button', { name: 'Change Password' })).toBeInTheDocument();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('has proper label associations', () => {
|
|
34
|
-
renderPasswordChangeForm();
|
|
35
|
-
|
|
36
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
37
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
38
|
-
|
|
39
|
-
// Check that labels are properly associated with inputs
|
|
40
|
-
expect(newPasswordInput).toHaveAttribute('id', 'new-password');
|
|
41
|
-
expect(confirmPasswordInput).toHaveAttribute('id', 'confirm-password');
|
|
42
|
-
|
|
43
|
-
// Verify label associations
|
|
44
|
-
const newPasswordLabel = screen.getByText('New Password');
|
|
45
|
-
const confirmPasswordLabel = screen.getByText('Confirm Password');
|
|
46
|
-
|
|
47
|
-
expect(newPasswordLabel).toHaveAttribute('for', 'new-password');
|
|
48
|
-
expect(confirmPasswordLabel).toHaveAttribute('for', 'confirm-password');
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('has proper input types for security', () => {
|
|
52
|
-
renderPasswordChangeForm();
|
|
53
|
-
|
|
54
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
55
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
56
|
-
|
|
57
|
-
// Password fields should be type="password" for security
|
|
58
|
-
expect(newPasswordInput).toHaveAttribute('type', 'password');
|
|
59
|
-
expect(confirmPasswordInput).toHaveAttribute('type', 'password');
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('has required field indicators', () => {
|
|
63
|
-
renderPasswordChangeForm();
|
|
64
|
-
|
|
65
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
66
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
67
|
-
|
|
68
|
-
// Required fields should have the required attribute
|
|
69
|
-
expect(newPasswordInput).toHaveAttribute('required');
|
|
70
|
-
expect(confirmPasswordInput).toHaveAttribute('required');
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe('Screen Reader Support', () => {
|
|
75
|
-
it('announces errors with proper ARIA attributes', async () => {
|
|
76
|
-
renderPasswordChangeForm();
|
|
77
|
-
|
|
78
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
79
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
80
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
81
|
-
|
|
82
|
-
// Trigger validation error
|
|
83
|
-
await user.type(newPasswordInput, 'short');
|
|
84
|
-
await user.type(confirmPasswordInput, 'short');
|
|
85
|
-
await user.click(submitButton);
|
|
86
|
-
|
|
87
|
-
// Error should be announced to screen readers
|
|
88
|
-
const errorElement = screen.getByRole('alert');
|
|
89
|
-
expect(errorElement).toBeInTheDocument();
|
|
90
|
-
expect(errorElement).toHaveTextContent('Password must be at least 8 characters.');
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('provides clear error messages for screen readers', async () => {
|
|
94
|
-
renderPasswordChangeForm();
|
|
95
|
-
|
|
96
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
97
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
98
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
99
|
-
|
|
100
|
-
// Test password length error
|
|
101
|
-
await user.type(newPasswordInput, 'short');
|
|
102
|
-
await user.type(confirmPasswordInput, 'short');
|
|
103
|
-
await user.click(submitButton);
|
|
104
|
-
|
|
105
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Password must be at least 8 characters.');
|
|
106
|
-
|
|
107
|
-
// Test password mismatch error
|
|
108
|
-
await user.clear(newPasswordInput);
|
|
109
|
-
await user.clear(confirmPasswordInput);
|
|
110
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
111
|
-
await user.type(confirmPasswordInput, 'differentpassword');
|
|
112
|
-
await user.click(submitButton);
|
|
113
|
-
|
|
114
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Passwords do not match.');
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('announces loading state changes', async () => {
|
|
118
|
-
const onSubmit = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({}), 100)));
|
|
119
|
-
renderPasswordChangeForm({ onSubmit });
|
|
120
|
-
|
|
121
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
122
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
123
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
124
|
-
|
|
125
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
126
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
127
|
-
await user.click(submitButton);
|
|
128
|
-
|
|
129
|
-
// Button text changes to indicate loading state
|
|
130
|
-
expect(screen.getByRole('button', { name: 'Changing...' })).toBeInTheDocument();
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('provides clear button labels', () => {
|
|
134
|
-
renderPasswordChangeForm();
|
|
135
|
-
|
|
136
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
137
|
-
expect(submitButton).toHaveAccessibleName('Change Password');
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
describe('Keyboard Navigation', () => {
|
|
142
|
-
it('supports full keyboard navigation', async () => {
|
|
143
|
-
renderPasswordChangeForm();
|
|
144
|
-
|
|
145
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
146
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
147
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
148
|
-
|
|
149
|
-
// Start with first input focused
|
|
150
|
-
newPasswordInput.focus();
|
|
151
|
-
expect(newPasswordInput).toHaveFocus();
|
|
152
|
-
|
|
153
|
-
// Tab to next input
|
|
154
|
-
await user.tab();
|
|
155
|
-
expect(confirmPasswordInput).toHaveFocus();
|
|
156
|
-
|
|
157
|
-
// Fill the form to enable the button
|
|
158
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
159
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
160
|
-
|
|
161
|
-
// Tab to submit button
|
|
162
|
-
confirmPasswordInput.focus();
|
|
163
|
-
await user.tab();
|
|
164
|
-
expect(submitButton).toHaveFocus();
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('supports Enter key for form submission', async () => {
|
|
168
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
169
|
-
renderPasswordChangeForm({ onSubmit });
|
|
170
|
-
|
|
171
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
172
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
173
|
-
|
|
174
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
175
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
176
|
-
|
|
177
|
-
// Submit form with Enter key
|
|
178
|
-
await user.keyboard('{Enter}');
|
|
179
|
-
|
|
180
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
181
|
-
newPassword: 'newpassword123',
|
|
182
|
-
confirmPassword: 'newpassword123'
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('supports Escape key to clear form', async () => {
|
|
187
|
-
renderPasswordChangeForm();
|
|
188
|
-
|
|
189
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
190
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
191
|
-
|
|
192
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
193
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
194
|
-
|
|
195
|
-
// Focus on an input and press Escape
|
|
196
|
-
newPasswordInput.focus();
|
|
197
|
-
await user.keyboard('{Escape}');
|
|
198
|
-
|
|
199
|
-
// Input should be cleared (browser default behavior)
|
|
200
|
-
// This test documents the expected behavior
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it('maintains focus during form interactions', async () => {
|
|
204
|
-
renderPasswordChangeForm();
|
|
205
|
-
|
|
206
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
207
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
208
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
209
|
-
|
|
210
|
-
// Focus on first input
|
|
211
|
-
newPasswordInput.focus();
|
|
212
|
-
expect(newPasswordInput).toHaveFocus();
|
|
213
|
-
|
|
214
|
-
// Type in first input
|
|
215
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
216
|
-
expect(newPasswordInput).toHaveFocus();
|
|
217
|
-
|
|
218
|
-
// Tab to second input
|
|
219
|
-
await user.tab();
|
|
220
|
-
expect(confirmPasswordInput).toHaveFocus();
|
|
221
|
-
|
|
222
|
-
// Type in second input
|
|
223
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
224
|
-
expect(confirmPasswordInput).toHaveFocus();
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
describe('Focus Management', () => {
|
|
229
|
-
it('maintains focus during loading states', async () => {
|
|
230
|
-
const onSubmit = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({}), 100)));
|
|
231
|
-
renderPasswordChangeForm({ onSubmit });
|
|
232
|
-
|
|
233
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
234
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
235
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
236
|
-
|
|
237
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
238
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
239
|
-
|
|
240
|
-
// Focus on submit button and click
|
|
241
|
-
submitButton.focus();
|
|
242
|
-
await user.click(submitButton);
|
|
243
|
-
|
|
244
|
-
// Button should remain focused during loading
|
|
245
|
-
expect(screen.getByRole('button', { name: 'Changing...' })).toHaveFocus();
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it('handles focus when inputs are disabled', async () => {
|
|
249
|
-
const onSubmit = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({}), 100)));
|
|
250
|
-
renderPasswordChangeForm({ onSubmit });
|
|
251
|
-
|
|
252
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
253
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
254
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
255
|
-
|
|
256
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
257
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
258
|
-
await user.click(submitButton);
|
|
259
|
-
|
|
260
|
-
// Inputs should be disabled during loading
|
|
261
|
-
expect(newPasswordInput).toBeDisabled();
|
|
262
|
-
expect(confirmPasswordInput).toBeDisabled();
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
describe('High Contrast Support', () => {
|
|
267
|
-
it('has sufficient color contrast for text', () => {
|
|
268
|
-
renderPasswordChangeForm();
|
|
269
|
-
|
|
270
|
-
// Check that text elements are present and visible
|
|
271
|
-
expect(screen.getByText('New Password')).toBeInTheDocument();
|
|
272
|
-
expect(screen.getByText('Confirm Password')).toBeInTheDocument();
|
|
273
|
-
expect(screen.getByRole('button', { name: 'Change Password' })).toBeInTheDocument();
|
|
274
|
-
|
|
275
|
-
// Note: Actual color contrast testing would require CSS-in-JS testing
|
|
276
|
-
// or visual regression testing tools
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('has proper focus indicators', async () => {
|
|
280
|
-
renderPasswordChangeForm();
|
|
281
|
-
|
|
282
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
283
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
284
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
285
|
-
|
|
286
|
-
// Test focus indicators
|
|
287
|
-
newPasswordInput.focus();
|
|
288
|
-
expect(newPasswordInput).toHaveFocus();
|
|
289
|
-
|
|
290
|
-
await user.tab();
|
|
291
|
-
expect(confirmPasswordInput).toHaveFocus();
|
|
292
|
-
|
|
293
|
-
// Fill form to enable button
|
|
294
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
295
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
296
|
-
|
|
297
|
-
confirmPasswordInput.focus();
|
|
298
|
-
await user.tab();
|
|
299
|
-
expect(submitButton).toHaveFocus();
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
describe('Error Identification', () => {
|
|
304
|
-
it('clearly identifies form errors', async () => {
|
|
305
|
-
renderPasswordChangeForm();
|
|
306
|
-
|
|
307
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
308
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
309
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
310
|
-
|
|
311
|
-
// Trigger validation error
|
|
312
|
-
await user.type(newPasswordInput, 'short');
|
|
313
|
-
await user.type(confirmPasswordInput, 'short');
|
|
314
|
-
await user.click(submitButton);
|
|
315
|
-
|
|
316
|
-
// Error should be clearly identified
|
|
317
|
-
const errorElement = screen.getByRole('alert');
|
|
318
|
-
expect(errorElement).toBeInTheDocument();
|
|
319
|
-
expect(errorElement).toHaveTextContent('Password must be at least 8 characters.');
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it('provides clear error recovery instructions', async () => {
|
|
323
|
-
renderPasswordChangeForm();
|
|
324
|
-
|
|
325
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
326
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
327
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
328
|
-
|
|
329
|
-
// Test password length error
|
|
330
|
-
await user.type(newPasswordInput, 'short');
|
|
331
|
-
await user.type(confirmPasswordInput, 'short');
|
|
332
|
-
await user.click(submitButton);
|
|
333
|
-
|
|
334
|
-
const errorMessage = screen.getByRole('alert').textContent;
|
|
335
|
-
expect(errorMessage).toContain('Password must be at least 8 characters.');
|
|
336
|
-
|
|
337
|
-
// Error message should provide clear guidance
|
|
338
|
-
expect(errorMessage).toContain('8 characters');
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
describe('Form Validation Announcements', () => {
|
|
343
|
-
it('announces validation errors immediately', async () => {
|
|
344
|
-
renderPasswordChangeForm();
|
|
345
|
-
|
|
346
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
347
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
348
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
349
|
-
|
|
350
|
-
// Submit with invalid data
|
|
351
|
-
await user.type(newPasswordInput, 'short');
|
|
352
|
-
await user.type(confirmPasswordInput, 'short');
|
|
353
|
-
await user.click(submitButton);
|
|
354
|
-
|
|
355
|
-
// Error should be announced immediately
|
|
356
|
-
expect(screen.getByRole('alert')).toBeInTheDocument();
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
it('announces when validation passes', async () => {
|
|
360
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
361
|
-
renderPasswordChangeForm({ onSubmit });
|
|
362
|
-
|
|
363
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
364
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
365
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
366
|
-
|
|
367
|
-
// Submit with valid data
|
|
368
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
369
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
370
|
-
await user.click(submitButton);
|
|
371
|
-
|
|
372
|
-
// No error should be announced
|
|
373
|
-
expect(screen.queryByRole('alert')).not.toBeInTheDocument();
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
describe('Security Considerations', () => {
|
|
378
|
-
it('does not expose password values in DOM', () => {
|
|
379
|
-
renderPasswordChangeForm();
|
|
380
|
-
|
|
381
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
382
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
383
|
-
|
|
384
|
-
// Password fields should be type="password" to prevent visual exposure
|
|
385
|
-
expect(newPasswordInput).toHaveAttribute('type', 'password');
|
|
386
|
-
expect(confirmPasswordInput).toHaveAttribute('type', 'password');
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
it('handles password field security properly', async () => {
|
|
390
|
-
renderPasswordChangeForm();
|
|
391
|
-
|
|
392
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
393
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
394
|
-
|
|
395
|
-
// Type passwords
|
|
396
|
-
await user.type(newPasswordInput, 'secretpassword');
|
|
397
|
-
await user.type(confirmPasswordInput, 'secretpassword');
|
|
398
|
-
|
|
399
|
-
// Values should be present but not visually exposed
|
|
400
|
-
expect(newPasswordInput).toHaveValue('secretpassword');
|
|
401
|
-
expect(confirmPasswordInput).toHaveValue('secretpassword');
|
|
402
|
-
|
|
403
|
-
// But the type should still be password for security
|
|
404
|
-
expect(newPasswordInput).toHaveAttribute('type', 'password');
|
|
405
|
-
expect(confirmPasswordInput).toHaveAttribute('type', 'password');
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
});
|