@scality/data-browser-library 1.0.0-preview.9 → 1.0.3
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.js +271 -105
- 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 +13 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
- package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
- package/dist/components/__tests__/BucketList.test.js +463 -239
- 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 +281 -266
- package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
- package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
- package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
- package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
- package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
- package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
- package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
- 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 +3 -2
- package/dist/components/buckets/BucketCreate.js +93 -47
- package/dist/components/buckets/BucketDetails.d.ts +42 -0
- package/dist/components/buckets/BucketDetails.js +249 -85
- package/dist/components/buckets/BucketLifecycleFormPage.js +225 -191
- package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
- package/dist/components/buckets/BucketLifecycleList.js +59 -61
- package/dist/components/buckets/BucketList.d.ts +7 -8
- package/dist/components/buckets/BucketList.js +158 -101
- package/dist/components/buckets/BucketLocation.js +4 -4
- package/dist/components/buckets/BucketOverview.d.ts +22 -2
- package/dist/components/buckets/BucketOverview.js +394 -187
- package/dist/components/buckets/BucketPage.js +43 -21
- package/dist/components/buckets/BucketPolicyPage.js +155 -127
- package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
- package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
- package/dist/components/buckets/BucketReplicationList.js +48 -45
- 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 +2 -2
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
- package/dist/components/buckets/EmptyBucketButton.js +24 -24
- package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
- package/dist/components/buckets/EmptyBucketSummary.js +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
- 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 -20
- package/dist/components/index.js +17 -10
- 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 +289 -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 +103 -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/formUtils.d.ts +15 -0
- package/dist/components/objects/ObjectDetails/formUtils.js +7 -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.js +4 -4
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
- 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.js +12 -7
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
- package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
- package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
- package/dist/components/ui/DeleteObjectModalContent.js +12 -12
- package/dist/components/ui/FilterFormSection.d.ts +2 -2
- package/dist/components/ui/FilterFormSection.js +29 -29
- 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 +10 -56
- package/dist/config/factory.js +23 -71
- 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.js +45 -45
- 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 +65 -65
- 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 +11 -6
- package/dist/hooks/index.d.ts +19 -12
- package/dist/hooks/index.js +16 -9
- 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 +2 -2
- package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
- package/dist/hooks/useEmptyBucket.js +11 -11
- package/dist/hooks/useFeatures.d.ts +7 -0
- package/dist/hooks/useFeatures.js +8 -0
- package/dist/hooks/useISVBucketDetection.js +6 -6
- 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/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 +85 -33
- package/dist/test/testUtils.js +176 -111
- package/dist/test/utils/errorHandling.test.js +119 -119
- package/dist/types/index.d.ts +50 -37
- 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 +10 -0
- package/dist/utils/constants.js +19 -9
- 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 +3 -3
- package/dist/utils/errorHandling.js +6 -6
- package/dist/utils/hooks.js +8 -8
- package/dist/utils/index.d.ts +5 -4
- package/dist/utils/index.js +4 -2
- 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 +5 -5
- package/dist/utils/s3RuleUtils.js +17 -17
- 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,26 +1,54 @@
|
|
|
1
|
+
import * as __rspack_external__providers_DataBrowserProvider_js_b116b609 from "../providers/DataBrowserProvider.js";
|
|
1
2
|
import { jsx } from "react/jsx-runtime";
|
|
2
3
|
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
|
|
3
4
|
import user_event from "@testing-library/user-event";
|
|
4
|
-
import { MemoryRouter } from "react-router
|
|
5
|
+
import { MemoryRouter } from "react-router";
|
|
6
|
+
import { useCreateBucket, useSetBucketEncryption, useSetBucketObjectLockConfiguration, useSetBucketVersioning } from "../../hooks/index.js";
|
|
5
7
|
import { createMockMutationResult, createTestWrapper } from "../../test/testUtils.js";
|
|
6
8
|
import { BucketCreate } from "../buckets/BucketCreate.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
var __webpack_modules__ = {
|
|
10
|
+
"../providers/DataBrowserProvider" (module) {
|
|
11
|
+
module.exports = __rspack_external__providers_DataBrowserProvider_js_b116b609;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var __webpack_module_cache__ = {};
|
|
15
|
+
function __webpack_require__(moduleId) {
|
|
16
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
17
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
18
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
19
|
+
exports: {}
|
|
20
|
+
};
|
|
21
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
22
|
+
return module.exports;
|
|
23
|
+
}
|
|
24
|
+
jest.mock('../../hooks', ()=>({
|
|
9
25
|
useCreateBucket: jest.fn(),
|
|
10
26
|
useSetBucketVersioning: jest.fn(),
|
|
11
|
-
useSetBucketObjectLockConfiguration: jest.fn()
|
|
27
|
+
useSetBucketObjectLockConfiguration: jest.fn(),
|
|
28
|
+
useSetBucketEncryption: jest.fn()
|
|
29
|
+
}));
|
|
30
|
+
jest.mock('../providers/DataBrowserProvider', ()=>({
|
|
31
|
+
...jest.requireActual('../providers/DataBrowserProvider'),
|
|
32
|
+
useDataBrowserConfig: jest.fn(()=>({
|
|
33
|
+
s3Capabilities: {
|
|
34
|
+
bucketEncryption: false
|
|
35
|
+
}
|
|
36
|
+
}))
|
|
12
37
|
}));
|
|
13
38
|
const mockUseCreateBucket = jest.mocked(useCreateBucket);
|
|
14
39
|
const mockUseSetBucketVersioning = jest.mocked(useSetBucketVersioning);
|
|
15
40
|
const mockUseSetBucketObjectLockConfiguration = jest.mocked(useSetBucketObjectLockConfiguration);
|
|
41
|
+
const mockUseSetBucketEncryption = jest.mocked(useSetBucketEncryption);
|
|
42
|
+
const { useDataBrowserConfig } = __webpack_require__("../providers/DataBrowserProvider");
|
|
43
|
+
const mockUseDataBrowserConfig = jest.mocked(useDataBrowserConfig);
|
|
16
44
|
const mockNavigate = jest.fn();
|
|
17
45
|
const mockShowToast = jest.fn();
|
|
18
|
-
jest.mock(
|
|
19
|
-
...jest.requireActual(
|
|
46
|
+
jest.mock('react-router', ()=>({
|
|
47
|
+
...jest.requireActual('react-router'),
|
|
20
48
|
useNavigate: ()=>mockNavigate
|
|
21
49
|
}));
|
|
22
|
-
jest.mock(
|
|
23
|
-
...jest.requireActual(
|
|
50
|
+
jest.mock('@scality/core-ui', ()=>({
|
|
51
|
+
...jest.requireActual('@scality/core-ui'),
|
|
24
52
|
useToast: ()=>({
|
|
25
53
|
showToast: mockShowToast
|
|
26
54
|
})
|
|
@@ -38,12 +66,14 @@ const renderBucketCreate = (props = {})=>{
|
|
|
38
66
|
const mockMutations = {
|
|
39
67
|
createBucket: jest.fn(),
|
|
40
68
|
setVersioning: jest.fn(),
|
|
41
|
-
setObjectLock: jest.fn()
|
|
69
|
+
setObjectLock: jest.fn(),
|
|
70
|
+
setBucketEncryption: jest.fn()
|
|
42
71
|
};
|
|
43
72
|
const setupMocks = (overrides = {})=>{
|
|
44
73
|
mockUseCreateBucket.mockReturnValue(createMockMutationResult(mockMutations.createBucket, overrides));
|
|
45
74
|
mockUseSetBucketVersioning.mockReturnValue(createMockMutationResult(mockMutations.setVersioning));
|
|
46
75
|
mockUseSetBucketObjectLockConfiguration.mockReturnValue(createMockMutationResult(mockMutations.setObjectLock));
|
|
76
|
+
mockUseSetBucketEncryption.mockReturnValue(createMockMutationResult(mockMutations.setBucketEncryption));
|
|
47
77
|
};
|
|
48
78
|
const fillBucketName = async (name)=>{
|
|
49
79
|
const nameInput = screen.getByLabelText(/bucket name/i);
|
|
@@ -51,108 +81,108 @@ const fillBucketName = async (name)=>{
|
|
|
51
81
|
};
|
|
52
82
|
const submitForm = async ()=>{
|
|
53
83
|
await waitFor(()=>{
|
|
54
|
-
const createButton = screen.getByRole(
|
|
84
|
+
const createButton = screen.getByRole('button', {
|
|
55
85
|
name: /^create$/i
|
|
56
86
|
});
|
|
57
87
|
expect(createButton).not.toBeDisabled();
|
|
58
88
|
}, {
|
|
59
89
|
timeout: 3000
|
|
60
90
|
});
|
|
61
|
-
const createButton = screen.getByRole(
|
|
91
|
+
const createButton = screen.getByRole('button', {
|
|
62
92
|
name: /^create$/i
|
|
63
93
|
});
|
|
64
94
|
await user_event.click(createButton);
|
|
65
95
|
};
|
|
66
|
-
describe(
|
|
96
|
+
describe('BucketCreate', ()=>{
|
|
67
97
|
beforeEach(()=>{
|
|
68
98
|
jest.clearAllMocks();
|
|
69
99
|
setupMocks();
|
|
70
100
|
});
|
|
71
|
-
it(
|
|
101
|
+
it('renders form with required fields', ()=>{
|
|
72
102
|
renderBucketCreate();
|
|
73
|
-
expect(screen.getByText(
|
|
103
|
+
expect(screen.getByText('Create a New Bucket')).toBeInTheDocument();
|
|
74
104
|
expect(screen.getByLabelText(/bucket name/i)).toBeInTheDocument();
|
|
75
|
-
expect(screen.getByText(
|
|
76
|
-
expect(screen.getByText(
|
|
105
|
+
expect(screen.getByText('Versioning')).toBeInTheDocument();
|
|
106
|
+
expect(screen.getByText('Object-lock')).toBeInTheDocument();
|
|
77
107
|
});
|
|
78
|
-
it(
|
|
108
|
+
it('shows validation error for invalid bucket name with uppercase', async ()=>{
|
|
79
109
|
renderBucketCreate();
|
|
80
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
110
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), 'INVALID');
|
|
81
111
|
await user_event.tab();
|
|
82
112
|
await waitFor(()=>{
|
|
83
113
|
expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
|
|
84
114
|
});
|
|
85
115
|
});
|
|
86
|
-
it(
|
|
116
|
+
it('shows validation error for bucket name starting with hyphen', async ()=>{
|
|
87
117
|
renderBucketCreate();
|
|
88
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
118
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), '-invalid');
|
|
89
119
|
await user_event.tab();
|
|
90
120
|
await waitFor(()=>{
|
|
91
121
|
expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
|
|
92
122
|
});
|
|
93
123
|
});
|
|
94
|
-
it(
|
|
124
|
+
it('shows validation error for bucket name ending with hyphen', async ()=>{
|
|
95
125
|
renderBucketCreate();
|
|
96
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
126
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), 'invalid-');
|
|
97
127
|
await user_event.tab();
|
|
98
128
|
await waitFor(()=>{
|
|
99
129
|
expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
|
|
100
130
|
});
|
|
101
131
|
});
|
|
102
|
-
it(
|
|
132
|
+
it('shows validation error for bucket name with adjacent periods', async ()=>{
|
|
103
133
|
renderBucketCreate();
|
|
104
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
134
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), 'test..bucket');
|
|
105
135
|
await user_event.tab();
|
|
106
136
|
await waitFor(()=>{
|
|
107
137
|
expect(screen.getByText(/bucket names cannot contain two adjacent periods/i)).toBeInTheDocument();
|
|
108
138
|
});
|
|
109
139
|
});
|
|
110
|
-
it(
|
|
140
|
+
it('shows validation error for bucket name formatted as IP address', async ()=>{
|
|
111
141
|
renderBucketCreate();
|
|
112
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
142
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), '192.168.1.1');
|
|
113
143
|
await user_event.tab();
|
|
114
144
|
await waitFor(()=>{
|
|
115
145
|
expect(screen.getByText(/bucket names must not be formatted as an ip address/i)).toBeInTheDocument();
|
|
116
146
|
});
|
|
117
147
|
});
|
|
118
|
-
it(
|
|
148
|
+
it('shows validation error for bucket name with forbidden prefix', async ()=>{
|
|
119
149
|
renderBucketCreate();
|
|
120
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
150
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), 'xn--test');
|
|
121
151
|
await user_event.tab();
|
|
122
152
|
await waitFor(()=>{
|
|
123
153
|
expect(screen.getByText(/bucket names must not start with/i)).toBeInTheDocument();
|
|
124
154
|
});
|
|
125
155
|
});
|
|
126
|
-
it(
|
|
156
|
+
it('shows validation error for bucket name with forbidden suffix', async ()=>{
|
|
127
157
|
renderBucketCreate();
|
|
128
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
158
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), 'test-s3alias');
|
|
129
159
|
await user_event.tab();
|
|
130
160
|
await waitFor(()=>{
|
|
131
161
|
expect(screen.getByText(/bucket names must not end with/i)).toBeInTheDocument();
|
|
132
162
|
});
|
|
133
163
|
});
|
|
134
|
-
it(
|
|
164
|
+
it('shows validation error for duplicate bucket name when context provided', async ()=>{
|
|
135
165
|
renderBucketCreate({
|
|
136
166
|
validationContext: {
|
|
137
167
|
existingBuckets: [
|
|
138
|
-
|
|
139
|
-
|
|
168
|
+
'existing-bucket',
|
|
169
|
+
'another-bucket'
|
|
140
170
|
]
|
|
141
171
|
}
|
|
142
172
|
});
|
|
143
|
-
await user_event.type(screen.getByLabelText(/bucket name/i),
|
|
173
|
+
await user_event.type(screen.getByLabelText(/bucket name/i), 'existing-bucket');
|
|
144
174
|
await user_event.tab();
|
|
145
175
|
await waitFor(()=>{
|
|
146
176
|
expect(screen.getByText(/a bucket with this name already exists/i)).toBeInTheDocument();
|
|
147
177
|
});
|
|
148
178
|
});
|
|
149
|
-
it(
|
|
179
|
+
it('accepts valid bucket names with dots and hyphens', async ()=>{
|
|
150
180
|
renderBucketCreate();
|
|
151
181
|
const validNames = [
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
182
|
+
'my-bucket-123',
|
|
183
|
+
'my.bucket.name',
|
|
184
|
+
'test-bucket.example',
|
|
185
|
+
'123-bucket-456'
|
|
156
186
|
];
|
|
157
187
|
for (const name of validNames){
|
|
158
188
|
const input = screen.getByLabelText(/bucket name/i);
|
|
@@ -166,79 +196,79 @@ describe("BucketCreate", ()=>{
|
|
|
166
196
|
});
|
|
167
197
|
}
|
|
168
198
|
});
|
|
169
|
-
it(
|
|
199
|
+
it('allows bucket creation when name is unique', async ()=>{
|
|
170
200
|
renderBucketCreate({
|
|
171
201
|
validationContext: {
|
|
172
202
|
existingBuckets: [
|
|
173
|
-
|
|
174
|
-
|
|
203
|
+
'existing-bucket',
|
|
204
|
+
'another-bucket'
|
|
175
205
|
]
|
|
176
206
|
}
|
|
177
207
|
});
|
|
178
|
-
await fillBucketName(
|
|
208
|
+
await fillBucketName('new-unique-bucket');
|
|
179
209
|
await waitFor(()=>{
|
|
180
|
-
expect(screen.getByRole(
|
|
210
|
+
expect(screen.getByRole('button', {
|
|
181
211
|
name: /^create$/i
|
|
182
212
|
})).not.toBeDisabled();
|
|
183
213
|
});
|
|
184
214
|
});
|
|
185
|
-
it(
|
|
215
|
+
it('disables create button when form is invalid', ()=>{
|
|
186
216
|
renderBucketCreate();
|
|
187
|
-
expect(screen.getByRole(
|
|
217
|
+
expect(screen.getByRole('button', {
|
|
188
218
|
name: /^create$/i
|
|
189
219
|
})).toBeDisabled();
|
|
190
220
|
});
|
|
191
|
-
it(
|
|
221
|
+
it('enables create button when bucket name is valid', async ()=>{
|
|
192
222
|
renderBucketCreate();
|
|
193
|
-
await fillBucketName(
|
|
223
|
+
await fillBucketName('test-bucket');
|
|
194
224
|
await waitFor(()=>{
|
|
195
|
-
expect(screen.getByRole(
|
|
225
|
+
expect(screen.getByRole('button', {
|
|
196
226
|
name: /^create$/i
|
|
197
227
|
})).not.toBeDisabled();
|
|
198
228
|
});
|
|
199
229
|
});
|
|
200
|
-
it(
|
|
230
|
+
it('creates bucket with basic configuration', async ()=>{
|
|
201
231
|
renderBucketCreate();
|
|
202
|
-
await fillBucketName(
|
|
232
|
+
await fillBucketName('test-bucket');
|
|
203
233
|
await submitForm();
|
|
204
234
|
expect(mockMutations.createBucket).toHaveBeenCalledWith({
|
|
205
|
-
Bucket:
|
|
235
|
+
Bucket: 'test-bucket',
|
|
206
236
|
ObjectLockEnabledForBucket: void 0
|
|
207
237
|
}, expect.objectContaining({
|
|
208
238
|
onSuccess: expect.any(Function),
|
|
209
239
|
onError: expect.any(Function)
|
|
210
240
|
}));
|
|
211
241
|
});
|
|
212
|
-
it(
|
|
242
|
+
it('shows success toast and navigates after bucket creation', async ()=>{
|
|
213
243
|
renderBucketCreate();
|
|
214
|
-
await fillBucketName(
|
|
244
|
+
await fillBucketName('my-bucket');
|
|
215
245
|
await submitForm();
|
|
216
246
|
const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
217
247
|
successCallback();
|
|
218
248
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
219
249
|
open: true,
|
|
220
250
|
message: 'Bucket "my-bucket" created successfully',
|
|
221
|
-
status:
|
|
251
|
+
status: 'success'
|
|
222
252
|
});
|
|
223
|
-
expect(mockNavigate).toHaveBeenCalledWith(
|
|
253
|
+
expect(mockNavigate).toHaveBeenCalledWith('/buckets/my-bucket');
|
|
224
254
|
});
|
|
225
|
-
it(
|
|
255
|
+
it('shows error toast when bucket creation fails', async ()=>{
|
|
226
256
|
renderBucketCreate();
|
|
227
|
-
await fillBucketName(
|
|
257
|
+
await fillBucketName('test-bucket');
|
|
228
258
|
await submitForm();
|
|
229
259
|
const errorCallback = mockMutations.createBucket.mock.calls[0][1].onError;
|
|
230
|
-
const error = new Error(
|
|
260
|
+
const error = new Error('Bucket already exists');
|
|
231
261
|
errorCallback(error);
|
|
232
262
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
233
263
|
open: true,
|
|
234
|
-
message:
|
|
235
|
-
status:
|
|
264
|
+
message: 'Bucket already exists',
|
|
265
|
+
status: 'error'
|
|
236
266
|
});
|
|
237
267
|
});
|
|
238
|
-
it(
|
|
268
|
+
it('enables versioning when requested', async ()=>{
|
|
239
269
|
renderBucketCreate();
|
|
240
|
-
await fillBucketName(
|
|
241
|
-
const versioningCheckbox = screen.getByRole(
|
|
270
|
+
await fillBucketName('test-bucket');
|
|
271
|
+
const versioningCheckbox = screen.getByRole('checkbox', {
|
|
242
272
|
name: /versioning/i
|
|
243
273
|
});
|
|
244
274
|
await user_event.click(versioningCheckbox);
|
|
@@ -246,32 +276,32 @@ describe("BucketCreate", ()=>{
|
|
|
246
276
|
const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
247
277
|
successCallback();
|
|
248
278
|
expect(mockMutations.setVersioning).toHaveBeenCalledWith({
|
|
249
|
-
Bucket:
|
|
279
|
+
Bucket: 'test-bucket',
|
|
250
280
|
VersioningConfiguration: {
|
|
251
|
-
Status:
|
|
281
|
+
Status: 'Enabled'
|
|
252
282
|
}
|
|
253
283
|
}, expect.objectContaining({
|
|
254
284
|
onSuccess: expect.any(Function),
|
|
255
285
|
onError: expect.any(Function)
|
|
256
286
|
}));
|
|
257
287
|
});
|
|
258
|
-
it(
|
|
288
|
+
it('disables versioning checkbox when object lock is enabled', async ()=>{
|
|
259
289
|
renderBucketCreate();
|
|
260
|
-
await fillBucketName(
|
|
261
|
-
const objectLockCheckbox = screen.getByRole(
|
|
290
|
+
await fillBucketName('test-bucket');
|
|
291
|
+
const objectLockCheckbox = screen.getByRole('checkbox', {
|
|
262
292
|
name: /object-lock/i
|
|
263
293
|
});
|
|
264
294
|
await user_event.click(objectLockCheckbox);
|
|
265
|
-
const versioningCheckbox = screen.getByRole(
|
|
295
|
+
const versioningCheckbox = screen.getByRole('checkbox', {
|
|
266
296
|
name: /versioning/i
|
|
267
297
|
});
|
|
268
298
|
expect(versioningCheckbox).toBeDisabled();
|
|
269
299
|
expect(screen.getByText(/automatically activated when object-lock is enabled/i)).toBeInTheDocument();
|
|
270
300
|
});
|
|
271
|
-
it(
|
|
301
|
+
it('enables versioning automatically when object lock is enabled', async ()=>{
|
|
272
302
|
renderBucketCreate();
|
|
273
|
-
await fillBucketName(
|
|
274
|
-
const objectLockCheckbox = screen.getByRole(
|
|
303
|
+
await fillBucketName('test-bucket');
|
|
304
|
+
const objectLockCheckbox = screen.getByRole('checkbox', {
|
|
275
305
|
name: /object-lock/i
|
|
276
306
|
});
|
|
277
307
|
await user_event.click(objectLockCheckbox);
|
|
@@ -283,13 +313,13 @@ describe("BucketCreate", ()=>{
|
|
|
283
313
|
successCallback();
|
|
284
314
|
expect(mockMutations.setVersioning).not.toHaveBeenCalled();
|
|
285
315
|
});
|
|
286
|
-
it(
|
|
316
|
+
it('configures object lock retention when enabled', async ()=>{
|
|
287
317
|
renderBucketCreate();
|
|
288
|
-
await fillBucketName(
|
|
289
|
-
await user_event.click(screen.getByRole(
|
|
318
|
+
await fillBucketName('test-bucket');
|
|
319
|
+
await user_event.click(screen.getByRole('checkbox', {
|
|
290
320
|
name: /object-lock/i
|
|
291
321
|
}));
|
|
292
|
-
await user_event.click(screen.getByRole(
|
|
322
|
+
await user_event.click(screen.getByRole('checkbox', {
|
|
293
323
|
name: /default retention/i
|
|
294
324
|
}));
|
|
295
325
|
await submitForm();
|
|
@@ -297,12 +327,12 @@ describe("BucketCreate", ()=>{
|
|
|
297
327
|
createSuccessCallback();
|
|
298
328
|
expect(mockMutations.setVersioning).not.toHaveBeenCalled();
|
|
299
329
|
expect(mockMutations.setObjectLock).toHaveBeenCalledWith({
|
|
300
|
-
Bucket:
|
|
330
|
+
Bucket: 'test-bucket',
|
|
301
331
|
ObjectLockConfiguration: {
|
|
302
|
-
ObjectLockEnabled:
|
|
332
|
+
ObjectLockEnabled: 'Enabled',
|
|
303
333
|
Rule: {
|
|
304
334
|
DefaultRetention: {
|
|
305
|
-
Mode:
|
|
335
|
+
Mode: 'GOVERNANCE',
|
|
306
336
|
Days: 1,
|
|
307
337
|
Years: void 0
|
|
308
338
|
}
|
|
@@ -313,83 +343,83 @@ describe("BucketCreate", ()=>{
|
|
|
313
343
|
onError: expect.any(Function)
|
|
314
344
|
}));
|
|
315
345
|
});
|
|
316
|
-
it(
|
|
346
|
+
it('calls custom onSubmit when provided', async ()=>{
|
|
317
347
|
const customSubmit = jest.fn();
|
|
318
348
|
renderBucketCreate({
|
|
319
349
|
onSubmit: customSubmit
|
|
320
350
|
});
|
|
321
|
-
await fillBucketName(
|
|
351
|
+
await fillBucketName('test-bucket');
|
|
322
352
|
await submitForm();
|
|
323
353
|
expect(customSubmit).toHaveBeenCalledWith(expect.objectContaining({
|
|
324
|
-
name:
|
|
354
|
+
name: 'test-bucket',
|
|
325
355
|
isVersioning: false,
|
|
326
356
|
isObjectLockEnabled: false
|
|
327
357
|
}));
|
|
328
358
|
expect(mockMutations.createBucket).not.toHaveBeenCalled();
|
|
329
359
|
});
|
|
330
|
-
it(
|
|
360
|
+
it('calls custom onCancel when provided', ()=>{
|
|
331
361
|
const customCancel = jest.fn();
|
|
332
362
|
renderBucketCreate({
|
|
333
363
|
onCancel: customCancel
|
|
334
364
|
});
|
|
335
|
-
const cancelButton = screen.getByRole(
|
|
365
|
+
const cancelButton = screen.getByRole('button', {
|
|
336
366
|
name: /cancel/i
|
|
337
367
|
});
|
|
338
368
|
fireEvent.click(cancelButton);
|
|
339
369
|
expect(customCancel).toHaveBeenCalled();
|
|
340
370
|
expect(mockNavigate).not.toHaveBeenCalled();
|
|
341
371
|
});
|
|
342
|
-
it(
|
|
372
|
+
it('navigates to buckets list when cancel is clicked without custom handler', ()=>{
|
|
343
373
|
renderBucketCreate();
|
|
344
|
-
const cancelButton = screen.getByRole(
|
|
374
|
+
const cancelButton = screen.getByRole('button', {
|
|
345
375
|
name: /cancel/i
|
|
346
376
|
});
|
|
347
377
|
fireEvent.click(cancelButton);
|
|
348
|
-
expect(mockNavigate).toHaveBeenCalledWith(
|
|
378
|
+
expect(mockNavigate).toHaveBeenCalledWith('/buckets');
|
|
349
379
|
});
|
|
350
|
-
it(
|
|
380
|
+
it('renders injected children', ()=>{
|
|
351
381
|
renderBucketCreate({
|
|
352
382
|
children: /*#__PURE__*/ jsx("div", {
|
|
353
383
|
"data-testid": "custom-field",
|
|
354
384
|
children: "Custom Field"
|
|
355
385
|
})
|
|
356
386
|
});
|
|
357
|
-
expect(screen.getByTestId(
|
|
387
|
+
expect(screen.getByTestId('custom-field')).toBeInTheDocument();
|
|
358
388
|
});
|
|
359
|
-
it(
|
|
389
|
+
it('shows loading state during bucket creation', async ()=>{
|
|
360
390
|
renderBucketCreate();
|
|
361
|
-
await fillBucketName(
|
|
391
|
+
await fillBucketName('test-bucket');
|
|
362
392
|
await submitForm();
|
|
363
393
|
setupMocks({
|
|
364
394
|
isPending: true
|
|
365
395
|
});
|
|
366
396
|
expect(mockMutations.createBucket).toHaveBeenCalled();
|
|
367
397
|
});
|
|
368
|
-
it(
|
|
398
|
+
it('shows error toast when versioning configuration fails', async ()=>{
|
|
369
399
|
renderBucketCreate();
|
|
370
|
-
await fillBucketName(
|
|
371
|
-
await user_event.click(screen.getByRole(
|
|
400
|
+
await fillBucketName('test-bucket');
|
|
401
|
+
await user_event.click(screen.getByRole('checkbox', {
|
|
372
402
|
name: /versioning/i
|
|
373
403
|
}));
|
|
374
404
|
await submitForm();
|
|
375
405
|
const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
376
406
|
createSuccessCallback();
|
|
377
407
|
const versioningErrorCallback = mockMutations.setVersioning.mock.calls[0][1].onError;
|
|
378
|
-
const error = new Error(
|
|
408
|
+
const error = new Error('Failed to enable versioning');
|
|
379
409
|
versioningErrorCallback(error);
|
|
380
410
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
381
411
|
open: true,
|
|
382
|
-
message:
|
|
383
|
-
status:
|
|
412
|
+
message: 'Failed to enable versioning',
|
|
413
|
+
status: 'error'
|
|
384
414
|
});
|
|
385
415
|
});
|
|
386
|
-
it(
|
|
416
|
+
it('shows error toast when object lock configuration fails', async ()=>{
|
|
387
417
|
renderBucketCreate();
|
|
388
|
-
await fillBucketName(
|
|
389
|
-
await user_event.click(screen.getByRole(
|
|
418
|
+
await fillBucketName('test-bucket');
|
|
419
|
+
await user_event.click(screen.getByRole('checkbox', {
|
|
390
420
|
name: /object-lock/i
|
|
391
421
|
}));
|
|
392
|
-
await user_event.click(screen.getByRole(
|
|
422
|
+
await user_event.click(screen.getByRole('checkbox', {
|
|
393
423
|
name: /default retention/i
|
|
394
424
|
}));
|
|
395
425
|
await submitForm();
|
|
@@ -397,12 +427,148 @@ describe("BucketCreate", ()=>{
|
|
|
397
427
|
createSuccessCallback();
|
|
398
428
|
expect(mockMutations.setVersioning).not.toHaveBeenCalled();
|
|
399
429
|
const objectLockErrorCallback = mockMutations.setObjectLock.mock.calls[0][1].onError;
|
|
400
|
-
const error = new Error(
|
|
430
|
+
const error = new Error('Failed to configure retention');
|
|
401
431
|
objectLockErrorCallback(error);
|
|
402
432
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
403
433
|
open: true,
|
|
404
|
-
message:
|
|
405
|
-
status:
|
|
434
|
+
message: 'Failed to configure retention',
|
|
435
|
+
status: 'error'
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
describe('Bucket Encryption Feature', ()=>{
|
|
439
|
+
beforeEach(()=>{
|
|
440
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
441
|
+
s3Capabilities: {
|
|
442
|
+
bucketEncryption: false
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
it('does not show encryption checkbox when feature is disabled', ()=>{
|
|
447
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
448
|
+
s3Capabilities: {
|
|
449
|
+
bucketEncryption: false
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
renderBucketCreate();
|
|
453
|
+
expect(screen.queryByText(/encryption/i)).not.toBeInTheDocument();
|
|
454
|
+
});
|
|
455
|
+
it('shows encryption checkbox when feature is enabled', ()=>{
|
|
456
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
457
|
+
s3Capabilities: {
|
|
458
|
+
bucketEncryption: true
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
renderBucketCreate();
|
|
462
|
+
expect(screen.getByText(/encryption/i)).toBeInTheDocument();
|
|
463
|
+
});
|
|
464
|
+
it('creates bucket with encryption when enabled', async ()=>{
|
|
465
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
466
|
+
s3Capabilities: {
|
|
467
|
+
bucketEncryption: true
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
renderBucketCreate();
|
|
471
|
+
await fillBucketName('test-bucket');
|
|
472
|
+
const encryptionCheckbox = screen.getByLabelText(/encryption/i);
|
|
473
|
+
await user_event.click(encryptionCheckbox);
|
|
474
|
+
await submitForm();
|
|
475
|
+
const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
476
|
+
createSuccessCallback();
|
|
477
|
+
expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith({
|
|
478
|
+
Bucket: 'test-bucket',
|
|
479
|
+
ServerSideEncryptionConfiguration: {
|
|
480
|
+
Rules: [
|
|
481
|
+
{
|
|
482
|
+
ApplyServerSideEncryptionByDefault: {
|
|
483
|
+
SSEAlgorithm: 'AES256'
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
]
|
|
487
|
+
}
|
|
488
|
+
}, expect.objectContaining({
|
|
489
|
+
onSuccess: expect.any(Function),
|
|
490
|
+
onError: expect.any(Function)
|
|
491
|
+
}));
|
|
492
|
+
});
|
|
493
|
+
it('creates bucket without encryption when checkbox not selected', async ()=>{
|
|
494
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
495
|
+
s3Capabilities: {
|
|
496
|
+
bucketEncryption: true
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
renderBucketCreate();
|
|
500
|
+
await fillBucketName('test-bucket');
|
|
501
|
+
await submitForm();
|
|
502
|
+
const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
503
|
+
createSuccessCallback();
|
|
504
|
+
expect(mockMutations.setBucketEncryption).not.toHaveBeenCalled();
|
|
505
|
+
expect(mockShowToast).toHaveBeenCalledWith({
|
|
506
|
+
open: true,
|
|
507
|
+
message: 'Bucket "test-bucket" created successfully',
|
|
508
|
+
status: 'success'
|
|
509
|
+
});
|
|
510
|
+
});
|
|
511
|
+
it('applies encryption after versioning when both enabled', async ()=>{
|
|
512
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
513
|
+
s3Capabilities: {
|
|
514
|
+
bucketEncryption: true
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
renderBucketCreate();
|
|
518
|
+
await fillBucketName('test-bucket');
|
|
519
|
+
await user_event.click(screen.getByLabelText(/versioning/i));
|
|
520
|
+
await user_event.click(screen.getByLabelText(/encryption/i));
|
|
521
|
+
await submitForm();
|
|
522
|
+
const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
523
|
+
createSuccessCallback();
|
|
524
|
+
expect(mockMutations.setVersioning).toHaveBeenCalled();
|
|
525
|
+
const versioningSuccessCallback = mockMutations.setVersioning.mock.calls[0][1].onSuccess;
|
|
526
|
+
versioningSuccessCallback();
|
|
527
|
+
expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith(expect.objectContaining({
|
|
528
|
+
Bucket: 'test-bucket'
|
|
529
|
+
}), expect.any(Object));
|
|
530
|
+
});
|
|
531
|
+
it('applies encryption after object lock retention when enabled', async ()=>{
|
|
532
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
533
|
+
s3Capabilities: {
|
|
534
|
+
bucketEncryption: true
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
renderBucketCreate();
|
|
538
|
+
await fillBucketName('test-bucket');
|
|
539
|
+
await user_event.click(screen.getByLabelText(/object-lock/i));
|
|
540
|
+
await user_event.click(screen.getByLabelText(/default retention/i));
|
|
541
|
+
await user_event.click(screen.getByLabelText(/encryption/i));
|
|
542
|
+
await submitForm();
|
|
543
|
+
const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
544
|
+
createSuccessCallback();
|
|
545
|
+
expect(mockMutations.setObjectLock).toHaveBeenCalled();
|
|
546
|
+
const objectLockSuccessCallback = mockMutations.setObjectLock.mock.calls[0][1].onSuccess;
|
|
547
|
+
objectLockSuccessCallback();
|
|
548
|
+
expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith(expect.objectContaining({
|
|
549
|
+
Bucket: 'test-bucket'
|
|
550
|
+
}), expect.any(Object));
|
|
551
|
+
});
|
|
552
|
+
it('shows error toast when encryption configuration fails', async ()=>{
|
|
553
|
+
mockUseDataBrowserConfig.mockReturnValue({
|
|
554
|
+
s3Capabilities: {
|
|
555
|
+
bucketEncryption: true
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
renderBucketCreate();
|
|
559
|
+
await fillBucketName('test-bucket');
|
|
560
|
+
await user_event.click(screen.getByLabelText(/encryption/i));
|
|
561
|
+
await submitForm();
|
|
562
|
+
const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
|
|
563
|
+
createSuccessCallback();
|
|
564
|
+
const encryptionErrorCallback = mockMutations.setBucketEncryption.mock.calls[0][1].onError;
|
|
565
|
+
const error = new Error('Failed to enable encryption');
|
|
566
|
+
encryptionErrorCallback(error);
|
|
567
|
+
expect(mockShowToast).toHaveBeenCalledWith({
|
|
568
|
+
open: true,
|
|
569
|
+
message: 'Failed to enable encryption',
|
|
570
|
+
status: 'error'
|
|
571
|
+
});
|
|
406
572
|
});
|
|
407
573
|
});
|
|
408
574
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|