@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,780 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file ImportModal Unit Tests
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/DataTable/ImportModal/Tests
|
|
5
|
-
* @since 0.3.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import React from 'react';
|
|
9
|
-
import { screen, waitFor, fireEvent } from '@testing-library/react';
|
|
10
|
-
import { renderWithProviders } from '../../../../__tests__/shared';
|
|
11
|
-
import userEvent from '@testing-library/user-event';
|
|
12
|
-
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
|
13
|
-
import '@testing-library/jest-dom';
|
|
14
|
-
|
|
15
|
-
// Mock Radix UI directly to prevent portal rendering
|
|
16
|
-
vi.mock('@radix-ui/react-dialog', () => ({
|
|
17
|
-
Root: ({ children, open }: { children: React.ReactNode; open?: boolean }) => (
|
|
18
|
-
<div data-testid="radix-dialog-root" data-open={String(open)}>
|
|
19
|
-
{open && children}
|
|
20
|
-
</div>
|
|
21
|
-
),
|
|
22
|
-
Portal: ({ children }: { children: React.ReactNode }) => (
|
|
23
|
-
<div data-testid="radix-portal">{children}</div>
|
|
24
|
-
),
|
|
25
|
-
Overlay: ({ children, className }: { children: React.ReactNode; className?: string }) => (
|
|
26
|
-
<div data-testid="radix-overlay" className={className}>{children}</div>
|
|
27
|
-
),
|
|
28
|
-
Content: ({ children, className }: { children: React.ReactNode; className?: string }) => (
|
|
29
|
-
<div data-testid="radix-content" className={className} role="dialog">
|
|
30
|
-
{children}
|
|
31
|
-
</div>
|
|
32
|
-
),
|
|
33
|
-
Title: ({ children }: { children: React.ReactNode }) => (
|
|
34
|
-
<h2 data-testid="radix-title">{children}</h2>
|
|
35
|
-
),
|
|
36
|
-
Description: ({ children }: { children: React.ReactNode }) => (
|
|
37
|
-
<p data-testid="radix-description">{children}</p>
|
|
38
|
-
),
|
|
39
|
-
Trigger: ({ children }: { children: React.ReactNode }) => (
|
|
40
|
-
<button data-testid="radix-trigger">{children}</button>
|
|
41
|
-
),
|
|
42
|
-
Close: ({ children }: { children: React.ReactNode }) => (
|
|
43
|
-
<button data-testid="radix-close">{children}</button>
|
|
44
|
-
),
|
|
45
|
-
}));
|
|
46
|
-
|
|
47
|
-
// Mock our Dialog wrapper components
|
|
48
|
-
vi.mock('../../Dialog', () => ({
|
|
49
|
-
Dialog: ({ children, open }: { children: React.ReactNode; open?: boolean }) => (
|
|
50
|
-
<div data-testid="dialog-root" data-open={String(open)}>
|
|
51
|
-
{children}
|
|
52
|
-
</div>
|
|
53
|
-
),
|
|
54
|
-
DialogContent: ({ children, className }: { children: React.ReactNode; className?: string }) => (
|
|
55
|
-
<div data-testid="dialog-content" className={className} role="dialog">
|
|
56
|
-
{children}
|
|
57
|
-
</div>
|
|
58
|
-
),
|
|
59
|
-
DialogHeader: ({ children }: { children: React.ReactNode }) => (
|
|
60
|
-
<div data-testid="dialog-header">{children}</div>
|
|
61
|
-
),
|
|
62
|
-
DialogTitle: ({ children }: { children: React.ReactNode }) => (
|
|
63
|
-
<h2 data-testid="dialog-title">{children}</h2>
|
|
64
|
-
),
|
|
65
|
-
DialogDescription: ({ children }: { children: React.ReactNode }) => (
|
|
66
|
-
<p data-testid="dialog-description">{children}</p>
|
|
67
|
-
),
|
|
68
|
-
}));
|
|
69
|
-
|
|
70
|
-
vi.mock('../../Button/Button', () => ({
|
|
71
|
-
Button: ({ children, onClick, ...props }: any) => (
|
|
72
|
-
<button onClick={onClick} {...props}>{children}</button>
|
|
73
|
-
),
|
|
74
|
-
}));
|
|
75
|
-
|
|
76
|
-
vi.mock('../../Input/Input', () => ({
|
|
77
|
-
Input: React.forwardRef<HTMLInputElement, any>(({ className, ...props }, ref) => (
|
|
78
|
-
<input ref={ref} className={className} {...props} />
|
|
79
|
-
)),
|
|
80
|
-
}));
|
|
81
|
-
|
|
82
|
-
vi.mock('lucide-react', () => ({
|
|
83
|
-
Upload: () => <div data-testid="upload-icon" />,
|
|
84
|
-
FileText: () => <div data-testid="file-text-icon" />,
|
|
85
|
-
AlertCircle: () => <div data-testid="alert-circle-icon" />,
|
|
86
|
-
X: () => <div data-testid="x-icon" />,
|
|
87
|
-
}));
|
|
88
|
-
|
|
89
|
-
// Import the component after mocks
|
|
90
|
-
import { ImportModal } from '../ImportModal';
|
|
91
|
-
|
|
92
|
-
const defaultProps = {
|
|
93
|
-
isOpen: true,
|
|
94
|
-
onClose: vi.fn(),
|
|
95
|
-
onImport: vi.fn(),
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// Helper function to create a proper File mock with text() method
|
|
99
|
-
const createMockFile = (content: string, filename: string = 'test.csv'): File => {
|
|
100
|
-
const mockFile = new File([content], filename, { type: 'text/csv' });
|
|
101
|
-
|
|
102
|
-
// Mock the text() method that ImportModal uses
|
|
103
|
-
Object.defineProperty(mockFile, 'text', {
|
|
104
|
-
value: () => Promise.resolve(content),
|
|
105
|
-
writable: false,
|
|
106
|
-
configurable: true,
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
return mockFile;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
// Helper function to simulate file upload for hidden inputs
|
|
113
|
-
const simulateFileUpload = (fileInput: HTMLInputElement | null, file: File) => {
|
|
114
|
-
if (!fileInput) {
|
|
115
|
-
throw new Error('File input not found');
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Create a mock FileList
|
|
119
|
-
const mockFileList = {
|
|
120
|
-
0: file,
|
|
121
|
-
length: 1,
|
|
122
|
-
item: (index: number) => index === 0 ? file : null,
|
|
123
|
-
[Symbol.iterator]: function* () {
|
|
124
|
-
yield file;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
Object.defineProperty(fileInput, 'files', {
|
|
129
|
-
value: mockFileList,
|
|
130
|
-
writable: false,
|
|
131
|
-
configurable: true,
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
fireEvent.change(fileInput);
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
describe('ImportModal', () => {
|
|
138
|
-
beforeEach(() => {
|
|
139
|
-
vi.clearAllMocks();
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('DEBUG: should render file input in DOM', () => {
|
|
143
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
144
|
-
|
|
145
|
-
console.log('=== USING SCREEN.DEBUG ===');
|
|
146
|
-
screen.debug();
|
|
147
|
-
|
|
148
|
-
console.log('=== CONTAINER CHECK ===');
|
|
149
|
-
console.log('container.innerHTML length:', container.innerHTML.length);
|
|
150
|
-
console.log('container.innerHTML:', container.innerHTML);
|
|
151
|
-
|
|
152
|
-
console.log('=== DOM QUERIES ===');
|
|
153
|
-
console.log('All elements:', container.querySelectorAll('*').length);
|
|
154
|
-
console.log('Text content:', container.textContent);
|
|
155
|
-
|
|
156
|
-
// This test is just for debugging - it should always pass
|
|
157
|
-
expect(true).toBe(true);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('should render when open', () => {
|
|
161
|
-
renderWithProviders(<ImportModal {...defaultProps} />);
|
|
162
|
-
|
|
163
|
-
expect(screen.getByText('Import Data')).toBeInTheDocument();
|
|
164
|
-
expect(screen.getByText('Choose a CSV file to upload')).toBeInTheDocument();
|
|
165
|
-
expect(screen.getByText('Select File')).toBeInTheDocument();
|
|
166
|
-
expect(screen.getByText('Cancel')).toBeInTheDocument();
|
|
167
|
-
expect(screen.getByText('Import')).toBeInTheDocument();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('should not render when closed', () => {
|
|
171
|
-
renderWithProviders(<ImportModal {...defaultProps} isOpen={false} />);
|
|
172
|
-
|
|
173
|
-
expect(screen.queryByText('Import Data')).not.toBeInTheDocument();
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it('should upload file successfully', async () => {
|
|
177
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
178
|
-
|
|
179
|
-
const csvContent = 'name,email,age\nJohn Doe,john@example.com,30\nJane Smith,jane@example.com,25';
|
|
180
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
181
|
-
|
|
182
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
183
|
-
simulateFileUpload(fileInput, file);
|
|
184
|
-
|
|
185
|
-
await waitFor(() => {
|
|
186
|
-
expect(screen.getByText('Selected: test.csv')).toBeInTheDocument();
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('should show preview when file is selected', async () => {
|
|
191
|
-
const user = userEvent.setup();
|
|
192
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
193
|
-
|
|
194
|
-
const csvContent = 'name,email,age\nJohn Doe,john@example.com,30\nJane Smith,jane@example.com,25';
|
|
195
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
196
|
-
|
|
197
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
198
|
-
simulateFileUpload(fileInput, file);
|
|
199
|
-
|
|
200
|
-
await waitFor(() => {
|
|
201
|
-
expect(screen.getByText('Preview (first 5 rows)')).toBeInTheDocument();
|
|
202
|
-
expect(screen.getByText('John Doe')).toBeInTheDocument();
|
|
203
|
-
expect(screen.getByText('jane@example.com')).toBeInTheDocument();
|
|
204
|
-
expect(screen.getByText('Total rows to import: 2')).toBeInTheDocument();
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it('should show error for invalid CSV', async () => {
|
|
209
|
-
const user = userEvent.setup();
|
|
210
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
211
|
-
|
|
212
|
-
const invalidContent = 'invalid csv content';
|
|
213
|
-
const file = createMockFile(invalidContent, 'invalid.csv');
|
|
214
|
-
|
|
215
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
216
|
-
simulateFileUpload(fileInput, file);
|
|
217
|
-
|
|
218
|
-
await waitFor(() => {
|
|
219
|
-
expect(screen.getByText(/CSV must have at least a header row and one data row/)).toBeInTheDocument();
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('should handle import successfully', async () => {
|
|
224
|
-
const user = userEvent.setup();
|
|
225
|
-
const mockOnImport = vi.fn();
|
|
226
|
-
const mockOnClose = vi.fn();
|
|
227
|
-
|
|
228
|
-
const { container } = renderWithProviders(
|
|
229
|
-
<ImportModal
|
|
230
|
-
isOpen={true}
|
|
231
|
-
onClose={mockOnClose}
|
|
232
|
-
onImport={mockOnImport}
|
|
233
|
-
/>
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
const csvContent = 'name,email,age\nJohn Doe,john@example.com,30\nJane Smith,jane@example.com,25';
|
|
237
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
238
|
-
|
|
239
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
240
|
-
simulateFileUpload(fileInput, file);
|
|
241
|
-
|
|
242
|
-
await waitFor(() => {
|
|
243
|
-
expect(screen.getByText('Import')).toBeEnabled();
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
const importButton = screen.getByText('Import');
|
|
247
|
-
await user.click(importButton);
|
|
248
|
-
|
|
249
|
-
await waitFor(() => {
|
|
250
|
-
expect(mockOnImport).toHaveBeenCalledWith([
|
|
251
|
-
{ name: 'John Doe', email: 'john@example.com', age: '30' },
|
|
252
|
-
{ name: 'Jane Smith', email: 'jane@example.com', age: '25' },
|
|
253
|
-
]);
|
|
254
|
-
expect(mockOnClose).toHaveBeenCalled();
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
it('should show processing state during import', async () => {
|
|
259
|
-
const user = userEvent.setup();
|
|
260
|
-
|
|
261
|
-
// Mock a delay to see processing state
|
|
262
|
-
const mockOnImport = vi.fn().mockImplementation(() => new Promise<void>(resolve => setTimeout(resolve, 100)));
|
|
263
|
-
const { container } = renderWithProviders(
|
|
264
|
-
<ImportModal
|
|
265
|
-
isOpen={true}
|
|
266
|
-
onClose={vi.fn()}
|
|
267
|
-
onImport={mockOnImport}
|
|
268
|
-
/>
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
const csvContent = 'name,email\nJohn,john@example.com';
|
|
272
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
273
|
-
|
|
274
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
275
|
-
simulateFileUpload(fileInput, file);
|
|
276
|
-
|
|
277
|
-
await waitFor(() => {
|
|
278
|
-
expect(screen.getByRole('button', { name: /import/i, hidden: true })).toBeEnabled();
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
const importButton = screen.getByRole('button', { name: /import/i, hidden: true });
|
|
282
|
-
await user.click(importButton);
|
|
283
|
-
|
|
284
|
-
// Should show processing state by disabling the button during operation
|
|
285
|
-
await waitFor(() => {
|
|
286
|
-
const updatedImportButton = screen.getByRole('button', { name: /import/i, hidden: true });
|
|
287
|
-
expect(updatedImportButton).toBeDisabled();
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
it('should handle cancel button', async () => {
|
|
292
|
-
const user = userEvent.setup();
|
|
293
|
-
const mockOnClose = vi.fn();
|
|
294
|
-
|
|
295
|
-
renderWithProviders(
|
|
296
|
-
<ImportModal
|
|
297
|
-
isOpen={true}
|
|
298
|
-
onClose={mockOnClose}
|
|
299
|
-
onImport={vi.fn()}
|
|
300
|
-
/>
|
|
301
|
-
);
|
|
302
|
-
|
|
303
|
-
const cancelButton = screen.getByText('Cancel');
|
|
304
|
-
await user.click(cancelButton);
|
|
305
|
-
|
|
306
|
-
expect(mockOnClose).toHaveBeenCalled();
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
it('should disable import button when no file selected', () => {
|
|
310
|
-
renderWithProviders(<ImportModal {...defaultProps} />);
|
|
311
|
-
|
|
312
|
-
const importButton = screen.getByText('Import');
|
|
313
|
-
expect(importButton).toBeDisabled();
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
it('should handle CSV with quoted values', async () => {
|
|
317
|
-
const user = userEvent.setup();
|
|
318
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
319
|
-
|
|
320
|
-
const csvContent = '"name","email","description"\n"John Doe","john@example.com","A person with, comma"';
|
|
321
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
322
|
-
|
|
323
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
324
|
-
simulateFileUpload(fileInput, file);
|
|
325
|
-
|
|
326
|
-
await waitFor(() => {
|
|
327
|
-
expect(screen.getByText('John Doe')).toBeInTheDocument();
|
|
328
|
-
// CSV parser correctly handles quoted values with commas
|
|
329
|
-
expect(screen.getByText('A person with, comma')).toBeInTheDocument();
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
it('should handle CSV with empty cells', async () => {
|
|
334
|
-
const user = userEvent.setup();
|
|
335
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
336
|
-
|
|
337
|
-
const csvContent = 'name,email,phone\nJohn,john@example.com,\nJane,,555-1234';
|
|
338
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
339
|
-
|
|
340
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
341
|
-
simulateFileUpload(fileInput, file);
|
|
342
|
-
|
|
343
|
-
await waitFor(() => {
|
|
344
|
-
expect(screen.getByText('John')).toBeInTheDocument();
|
|
345
|
-
expect(screen.getByText('555-1234')).toBeInTheDocument();
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
it('should handle large CSV files', async () => {
|
|
350
|
-
const user = userEvent.setup();
|
|
351
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
352
|
-
|
|
353
|
-
// Create a CSV with 100 rows
|
|
354
|
-
let csvContent = 'name,email,id\n';
|
|
355
|
-
for (let i = 1; i <= 100; i++) {
|
|
356
|
-
csvContent += `User ${i},user${i}@example.com,${i}\n`;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
const file = createMockFile(csvContent, 'large.csv');
|
|
360
|
-
|
|
361
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
362
|
-
simulateFileUpload(fileInput, file);
|
|
363
|
-
|
|
364
|
-
await waitFor(() => {
|
|
365
|
-
expect(screen.getByText('Total rows to import: 100')).toBeInTheDocument();
|
|
366
|
-
expect(screen.getByText('Preview (first 5 rows)')).toBeInTheDocument();
|
|
367
|
-
// Should only show first 5 rows in preview
|
|
368
|
-
expect(screen.getByText('User 1')).toBeInTheDocument();
|
|
369
|
-
expect(screen.getByText('User 5')).toBeInTheDocument();
|
|
370
|
-
expect(screen.queryByText('User 6')).not.toBeInTheDocument();
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
it('should handle error during file processing', async () => {
|
|
375
|
-
const user = userEvent.setup();
|
|
376
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
377
|
-
|
|
378
|
-
// Create an invalid file that will cause an error when processed
|
|
379
|
-
const invalidContent = '';
|
|
380
|
-
const file = createMockFile(invalidContent, 'empty.csv');
|
|
381
|
-
|
|
382
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
383
|
-
simulateFileUpload(fileInput, file);
|
|
384
|
-
|
|
385
|
-
await waitFor(() => {
|
|
386
|
-
expect(screen.getByText(/CSV must have at least a header row and one data row/)).toBeInTheDocument();
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
it('should clear file when modal is closed', async () => {
|
|
391
|
-
const user = userEvent.setup();
|
|
392
|
-
const mockOnClose = vi.fn();
|
|
393
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} onClose={mockOnClose} />);
|
|
394
|
-
|
|
395
|
-
const csvContent = 'name,email\nJohn,john@example.com';
|
|
396
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
397
|
-
|
|
398
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
399
|
-
simulateFileUpload(fileInput, file);
|
|
400
|
-
|
|
401
|
-
await waitFor(() => {
|
|
402
|
-
expect(screen.getByText('Selected: test.csv')).toBeInTheDocument();
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
// Close modal
|
|
406
|
-
const cancelButton = screen.getByText('Cancel');
|
|
407
|
-
await user.click(cancelButton);
|
|
408
|
-
|
|
409
|
-
expect(mockOnClose).toHaveBeenCalled();
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
it('should handle file selection through button click', async () => {
|
|
413
|
-
const user = userEvent.setup();
|
|
414
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
415
|
-
|
|
416
|
-
const selectFileButton = screen.getByText('Select File');
|
|
417
|
-
|
|
418
|
-
// Mock the file input click
|
|
419
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
420
|
-
if (fileInput) {
|
|
421
|
-
const originalClick = fileInput.click;
|
|
422
|
-
fileInput.click = vi.fn();
|
|
423
|
-
|
|
424
|
-
await user.click(selectFileButton);
|
|
425
|
-
|
|
426
|
-
expect(fileInput.click).toHaveBeenCalled();
|
|
427
|
-
fileInput.click = originalClick;
|
|
428
|
-
} else {
|
|
429
|
-
// If we can't find the file input, at least verify the button works
|
|
430
|
-
await user.click(selectFileButton);
|
|
431
|
-
expect(selectFileButton).toBeInTheDocument();
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
it('should show responsive design on small screens', () => {
|
|
436
|
-
// Mock window.innerWidth for responsive design
|
|
437
|
-
Object.defineProperty(window, 'innerWidth', {
|
|
438
|
-
writable: true,
|
|
439
|
-
configurable: true,
|
|
440
|
-
value: 400,
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
renderWithProviders(<ImportModal {...defaultProps} />);
|
|
444
|
-
|
|
445
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
446
|
-
expect(screen.getByText('Import Data')).toBeInTheDocument();
|
|
447
|
-
|
|
448
|
-
// Reset window width
|
|
449
|
-
Object.defineProperty(window, 'innerWidth', {
|
|
450
|
-
writable: true,
|
|
451
|
-
configurable: true,
|
|
452
|
-
value: 1024,
|
|
453
|
-
});
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
it('should handle keyboard navigation', async () => {
|
|
457
|
-
const user = userEvent.setup();
|
|
458
|
-
const mockOnClose = vi.fn();
|
|
459
|
-
|
|
460
|
-
renderWithProviders(
|
|
461
|
-
<ImportModal
|
|
462
|
-
isOpen={true}
|
|
463
|
-
onClose={mockOnClose}
|
|
464
|
-
onImport={vi.fn()}
|
|
465
|
-
/>
|
|
466
|
-
);
|
|
467
|
-
|
|
468
|
-
// Test that modal is keyboard accessible (ESC behavior varies with mocked Radix components)
|
|
469
|
-
const dialog = screen.getByRole('dialog');
|
|
470
|
-
expect(dialog).toBeInTheDocument();
|
|
471
|
-
|
|
472
|
-
// Test that buttons are focusable
|
|
473
|
-
const cancelButton = screen.getByRole('button', { name: /cancel/i, hidden: true });
|
|
474
|
-
expect(cancelButton).toHaveAttribute('type', 'button');
|
|
475
|
-
expect(cancelButton).not.toBeDisabled();
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
it('should accept only CSV files', () => {
|
|
479
|
-
const { container } = renderWithProviders(<ImportModal {...defaultProps} />);
|
|
480
|
-
|
|
481
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
482
|
-
expect(fileInput).toBeInTheDocument();
|
|
483
|
-
expect(fileInput.accept).toBe('.csv');
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
it('should maintain accessibility standards', () => {
|
|
487
|
-
renderWithProviders(<ImportModal {...defaultProps} />);
|
|
488
|
-
|
|
489
|
-
// Check for proper ARIA labels and roles
|
|
490
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
491
|
-
|
|
492
|
-
// Check that dialog title is present (accessible name may vary with mocked components)
|
|
493
|
-
expect(screen.getByText('Import Data')).toBeInTheDocument();
|
|
494
|
-
|
|
495
|
-
// Check for form controls
|
|
496
|
-
expect(screen.getByRole('button', { name: /select file/i, hidden: true })).toBeInTheDocument();
|
|
497
|
-
expect(screen.getByRole('button', { name: /cancel/i, hidden: true })).toBeInTheDocument();
|
|
498
|
-
expect(screen.getByRole('button', { name: /import/i, hidden: true })).toBeInTheDocument();
|
|
499
|
-
|
|
500
|
-
// Check for close button
|
|
501
|
-
expect(screen.getByRole('button', { name: /close/i, hidden: true })).toBeInTheDocument();
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
// ============================================================================
|
|
505
|
-
// CUSTOMIZATION TESTS
|
|
506
|
-
// ============================================================================
|
|
507
|
-
|
|
508
|
-
describe('Customization Configuration', () => {
|
|
509
|
-
it('should render with custom title and description', () => {
|
|
510
|
-
const customConfig = {
|
|
511
|
-
title: 'Import Customer Data',
|
|
512
|
-
description: 'Upload a CSV file with customer information to import multiple customer records.',
|
|
513
|
-
};
|
|
514
|
-
|
|
515
|
-
renderWithProviders(
|
|
516
|
-
<ImportModal
|
|
517
|
-
{...defaultProps}
|
|
518
|
-
config={customConfig}
|
|
519
|
-
/>
|
|
520
|
-
);
|
|
521
|
-
|
|
522
|
-
expect(screen.getByText('Import Customer Data')).toBeInTheDocument();
|
|
523
|
-
expect(screen.getByText('Upload a CSV file with customer information to import multiple customer records.')).toBeInTheDocument();
|
|
524
|
-
});
|
|
525
|
-
|
|
526
|
-
it('should render with custom upload text and button text', () => {
|
|
527
|
-
const customConfig = {
|
|
528
|
-
uploadText: 'Choose a customer CSV file to upload',
|
|
529
|
-
selectFileButtonText: 'Browse Customer Files',
|
|
530
|
-
};
|
|
531
|
-
|
|
532
|
-
renderWithProviders(
|
|
533
|
-
<ImportModal
|
|
534
|
-
{...defaultProps}
|
|
535
|
-
config={customConfig}
|
|
536
|
-
/>
|
|
537
|
-
);
|
|
538
|
-
|
|
539
|
-
expect(screen.getByText('Choose a customer CSV file to upload')).toBeInTheDocument();
|
|
540
|
-
expect(screen.getByText('Browse Customer Files')).toBeInTheDocument();
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
it('should render with custom button texts', () => {
|
|
544
|
-
const customConfig = {
|
|
545
|
-
importButtonText: 'Import Customers',
|
|
546
|
-
importButtonProcessingText: 'Processing customers...',
|
|
547
|
-
cancelButtonText: 'Close Modal',
|
|
548
|
-
};
|
|
549
|
-
|
|
550
|
-
renderWithProviders(
|
|
551
|
-
<ImportModal
|
|
552
|
-
{...defaultProps}
|
|
553
|
-
config={customConfig}
|
|
554
|
-
/>
|
|
555
|
-
);
|
|
556
|
-
|
|
557
|
-
expect(screen.getByText('Import Customers')).toBeInTheDocument();
|
|
558
|
-
expect(screen.getByText('Close Modal')).toBeInTheDocument();
|
|
559
|
-
});
|
|
560
|
-
|
|
561
|
-
it('should render with custom preview header text', async () => {
|
|
562
|
-
const customConfig = {
|
|
563
|
-
previewHeaderText: 'Customer Preview (first 5 records)',
|
|
564
|
-
};
|
|
565
|
-
|
|
566
|
-
const { container } = renderWithProviders(
|
|
567
|
-
<ImportModal
|
|
568
|
-
{...defaultProps}
|
|
569
|
-
config={customConfig}
|
|
570
|
-
/>
|
|
571
|
-
);
|
|
572
|
-
|
|
573
|
-
const csvContent = 'name,email,age\nJohn Doe,john@example.com,30\nJane Smith,jane@example.com,25';
|
|
574
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
575
|
-
|
|
576
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
577
|
-
simulateFileUpload(fileInput, file);
|
|
578
|
-
|
|
579
|
-
await waitFor(() => {
|
|
580
|
-
expect(screen.getByText('Customer Preview (first 5 records)')).toBeInTheDocument();
|
|
581
|
-
});
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
it('should render with custom total rows text pattern', async () => {
|
|
585
|
-
const customConfig = {
|
|
586
|
-
totalRowsText: 'Found {count} customer records to import',
|
|
587
|
-
};
|
|
588
|
-
|
|
589
|
-
const { container } = renderWithProviders(
|
|
590
|
-
<ImportModal
|
|
591
|
-
{...defaultProps}
|
|
592
|
-
config={customConfig}
|
|
593
|
-
/>
|
|
594
|
-
);
|
|
595
|
-
|
|
596
|
-
const csvContent = 'name,email,age\nJohn Doe,john@example.com,30\nJane Smith,jane@example.com,25\nBob Wilson,bob@example.com,35';
|
|
597
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
598
|
-
|
|
599
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
600
|
-
simulateFileUpload(fileInput, file);
|
|
601
|
-
|
|
602
|
-
await waitFor(() => {
|
|
603
|
-
expect(screen.getByText('Found 3 customer records to import')).toBeInTheDocument();
|
|
604
|
-
});
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
it('should show custom processing text during import', async () => {
|
|
608
|
-
const user = userEvent.setup();
|
|
609
|
-
const customConfig = {
|
|
610
|
-
importButtonText: 'Import Customers',
|
|
611
|
-
importButtonProcessingText: 'Processing customers...',
|
|
612
|
-
};
|
|
613
|
-
|
|
614
|
-
// Mock a delay to see processing state
|
|
615
|
-
const mockOnImport = vi.fn().mockImplementation(() => new Promise<void>(resolve => setTimeout(resolve, 100)));
|
|
616
|
-
const { container } = renderWithProviders(
|
|
617
|
-
<ImportModal
|
|
618
|
-
isOpen={true}
|
|
619
|
-
onClose={vi.fn()}
|
|
620
|
-
onImport={mockOnImport}
|
|
621
|
-
config={customConfig}
|
|
622
|
-
/>
|
|
623
|
-
);
|
|
624
|
-
|
|
625
|
-
const csvContent = 'name,email\nJohn,john@example.com';
|
|
626
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
627
|
-
|
|
628
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
629
|
-
simulateFileUpload(fileInput, file);
|
|
630
|
-
|
|
631
|
-
await waitFor(() => {
|
|
632
|
-
expect(screen.getByRole('button', { name: /import customers/i, hidden: true })).toBeEnabled();
|
|
633
|
-
});
|
|
634
|
-
|
|
635
|
-
const importButton = screen.getByRole('button', { name: /import customers/i, hidden: true });
|
|
636
|
-
await user.click(importButton);
|
|
637
|
-
|
|
638
|
-
// Should show processing state
|
|
639
|
-
await waitFor(() => {
|
|
640
|
-
expect(screen.getByText('Processing customers...')).toBeInTheDocument();
|
|
641
|
-
});
|
|
642
|
-
});
|
|
643
|
-
|
|
644
|
-
it('should use custom cancel button text in event handlers', async () => {
|
|
645
|
-
const user = userEvent.setup();
|
|
646
|
-
const mockOnClose = vi.fn();
|
|
647
|
-
const customConfig = {
|
|
648
|
-
cancelButtonText: 'Close Modal',
|
|
649
|
-
};
|
|
650
|
-
|
|
651
|
-
renderWithProviders(
|
|
652
|
-
<ImportModal
|
|
653
|
-
isOpen={true}
|
|
654
|
-
onClose={mockOnClose}
|
|
655
|
-
onImport={vi.fn()}
|
|
656
|
-
config={customConfig}
|
|
657
|
-
/>
|
|
658
|
-
);
|
|
659
|
-
|
|
660
|
-
const cancelButton = screen.getByText('Close Modal');
|
|
661
|
-
await user.click(cancelButton);
|
|
662
|
-
|
|
663
|
-
expect(mockOnClose).toHaveBeenCalled();
|
|
664
|
-
});
|
|
665
|
-
|
|
666
|
-
it('should handle all custom configuration options together', async () => {
|
|
667
|
-
const user = userEvent.setup();
|
|
668
|
-
const fullCustomConfig = {
|
|
669
|
-
title: 'Import Customer Database',
|
|
670
|
-
description: 'Upload a CSV file containing customer information to bulk import customer records.',
|
|
671
|
-
uploadText: 'Select a customer CSV file from your computer',
|
|
672
|
-
selectFileButtonText: 'Choose Customer File',
|
|
673
|
-
importButtonText: 'Import All Customers',
|
|
674
|
-
importButtonProcessingText: 'Importing customers, please wait...',
|
|
675
|
-
cancelButtonText: 'Cancel Import',
|
|
676
|
-
previewHeaderText: 'Customer Data Preview (showing first 5 entries)',
|
|
677
|
-
totalRowsText: 'Ready to import {count} customer records',
|
|
678
|
-
};
|
|
679
|
-
|
|
680
|
-
const { container } = renderWithProviders(
|
|
681
|
-
<ImportModal
|
|
682
|
-
{...defaultProps}
|
|
683
|
-
config={fullCustomConfig}
|
|
684
|
-
/>
|
|
685
|
-
);
|
|
686
|
-
|
|
687
|
-
// Check title and description
|
|
688
|
-
expect(screen.getByText('Import Customer Database')).toBeInTheDocument();
|
|
689
|
-
expect(screen.getByText('Upload a CSV file containing customer information to bulk import customer records.')).toBeInTheDocument();
|
|
690
|
-
|
|
691
|
-
// Check upload text and button
|
|
692
|
-
expect(screen.getByText('Select a customer CSV file from your computer')).toBeInTheDocument();
|
|
693
|
-
expect(screen.getByText('Choose Customer File')).toBeInTheDocument();
|
|
694
|
-
|
|
695
|
-
// Check button texts
|
|
696
|
-
expect(screen.getByText('Import All Customers')).toBeInTheDocument();
|
|
697
|
-
expect(screen.getByText('Cancel Import')).toBeInTheDocument();
|
|
698
|
-
|
|
699
|
-
// Upload a file to test preview customization
|
|
700
|
-
const csvContent = 'name,email,company\nJohn Doe,john@example.com,Acme Corp\nJane Smith,jane@example.com,Tech Inc';
|
|
701
|
-
const file = createMockFile(csvContent, 'customers.csv');
|
|
702
|
-
|
|
703
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
704
|
-
simulateFileUpload(fileInput, file);
|
|
705
|
-
|
|
706
|
-
await waitFor(() => {
|
|
707
|
-
expect(screen.getByText('Customer Data Preview (showing first 5 entries)')).toBeInTheDocument();
|
|
708
|
-
expect(screen.getByText('Ready to import 2 customer records')).toBeInTheDocument();
|
|
709
|
-
});
|
|
710
|
-
});
|
|
711
|
-
|
|
712
|
-
it('should fall back to default values when config is not provided', () => {
|
|
713
|
-
renderWithProviders(<ImportModal {...defaultProps} />);
|
|
714
|
-
|
|
715
|
-
// Check that default values are used
|
|
716
|
-
expect(screen.getByText('Import Data')).toBeInTheDocument();
|
|
717
|
-
expect(screen.getByText('Upload a CSV file to import multiple records at once.')).toBeInTheDocument();
|
|
718
|
-
expect(screen.getByText('Choose a CSV file to upload')).toBeInTheDocument();
|
|
719
|
-
expect(screen.getByText('Select File')).toBeInTheDocument();
|
|
720
|
-
expect(screen.getByText('Import')).toBeInTheDocument();
|
|
721
|
-
expect(screen.getByText('Cancel')).toBeInTheDocument();
|
|
722
|
-
});
|
|
723
|
-
|
|
724
|
-
it('should fall back to default values when config is empty', () => {
|
|
725
|
-
renderWithProviders(<ImportModal {...defaultProps} config={{}} />);
|
|
726
|
-
|
|
727
|
-
// Check that default values are used even with empty config
|
|
728
|
-
expect(screen.getByText('Import Data')).toBeInTheDocument();
|
|
729
|
-
expect(screen.getByText('Upload a CSV file to import multiple records at once.')).toBeInTheDocument();
|
|
730
|
-
expect(screen.getByText('Choose a CSV file to upload')).toBeInTheDocument();
|
|
731
|
-
expect(screen.getByText('Select File')).toBeInTheDocument();
|
|
732
|
-
expect(screen.getByText('Import')).toBeInTheDocument();
|
|
733
|
-
expect(screen.getByText('Cancel')).toBeInTheDocument();
|
|
734
|
-
});
|
|
735
|
-
|
|
736
|
-
it('should handle partial config with mixed custom and default values', () => {
|
|
737
|
-
const partialConfig = {
|
|
738
|
-
title: 'Custom Import Title',
|
|
739
|
-
importButtonText: 'Start Import',
|
|
740
|
-
// description, uploadText, etc. should use defaults
|
|
741
|
-
};
|
|
742
|
-
|
|
743
|
-
renderWithProviders(<ImportModal {...defaultProps} config={partialConfig} />);
|
|
744
|
-
|
|
745
|
-
// Check custom values
|
|
746
|
-
expect(screen.getByText('Custom Import Title')).toBeInTheDocument();
|
|
747
|
-
expect(screen.getByText('Start Import')).toBeInTheDocument();
|
|
748
|
-
|
|
749
|
-
// Check default values for non-specified config
|
|
750
|
-
expect(screen.getByText('Upload a CSV file to import multiple records at once.')).toBeInTheDocument();
|
|
751
|
-
expect(screen.getByText('Choose a CSV file to upload')).toBeInTheDocument();
|
|
752
|
-
expect(screen.getByText('Select File')).toBeInTheDocument();
|
|
753
|
-
expect(screen.getByText('Cancel')).toBeInTheDocument();
|
|
754
|
-
});
|
|
755
|
-
|
|
756
|
-
it('should properly replace placeholder in totalRowsText', async () => {
|
|
757
|
-
const customConfig = {
|
|
758
|
-
totalRowsText: 'Processing {count} items for import',
|
|
759
|
-
};
|
|
760
|
-
|
|
761
|
-
const { container } = renderWithProviders(
|
|
762
|
-
<ImportModal
|
|
763
|
-
{...defaultProps}
|
|
764
|
-
config={customConfig}
|
|
765
|
-
/>
|
|
766
|
-
);
|
|
767
|
-
|
|
768
|
-
// Test with different row counts
|
|
769
|
-
const csvContent = 'id,name\n1,First\n2,Second\n3,Third\n4,Fourth\n5,Fifth\n6,Sixth\n7,Seventh';
|
|
770
|
-
const file = createMockFile(csvContent, 'test.csv');
|
|
771
|
-
|
|
772
|
-
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
773
|
-
simulateFileUpload(fileInput, file);
|
|
774
|
-
|
|
775
|
-
await waitFor(() => {
|
|
776
|
-
expect(screen.getByText('Processing 7 items for import')).toBeInTheDocument();
|
|
777
|
-
});
|
|
778
|
-
});
|
|
779
|
-
});
|
|
780
|
-
});
|