@scality/data-browser-library 1.0.0-preview.8 → 1.0.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/components/DataBrowserUI.d.ts +12 -0
- package/dist/components/DataBrowserUI.js +99 -0
- package/dist/components/Editor.d.ts +1 -1
- package/dist/components/Editor.js +3 -3
- package/dist/components/__tests__/BucketAccessor.test.js +214 -0
- package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
- package/dist/components/__tests__/BucketCreate.test.d.ts +1 -0
- package/dist/components/__tests__/BucketCreate.test.js +574 -0
- package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
- package/dist/components/__tests__/BucketDetails.test.js +421 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +14 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
- package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
- package/dist/components/__tests__/BucketList.test.js +495 -81
- package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
- package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
- package/dist/components/__tests__/BucketOverview.test.js +484 -179
- package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
- package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +16 -0
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
- package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
- package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
- package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
- package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
- package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
- package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
- package/dist/components/__tests__/MetadataSearch.test.js +65 -65
- package/dist/components/__tests__/ObjectList.test.js +741 -240
- package/dist/components/__tests__/UploadButton.test.js +45 -45
- package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
- package/dist/components/breadcrumb/Breadcrumb.js +37 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
- package/dist/components/breadcrumb/index.d.ts +8 -0
- package/dist/components/breadcrumb/index.js +4 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
- package/dist/components/buckets/BucketAccessor.d.ts +2 -0
- package/dist/components/buckets/BucketAccessor.js +125 -0
- package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
- package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
- package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
- package/dist/components/buckets/BucketCorsPage.js +234 -0
- package/dist/components/buckets/BucketCreate.d.ts +50 -0
- package/dist/components/buckets/BucketCreate.js +279 -0
- package/dist/components/buckets/BucketDetails.d.ts +42 -0
- package/dist/components/buckets/BucketDetails.js +256 -40
- package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
- package/dist/components/buckets/BucketLifecycleFormPage.js +1086 -0
- package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
- package/dist/components/buckets/BucketLifecycleList.js +270 -0
- package/dist/components/buckets/BucketList.d.ts +6 -4
- package/dist/components/buckets/BucketList.js +161 -94
- package/dist/components/buckets/BucketLocation.js +4 -4
- package/dist/components/buckets/BucketOverview.d.ts +86 -5
- package/dist/components/buckets/BucketOverview.js +481 -192
- package/dist/components/buckets/BucketPage.js +44 -22
- package/dist/components/buckets/BucketPolicyPage.js +155 -127
- package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
- package/dist/components/buckets/BucketReplicationFormPage.js +835 -0
- package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
- package/dist/components/buckets/BucketReplicationList.js +189 -0
- package/dist/components/buckets/BucketVersioning.d.ts +4 -0
- package/dist/components/buckets/BucketVersioning.js +76 -0
- package/dist/components/buckets/DeleteBucketButton.js +8 -8
- package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
- package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
- package/dist/components/buckets/EmptyBucketButton.js +232 -0
- package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
- package/dist/components/buckets/EmptyBucketSummary.js +60 -0
- package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
- package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
- package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
- package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
- package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
- package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
- package/dist/components/buckets/notifications/EventsSection.js +145 -29
- package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
- package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
- package/dist/components/buckets/notifications/events.d.ts +71 -7
- package/dist/components/buckets/notifications/events.js +98 -16
- package/dist/components/index.d.ts +27 -13
- package/dist/components/index.js +20 -6
- package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
- package/dist/components/layouts/ArrowNavigation.js +28 -0
- package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
- package/dist/components/layouts/BrowserPageLayout.js +10 -5
- package/dist/components/objects/CreateFolderButton.d.ts +2 -2
- package/dist/components/objects/CreateFolderButton.js +12 -12
- package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
- package/dist/components/objects/DeleteObjectButton.js +19 -21
- package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
- package/dist/components/objects/GetPresignedUrlButton.js +255 -0
- package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
- package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
- package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
- package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
- package/dist/components/objects/ObjectDetails/index.js +152 -40
- package/dist/components/objects/ObjectList.d.ts +12 -10
- package/dist/components/objects/ObjectList.js +590 -263
- package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +159 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
- package/dist/components/objects/ObjectPage.js +12 -8
- package/dist/components/objects/UploadButton.d.ts +3 -3
- package/dist/components/objects/UploadButton.js +10 -10
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
- package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
- package/dist/components/providers/DataBrowserProvider.js +60 -38
- package/dist/components/providers/QueryProvider.d.ts +9 -0
- package/dist/components/providers/QueryProvider.js +21 -0
- package/dist/components/search/MetadataSearch.js +29 -28
- package/dist/components/search/SearchHints.js +1 -1
- package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
- package/dist/components/ui/ArrayFieldActions.js +43 -0
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
- package/dist/components/ui/ConfirmDeleteRuleModal.js +48 -0
- package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
- package/dist/components/ui/DeleteObjectModalContent.js +12 -12
- package/dist/components/ui/FilterFormSection.d.ts +44 -0
- package/dist/components/ui/FilterFormSection.js +159 -0
- package/dist/components/ui/Search.elements.d.ts +2 -2
- package/dist/components/ui/Search.elements.js +7 -7
- package/dist/components/ui/Table.elements.d.ts +2 -1
- package/dist/components/ui/Table.elements.js +18 -12
- package/dist/config/__tests__/factory.test.d.ts +1 -0
- package/dist/config/__tests__/factory.test.js +311 -0
- package/dist/config/factory.d.ts +14 -49
- package/dist/config/factory.js +23 -68
- package/dist/config/types.d.ts +212 -34
- package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
- package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
- package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
- package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
- package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
- package/dist/hooks/bucketConfiguration.d.ts +8 -1
- package/dist/hooks/bucketConfiguration.js +52 -51
- package/dist/hooks/bucketOperations.d.ts +10 -1
- package/dist/hooks/bucketOperations.js +10 -9
- package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
- package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
- package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +95 -52
- package/dist/hooks/factories/index.d.ts +4 -4
- package/dist/hooks/factories/index.js +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
- package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
- package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
- package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
- package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3QueryHook.js +29 -3
- package/dist/hooks/index.d.ts +19 -8
- package/dist/hooks/index.js +16 -5
- package/dist/hooks/loginOperations.d.ts +1 -1
- package/dist/hooks/loginOperations.js +1 -1
- package/dist/hooks/objectOperations.d.ts +2 -2
- package/dist/hooks/objectOperations.js +50 -49
- package/dist/hooks/presignedOperations.d.ts +4 -4
- package/dist/hooks/presignedOperations.js +5 -5
- package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
- package/dist/hooks/useAccessibleBuckets.js +115 -0
- package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
- package/dist/hooks/useBatchObjectLegalHold.js +48 -0
- package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
- package/dist/hooks/useBucketConfigEditor.js +82 -0
- package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
- package/dist/hooks/useDataBrowserNavigate.js +24 -0
- package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
- package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
- package/dist/hooks/useEmptyBucket.d.ts +27 -0
- package/dist/hooks/useEmptyBucket.js +116 -0
- package/dist/hooks/useFeatures.d.ts +7 -0
- package/dist/hooks/useFeatures.js +8 -0
- package/dist/hooks/useISVBucketDetection.d.ts +15 -0
- package/dist/hooks/useISVBucketDetection.js +27 -0
- package/dist/hooks/useIsBucketEmpty.js +4 -4
- package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
- package/dist/hooks/useLimitedAccessFlow.js +23 -0
- package/dist/hooks/useS3Client.d.ts +6 -0
- package/dist/hooks/useS3Client.js +3 -2
- package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
- package/dist/hooks/useS3ConfigSwitch.js +37 -0
- package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
- package/dist/hooks/useSupportedNotificationEvents.js +8 -0
- package/dist/hooks/useTableRowSelection.d.ts +9 -0
- package/dist/hooks/useTableRowSelection.js +45 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +2 -2
- package/dist/schemas/bucketPolicySchema.json +3 -13
- package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
- package/dist/test/msw/handlers/deleteBucket.js +20 -10
- package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketAcl.js +29 -17
- package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketLocation.js +29 -15
- package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
- package/dist/test/msw/handlers/headObject.d.ts +1 -1
- package/dist/test/msw/handlers/headObject.js +31 -13
- package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
- package/dist/test/msw/handlers/listBuckets.js +5 -3
- package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
- package/dist/test/msw/handlers/listObjectVersions.js +38 -26
- package/dist/test/msw/handlers/listObjects.d.ts +1 -1
- package/dist/test/msw/handlers/listObjects.js +35 -23
- package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
- package/dist/test/msw/handlers/objectLegalHold.js +32 -17
- package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
- package/dist/test/msw/handlers/objectRetention.js +31 -17
- package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/putBucketAcl.js +29 -14
- package/dist/test/msw/handlers/putObject.d.ts +1 -1
- package/dist/test/msw/handlers/putObject.js +27 -12
- package/dist/test/msw/handlers.d.ts +3 -3
- package/dist/test/msw/handlers.js +77 -54
- package/dist/test/msw/index.d.ts +2 -2
- package/dist/test/msw/index.js +1 -1
- package/dist/test/msw/server.d.ts +1 -1
- package/dist/test/msw/server.js +1 -1
- package/dist/test/msw/utils.js +2 -2
- package/dist/test/setup.d.ts +1 -1
- package/dist/test/setup.js +13 -30
- package/dist/test/testUtils.d.ts +170 -36
- package/dist/test/testUtils.js +229 -116
- package/dist/test/utils/errorHandling.test.js +146 -108
- package/dist/types/index.d.ts +49 -36
- package/dist/types/monaco.d.ts +13 -0
- package/dist/types/monaco.js +0 -0
- package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
- package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
- package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
- package/dist/utils/__tests__/s3Client.test.js +340 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
- package/dist/utils/constants.d.ts +22 -0
- package/dist/utils/constants.js +19 -0
- package/dist/utils/deletion/index.d.ts +2 -2
- package/dist/utils/deletion/index.js +1 -1
- package/dist/utils/deletion/messages.d.ts +1 -1
- package/dist/utils/deletion/messages.js +4 -4
- package/dist/utils/errorHandling.d.ts +12 -3
- package/dist/utils/errorHandling.js +12 -7
- package/dist/utils/hooks.js +8 -8
- package/dist/utils/index.d.ts +5 -2
- package/dist/utils/index.js +5 -1
- package/dist/utils/proxyMiddleware.d.ts +32 -13
- package/dist/utils/proxyMiddleware.js +90 -36
- package/dist/utils/s3Client.d.ts +14 -4
- package/dist/utils/s3Client.js +5 -26
- package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
- package/dist/utils/s3ConfigIdentifier.js +57 -0
- package/dist/utils/s3RuleUtils.d.ts +53 -0
- package/dist/utils/s3RuleUtils.js +101 -0
- package/package.json +10 -8
- package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
- package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
- package/dist/hooks/useLoginMutation.d.ts +0 -21
- package/dist/hooks/useLoginMutation.js +0 -9
- package/dist/utils/useFeatures.d.ts +0 -1
- package/dist/utils/useFeatures.js +0 -7
- /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
|
@@ -3,6 +3,10 @@ import { fireEvent, render, screen } from "@testing-library/react";
|
|
|
3
3
|
import { MemoryRouter } from "react-router";
|
|
4
4
|
import { createTestWrapper, mockOffsetSize } from "../../test/testUtils.js";
|
|
5
5
|
import { BucketList } from "../buckets/BucketList.js";
|
|
6
|
+
import * as __rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c from "../../contexts/DataBrowserUICustomizationContext.js";
|
|
7
|
+
const mockUseDataBrowserUICustomization = (config = {})=>{
|
|
8
|
+
jest.spyOn(__rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c, 'useDataBrowserUICustomization').mockReturnValue(config);
|
|
9
|
+
};
|
|
6
10
|
const renderBucketList = (props = {})=>{
|
|
7
11
|
const Wrapper = createTestWrapper();
|
|
8
12
|
return render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
@@ -16,190 +20,169 @@ const renderBucketList = (props = {})=>{
|
|
|
16
20
|
};
|
|
17
21
|
const mockBuckets = [
|
|
18
22
|
{
|
|
19
|
-
Name:
|
|
20
|
-
CreationDate: new Date(
|
|
23
|
+
Name: 'test-bucket-1',
|
|
24
|
+
CreationDate: new Date('2024-01-15T10:30:00Z')
|
|
21
25
|
},
|
|
22
26
|
{
|
|
23
|
-
Name:
|
|
24
|
-
CreationDate: new Date(
|
|
27
|
+
Name: 'test-bucket-2',
|
|
28
|
+
CreationDate: new Date('2024-01-16T14:45:00Z')
|
|
25
29
|
},
|
|
26
30
|
{
|
|
27
|
-
Name:
|
|
28
|
-
CreationDate: new Date(
|
|
31
|
+
Name: 'test-bucket-3',
|
|
32
|
+
CreationDate: new Date('2024-01-17T09:15:00Z')
|
|
29
33
|
}
|
|
30
34
|
];
|
|
31
|
-
describe(
|
|
35
|
+
describe('BucketList', ()=>{
|
|
32
36
|
beforeEach(()=>{
|
|
33
37
|
jest.clearAllMocks();
|
|
34
38
|
mockOffsetSize(800, 600);
|
|
39
|
+
mockUseDataBrowserUICustomization({});
|
|
35
40
|
});
|
|
36
|
-
it(
|
|
41
|
+
it('shows a table with proper headers', ()=>{
|
|
37
42
|
renderBucketList({
|
|
38
43
|
buckets: mockBuckets
|
|
39
44
|
});
|
|
40
|
-
expect(screen.getByRole(
|
|
41
|
-
expect(screen.getByText(
|
|
42
|
-
expect(screen.getByText(
|
|
43
|
-
expect(screen.getByText(
|
|
45
|
+
expect(screen.getByRole('grid')).toBeInTheDocument();
|
|
46
|
+
expect(screen.getByText('Bucket Name')).toBeInTheDocument();
|
|
47
|
+
expect(screen.getByText('Storage Location')).toBeInTheDocument();
|
|
48
|
+
expect(screen.getByText('Created on')).toBeInTheDocument();
|
|
44
49
|
});
|
|
45
|
-
it(
|
|
50
|
+
it('displays buckets with their names as clickable links', ()=>{
|
|
46
51
|
const onNavigateToBucket = jest.fn();
|
|
47
52
|
renderBucketList({
|
|
48
53
|
buckets: mockBuckets,
|
|
49
54
|
onNavigateToBucket
|
|
50
55
|
});
|
|
51
|
-
expect(screen.getByText(
|
|
52
|
-
expect(screen.getByText(
|
|
53
|
-
expect(screen.getByText(
|
|
54
|
-
fireEvent.click(screen.getByText(
|
|
55
|
-
expect(onNavigateToBucket).toHaveBeenCalledWith(
|
|
56
|
+
expect(screen.getByText('test-bucket-1')).toBeInTheDocument();
|
|
57
|
+
expect(screen.getByText('test-bucket-2')).toBeInTheDocument();
|
|
58
|
+
expect(screen.getByText('test-bucket-3')).toBeInTheDocument();
|
|
59
|
+
fireEvent.click(screen.getByText('test-bucket-1'));
|
|
60
|
+
expect(onNavigateToBucket).toHaveBeenCalledWith('test-bucket-1');
|
|
56
61
|
});
|
|
57
|
-
it(
|
|
62
|
+
it('displays creation dates in formatted format', ()=>{
|
|
58
63
|
renderBucketList({
|
|
59
64
|
buckets: mockBuckets
|
|
60
65
|
});
|
|
61
|
-
const gridElement = screen.getByRole(
|
|
62
|
-
expect(gridElement).toHaveTextContent(
|
|
66
|
+
const gridElement = screen.getByRole('grid');
|
|
67
|
+
expect(gridElement).toHaveTextContent('2024');
|
|
63
68
|
const dateElements = screen.getAllByText(/2024/);
|
|
64
69
|
expect(dateElements.length).toBeGreaterThanOrEqual(3);
|
|
65
70
|
});
|
|
66
|
-
it(
|
|
67
|
-
const renderBucketLocation = jest.fn((bucketName)=>/*#__PURE__*/ jsxs("span", {
|
|
68
|
-
children: [
|
|
69
|
-
"Location for ",
|
|
70
|
-
bucketName
|
|
71
|
-
]
|
|
72
|
-
}));
|
|
73
|
-
renderBucketList({
|
|
74
|
-
buckets: mockBuckets,
|
|
75
|
-
renderBucketLocation
|
|
76
|
-
});
|
|
77
|
-
expect(renderBucketLocation).toHaveBeenCalledWith("test-bucket-1");
|
|
78
|
-
expect(renderBucketLocation).toHaveBeenCalledWith("test-bucket-2");
|
|
79
|
-
expect(renderBucketLocation).toHaveBeenCalledWith("test-bucket-3");
|
|
80
|
-
});
|
|
81
|
-
it("shows dash for storage location when renderBucketLocation is not provided", ()=>{
|
|
82
|
-
renderBucketList({
|
|
83
|
-
buckets: mockBuckets
|
|
84
|
-
});
|
|
85
|
-
const dashes = screen.getAllByText("-");
|
|
86
|
-
expect(dashes.length).toBeGreaterThan(0);
|
|
87
|
-
});
|
|
88
|
-
it("handles bucket selection when onBucketSelect is provided", ()=>{
|
|
71
|
+
it('handles bucket selection when onBucketSelect is provided', ()=>{
|
|
89
72
|
const onBucketSelect = jest.fn();
|
|
90
73
|
renderBucketList({
|
|
91
74
|
buckets: mockBuckets,
|
|
92
75
|
onBucketSelect
|
|
93
76
|
});
|
|
94
|
-
const rows = screen.getAllByRole(
|
|
77
|
+
const rows = screen.getAllByRole('row');
|
|
95
78
|
fireEvent.click(rows[1]);
|
|
96
|
-
expect(onBucketSelect).toHaveBeenCalledWith(
|
|
79
|
+
expect(onBucketSelect).toHaveBeenCalledWith('test-bucket-3');
|
|
97
80
|
});
|
|
98
|
-
it(
|
|
81
|
+
it('shows selected bucket when selectedBucketName is provided', ()=>{
|
|
99
82
|
renderBucketList({
|
|
100
83
|
buckets: mockBuckets,
|
|
101
|
-
selectedBucketName:
|
|
84
|
+
selectedBucketName: 'test-bucket-2'
|
|
102
85
|
});
|
|
103
|
-
const selectedRow = screen.getByRole(
|
|
86
|
+
const selectedRow = screen.getByRole('row', {
|
|
104
87
|
name: /test-bucket-2/
|
|
105
88
|
});
|
|
106
|
-
expect(selectedRow).toHaveAttribute(
|
|
89
|
+
expect(selectedRow).toHaveAttribute('aria-selected', 'true');
|
|
107
90
|
});
|
|
108
|
-
it(
|
|
91
|
+
it('handles create bucket button click', ()=>{
|
|
109
92
|
const onCreateBucket = jest.fn();
|
|
110
93
|
renderBucketList({
|
|
111
94
|
buckets: mockBuckets,
|
|
112
95
|
onCreateBucket
|
|
113
96
|
});
|
|
114
|
-
const createButton = screen.getByRole(
|
|
97
|
+
const createButton = screen.getByRole('button', {
|
|
115
98
|
name: /create bucket/i
|
|
116
99
|
});
|
|
117
100
|
expect(createButton).toBeInTheDocument();
|
|
118
101
|
fireEvent.click(createButton);
|
|
119
102
|
expect(onCreateBucket).toHaveBeenCalled();
|
|
120
103
|
});
|
|
121
|
-
it(
|
|
104
|
+
it('shows search functionality', ()=>{
|
|
122
105
|
renderBucketList({
|
|
123
106
|
buckets: mockBuckets
|
|
124
107
|
});
|
|
125
|
-
const searchInput = screen.getByRole(
|
|
108
|
+
const searchInput = screen.getByRole('searchbox');
|
|
126
109
|
expect(searchInput).toBeInTheDocument();
|
|
127
|
-
expect(searchInput).toHaveAttribute(
|
|
110
|
+
expect(searchInput).toHaveAttribute('placeholder', 'Example: Search');
|
|
128
111
|
});
|
|
129
|
-
it(
|
|
112
|
+
it('handles empty buckets list', ()=>{
|
|
130
113
|
renderBucketList({
|
|
131
114
|
buckets: []
|
|
132
115
|
});
|
|
133
|
-
expect(screen.getByRole(
|
|
134
|
-
expect(screen.getByText(
|
|
116
|
+
expect(screen.getByRole('grid')).toBeInTheDocument();
|
|
117
|
+
expect(screen.getByText('Bucket Name')).toBeInTheDocument();
|
|
135
118
|
});
|
|
136
|
-
it(
|
|
119
|
+
it('handles buckets without names gracefully', ()=>{
|
|
137
120
|
const bucketsWithMissingNames = [
|
|
138
121
|
{
|
|
139
122
|
Name: void 0,
|
|
140
123
|
CreationDate: new Date()
|
|
141
124
|
},
|
|
142
125
|
{
|
|
143
|
-
Name:
|
|
126
|
+
Name: '',
|
|
144
127
|
CreationDate: new Date()
|
|
145
128
|
},
|
|
146
129
|
{
|
|
147
|
-
Name:
|
|
130
|
+
Name: 'valid-bucket',
|
|
148
131
|
CreationDate: new Date()
|
|
149
132
|
}
|
|
150
133
|
];
|
|
151
134
|
renderBucketList({
|
|
152
135
|
buckets: bucketsWithMissingNames
|
|
153
136
|
});
|
|
154
|
-
expect(screen.getByText(
|
|
155
|
-
const dashes = screen.getAllByText(
|
|
137
|
+
expect(screen.getByText('valid-bucket')).toBeInTheDocument();
|
|
138
|
+
const dashes = screen.getAllByText('-');
|
|
156
139
|
expect(dashes.length).toBeGreaterThan(0);
|
|
157
140
|
});
|
|
158
|
-
it(
|
|
141
|
+
it('handles buckets without creation dates', ()=>{
|
|
159
142
|
const bucketsWithoutDates = [
|
|
160
143
|
{
|
|
161
|
-
Name:
|
|
144
|
+
Name: 'bucket-1',
|
|
162
145
|
CreationDate: void 0
|
|
163
146
|
},
|
|
164
147
|
{
|
|
165
|
-
Name:
|
|
148
|
+
Name: 'bucket-2'
|
|
166
149
|
}
|
|
167
150
|
];
|
|
168
151
|
renderBucketList({
|
|
169
152
|
buckets: bucketsWithoutDates
|
|
170
153
|
});
|
|
171
|
-
expect(screen.getByText(
|
|
172
|
-
expect(screen.getByText(
|
|
154
|
+
expect(screen.getByText('bucket-1')).toBeInTheDocument();
|
|
155
|
+
expect(screen.getByText('bucket-2')).toBeInTheDocument();
|
|
173
156
|
});
|
|
174
|
-
it(
|
|
157
|
+
it('works when no callbacks are provided', ()=>{
|
|
175
158
|
renderBucketList({
|
|
176
159
|
buckets: mockBuckets
|
|
177
160
|
});
|
|
178
161
|
expect(()=>{
|
|
179
|
-
fireEvent.click(screen.getByText(
|
|
180
|
-
const createButton = screen.getByRole(
|
|
162
|
+
fireEvent.click(screen.getByText('test-bucket-1'));
|
|
163
|
+
const createButton = screen.getByRole('button', {
|
|
181
164
|
name: /create bucket/i
|
|
182
165
|
});
|
|
183
166
|
fireEvent.click(createButton);
|
|
184
167
|
}).not.toThrow();
|
|
185
168
|
});
|
|
186
|
-
it(
|
|
169
|
+
it('handles different bucket statuses', ()=>{
|
|
187
170
|
expect(()=>{
|
|
188
171
|
renderBucketList({
|
|
189
172
|
buckets: mockBuckets,
|
|
190
|
-
bucketStatus:
|
|
173
|
+
bucketStatus: 'loading'
|
|
191
174
|
});
|
|
192
175
|
renderBucketList({
|
|
193
176
|
buckets: mockBuckets,
|
|
194
|
-
bucketStatus:
|
|
177
|
+
bucketStatus: 'error'
|
|
195
178
|
});
|
|
196
179
|
renderBucketList({
|
|
197
180
|
buckets: mockBuckets,
|
|
198
|
-
bucketStatus:
|
|
181
|
+
bucketStatus: 'success'
|
|
199
182
|
});
|
|
200
183
|
}).not.toThrow();
|
|
201
184
|
});
|
|
202
|
-
it(
|
|
185
|
+
it('prevents event propagation when clicking bucket name link', ()=>{
|
|
203
186
|
const onNavigateToBucket = jest.fn();
|
|
204
187
|
const onBucketSelect = jest.fn();
|
|
205
188
|
renderBucketList({
|
|
@@ -207,19 +190,450 @@ describe("BucketList", ()=>{
|
|
|
207
190
|
onNavigateToBucket,
|
|
208
191
|
onBucketSelect
|
|
209
192
|
});
|
|
210
|
-
fireEvent.click(screen.getByText(
|
|
211
|
-
expect(onNavigateToBucket).toHaveBeenCalledWith(
|
|
193
|
+
fireEvent.click(screen.getByText('test-bucket-1'));
|
|
194
|
+
expect(onNavigateToBucket).toHaveBeenCalledWith('test-bucket-1');
|
|
212
195
|
expect(onBucketSelect).not.toHaveBeenCalled();
|
|
213
196
|
});
|
|
214
|
-
it(
|
|
197
|
+
it('does not select already selected bucket', ()=>{
|
|
215
198
|
const onBucketSelect = jest.fn();
|
|
216
199
|
renderBucketList({
|
|
217
200
|
buckets: mockBuckets,
|
|
218
|
-
selectedBucketName:
|
|
201
|
+
selectedBucketName: 'test-bucket-1',
|
|
219
202
|
onBucketSelect
|
|
220
203
|
});
|
|
221
|
-
const bucketName = screen.getByText(
|
|
204
|
+
const bucketName = screen.getByText('test-bucket-1');
|
|
222
205
|
fireEvent.click(bucketName.closest('[role="row"]') || bucketName);
|
|
223
206
|
expect(onBucketSelect).not.toHaveBeenCalled();
|
|
224
207
|
});
|
|
208
|
+
describe('extraBucketListColumns support', ()=>{
|
|
209
|
+
it('renders extra columns when extraBucketListColumns is configured', ()=>{
|
|
210
|
+
const CustomColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
211
|
+
children: [
|
|
212
|
+
"Custom data for ",
|
|
213
|
+
data.Name
|
|
214
|
+
]
|
|
215
|
+
});
|
|
216
|
+
mockUseDataBrowserUICustomization({
|
|
217
|
+
extraBucketListColumns: [
|
|
218
|
+
{
|
|
219
|
+
id: 'customData',
|
|
220
|
+
header: 'Custom Data',
|
|
221
|
+
render: CustomColumn
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
});
|
|
225
|
+
renderBucketList({
|
|
226
|
+
buckets: mockBuckets
|
|
227
|
+
});
|
|
228
|
+
expect(screen.getByText('Custom Data')).toBeInTheDocument();
|
|
229
|
+
expect(screen.getByText('Custom data for test-bucket-1')).toBeInTheDocument();
|
|
230
|
+
expect(screen.getByText('Custom data for test-bucket-2')).toBeInTheDocument();
|
|
231
|
+
expect(screen.getByText('Custom data for test-bucket-3')).toBeInTheDocument();
|
|
232
|
+
});
|
|
233
|
+
it('renders multiple extra columns in correct order', ()=>{
|
|
234
|
+
const ColumnA = ()=>/*#__PURE__*/ jsx("span", {
|
|
235
|
+
children: "A"
|
|
236
|
+
});
|
|
237
|
+
const ColumnB = ()=>/*#__PURE__*/ jsx("span", {
|
|
238
|
+
children: "B"
|
|
239
|
+
});
|
|
240
|
+
mockUseDataBrowserUICustomization({
|
|
241
|
+
extraBucketListColumns: [
|
|
242
|
+
{
|
|
243
|
+
id: 'columnA',
|
|
244
|
+
header: 'Column A',
|
|
245
|
+
render: ColumnA
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
id: 'columnB',
|
|
249
|
+
header: 'Column B',
|
|
250
|
+
render: ColumnB
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
});
|
|
254
|
+
renderBucketList({
|
|
255
|
+
buckets: mockBuckets
|
|
256
|
+
});
|
|
257
|
+
const headers = screen.getAllByRole('columnheader');
|
|
258
|
+
const headerTexts = headers.map((h)=>h.textContent);
|
|
259
|
+
expect(headerTexts).toContain('Bucket Name');
|
|
260
|
+
expect(headerTexts).toContain('Storage Location');
|
|
261
|
+
expect(headerTexts).toContain('Column A');
|
|
262
|
+
expect(headerTexts).toContain('Column B');
|
|
263
|
+
expect(headerTexts).toContain('Created on');
|
|
264
|
+
const bucketNameIndex = headerTexts.indexOf('Bucket Name');
|
|
265
|
+
const storageLocationIndex = headerTexts.indexOf('Storage Location');
|
|
266
|
+
const columnAIndex = headerTexts.indexOf('Column A');
|
|
267
|
+
const columnBIndex = headerTexts.indexOf('Column B');
|
|
268
|
+
const createdOnIndex = headerTexts.indexOf('Created on');
|
|
269
|
+
expect(bucketNameIndex).toBeLessThan(storageLocationIndex);
|
|
270
|
+
expect(storageLocationIndex).toBeLessThan(columnAIndex);
|
|
271
|
+
expect(columnAIndex).toBeLessThan(columnBIndex);
|
|
272
|
+
expect(columnBIndex).toBeLessThan(createdOnIndex);
|
|
273
|
+
});
|
|
274
|
+
it('works without extra columns (shows default columns)', ()=>{
|
|
275
|
+
renderBucketList({
|
|
276
|
+
buckets: mockBuckets
|
|
277
|
+
});
|
|
278
|
+
const headers = screen.getAllByRole('columnheader');
|
|
279
|
+
const headerTexts = headers.map((h)=>h.textContent);
|
|
280
|
+
expect(headerTexts).toContain('Bucket Name');
|
|
281
|
+
expect(headerTexts).toContain('Storage Location');
|
|
282
|
+
expect(headerTexts).toContain('Created on');
|
|
283
|
+
expect(headerTexts).toHaveLength(3);
|
|
284
|
+
});
|
|
285
|
+
it('receives full bucket data in render component', ()=>{
|
|
286
|
+
const CustomColumn = jest.fn(({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
287
|
+
children: [
|
|
288
|
+
"Bucket ",
|
|
289
|
+
data.Name
|
|
290
|
+
]
|
|
291
|
+
}));
|
|
292
|
+
mockUseDataBrowserUICustomization({
|
|
293
|
+
extraBucketListColumns: [
|
|
294
|
+
{
|
|
295
|
+
id: 'customColumn',
|
|
296
|
+
header: 'Custom',
|
|
297
|
+
render: CustomColumn
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
});
|
|
301
|
+
renderBucketList({
|
|
302
|
+
buckets: mockBuckets
|
|
303
|
+
});
|
|
304
|
+
expect(CustomColumn).toHaveBeenCalledWith(expect.objectContaining({
|
|
305
|
+
data: mockBuckets[0]
|
|
306
|
+
}), expect.anything());
|
|
307
|
+
});
|
|
308
|
+
it('supports custom column widths', ()=>{
|
|
309
|
+
const CustomColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
310
|
+
children: [
|
|
311
|
+
"Width: ",
|
|
312
|
+
data.Name
|
|
313
|
+
]
|
|
314
|
+
});
|
|
315
|
+
mockUseDataBrowserUICustomization({
|
|
316
|
+
extraBucketListColumns: [
|
|
317
|
+
{
|
|
318
|
+
id: 'customWidth',
|
|
319
|
+
header: 'Custom Width',
|
|
320
|
+
width: '200px',
|
|
321
|
+
render: CustomColumn
|
|
322
|
+
}
|
|
323
|
+
]
|
|
324
|
+
});
|
|
325
|
+
renderBucketList({
|
|
326
|
+
buckets: mockBuckets
|
|
327
|
+
});
|
|
328
|
+
expect(screen.getByText('Custom Width')).toBeInTheDocument();
|
|
329
|
+
expect(screen.getByText('Width: test-bucket-1')).toBeInTheDocument();
|
|
330
|
+
});
|
|
331
|
+
it('supports custom columns with IDs not in Bucket type (e.g., computed data)', ()=>{
|
|
332
|
+
const DataUsedColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
333
|
+
children: [
|
|
334
|
+
"Data used for ",
|
|
335
|
+
data.Name
|
|
336
|
+
]
|
|
337
|
+
});
|
|
338
|
+
mockUseDataBrowserUICustomization({
|
|
339
|
+
extraBucketListColumns: [
|
|
340
|
+
{
|
|
341
|
+
id: 'dataUsed',
|
|
342
|
+
header: 'Data Used',
|
|
343
|
+
render: DataUsedColumn
|
|
344
|
+
}
|
|
345
|
+
]
|
|
346
|
+
});
|
|
347
|
+
renderBucketList({
|
|
348
|
+
buckets: mockBuckets
|
|
349
|
+
});
|
|
350
|
+
expect(screen.getByText('Data Used')).toBeInTheDocument();
|
|
351
|
+
expect(screen.getByText('Data used for test-bucket-1')).toBeInTheDocument();
|
|
352
|
+
expect(screen.getByText('Data used for test-bucket-2')).toBeInTheDocument();
|
|
353
|
+
expect(screen.getByText('Data used for test-bucket-3')).toBeInTheDocument();
|
|
354
|
+
});
|
|
355
|
+
it('supports mixing native and custom column IDs', ()=>{
|
|
356
|
+
const RegionColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
357
|
+
children: [
|
|
358
|
+
"Region: ",
|
|
359
|
+
data.Name
|
|
360
|
+
]
|
|
361
|
+
});
|
|
362
|
+
const MetricsColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
363
|
+
children: [
|
|
364
|
+
"Metrics for ",
|
|
365
|
+
data.Name
|
|
366
|
+
]
|
|
367
|
+
});
|
|
368
|
+
mockUseDataBrowserUICustomization({
|
|
369
|
+
extraBucketListColumns: [
|
|
370
|
+
{
|
|
371
|
+
id: 'location',
|
|
372
|
+
header: 'Region',
|
|
373
|
+
render: RegionColumn
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
id: 'customMetrics',
|
|
377
|
+
header: 'Metrics',
|
|
378
|
+
render: MetricsColumn
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
});
|
|
382
|
+
renderBucketList({
|
|
383
|
+
buckets: mockBuckets
|
|
384
|
+
});
|
|
385
|
+
expect(screen.queryByText('Storage Location')).not.toBeInTheDocument();
|
|
386
|
+
expect(screen.getByText('Region')).toBeInTheDocument();
|
|
387
|
+
expect(screen.getByText('Metrics')).toBeInTheDocument();
|
|
388
|
+
expect(screen.getByText('Region: test-bucket-1')).toBeInTheDocument();
|
|
389
|
+
expect(screen.getByText('Metrics for test-bucket-1')).toBeInTheDocument();
|
|
390
|
+
});
|
|
391
|
+
it('can replace default columns by using matching IDs', ()=>{
|
|
392
|
+
const CustomLocationColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
393
|
+
children: [
|
|
394
|
+
"Custom location for ",
|
|
395
|
+
data.Name
|
|
396
|
+
]
|
|
397
|
+
});
|
|
398
|
+
mockUseDataBrowserUICustomization({
|
|
399
|
+
extraBucketListColumns: [
|
|
400
|
+
{
|
|
401
|
+
id: 'location',
|
|
402
|
+
header: 'Custom Location',
|
|
403
|
+
render: CustomLocationColumn
|
|
404
|
+
}
|
|
405
|
+
]
|
|
406
|
+
});
|
|
407
|
+
renderBucketList({
|
|
408
|
+
buckets: mockBuckets
|
|
409
|
+
});
|
|
410
|
+
expect(screen.getByText('Custom Location')).toBeInTheDocument();
|
|
411
|
+
expect(screen.queryByText('Storage Location')).not.toBeInTheDocument();
|
|
412
|
+
expect(screen.getByText('Custom location for test-bucket-1')).toBeInTheDocument();
|
|
413
|
+
expect(screen.getByText('Custom location for test-bucket-2')).toBeInTheDocument();
|
|
414
|
+
expect(screen.getByText('Custom location for test-bucket-3')).toBeInTheDocument();
|
|
415
|
+
});
|
|
416
|
+
it('can replace multiple default columns simultaneously', ()=>{
|
|
417
|
+
const CustomLocationColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
418
|
+
children: [
|
|
419
|
+
"Loc: ",
|
|
420
|
+
data.Name
|
|
421
|
+
]
|
|
422
|
+
});
|
|
423
|
+
const CustomDateColumn = ({ data })=>/*#__PURE__*/ jsxs("span", {
|
|
424
|
+
children: [
|
|
425
|
+
"Date: ",
|
|
426
|
+
data.CreationDate?.toString()
|
|
427
|
+
]
|
|
428
|
+
});
|
|
429
|
+
mockUseDataBrowserUICustomization({
|
|
430
|
+
extraBucketListColumns: [
|
|
431
|
+
{
|
|
432
|
+
id: 'location',
|
|
433
|
+
header: 'Loc',
|
|
434
|
+
render: CustomLocationColumn
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
id: 'date',
|
|
438
|
+
header: 'Date',
|
|
439
|
+
render: CustomDateColumn
|
|
440
|
+
}
|
|
441
|
+
]
|
|
442
|
+
});
|
|
443
|
+
renderBucketList({
|
|
444
|
+
buckets: mockBuckets
|
|
445
|
+
});
|
|
446
|
+
expect(screen.getByText('Loc')).toBeInTheDocument();
|
|
447
|
+
expect(screen.getByText('Date')).toBeInTheDocument();
|
|
448
|
+
expect(screen.queryByText('Storage Location')).not.toBeInTheDocument();
|
|
449
|
+
expect(screen.queryByText('Created on')).not.toBeInTheDocument();
|
|
450
|
+
expect(screen.getByText('Loc: test-bucket-1')).toBeInTheDocument();
|
|
451
|
+
});
|
|
452
|
+
it('maintains correct column order when replacing and adding columns', ()=>{
|
|
453
|
+
const CustomLocationColumn = ()=>/*#__PURE__*/ jsx("span", {
|
|
454
|
+
children: "Custom Loc"
|
|
455
|
+
});
|
|
456
|
+
const ExtraColumn = ()=>/*#__PURE__*/ jsx("span", {
|
|
457
|
+
children: "Extra"
|
|
458
|
+
});
|
|
459
|
+
mockUseDataBrowserUICustomization({
|
|
460
|
+
extraBucketListColumns: [
|
|
461
|
+
{
|
|
462
|
+
id: 'location',
|
|
463
|
+
header: 'Custom Location',
|
|
464
|
+
render: CustomLocationColumn
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
id: 'extraData',
|
|
468
|
+
header: 'Extra Data',
|
|
469
|
+
render: ExtraColumn
|
|
470
|
+
}
|
|
471
|
+
]
|
|
472
|
+
});
|
|
473
|
+
renderBucketList({
|
|
474
|
+
buckets: mockBuckets
|
|
475
|
+
});
|
|
476
|
+
const headers = screen.getAllByRole('columnheader');
|
|
477
|
+
const headerTexts = headers.map((h)=>h.textContent);
|
|
478
|
+
const bucketNameIndex = headerTexts.indexOf('Bucket Name');
|
|
479
|
+
const customLocationIndex = headerTexts.indexOf('Custom Location');
|
|
480
|
+
const extraDataIndex = headerTexts.indexOf('Extra Data');
|
|
481
|
+
const createdOnIndex = headerTexts.indexOf('Created on');
|
|
482
|
+
expect(bucketNameIndex).toBe(0);
|
|
483
|
+
expect(customLocationIndex).toBe(1);
|
|
484
|
+
expect(extraDataIndex).toBe(2);
|
|
485
|
+
expect(createdOnIndex).toBe(3);
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
describe('extraBucketListActions support', ()=>{
|
|
489
|
+
it('renders extra actions when extraBucketListActions is configured', ()=>{
|
|
490
|
+
const CustomAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
491
|
+
children: "Custom Action"
|
|
492
|
+
});
|
|
493
|
+
mockUseDataBrowserUICustomization({
|
|
494
|
+
extraBucketListActions: [
|
|
495
|
+
{
|
|
496
|
+
id: 'customAction',
|
|
497
|
+
render: CustomAction
|
|
498
|
+
}
|
|
499
|
+
]
|
|
500
|
+
});
|
|
501
|
+
renderBucketList({
|
|
502
|
+
buckets: mockBuckets
|
|
503
|
+
});
|
|
504
|
+
expect(screen.getByText('Custom Action')).toBeInTheDocument();
|
|
505
|
+
});
|
|
506
|
+
it('renders multiple extra actions', ()=>{
|
|
507
|
+
const Action1 = ()=>/*#__PURE__*/ jsx("button", {
|
|
508
|
+
children: "Action 1"
|
|
509
|
+
});
|
|
510
|
+
const Action2 = ()=>/*#__PURE__*/ jsx("button", {
|
|
511
|
+
children: "Action 2"
|
|
512
|
+
});
|
|
513
|
+
mockUseDataBrowserUICustomization({
|
|
514
|
+
extraBucketListActions: [
|
|
515
|
+
{
|
|
516
|
+
id: 'action1',
|
|
517
|
+
render: Action1
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
id: 'action2',
|
|
521
|
+
render: Action2
|
|
522
|
+
}
|
|
523
|
+
]
|
|
524
|
+
});
|
|
525
|
+
renderBucketList({
|
|
526
|
+
buckets: mockBuckets
|
|
527
|
+
});
|
|
528
|
+
expect(screen.getByText('Action 1')).toBeInTheDocument();
|
|
529
|
+
expect(screen.getByText('Action 2')).toBeInTheDocument();
|
|
530
|
+
});
|
|
531
|
+
it('renders actions alongside default Create Bucket button', ()=>{
|
|
532
|
+
const CustomAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
533
|
+
children: "Export"
|
|
534
|
+
});
|
|
535
|
+
mockUseDataBrowserUICustomization({
|
|
536
|
+
extraBucketListActions: [
|
|
537
|
+
{
|
|
538
|
+
id: 'export',
|
|
539
|
+
render: CustomAction
|
|
540
|
+
}
|
|
541
|
+
]
|
|
542
|
+
});
|
|
543
|
+
renderBucketList({
|
|
544
|
+
buckets: mockBuckets,
|
|
545
|
+
onCreateBucket: jest.fn()
|
|
546
|
+
});
|
|
547
|
+
expect(screen.getByText('Create Bucket')).toBeInTheDocument();
|
|
548
|
+
expect(screen.getByText('Export')).toBeInTheDocument();
|
|
549
|
+
});
|
|
550
|
+
it('works without extra actions', ()=>{
|
|
551
|
+
renderBucketList({
|
|
552
|
+
buckets: mockBuckets,
|
|
553
|
+
onCreateBucket: jest.fn()
|
|
554
|
+
});
|
|
555
|
+
expect(screen.getByText('Create Bucket')).toBeInTheDocument();
|
|
556
|
+
});
|
|
557
|
+
it("can replace default Create Bucket action by using 'createBucket' ID", ()=>{
|
|
558
|
+
const CustomCreateAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
559
|
+
children: "Custom Create"
|
|
560
|
+
});
|
|
561
|
+
mockUseDataBrowserUICustomization({
|
|
562
|
+
extraBucketListActions: [
|
|
563
|
+
{
|
|
564
|
+
id: 'createBucket',
|
|
565
|
+
render: CustomCreateAction
|
|
566
|
+
}
|
|
567
|
+
]
|
|
568
|
+
});
|
|
569
|
+
renderBucketList({
|
|
570
|
+
buckets: mockBuckets,
|
|
571
|
+
onCreateBucket: jest.fn()
|
|
572
|
+
});
|
|
573
|
+
expect(screen.getByText('Custom Create')).toBeInTheDocument();
|
|
574
|
+
expect(screen.queryByText('Create Bucket')).not.toBeInTheDocument();
|
|
575
|
+
});
|
|
576
|
+
it('can mix replacing default action and adding new actions', ()=>{
|
|
577
|
+
const CustomCreateAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
578
|
+
children: "Custom Create"
|
|
579
|
+
});
|
|
580
|
+
const ExportAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
581
|
+
children: "Export"
|
|
582
|
+
});
|
|
583
|
+
mockUseDataBrowserUICustomization({
|
|
584
|
+
extraBucketListActions: [
|
|
585
|
+
{
|
|
586
|
+
id: 'createBucket',
|
|
587
|
+
render: CustomCreateAction
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
id: 'export',
|
|
591
|
+
render: ExportAction
|
|
592
|
+
}
|
|
593
|
+
]
|
|
594
|
+
});
|
|
595
|
+
renderBucketList({
|
|
596
|
+
buckets: mockBuckets,
|
|
597
|
+
onCreateBucket: jest.fn()
|
|
598
|
+
});
|
|
599
|
+
expect(screen.getByText('Custom Create')).toBeInTheDocument();
|
|
600
|
+
expect(screen.getByText('Export')).toBeInTheDocument();
|
|
601
|
+
expect(screen.queryByText('Create Bucket')).not.toBeInTheDocument();
|
|
602
|
+
});
|
|
603
|
+
it('maintains correct action order when replacing and adding actions', ()=>{
|
|
604
|
+
const CustomCreateAction = ()=>/*#__PURE__*/ jsx("button", {
|
|
605
|
+
children: "Custom Create"
|
|
606
|
+
});
|
|
607
|
+
const Action1 = ()=>/*#__PURE__*/ jsx("button", {
|
|
608
|
+
children: "Action 1"
|
|
609
|
+
});
|
|
610
|
+
const Action2 = ()=>/*#__PURE__*/ jsx("button", {
|
|
611
|
+
children: "Action 2"
|
|
612
|
+
});
|
|
613
|
+
mockUseDataBrowserUICustomization({
|
|
614
|
+
extraBucketListActions: [
|
|
615
|
+
{
|
|
616
|
+
id: 'createBucket',
|
|
617
|
+
render: CustomCreateAction
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
id: 'action1',
|
|
621
|
+
render: Action1
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
id: 'action2',
|
|
625
|
+
render: Action2
|
|
626
|
+
}
|
|
627
|
+
]
|
|
628
|
+
});
|
|
629
|
+
renderBucketList({
|
|
630
|
+
buckets: mockBuckets,
|
|
631
|
+
onCreateBucket: jest.fn()
|
|
632
|
+
});
|
|
633
|
+
const buttons = screen.getAllByRole('button');
|
|
634
|
+
expect(buttons[0]).toHaveTextContent('Custom Create');
|
|
635
|
+
expect(buttons[1]).toHaveTextContent('Action 1');
|
|
636
|
+
expect(buttons[2]).toHaveTextContent('Action 2');
|
|
637
|
+
});
|
|
638
|
+
});
|
|
225
639
|
});
|