@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,561 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { screen, fireEvent, waitFor } from '@testing-library/react';
|
|
3
|
-
import userEvent from '@testing-library/user-event';
|
|
4
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
5
|
-
import { PasswordChangeForm } from '../PasswordChangeForm';
|
|
6
|
-
import { renderWithProviders } from '../../../__tests__/shared';
|
|
7
|
-
|
|
8
|
-
describe('PasswordChangeForm Component', () => {
|
|
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('Rendering', () => {
|
|
24
|
-
it('renders the form with all required elements', () => {
|
|
25
|
-
renderPasswordChangeForm();
|
|
26
|
-
|
|
27
|
-
expect(screen.getByLabelText('New Password')).toBeInTheDocument();
|
|
28
|
-
expect(screen.getByLabelText('Confirm Password')).toBeInTheDocument();
|
|
29
|
-
expect(screen.getByRole('button', { name: 'Change Password' })).toBeInTheDocument();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('applies custom className', () => {
|
|
33
|
-
renderPasswordChangeForm({ className: 'custom-class' });
|
|
34
|
-
|
|
35
|
-
const form = screen.getByRole('button', { name: 'Change Password' }).closest('form');
|
|
36
|
-
expect(form).toHaveClass('custom-class');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('renders password fields with proper attributes', () => {
|
|
40
|
-
renderPasswordChangeForm();
|
|
41
|
-
|
|
42
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
43
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
44
|
-
|
|
45
|
-
expect(newPasswordInput).toHaveAttribute('type', 'password');
|
|
46
|
-
expect(newPasswordInput).toHaveAttribute('required');
|
|
47
|
-
expect(newPasswordInput).toHaveAttribute('id', 'new-password');
|
|
48
|
-
|
|
49
|
-
expect(confirmPasswordInput).toHaveAttribute('type', 'password');
|
|
50
|
-
expect(confirmPasswordInput).toHaveAttribute('required');
|
|
51
|
-
expect(confirmPasswordInput).toHaveAttribute('id', 'confirm-password');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('Form Interactions', () => {
|
|
56
|
-
it('updates new password input value', async () => {
|
|
57
|
-
renderPasswordChangeForm();
|
|
58
|
-
|
|
59
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
60
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
61
|
-
|
|
62
|
-
expect(newPasswordInput).toHaveValue('newpassword123');
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('updates confirm password input value', async () => {
|
|
66
|
-
renderPasswordChangeForm();
|
|
67
|
-
|
|
68
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
69
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
70
|
-
|
|
71
|
-
expect(confirmPasswordInput).toHaveValue('newpassword123');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('enables submit button when both passwords are entered', async () => {
|
|
75
|
-
renderPasswordChangeForm();
|
|
76
|
-
|
|
77
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
78
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
79
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
80
|
-
|
|
81
|
-
expect(submitButton).toBeDisabled();
|
|
82
|
-
|
|
83
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
84
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
85
|
-
|
|
86
|
-
expect(submitButton).toBeEnabled();
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('disables submit button when passwords are empty', async () => {
|
|
90
|
-
renderPasswordChangeForm();
|
|
91
|
-
|
|
92
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
93
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
94
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
95
|
-
|
|
96
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
97
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
98
|
-
expect(submitButton).toBeEnabled();
|
|
99
|
-
|
|
100
|
-
await user.clear(newPasswordInput);
|
|
101
|
-
expect(submitButton).toBeDisabled();
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe('Form Submission', () => {
|
|
106
|
-
it('submits form with password values when valid', async () => {
|
|
107
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
108
|
-
renderPasswordChangeForm({ onSubmit });
|
|
109
|
-
|
|
110
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
111
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
112
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
113
|
-
|
|
114
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
115
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
116
|
-
await user.click(submitButton);
|
|
117
|
-
|
|
118
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
119
|
-
newPassword: 'newpassword123',
|
|
120
|
-
confirmPassword: 'newpassword123'
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
describe('Password Validation', () => {
|
|
126
|
-
it('shows error when password is less than 8 characters', async () => {
|
|
127
|
-
renderPasswordChangeForm();
|
|
128
|
-
|
|
129
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
130
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
131
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
132
|
-
|
|
133
|
-
await user.type(newPasswordInput, 'short');
|
|
134
|
-
await user.type(confirmPasswordInput, 'short');
|
|
135
|
-
await user.click(submitButton);
|
|
136
|
-
|
|
137
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Password must be at least 8 characters.');
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('shows error when passwords do not match', async () => {
|
|
141
|
-
renderPasswordChangeForm();
|
|
142
|
-
|
|
143
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
144
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
145
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
146
|
-
|
|
147
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
148
|
-
await user.type(confirmPasswordInput, 'differentpassword');
|
|
149
|
-
await user.click(submitButton);
|
|
150
|
-
|
|
151
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Passwords do not match.');
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('validates password length before checking match', async () => {
|
|
155
|
-
renderPasswordChangeForm();
|
|
156
|
-
|
|
157
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
158
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
159
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
160
|
-
|
|
161
|
-
await user.type(newPasswordInput, 'short');
|
|
162
|
-
await user.type(confirmPasswordInput, 'different');
|
|
163
|
-
await user.click(submitButton);
|
|
164
|
-
|
|
165
|
-
// Should show length error, not match error
|
|
166
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Password must be at least 8 characters.');
|
|
167
|
-
expect(screen.queryByText('Passwords do not match.')).not.toBeInTheDocument();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('accepts passwords with exactly 8 characters', async () => {
|
|
171
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
172
|
-
renderPasswordChangeForm({ onSubmit });
|
|
173
|
-
|
|
174
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
175
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
176
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
177
|
-
|
|
178
|
-
await user.type(newPasswordInput, '12345678');
|
|
179
|
-
await user.type(confirmPasswordInput, '12345678');
|
|
180
|
-
await user.click(submitButton);
|
|
181
|
-
|
|
182
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
183
|
-
newPassword: '12345678',
|
|
184
|
-
confirmPassword: '12345678'
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('accepts passwords with special characters', async () => {
|
|
189
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
190
|
-
renderPasswordChangeForm({ onSubmit });
|
|
191
|
-
|
|
192
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
193
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
194
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
195
|
-
|
|
196
|
-
await user.type(newPasswordInput, 'P@ssw0rd!');
|
|
197
|
-
await user.type(confirmPasswordInput, 'P@ssw0rd!');
|
|
198
|
-
await user.click(submitButton);
|
|
199
|
-
|
|
200
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
201
|
-
newPassword: 'P@ssw0rd!',
|
|
202
|
-
confirmPassword: 'P@ssw0rd!'
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
describe('Loading States', () => {
|
|
208
|
-
it('shows loading state during submission', async () => {
|
|
209
|
-
const onSubmit = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({}), 100)));
|
|
210
|
-
renderPasswordChangeForm({ onSubmit });
|
|
211
|
-
|
|
212
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
213
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
214
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
215
|
-
|
|
216
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
217
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
218
|
-
await user.click(submitButton);
|
|
219
|
-
|
|
220
|
-
expect(screen.getByRole('button', { name: 'Changing...' })).toBeInTheDocument();
|
|
221
|
-
expect(screen.getByRole('button', { name: 'Changing...' })).toBeDisabled();
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it('disables form inputs during loading', async () => {
|
|
225
|
-
const onSubmit = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({}), 100)));
|
|
226
|
-
renderPasswordChangeForm({ onSubmit });
|
|
227
|
-
|
|
228
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
229
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
230
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
231
|
-
|
|
232
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
233
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
234
|
-
await user.click(submitButton);
|
|
235
|
-
|
|
236
|
-
expect(newPasswordInput).toBeDisabled();
|
|
237
|
-
expect(confirmPasswordInput).toBeDisabled();
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
describe('Error Handling', () => {
|
|
242
|
-
it('displays error from onSubmit callback', async () => {
|
|
243
|
-
const errorMessage = 'Password change failed';
|
|
244
|
-
const onSubmit = vi.fn().mockResolvedValue({
|
|
245
|
-
error: { message: errorMessage }
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
renderPasswordChangeForm({ onSubmit });
|
|
249
|
-
|
|
250
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
251
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
252
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
253
|
-
|
|
254
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
255
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
256
|
-
await user.click(submitButton);
|
|
257
|
-
|
|
258
|
-
await waitFor(() => {
|
|
259
|
-
expect(screen.getByRole('alert')).toHaveTextContent(errorMessage);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
it('displays generic error when onSubmit throws', async () => {
|
|
264
|
-
const onSubmit = vi.fn().mockRejectedValue(new Error('Network error'));
|
|
265
|
-
|
|
266
|
-
renderPasswordChangeForm({ onSubmit });
|
|
267
|
-
|
|
268
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
269
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
270
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
271
|
-
|
|
272
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
273
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
274
|
-
await user.click(submitButton);
|
|
275
|
-
|
|
276
|
-
await waitFor(() => {
|
|
277
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Network error');
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
it('handles non-Error objects from onSubmit', async () => {
|
|
282
|
-
const onSubmit = vi.fn().mockRejectedValue('String error');
|
|
283
|
-
|
|
284
|
-
renderPasswordChangeForm({ onSubmit });
|
|
285
|
-
|
|
286
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
287
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
288
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
289
|
-
|
|
290
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
291
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
292
|
-
await user.click(submitButton);
|
|
293
|
-
|
|
294
|
-
await waitFor(() => {
|
|
295
|
-
expect(screen.getByRole('alert')).toHaveTextContent('An unexpected error occurred.');
|
|
296
|
-
});
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
it('clears error when form is resubmitted', async () => {
|
|
300
|
-
const onSubmit = vi.fn()
|
|
301
|
-
.mockResolvedValueOnce({ error: { message: 'First error' } })
|
|
302
|
-
.mockResolvedValueOnce({});
|
|
303
|
-
|
|
304
|
-
renderPasswordChangeForm({ onSubmit });
|
|
305
|
-
|
|
306
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
307
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
308
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
309
|
-
|
|
310
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
311
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
312
|
-
await user.click(submitButton);
|
|
313
|
-
|
|
314
|
-
await waitFor(() => {
|
|
315
|
-
expect(screen.getByRole('alert')).toHaveTextContent('First error');
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
await user.click(submitButton);
|
|
319
|
-
|
|
320
|
-
await waitFor(() => {
|
|
321
|
-
expect(screen.queryByRole('alert')).not.toBeInTheDocument();
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
it('clears error when validation passes', async () => {
|
|
326
|
-
const onSubmit = vi.fn().mockResolvedValue({ error: { message: 'Server error' } });
|
|
327
|
-
|
|
328
|
-
renderPasswordChangeForm({ onSubmit });
|
|
329
|
-
|
|
330
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
331
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
332
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
333
|
-
|
|
334
|
-
// First submit with validation error
|
|
335
|
-
await user.type(newPasswordInput, 'short');
|
|
336
|
-
await user.type(confirmPasswordInput, 'short');
|
|
337
|
-
await user.click(submitButton);
|
|
338
|
-
|
|
339
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Password must be at least 8 characters.');
|
|
340
|
-
|
|
341
|
-
// Fix validation and submit again
|
|
342
|
-
await user.clear(newPasswordInput);
|
|
343
|
-
await user.clear(confirmPasswordInput);
|
|
344
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
345
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
346
|
-
await user.click(submitButton);
|
|
347
|
-
|
|
348
|
-
await waitFor(() => {
|
|
349
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Server error');
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
describe('Accessibility', () => {
|
|
355
|
-
it('has proper form labels and associations', () => {
|
|
356
|
-
renderPasswordChangeForm();
|
|
357
|
-
|
|
358
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
359
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
360
|
-
|
|
361
|
-
expect(newPasswordInput).toHaveAttribute('id', 'new-password');
|
|
362
|
-
expect(confirmPasswordInput).toHaveAttribute('id', 'confirm-password');
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
it('has proper ARIA roles', () => {
|
|
366
|
-
renderPasswordChangeForm();
|
|
367
|
-
|
|
368
|
-
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
it('announces errors with role="alert"', async () => {
|
|
372
|
-
renderPasswordChangeForm();
|
|
373
|
-
|
|
374
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
375
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
376
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
377
|
-
|
|
378
|
-
await user.type(newPasswordInput, 'short');
|
|
379
|
-
await user.type(confirmPasswordInput, 'short');
|
|
380
|
-
await user.click(submitButton);
|
|
381
|
-
|
|
382
|
-
const errorElement = screen.getByRole('alert');
|
|
383
|
-
expect(errorElement).toBeInTheDocument();
|
|
384
|
-
expect(errorElement).toHaveTextContent('Password must be at least 8 characters.');
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
it('supports keyboard navigation', async () => {
|
|
388
|
-
renderPasswordChangeForm();
|
|
389
|
-
|
|
390
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
391
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
392
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
393
|
-
|
|
394
|
-
newPasswordInput.focus();
|
|
395
|
-
expect(newPasswordInput).toHaveFocus();
|
|
396
|
-
|
|
397
|
-
await user.tab();
|
|
398
|
-
expect(confirmPasswordInput).toHaveFocus();
|
|
399
|
-
|
|
400
|
-
// Button should be disabled initially, so focus might not move there
|
|
401
|
-
// Let's check if we can tab to it after filling the form
|
|
402
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
403
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
404
|
-
|
|
405
|
-
confirmPasswordInput.focus();
|
|
406
|
-
await user.tab();
|
|
407
|
-
expect(submitButton).toHaveFocus();
|
|
408
|
-
});
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
describe('Edge Cases', () => {
|
|
412
|
-
it('handles very long passwords', async () => {
|
|
413
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
414
|
-
renderPasswordChangeForm({ onSubmit });
|
|
415
|
-
|
|
416
|
-
const longPassword = 'a'.repeat(100); // Reduced from 1000 to 100
|
|
417
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
418
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
419
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
420
|
-
|
|
421
|
-
await user.type(newPasswordInput, longPassword);
|
|
422
|
-
await user.type(confirmPasswordInput, longPassword);
|
|
423
|
-
await user.click(submitButton);
|
|
424
|
-
|
|
425
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
426
|
-
newPassword: longPassword,
|
|
427
|
-
confirmPassword: longPassword
|
|
428
|
-
});
|
|
429
|
-
}, 10000); // Add 10 second timeout
|
|
430
|
-
|
|
431
|
-
it('handles passwords with unicode characters', async () => {
|
|
432
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
433
|
-
renderPasswordChangeForm({ onSubmit });
|
|
434
|
-
|
|
435
|
-
const unicodePassword = 'p@ssw0rd🚀🌟';
|
|
436
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
437
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
438
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
439
|
-
|
|
440
|
-
await user.type(newPasswordInput, unicodePassword);
|
|
441
|
-
await user.type(confirmPasswordInput, unicodePassword);
|
|
442
|
-
await user.click(submitButton);
|
|
443
|
-
|
|
444
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
445
|
-
newPassword: unicodePassword,
|
|
446
|
-
confirmPassword: unicodePassword
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
it('handles rapid form submissions', async () => {
|
|
451
|
-
const onSubmit = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({}), 100)));
|
|
452
|
-
renderPasswordChangeForm({ onSubmit });
|
|
453
|
-
|
|
454
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
455
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
456
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
457
|
-
|
|
458
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
459
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
460
|
-
|
|
461
|
-
// Rapid clicks
|
|
462
|
-
await user.click(submitButton);
|
|
463
|
-
await user.click(submitButton);
|
|
464
|
-
await user.click(submitButton);
|
|
465
|
-
|
|
466
|
-
// Should only call once due to loading state
|
|
467
|
-
expect(onSubmit).toHaveBeenCalledTimes(1);
|
|
468
|
-
});
|
|
469
|
-
|
|
470
|
-
it('handles empty string passwords', async () => {
|
|
471
|
-
renderPasswordChangeForm();
|
|
472
|
-
|
|
473
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
474
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
475
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
476
|
-
|
|
477
|
-
// Button should be disabled when fields are empty
|
|
478
|
-
expect(submitButton).toBeDisabled();
|
|
479
|
-
|
|
480
|
-
// Fill fields with short passwords to trigger validation
|
|
481
|
-
await user.type(newPasswordInput, 'short');
|
|
482
|
-
await user.type(confirmPasswordInput, 'short');
|
|
483
|
-
await user.click(submitButton);
|
|
484
|
-
|
|
485
|
-
// Should show validation error
|
|
486
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Password must be at least 8 characters.');
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
it('handles whitespace-only passwords', async () => {
|
|
490
|
-
renderPasswordChangeForm();
|
|
491
|
-
|
|
492
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
493
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
494
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
495
|
-
|
|
496
|
-
await user.type(newPasswordInput, ' ');
|
|
497
|
-
await user.type(confirmPasswordInput, ' ');
|
|
498
|
-
await user.click(submitButton);
|
|
499
|
-
|
|
500
|
-
// Should not submit due to validation
|
|
501
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Password must be at least 8 characters.');
|
|
502
|
-
});
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
describe('Form State Management', () => {
|
|
506
|
-
it('clears form state when validation passes', async () => {
|
|
507
|
-
const onSubmit = vi.fn().mockResolvedValue({});
|
|
508
|
-
renderPasswordChangeForm({ onSubmit });
|
|
509
|
-
|
|
510
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
511
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
512
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
513
|
-
|
|
514
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
515
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
516
|
-
await user.click(submitButton);
|
|
517
|
-
|
|
518
|
-
// Form should remain filled after successful submission
|
|
519
|
-
expect(newPasswordInput).toHaveValue('newpassword123');
|
|
520
|
-
expect(confirmPasswordInput).toHaveValue('newpassword123');
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
it('maintains form state when validation fails', async () => {
|
|
524
|
-
renderPasswordChangeForm();
|
|
525
|
-
|
|
526
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
527
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
528
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
529
|
-
|
|
530
|
-
await user.type(newPasswordInput, 'short');
|
|
531
|
-
await user.type(confirmPasswordInput, 'different');
|
|
532
|
-
await user.click(submitButton);
|
|
533
|
-
|
|
534
|
-
// Form should retain values after validation error
|
|
535
|
-
expect(newPasswordInput).toHaveValue('short');
|
|
536
|
-
expect(confirmPasswordInput).toHaveValue('different');
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
it('maintains form state when server error occurs', async () => {
|
|
540
|
-
const onSubmit = vi.fn().mockResolvedValue({ error: { message: 'Server error' } });
|
|
541
|
-
|
|
542
|
-
renderPasswordChangeForm({ onSubmit });
|
|
543
|
-
|
|
544
|
-
const newPasswordInput = screen.getByLabelText('New Password');
|
|
545
|
-
const confirmPasswordInput = screen.getByLabelText('Confirm Password');
|
|
546
|
-
const submitButton = screen.getByRole('button', { name: 'Change Password' });
|
|
547
|
-
|
|
548
|
-
await user.type(newPasswordInput, 'newpassword123');
|
|
549
|
-
await user.type(confirmPasswordInput, 'newpassword123');
|
|
550
|
-
await user.click(submitButton);
|
|
551
|
-
|
|
552
|
-
await waitFor(() => {
|
|
553
|
-
expect(screen.getByRole('alert')).toHaveTextContent('Server error');
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
// Form should retain values after server error
|
|
557
|
-
expect(newPasswordInput).toHaveValue('newpassword123');
|
|
558
|
-
expect(confirmPasswordInput).toHaveValue('newpassword123');
|
|
559
|
-
});
|
|
560
|
-
});
|
|
561
|
-
});
|