@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
|
@@ -1,479 +1,784 @@
|
|
|
1
|
-
import { jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
3
|
+
import { MemoryRouter } from "react-router";
|
|
4
|
+
import { useGetBucketAcl, useGetBucketCors, useGetBucketLocation, useGetBucketObjectLockConfiguration, useGetBucketPolicy, useGetBucketTagging, useGetBucketVersioning, useISVBucketStatus } from "../../hooks/index.js";
|
|
5
|
+
import { useFeatures } from "../../hooks/useFeatures.js";
|
|
6
|
+
import { applyBucketMocks, createTestWrapper } from "../../test/testUtils.js";
|
|
7
|
+
import { BucketOverview, useBucketOverviewContext } from "../buckets/BucketOverview.js";
|
|
8
|
+
import * as __rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c from "../../contexts/DataBrowserUICustomizationContext.js";
|
|
9
|
+
jest.mock('../../hooks');
|
|
10
|
+
jest.mock('../../hooks/useFeatures');
|
|
7
11
|
const mockUseGetBucketVersioning = jest.mocked(useGetBucketVersioning);
|
|
8
12
|
const mockUseGetBucketAcl = jest.mocked(useGetBucketAcl);
|
|
9
13
|
const mockUseGetBucketLocation = jest.mocked(useGetBucketLocation);
|
|
10
14
|
const mockUseGetBucketCors = jest.mocked(useGetBucketCors);
|
|
11
15
|
const mockUseGetBucketObjectLockConfiguration = jest.mocked(useGetBucketObjectLockConfiguration);
|
|
12
16
|
const mockUseGetBucketPolicy = jest.mocked(useGetBucketPolicy);
|
|
17
|
+
const mockUseGetBucketTagging = jest.mocked(useGetBucketTagging);
|
|
18
|
+
const mockUseISVBucketStatus = jest.mocked(useISVBucketStatus);
|
|
19
|
+
const mockUseFeatures = jest.mocked(useFeatures);
|
|
20
|
+
const mockUseDataBrowserUICustomization = (config = {})=>{
|
|
21
|
+
jest.spyOn(__rspack_external__contexts_DataBrowserUICustomizationContext_js_f267b01c, 'useDataBrowserUICustomization').mockReturnValue(config);
|
|
22
|
+
};
|
|
13
23
|
const renderBucketOverview = (props = {})=>{
|
|
24
|
+
const { bucketName = 'test-bucket', onEmptyBucket, onDeleteBucket, onEditPolicy, renderEmptyButton, renderDeleteButton, isEmptyBucketDisabled, isDeleteBucketDisabled } = props;
|
|
14
25
|
const Wrapper = createTestWrapper();
|
|
15
|
-
return render(/*#__PURE__*/ jsx(
|
|
16
|
-
children: /*#__PURE__*/ jsx(
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
return render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
27
|
+
children: /*#__PURE__*/ jsx(Wrapper, {
|
|
28
|
+
children: /*#__PURE__*/ jsxs(BucketOverview, {
|
|
29
|
+
bucketName: bucketName,
|
|
30
|
+
children: [
|
|
31
|
+
/*#__PURE__*/ jsx(BucketOverview.Actions, {
|
|
32
|
+
onEmptyBucket: onEmptyBucket,
|
|
33
|
+
onDeleteBucket: onDeleteBucket,
|
|
34
|
+
renderEmptyButton: renderEmptyButton,
|
|
35
|
+
renderDeleteButton: renderDeleteButton,
|
|
36
|
+
isEmptyBucketDisabled: isEmptyBucketDisabled,
|
|
37
|
+
isDeleteBucketDisabled: isDeleteBucketDisabled
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ jsxs(BucketOverview.Sections, {
|
|
40
|
+
children: [
|
|
41
|
+
/*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
|
|
42
|
+
/*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
|
|
43
|
+
/*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {
|
|
44
|
+
onEditPolicy: onEditPolicy
|
|
45
|
+
})
|
|
46
|
+
]
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
})
|
|
19
50
|
})
|
|
20
51
|
}));
|
|
21
52
|
};
|
|
22
|
-
const mockHookDefaults = ()=>{
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
Grants: [
|
|
35
|
-
{
|
|
36
|
-
Grantee: {
|
|
37
|
-
DisplayName: "test-grantee"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
},
|
|
42
|
-
status: "success"
|
|
43
|
-
});
|
|
44
|
-
mockUseGetBucketLocation.mockReturnValue({
|
|
45
|
-
data: {
|
|
46
|
-
LocationConstraint: "us-west-2"
|
|
47
|
-
},
|
|
48
|
-
status: "success"
|
|
49
|
-
});
|
|
50
|
-
mockUseGetBucketCors.mockReturnValue({
|
|
51
|
-
data: {
|
|
52
|
-
CORSRules: []
|
|
53
|
-
},
|
|
54
|
-
status: "success"
|
|
55
|
-
});
|
|
56
|
-
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
57
|
-
data: {
|
|
58
|
-
ObjectLockConfiguration: {
|
|
59
|
-
ObjectLockEnabled: "Disabled"
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
status: "success"
|
|
63
|
-
});
|
|
64
|
-
mockUseGetBucketPolicy.mockReturnValue({
|
|
65
|
-
data: void 0,
|
|
66
|
-
error: null,
|
|
67
|
-
status: "success"
|
|
68
|
-
});
|
|
53
|
+
const mockHookDefaults = (overrides = {})=>{
|
|
54
|
+
applyBucketMocks({
|
|
55
|
+
useGetBucketVersioning: mockUseGetBucketVersioning,
|
|
56
|
+
useGetBucketAcl: mockUseGetBucketAcl,
|
|
57
|
+
useGetBucketLocation: mockUseGetBucketLocation,
|
|
58
|
+
useGetBucketCors: mockUseGetBucketCors,
|
|
59
|
+
useGetBucketObjectLockConfiguration: mockUseGetBucketObjectLockConfiguration,
|
|
60
|
+
useGetBucketPolicy: mockUseGetBucketPolicy,
|
|
61
|
+
useGetBucketTagging: mockUseGetBucketTagging,
|
|
62
|
+
useISVBucketStatus: mockUseISVBucketStatus,
|
|
63
|
+
useFeatures: mockUseFeatures
|
|
64
|
+
}, overrides);
|
|
69
65
|
};
|
|
70
|
-
describe(
|
|
66
|
+
describe('BucketOverview', ()=>{
|
|
71
67
|
beforeEach(()=>{
|
|
72
68
|
jest.clearAllMocks();
|
|
73
69
|
mockHookDefaults();
|
|
70
|
+
mockUseDataBrowserUICustomization({});
|
|
74
71
|
});
|
|
75
|
-
it(
|
|
72
|
+
it('renders bucket overview with all sections', ()=>{
|
|
76
73
|
renderBucketOverview();
|
|
77
|
-
expect(screen.getByText(
|
|
78
|
-
expect(screen.getByText(
|
|
79
|
-
expect(screen.getByText(
|
|
74
|
+
expect(screen.getByText('General')).toBeInTheDocument();
|
|
75
|
+
expect(screen.getByText('Data protection')).toBeInTheDocument();
|
|
76
|
+
expect(screen.getByText('Permissions')).toBeInTheDocument();
|
|
80
77
|
});
|
|
81
|
-
it(
|
|
78
|
+
it('displays bucket name correctly', ()=>{
|
|
82
79
|
renderBucketOverview({
|
|
83
|
-
bucketName:
|
|
80
|
+
bucketName: 'my-test-bucket'
|
|
84
81
|
});
|
|
85
|
-
expect(screen.getByText(
|
|
82
|
+
expect(screen.getByText('my-test-bucket')).toBeInTheDocument();
|
|
86
83
|
});
|
|
87
|
-
it(
|
|
84
|
+
it('shows versioning status when enabled', ()=>{
|
|
88
85
|
mockUseGetBucketVersioning.mockReturnValue({
|
|
89
86
|
data: {
|
|
90
|
-
Status:
|
|
87
|
+
Status: 'Enabled'
|
|
91
88
|
},
|
|
92
|
-
status:
|
|
89
|
+
status: 'success'
|
|
93
90
|
});
|
|
94
91
|
renderBucketOverview();
|
|
95
|
-
expect(screen.getByText(
|
|
92
|
+
expect(screen.getByText('Active')).toBeInTheDocument();
|
|
96
93
|
});
|
|
97
|
-
it(
|
|
94
|
+
it('shows versioning status when disabled', ()=>{
|
|
98
95
|
mockUseGetBucketVersioning.mockReturnValue({
|
|
99
96
|
data: {
|
|
100
|
-
Status:
|
|
97
|
+
Status: 'Suspended'
|
|
101
98
|
},
|
|
102
|
-
status:
|
|
99
|
+
status: 'success'
|
|
103
100
|
});
|
|
104
101
|
renderBucketOverview();
|
|
105
|
-
expect(screen.getByText(
|
|
102
|
+
expect(screen.getByText('Inactive')).toBeInTheDocument();
|
|
106
103
|
});
|
|
107
|
-
it(
|
|
104
|
+
it('displays bucket location', ()=>{
|
|
108
105
|
mockUseGetBucketLocation.mockReturnValue({
|
|
109
106
|
data: {
|
|
110
|
-
LocationConstraint:
|
|
107
|
+
LocationConstraint: 'eu-west-1'
|
|
111
108
|
},
|
|
112
|
-
status:
|
|
109
|
+
status: 'success'
|
|
113
110
|
});
|
|
114
111
|
renderBucketOverview();
|
|
115
|
-
expect(screen.getByText(
|
|
112
|
+
expect(screen.getByText('eu-west-1')).toBeInTheDocument();
|
|
116
113
|
});
|
|
117
|
-
it(
|
|
114
|
+
it('shows default location when LocationConstraint is null', ()=>{
|
|
118
115
|
mockUseGetBucketLocation.mockReturnValue({
|
|
119
116
|
data: {
|
|
120
117
|
LocationConstraint: null
|
|
121
118
|
},
|
|
122
|
-
status:
|
|
119
|
+
status: 'success'
|
|
120
|
+
});
|
|
121
|
+
renderBucketOverview();
|
|
122
|
+
expect(screen.getByText('us-east-1')).toBeInTheDocument();
|
|
123
|
+
});
|
|
124
|
+
it('shows object-lock enabled status', ()=>{
|
|
125
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
126
|
+
data: {
|
|
127
|
+
ObjectLockConfiguration: {
|
|
128
|
+
ObjectLockEnabled: 'Enabled'
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
status: 'success'
|
|
132
|
+
});
|
|
133
|
+
renderBucketOverview();
|
|
134
|
+
expect(screen.getByText('Enabled')).toBeInTheDocument();
|
|
135
|
+
});
|
|
136
|
+
it('shows object-lock disabled status', ()=>{
|
|
137
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
138
|
+
data: {
|
|
139
|
+
ObjectLockConfiguration: {
|
|
140
|
+
ObjectLockEnabled: 'Disabled'
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
status: 'success'
|
|
144
|
+
});
|
|
145
|
+
renderBucketOverview();
|
|
146
|
+
expect(screen.getByText('Disabled')).toBeInTheDocument();
|
|
147
|
+
});
|
|
148
|
+
it('shows default retention as Inactive when not configured', ()=>{
|
|
149
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
150
|
+
data: {
|
|
151
|
+
ObjectLockConfiguration: {
|
|
152
|
+
ObjectLockEnabled: 'Enabled'
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
status: 'success'
|
|
123
156
|
});
|
|
124
157
|
renderBucketOverview();
|
|
125
|
-
expect(screen.getByText(
|
|
158
|
+
expect(screen.getByText('Inactive')).toBeInTheDocument();
|
|
126
159
|
});
|
|
127
|
-
it(
|
|
160
|
+
it('shows default retention with days in Governance mode', ()=>{
|
|
128
161
|
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
129
162
|
data: {
|
|
130
163
|
ObjectLockConfiguration: {
|
|
131
|
-
ObjectLockEnabled:
|
|
164
|
+
ObjectLockEnabled: 'Enabled',
|
|
165
|
+
Rule: {
|
|
166
|
+
DefaultRetention: {
|
|
167
|
+
Mode: 'GOVERNANCE',
|
|
168
|
+
Days: 30
|
|
169
|
+
}
|
|
170
|
+
}
|
|
132
171
|
}
|
|
133
172
|
},
|
|
134
|
-
status:
|
|
173
|
+
status: 'success'
|
|
135
174
|
});
|
|
136
175
|
renderBucketOverview();
|
|
137
|
-
expect(screen.getByText(
|
|
176
|
+
expect(screen.getByText('Governance - 30 days')).toBeInTheDocument();
|
|
138
177
|
});
|
|
139
|
-
it(
|
|
178
|
+
it('shows default retention with single day', ()=>{
|
|
140
179
|
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
141
180
|
data: {
|
|
142
181
|
ObjectLockConfiguration: {
|
|
143
|
-
ObjectLockEnabled:
|
|
182
|
+
ObjectLockEnabled: 'Enabled',
|
|
183
|
+
Rule: {
|
|
184
|
+
DefaultRetention: {
|
|
185
|
+
Mode: 'COMPLIANCE',
|
|
186
|
+
Days: 1
|
|
187
|
+
}
|
|
188
|
+
}
|
|
144
189
|
}
|
|
145
190
|
},
|
|
146
|
-
status:
|
|
191
|
+
status: 'success'
|
|
147
192
|
});
|
|
148
193
|
renderBucketOverview();
|
|
149
|
-
expect(screen.getByText(
|
|
194
|
+
expect(screen.getByText('Compliance - 1 day')).toBeInTheDocument();
|
|
150
195
|
});
|
|
151
|
-
it(
|
|
196
|
+
it('shows default retention with years in Compliance mode', ()=>{
|
|
197
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
198
|
+
data: {
|
|
199
|
+
ObjectLockConfiguration: {
|
|
200
|
+
ObjectLockEnabled: 'Enabled',
|
|
201
|
+
Rule: {
|
|
202
|
+
DefaultRetention: {
|
|
203
|
+
Mode: 'COMPLIANCE',
|
|
204
|
+
Years: 7
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
status: 'success'
|
|
210
|
+
});
|
|
211
|
+
renderBucketOverview();
|
|
212
|
+
expect(screen.getByText('Compliance - 7 years')).toBeInTheDocument();
|
|
213
|
+
});
|
|
214
|
+
it('shows default retention with single year', ()=>{
|
|
215
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
216
|
+
data: {
|
|
217
|
+
ObjectLockConfiguration: {
|
|
218
|
+
ObjectLockEnabled: 'Enabled',
|
|
219
|
+
Rule: {
|
|
220
|
+
DefaultRetention: {
|
|
221
|
+
Mode: 'GOVERNANCE',
|
|
222
|
+
Years: 1
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
status: 'success'
|
|
228
|
+
});
|
|
229
|
+
renderBucketOverview();
|
|
230
|
+
expect(screen.getByText('Governance - 1 year')).toBeInTheDocument();
|
|
231
|
+
});
|
|
232
|
+
it('shows edit retention button when object lock is enabled', ()=>{
|
|
233
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
234
|
+
data: {
|
|
235
|
+
ObjectLockConfiguration: {
|
|
236
|
+
ObjectLockEnabled: 'Enabled',
|
|
237
|
+
Rule: {
|
|
238
|
+
DefaultRetention: {
|
|
239
|
+
Mode: 'GOVERNANCE',
|
|
240
|
+
Days: 30
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
status: 'success'
|
|
246
|
+
});
|
|
247
|
+
renderBucketOverview();
|
|
248
|
+
const editButton = screen.getByRole('button', {
|
|
249
|
+
name: /edit default retention/i
|
|
250
|
+
});
|
|
251
|
+
expect(editButton).toBeInTheDocument();
|
|
252
|
+
});
|
|
253
|
+
it('does not show edit retention button when object lock is disabled', ()=>{
|
|
254
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
255
|
+
data: {
|
|
256
|
+
ObjectLockConfiguration: {
|
|
257
|
+
ObjectLockEnabled: 'Disabled'
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
status: 'success'
|
|
261
|
+
});
|
|
262
|
+
renderBucketOverview();
|
|
263
|
+
const editButton = screen.queryByRole('button', {
|
|
264
|
+
name: /edit default retention/i
|
|
265
|
+
});
|
|
266
|
+
expect(editButton).not.toBeInTheDocument();
|
|
267
|
+
});
|
|
268
|
+
it('displays bucket owner from ACL', ()=>{
|
|
152
269
|
mockUseGetBucketAcl.mockReturnValue({
|
|
153
270
|
data: {
|
|
154
271
|
Owner: {
|
|
155
|
-
DisplayName:
|
|
272
|
+
DisplayName: 'bucket-owner'
|
|
156
273
|
},
|
|
157
274
|
Grants: []
|
|
158
275
|
},
|
|
159
|
-
status:
|
|
276
|
+
status: 'success'
|
|
160
277
|
});
|
|
161
278
|
renderBucketOverview();
|
|
162
|
-
expect(screen.getByText(
|
|
279
|
+
expect(screen.getByText('bucket-owner')).toBeInTheDocument();
|
|
163
280
|
});
|
|
164
|
-
it(
|
|
281
|
+
it('shows ACL grantees count', ()=>{
|
|
165
282
|
mockUseGetBucketAcl.mockReturnValue({
|
|
166
283
|
data: {
|
|
167
284
|
Owner: {
|
|
168
|
-
DisplayName:
|
|
285
|
+
DisplayName: 'owner'
|
|
169
286
|
},
|
|
170
287
|
Grants: [
|
|
171
288
|
{
|
|
172
289
|
Grantee: {
|
|
173
|
-
DisplayName:
|
|
290
|
+
DisplayName: 'user1'
|
|
174
291
|
}
|
|
175
292
|
},
|
|
176
293
|
{
|
|
177
294
|
Grantee: {
|
|
178
|
-
DisplayName:
|
|
295
|
+
DisplayName: 'user2'
|
|
179
296
|
}
|
|
180
297
|
},
|
|
181
298
|
{
|
|
182
299
|
Grantee: {
|
|
183
|
-
DisplayName:
|
|
300
|
+
DisplayName: 'user3'
|
|
184
301
|
}
|
|
185
302
|
}
|
|
186
303
|
]
|
|
187
304
|
},
|
|
188
|
-
status:
|
|
305
|
+
status: 'success'
|
|
189
306
|
});
|
|
190
307
|
renderBucketOverview();
|
|
191
|
-
expect(screen.getByText(
|
|
308
|
+
expect(screen.getByText('3 Grantees')).toBeInTheDocument();
|
|
192
309
|
});
|
|
193
|
-
it(
|
|
310
|
+
it('shows single grantee without plural', ()=>{
|
|
194
311
|
mockUseGetBucketAcl.mockReturnValue({
|
|
195
312
|
data: {
|
|
196
313
|
Owner: {
|
|
197
|
-
DisplayName:
|
|
314
|
+
DisplayName: 'owner'
|
|
198
315
|
},
|
|
199
316
|
Grants: [
|
|
200
317
|
{
|
|
201
318
|
Grantee: {
|
|
202
|
-
DisplayName:
|
|
319
|
+
DisplayName: 'user1'
|
|
203
320
|
}
|
|
204
321
|
}
|
|
205
322
|
]
|
|
206
323
|
},
|
|
207
|
-
status:
|
|
324
|
+
status: 'success'
|
|
208
325
|
});
|
|
209
326
|
renderBucketOverview();
|
|
210
|
-
expect(screen.getByText(
|
|
327
|
+
expect(screen.getByText('1 Grantee')).toBeInTheDocument();
|
|
211
328
|
});
|
|
212
|
-
it(
|
|
329
|
+
it('shows CORS enabled when rules exist', ()=>{
|
|
213
330
|
mockUseGetBucketCors.mockReturnValue({
|
|
214
331
|
data: {
|
|
215
332
|
CORSRules: [
|
|
216
333
|
{
|
|
217
334
|
AllowedMethods: [
|
|
218
|
-
|
|
335
|
+
'GET'
|
|
219
336
|
],
|
|
220
337
|
AllowedOrigins: [
|
|
221
|
-
|
|
338
|
+
'*'
|
|
222
339
|
]
|
|
223
340
|
}
|
|
224
341
|
]
|
|
225
342
|
},
|
|
226
|
-
status:
|
|
343
|
+
status: 'success',
|
|
344
|
+
error: null
|
|
227
345
|
});
|
|
228
346
|
renderBucketOverview();
|
|
229
|
-
|
|
347
|
+
const yesElements = screen.getAllByText('Yes');
|
|
348
|
+
expect(yesElements.length).toBeGreaterThanOrEqual(1);
|
|
230
349
|
});
|
|
231
|
-
it(
|
|
350
|
+
it('shows CORS disabled when no rules exist', ()=>{
|
|
232
351
|
mockUseGetBucketCors.mockReturnValue({
|
|
233
352
|
data: {
|
|
234
353
|
CORSRules: []
|
|
235
354
|
},
|
|
236
|
-
status:
|
|
355
|
+
status: 'success',
|
|
356
|
+
error: null
|
|
237
357
|
});
|
|
238
358
|
renderBucketOverview();
|
|
239
|
-
const
|
|
240
|
-
expect(
|
|
359
|
+
const noElements = screen.getAllByText('No');
|
|
360
|
+
expect(noElements.length).toBeGreaterThanOrEqual(1);
|
|
241
361
|
});
|
|
242
|
-
it(
|
|
362
|
+
it('detects public bucket from ACL grants', ()=>{
|
|
243
363
|
mockUseGetBucketAcl.mockReturnValue({
|
|
244
364
|
data: {
|
|
245
365
|
Owner: {
|
|
246
|
-
DisplayName:
|
|
366
|
+
DisplayName: 'owner'
|
|
247
367
|
},
|
|
248
368
|
Grants: [
|
|
249
369
|
{
|
|
250
370
|
Grantee: {
|
|
251
|
-
URI:
|
|
371
|
+
URI: 'http://acs.amazonaws.com/groups/global/AllUsers'
|
|
252
372
|
},
|
|
253
|
-
Permission:
|
|
373
|
+
Permission: 'READ'
|
|
254
374
|
}
|
|
255
375
|
]
|
|
256
376
|
},
|
|
257
|
-
status:
|
|
377
|
+
status: 'success'
|
|
258
378
|
});
|
|
259
379
|
renderBucketOverview();
|
|
260
|
-
expect(screen.getByText(
|
|
380
|
+
expect(screen.getByText('Yes')).toBeInTheDocument();
|
|
261
381
|
});
|
|
262
|
-
it(
|
|
382
|
+
it('shows non-public bucket when no public grants', ()=>{
|
|
263
383
|
mockUseGetBucketAcl.mockReturnValue({
|
|
264
384
|
data: {
|
|
265
385
|
Owner: {
|
|
266
|
-
DisplayName:
|
|
386
|
+
DisplayName: 'owner'
|
|
267
387
|
},
|
|
268
388
|
Grants: [
|
|
269
389
|
{
|
|
270
390
|
Grantee: {
|
|
271
|
-
DisplayName:
|
|
391
|
+
DisplayName: 'private-user'
|
|
272
392
|
},
|
|
273
|
-
Permission:
|
|
393
|
+
Permission: 'READ'
|
|
274
394
|
}
|
|
275
395
|
]
|
|
276
396
|
},
|
|
277
|
-
status:
|
|
397
|
+
status: 'success'
|
|
278
398
|
});
|
|
279
399
|
renderBucketOverview();
|
|
280
|
-
const publicValues = screen.getAllByText(
|
|
400
|
+
const publicValues = screen.getAllByText('No');
|
|
281
401
|
expect(publicValues.length).toBeGreaterThan(0);
|
|
282
402
|
});
|
|
283
|
-
it(
|
|
403
|
+
it('shows loading states while data is being fetched', ()=>{
|
|
284
404
|
mockUseGetBucketVersioning.mockReturnValue({
|
|
285
405
|
data: void 0,
|
|
286
|
-
status:
|
|
406
|
+
status: 'pending'
|
|
287
407
|
});
|
|
288
408
|
mockUseGetBucketAcl.mockReturnValue({
|
|
289
409
|
data: void 0,
|
|
290
|
-
status:
|
|
410
|
+
status: 'pending'
|
|
291
411
|
});
|
|
292
412
|
renderBucketOverview();
|
|
293
413
|
const loaders = document.querySelectorAll('[data-testid="loader"], .loader, [class*="loader"]');
|
|
294
414
|
expect(loaders.length).toBeGreaterThan(0);
|
|
295
415
|
});
|
|
296
|
-
it(
|
|
416
|
+
it('shows error states when API calls fail', ()=>{
|
|
297
417
|
mockUseGetBucketVersioning.mockReturnValue({
|
|
298
418
|
data: void 0,
|
|
299
|
-
status:
|
|
419
|
+
status: 'error'
|
|
300
420
|
});
|
|
301
421
|
mockUseGetBucketLocation.mockReturnValue({
|
|
302
422
|
data: void 0,
|
|
303
|
-
status:
|
|
423
|
+
status: 'error'
|
|
304
424
|
});
|
|
305
425
|
renderBucketOverview();
|
|
306
|
-
const errorElements = screen.getAllByText(
|
|
426
|
+
const errorElements = screen.getAllByText('Error');
|
|
307
427
|
expect(errorElements.length).toBeGreaterThan(0);
|
|
308
428
|
});
|
|
309
|
-
it(
|
|
429
|
+
it('handles empty bucket button click', ()=>{
|
|
310
430
|
const onEmptyBucket = jest.fn();
|
|
311
431
|
renderBucketOverview({
|
|
312
432
|
onEmptyBucket,
|
|
313
433
|
isEmptyBucketDisabled: false
|
|
314
434
|
});
|
|
315
|
-
const emptyButton = screen.getByRole(
|
|
435
|
+
const emptyButton = screen.getByRole('button', {
|
|
316
436
|
name: /empty bucket/i
|
|
317
437
|
});
|
|
318
438
|
fireEvent.click(emptyButton);
|
|
319
439
|
expect(onEmptyBucket).toHaveBeenCalled();
|
|
320
440
|
});
|
|
321
|
-
it(
|
|
441
|
+
it('handles delete bucket button click', ()=>{
|
|
322
442
|
const onDeleteBucket = jest.fn();
|
|
323
443
|
renderBucketOverview({
|
|
324
444
|
onDeleteBucket
|
|
325
445
|
});
|
|
326
|
-
const deleteButton = screen.getByRole(
|
|
446
|
+
const deleteButton = screen.getByRole('button', {
|
|
327
447
|
name: /delete bucket/i
|
|
328
448
|
});
|
|
329
449
|
fireEvent.click(deleteButton);
|
|
330
450
|
expect(onDeleteBucket).toHaveBeenCalled();
|
|
331
451
|
});
|
|
332
|
-
it(
|
|
452
|
+
it('disables empty button when specified', ()=>{
|
|
333
453
|
renderBucketOverview({
|
|
334
454
|
isEmptyBucketDisabled: true
|
|
335
455
|
});
|
|
336
|
-
const emptyButton = screen.getByRole(
|
|
456
|
+
const emptyButton = screen.getByRole('button', {
|
|
337
457
|
name: /empty bucket/i
|
|
338
458
|
});
|
|
339
459
|
expect(emptyButton).toBeDisabled();
|
|
340
460
|
});
|
|
341
|
-
it(
|
|
461
|
+
it('disables delete button when specified', ()=>{
|
|
342
462
|
renderBucketOverview({
|
|
343
463
|
isDeleteBucketDisabled: true
|
|
344
464
|
});
|
|
345
|
-
const deleteButton = screen.getByRole(
|
|
465
|
+
const deleteButton = screen.getByRole('button', {
|
|
346
466
|
name: /delete bucket/i
|
|
347
467
|
});
|
|
348
468
|
expect(deleteButton).toBeDisabled();
|
|
349
469
|
});
|
|
350
|
-
it(
|
|
470
|
+
it('renders custom empty button when provided', ()=>{
|
|
351
471
|
const renderEmptyButton = jest.fn(()=>/*#__PURE__*/ jsx("button", {
|
|
352
472
|
children: "Custom Empty Button"
|
|
353
473
|
}));
|
|
354
474
|
renderBucketOverview({
|
|
355
475
|
renderEmptyButton
|
|
356
476
|
});
|
|
357
|
-
expect(screen.getByText(
|
|
358
|
-
expect(renderEmptyButton).toHaveBeenCalledWith(
|
|
477
|
+
expect(screen.getByText('Custom Empty Button')).toBeInTheDocument();
|
|
478
|
+
expect(renderEmptyButton).toHaveBeenCalledWith('test-bucket');
|
|
359
479
|
});
|
|
360
|
-
it(
|
|
480
|
+
it('renders custom delete button when provided', ()=>{
|
|
361
481
|
const renderDeleteButton = jest.fn(()=>/*#__PURE__*/ jsx("button", {
|
|
362
482
|
children: "Custom Delete Button"
|
|
363
483
|
}));
|
|
364
484
|
renderBucketOverview({
|
|
365
485
|
renderDeleteButton
|
|
366
486
|
});
|
|
367
|
-
expect(screen.getByText(
|
|
368
|
-
expect(renderDeleteButton).toHaveBeenCalledWith(
|
|
487
|
+
expect(screen.getByText('Custom Delete Button')).toBeInTheDocument();
|
|
488
|
+
expect(renderDeleteButton).toHaveBeenCalledWith('test-bucket');
|
|
369
489
|
});
|
|
370
|
-
it(
|
|
490
|
+
it('works when no callbacks are provided', ()=>{
|
|
371
491
|
expect(()=>{
|
|
372
492
|
renderBucketOverview();
|
|
373
|
-
const emptyButton = screen.getByRole(
|
|
493
|
+
const emptyButton = screen.getByRole('button', {
|
|
374
494
|
name: /empty bucket/i
|
|
375
495
|
});
|
|
376
|
-
const deleteButton = screen.getByRole(
|
|
496
|
+
const deleteButton = screen.getByRole('button', {
|
|
377
497
|
name: /delete bucket/i
|
|
378
498
|
});
|
|
379
499
|
fireEvent.click(emptyButton);
|
|
380
500
|
fireEvent.click(deleteButton);
|
|
381
501
|
}).not.toThrow();
|
|
382
502
|
});
|
|
383
|
-
it(
|
|
503
|
+
it('handles missing ACL data gracefully', ()=>{
|
|
384
504
|
mockUseGetBucketAcl.mockReturnValue({
|
|
385
505
|
data: void 0,
|
|
386
|
-
status:
|
|
506
|
+
status: 'success'
|
|
387
507
|
});
|
|
388
508
|
renderBucketOverview();
|
|
389
|
-
const naElements = screen.getAllByText(
|
|
509
|
+
const naElements = screen.getAllByText('N/A');
|
|
390
510
|
expect(naElements.length).toBeGreaterThan(0);
|
|
391
511
|
});
|
|
392
|
-
it(
|
|
512
|
+
it('handles missing versioning data gracefully', ()=>{
|
|
393
513
|
mockUseGetBucketVersioning.mockReturnValue({
|
|
394
514
|
data: void 0,
|
|
395
|
-
status:
|
|
515
|
+
status: 'success'
|
|
396
516
|
});
|
|
397
517
|
renderBucketOverview();
|
|
398
|
-
expect(screen.getByText(
|
|
518
|
+
expect(screen.getByText('Inactive')).toBeInTheDocument();
|
|
399
519
|
});
|
|
400
|
-
it(
|
|
520
|
+
it('handles CORS error state', ()=>{
|
|
401
521
|
mockUseGetBucketCors.mockReturnValue({
|
|
402
522
|
data: void 0,
|
|
403
|
-
status:
|
|
523
|
+
status: 'error'
|
|
404
524
|
});
|
|
405
525
|
renderBucketOverview();
|
|
406
|
-
const corsValues = screen.getAllByText(
|
|
526
|
+
const corsValues = screen.getAllByText('No');
|
|
407
527
|
expect(corsValues.length).toBeGreaterThan(0);
|
|
408
528
|
});
|
|
409
|
-
it(
|
|
529
|
+
it('handles object lock error state (404 - not configured)', ()=>{
|
|
530
|
+
const notFoundError = new Error('Object Lock configuration does not exist');
|
|
531
|
+
notFoundError.name = 'NoSuchBucketObjectLockConfiguration';
|
|
532
|
+
notFoundError.$metadata = {
|
|
533
|
+
httpStatusCode: 404
|
|
534
|
+
};
|
|
535
|
+
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
536
|
+
data: void 0,
|
|
537
|
+
status: 'error',
|
|
538
|
+
error: notFoundError
|
|
539
|
+
});
|
|
540
|
+
renderBucketOverview();
|
|
541
|
+
expect(screen.getByText('Disabled')).toBeInTheDocument();
|
|
542
|
+
});
|
|
543
|
+
it('handles object lock real error state (non-404)', ()=>{
|
|
544
|
+
const accessDeniedError = new Error('Access Denied');
|
|
545
|
+
accessDeniedError.name = 'AccessDenied';
|
|
546
|
+
accessDeniedError.$metadata = {
|
|
547
|
+
httpStatusCode: 403
|
|
548
|
+
};
|
|
410
549
|
mockUseGetBucketObjectLockConfiguration.mockReturnValue({
|
|
411
550
|
data: void 0,
|
|
412
|
-
status:
|
|
551
|
+
status: 'error',
|
|
552
|
+
error: accessDeniedError
|
|
413
553
|
});
|
|
414
554
|
renderBucketOverview();
|
|
415
|
-
expect(screen.getByText(
|
|
555
|
+
expect(screen.getByText('Error')).toBeInTheDocument();
|
|
416
556
|
});
|
|
417
|
-
describe(
|
|
557
|
+
describe('Bucket Policy', ()=>{
|
|
418
558
|
it("shows 'Configured' when policy exists", ()=>{
|
|
419
559
|
mockUseGetBucketPolicy.mockReturnValue({
|
|
420
560
|
data: {
|
|
421
561
|
Policy: '{"Version":"2012-10-17","Statement":[]}'
|
|
422
562
|
},
|
|
423
563
|
error: null,
|
|
424
|
-
status:
|
|
564
|
+
status: 'success'
|
|
425
565
|
});
|
|
426
566
|
renderBucketOverview();
|
|
427
|
-
expect(screen.getByText(
|
|
567
|
+
expect(screen.getByText('Configured')).toBeInTheDocument();
|
|
428
568
|
});
|
|
429
569
|
it("shows 'Not configured' when no policy exists", ()=>{
|
|
430
570
|
mockUseGetBucketPolicy.mockReturnValue({
|
|
431
571
|
data: void 0,
|
|
432
572
|
error: null,
|
|
433
|
-
status:
|
|
573
|
+
status: 'success'
|
|
434
574
|
});
|
|
435
575
|
renderBucketOverview();
|
|
436
|
-
|
|
576
|
+
const notConfiguredElements = screen.getAllByText('Not configured');
|
|
577
|
+
expect(notConfiguredElements.length).toBeGreaterThanOrEqual(1);
|
|
437
578
|
});
|
|
438
579
|
it("shows 'Error' when policy fetch fails with non-NoSuchBucketPolicy error", ()=>{
|
|
439
|
-
const genericError = new Error(
|
|
580
|
+
const genericError = new Error('Network error');
|
|
440
581
|
mockUseGetBucketPolicy.mockReturnValue({
|
|
441
582
|
data: void 0,
|
|
442
583
|
error: genericError,
|
|
443
|
-
status:
|
|
584
|
+
status: 'error'
|
|
444
585
|
});
|
|
445
586
|
renderBucketOverview();
|
|
446
|
-
const errorElements = screen.getAllByText(
|
|
587
|
+
const errorElements = screen.getAllByText('Error');
|
|
447
588
|
expect(errorElements.length).toBeGreaterThan(0);
|
|
448
589
|
});
|
|
449
590
|
it("shows 'Not configured' when policy does not exist (NoSuchBucketPolicy)", ()=>{
|
|
450
|
-
const noSuchPolicyError = new Error(
|
|
451
|
-
noSuchPolicyError.name =
|
|
591
|
+
const noSuchPolicyError = new Error('Policy does not exist');
|
|
592
|
+
noSuchPolicyError.name = 'NoSuchBucketPolicy';
|
|
452
593
|
mockUseGetBucketPolicy.mockReturnValue({
|
|
453
594
|
data: void 0,
|
|
454
595
|
error: noSuchPolicyError,
|
|
455
|
-
status:
|
|
596
|
+
status: 'error'
|
|
456
597
|
});
|
|
457
598
|
renderBucketOverview();
|
|
458
|
-
|
|
599
|
+
const notConfiguredElements = screen.getAllByText('Not configured');
|
|
600
|
+
expect(notConfiguredElements.length).toBeGreaterThanOrEqual(1);
|
|
459
601
|
});
|
|
460
|
-
it(
|
|
602
|
+
it('calls onEditPolicy when edit button is clicked', ()=>{
|
|
461
603
|
const onEditPolicy = jest.fn();
|
|
462
604
|
mockUseGetBucketPolicy.mockReturnValue({
|
|
463
605
|
data: {
|
|
464
606
|
Policy: '{"Version":"2012-10-17","Statement":[]}'
|
|
465
607
|
},
|
|
466
608
|
error: null,
|
|
467
|
-
status:
|
|
609
|
+
status: 'success'
|
|
468
610
|
});
|
|
469
611
|
renderBucketOverview({
|
|
470
612
|
onEditPolicy
|
|
471
613
|
});
|
|
472
|
-
|
|
473
|
-
name:
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
|
|
614
|
+
fireEvent.click(screen.getByRole('button', {
|
|
615
|
+
name: 'Edit bucket policy'
|
|
616
|
+
}));
|
|
617
|
+
expect(onEditPolicy).toHaveBeenCalledWith('test-bucket');
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
describe('Extra Sections', ()=>{
|
|
621
|
+
it('renders extra sections between General and Data Protection', ()=>{
|
|
622
|
+
const Wrapper = createTestWrapper();
|
|
623
|
+
const extraSections = [
|
|
624
|
+
{
|
|
625
|
+
id: 'custom-section',
|
|
626
|
+
title: 'Custom Section',
|
|
627
|
+
render: ()=>/*#__PURE__*/ jsx("div", {
|
|
628
|
+
children: "Custom content"
|
|
629
|
+
})
|
|
630
|
+
}
|
|
631
|
+
];
|
|
632
|
+
render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
633
|
+
children: /*#__PURE__*/ jsx(Wrapper, {
|
|
634
|
+
children: /*#__PURE__*/ jsxs(BucketOverview, {
|
|
635
|
+
bucketName: "test-bucket",
|
|
636
|
+
children: [
|
|
637
|
+
/*#__PURE__*/ jsx(BucketOverview.Actions, {}),
|
|
638
|
+
/*#__PURE__*/ jsxs(BucketOverview.Sections, {
|
|
639
|
+
children: [
|
|
640
|
+
/*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
|
|
641
|
+
extraSections.map((section)=>/*#__PURE__*/ jsx(BucketOverview.Section, {
|
|
642
|
+
title: section.title,
|
|
643
|
+
children: section.render()
|
|
644
|
+
}, section.id)),
|
|
645
|
+
/*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
|
|
646
|
+
/*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
|
|
647
|
+
]
|
|
648
|
+
})
|
|
649
|
+
]
|
|
650
|
+
})
|
|
651
|
+
})
|
|
652
|
+
}));
|
|
653
|
+
expect(screen.getByText('Custom Section')).toBeInTheDocument();
|
|
654
|
+
expect(screen.getByText('Custom content')).toBeInTheDocument();
|
|
655
|
+
});
|
|
656
|
+
it('extra sections have access to BucketOverview context', ()=>{
|
|
657
|
+
const CustomSectionContent = ()=>{
|
|
658
|
+
const { bucketName } = useBucketOverviewContext();
|
|
659
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
660
|
+
children: [
|
|
661
|
+
"Bucket name from context: ",
|
|
662
|
+
bucketName
|
|
663
|
+
]
|
|
664
|
+
});
|
|
665
|
+
};
|
|
666
|
+
const Wrapper = createTestWrapper();
|
|
667
|
+
const extraSections = [
|
|
668
|
+
{
|
|
669
|
+
id: 'context-section',
|
|
670
|
+
title: 'Context Test',
|
|
671
|
+
render: ()=>/*#__PURE__*/ jsx(CustomSectionContent, {})
|
|
672
|
+
}
|
|
673
|
+
];
|
|
674
|
+
render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
675
|
+
children: /*#__PURE__*/ jsx(Wrapper, {
|
|
676
|
+
children: /*#__PURE__*/ jsxs(BucketOverview, {
|
|
677
|
+
bucketName: "my-custom-bucket",
|
|
678
|
+
children: [
|
|
679
|
+
/*#__PURE__*/ jsx(BucketOverview.Actions, {}),
|
|
680
|
+
/*#__PURE__*/ jsxs(BucketOverview.Sections, {
|
|
681
|
+
children: [
|
|
682
|
+
/*#__PURE__*/ jsx(BucketOverview.GeneralSection, {}),
|
|
683
|
+
extraSections.map((section)=>/*#__PURE__*/ jsx(BucketOverview.Section, {
|
|
684
|
+
title: section.title,
|
|
685
|
+
children: section.render()
|
|
686
|
+
}, section.id)),
|
|
687
|
+
/*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
|
|
688
|
+
/*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
|
|
689
|
+
]
|
|
690
|
+
})
|
|
691
|
+
]
|
|
692
|
+
})
|
|
693
|
+
})
|
|
694
|
+
}));
|
|
695
|
+
expect(screen.getByText('Bucket name from context: my-custom-bucket')).toBeInTheDocument();
|
|
696
|
+
});
|
|
697
|
+
});
|
|
698
|
+
describe('Field Overrides', ()=>{
|
|
699
|
+
it('renders slot-based field override', ()=>{
|
|
700
|
+
const Wrapper = createTestWrapper();
|
|
701
|
+
render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
702
|
+
children: /*#__PURE__*/ jsx(Wrapper, {
|
|
703
|
+
children: /*#__PURE__*/ jsxs(BucketOverview, {
|
|
704
|
+
bucketName: "test-bucket",
|
|
705
|
+
children: [
|
|
706
|
+
/*#__PURE__*/ jsx(BucketOverview.Actions, {}),
|
|
707
|
+
/*#__PURE__*/ jsxs(BucketOverview.Sections, {
|
|
708
|
+
children: [
|
|
709
|
+
/*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
|
|
710
|
+
locationField: /*#__PURE__*/ jsx("span", {
|
|
711
|
+
children: "Custom Location Content"
|
|
712
|
+
})
|
|
713
|
+
}),
|
|
714
|
+
/*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
|
|
715
|
+
/*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
|
|
716
|
+
]
|
|
717
|
+
})
|
|
718
|
+
]
|
|
719
|
+
})
|
|
720
|
+
})
|
|
721
|
+
}));
|
|
722
|
+
expect(screen.getByText('Custom Location Content')).toBeInTheDocument();
|
|
723
|
+
expect(screen.getByText('test-bucket')).toBeInTheDocument();
|
|
724
|
+
});
|
|
725
|
+
it('renders render prop field override', ()=>{
|
|
726
|
+
const Wrapper = createTestWrapper();
|
|
727
|
+
render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
728
|
+
children: /*#__PURE__*/ jsx(Wrapper, {
|
|
729
|
+
children: /*#__PURE__*/ jsxs(BucketOverview, {
|
|
730
|
+
bucketName: "test-bucket",
|
|
731
|
+
children: [
|
|
732
|
+
/*#__PURE__*/ jsx(BucketOverview.Actions, {}),
|
|
733
|
+
/*#__PURE__*/ jsxs(BucketOverview.Sections, {
|
|
734
|
+
children: [
|
|
735
|
+
/*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
|
|
736
|
+
renderVersioning: (name)=>/*#__PURE__*/ jsxs("span", {
|
|
737
|
+
children: [
|
|
738
|
+
"Custom Versioning for ",
|
|
739
|
+
name
|
|
740
|
+
]
|
|
741
|
+
})
|
|
742
|
+
}),
|
|
743
|
+
/*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
|
|
744
|
+
/*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
|
|
745
|
+
]
|
|
746
|
+
})
|
|
747
|
+
]
|
|
748
|
+
})
|
|
749
|
+
})
|
|
750
|
+
}));
|
|
751
|
+
expect(screen.getByText('Custom Versioning for test-bucket')).toBeInTheDocument();
|
|
752
|
+
});
|
|
753
|
+
it('prioritizes slot prop over render prop over default', ()=>{
|
|
754
|
+
const Wrapper = createTestWrapper();
|
|
755
|
+
const renderName = jest.fn(()=>/*#__PURE__*/ jsx("span", {
|
|
756
|
+
children: "Render Prop Name"
|
|
757
|
+
}));
|
|
758
|
+
render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
759
|
+
children: /*#__PURE__*/ jsx(Wrapper, {
|
|
760
|
+
children: /*#__PURE__*/ jsxs(BucketOverview, {
|
|
761
|
+
bucketName: "test-bucket",
|
|
762
|
+
children: [
|
|
763
|
+
/*#__PURE__*/ jsx(BucketOverview.Actions, {}),
|
|
764
|
+
/*#__PURE__*/ jsxs(BucketOverview.Sections, {
|
|
765
|
+
children: [
|
|
766
|
+
/*#__PURE__*/ jsx(BucketOverview.GeneralSection, {
|
|
767
|
+
nameField: /*#__PURE__*/ jsx("span", {
|
|
768
|
+
children: "Slot Prop Name"
|
|
769
|
+
}),
|
|
770
|
+
renderName: renderName
|
|
771
|
+
}),
|
|
772
|
+
/*#__PURE__*/ jsx(BucketOverview.DataProtectionSection, {}),
|
|
773
|
+
/*#__PURE__*/ jsx(BucketOverview.PermissionsSection, {})
|
|
774
|
+
]
|
|
775
|
+
})
|
|
776
|
+
]
|
|
777
|
+
})
|
|
778
|
+
})
|
|
779
|
+
}));
|
|
780
|
+
expect(screen.getByText('Slot Prop Name')).toBeInTheDocument();
|
|
781
|
+
expect(renderName).not.toHaveBeenCalled();
|
|
477
782
|
});
|
|
478
783
|
});
|
|
479
784
|
});
|