@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,11 +1,11 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
|
|
3
3
|
import user_event from "@testing-library/user-event";
|
|
4
|
-
import { MemoryRouter, Route, Routes } from "react-router
|
|
4
|
+
import { MemoryRouter, Route, Routes } from "react-router";
|
|
5
|
+
import { useGetBucketLifecycle, useSetBucketLifecycle } from "../../hooks/bucketConfiguration.js";
|
|
5
6
|
import { createTestWrapper, findToggleByLabel, mockErrorSubmit, mockOffsetSize, mockSuccessSubmit, submitForm } from "../../test/testUtils.js";
|
|
6
7
|
import { BucketLifecycleFormPage } from "../buckets/BucketLifecycleFormPage.js";
|
|
7
|
-
|
|
8
|
-
jest.mock("../../hooks/bucketConfiguration", ()=>({
|
|
8
|
+
jest.mock('../../hooks/bucketConfiguration', ()=>({
|
|
9
9
|
useGetBucketLifecycle: jest.fn(),
|
|
10
10
|
useSetBucketLifecycle: jest.fn()
|
|
11
11
|
}));
|
|
@@ -13,17 +13,17 @@ const mockUseGetBucketLifecycle = jest.mocked(useGetBucketLifecycle);
|
|
|
13
13
|
const mockUseSetBucketLifecycle = jest.mocked(useSetBucketLifecycle);
|
|
14
14
|
const mockNavigate = jest.fn();
|
|
15
15
|
const mockShowToast = jest.fn();
|
|
16
|
-
jest.mock(
|
|
17
|
-
...jest.requireActual(
|
|
16
|
+
jest.mock('react-router', ()=>({
|
|
17
|
+
...jest.requireActual('react-router'),
|
|
18
18
|
useNavigate: ()=>mockNavigate
|
|
19
19
|
}));
|
|
20
|
-
jest.mock(
|
|
21
|
-
...jest.requireActual(
|
|
20
|
+
jest.mock('@scality/core-ui', ()=>({
|
|
21
|
+
...jest.requireActual('@scality/core-ui'),
|
|
22
22
|
useToast: ()=>({
|
|
23
23
|
showToast: mockShowToast
|
|
24
24
|
})
|
|
25
25
|
}));
|
|
26
|
-
const renderBucketLifecycleFormPage = (bucketName =
|
|
26
|
+
const renderBucketLifecycleFormPage = (bucketName = 'test-bucket', ruleId)=>{
|
|
27
27
|
const Wrapper = createTestWrapper();
|
|
28
28
|
const path = ruleId ? `/buckets/${bucketName}/lifecycle/${ruleId}/edit` : `/buckets/${bucketName}/lifecycle/create`;
|
|
29
29
|
return render(/*#__PURE__*/ jsx(MemoryRouter, {
|
|
@@ -46,10 +46,10 @@ const renderBucketLifecycleFormPage = (bucketName = "test-bucket", ruleId)=>{
|
|
|
46
46
|
})
|
|
47
47
|
}));
|
|
48
48
|
};
|
|
49
|
-
describe(
|
|
49
|
+
describe('BucketLifecycleFormPage', ()=>{
|
|
50
50
|
const mockMutate = jest.fn();
|
|
51
51
|
const enableExpirationAction = async ()=>{
|
|
52
|
-
const expirationToggle = findToggleByLabel(
|
|
52
|
+
const expirationToggle = findToggleByLabel('Expiration current version');
|
|
53
53
|
await user_event.click(expirationToggle);
|
|
54
54
|
};
|
|
55
55
|
const fillRequiredFields = async (ruleId)=>{
|
|
@@ -63,22 +63,22 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
63
63
|
mockOffsetSize(800, 600);
|
|
64
64
|
mockUseGetBucketLifecycle.mockReturnValue({
|
|
65
65
|
data: void 0,
|
|
66
|
-
status:
|
|
66
|
+
status: 'success'
|
|
67
67
|
});
|
|
68
68
|
mockUseSetBucketLifecycle.mockReturnValue({
|
|
69
69
|
mutate: mockMutate,
|
|
70
70
|
isPending: false
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
|
-
describe(
|
|
74
|
-
it(
|
|
73
|
+
describe('Page Rendering', ()=>{
|
|
74
|
+
it('renders create mode with correct title', ()=>{
|
|
75
75
|
renderBucketLifecycleFormPage();
|
|
76
|
-
expect(screen.getByText(
|
|
76
|
+
expect(screen.getByText('Create Lifecycle Rule')).toBeInTheDocument();
|
|
77
77
|
});
|
|
78
|
-
it(
|
|
78
|
+
it('renders edit mode with correct title when rule exists', async ()=>{
|
|
79
79
|
const existingRule = {
|
|
80
|
-
ID:
|
|
81
|
-
Status:
|
|
80
|
+
ID: 'test-rule',
|
|
81
|
+
Status: 'Enabled',
|
|
82
82
|
Filter: {},
|
|
83
83
|
Expiration: {
|
|
84
84
|
Days: 30
|
|
@@ -90,68 +90,68 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
90
90
|
existingRule
|
|
91
91
|
]
|
|
92
92
|
},
|
|
93
|
-
status:
|
|
93
|
+
status: 'success'
|
|
94
94
|
});
|
|
95
|
-
renderBucketLifecycleFormPage(
|
|
95
|
+
renderBucketLifecycleFormPage('test-bucket', 'test-rule');
|
|
96
96
|
await waitFor(()=>{
|
|
97
|
-
expect(screen.getByText(
|
|
97
|
+
expect(screen.getByText('Edit Lifecycle Rule')).toBeInTheDocument();
|
|
98
98
|
});
|
|
99
99
|
});
|
|
100
|
-
it(
|
|
100
|
+
it('shows loading state when fetching lifecycle data', ()=>{
|
|
101
101
|
mockUseGetBucketLifecycle.mockReturnValue({
|
|
102
102
|
data: void 0,
|
|
103
|
-
status:
|
|
103
|
+
status: 'pending'
|
|
104
104
|
});
|
|
105
105
|
renderBucketLifecycleFormPage();
|
|
106
|
-
expect(screen.getByText(
|
|
106
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
107
107
|
});
|
|
108
|
-
it(
|
|
108
|
+
it('shows error when rule not found in edit mode', ()=>{
|
|
109
109
|
mockUseGetBucketLifecycle.mockReturnValue({
|
|
110
110
|
data: {
|
|
111
111
|
Rules: []
|
|
112
112
|
},
|
|
113
|
-
status:
|
|
113
|
+
status: 'success'
|
|
114
114
|
});
|
|
115
|
-
renderBucketLifecycleFormPage(
|
|
116
|
-
expect(screen.getByText(
|
|
115
|
+
renderBucketLifecycleFormPage('test-bucket', 'non-existent');
|
|
116
|
+
expect(screen.getByText('Rule not found')).toBeInTheDocument();
|
|
117
117
|
});
|
|
118
118
|
});
|
|
119
|
-
describe(
|
|
120
|
-
it(
|
|
119
|
+
describe('Form Fields - Initial State', ()=>{
|
|
120
|
+
it('renders required form fields in create mode', ()=>{
|
|
121
121
|
renderBucketLifecycleFormPage();
|
|
122
122
|
expect(screen.getByLabelText(/rule id/i)).toBeInTheDocument();
|
|
123
123
|
expect(screen.getByLabelText(/status/i)).toBeInTheDocument();
|
|
124
124
|
expect(screen.getByLabelText(/filter/i)).toBeInTheDocument();
|
|
125
125
|
});
|
|
126
|
-
it(
|
|
126
|
+
it('renders all lifecycle action toggles', ()=>{
|
|
127
127
|
renderBucketLifecycleFormPage();
|
|
128
|
-
expect(screen.getByText(
|
|
129
|
-
expect(screen.getByText(
|
|
130
|
-
expect(screen.getByText(
|
|
131
|
-
expect(screen.getByText(
|
|
132
|
-
expect(screen.getByText(
|
|
128
|
+
expect(screen.getByText('Transition current version')).toBeInTheDocument();
|
|
129
|
+
expect(screen.getByText('Expiration current version')).toBeInTheDocument();
|
|
130
|
+
expect(screen.getByText('Transition noncurrent version')).toBeInTheDocument();
|
|
131
|
+
expect(screen.getByText('Expiration noncurrent version')).toBeInTheDocument();
|
|
132
|
+
expect(screen.getByText('Expire incomplete multipart upload')).toBeInTheDocument();
|
|
133
133
|
});
|
|
134
|
-
it(
|
|
134
|
+
it('shows all filter type options when filter select is opened', async ()=>{
|
|
135
135
|
renderBucketLifecycleFormPage();
|
|
136
136
|
const filterSelect = screen.getByLabelText(/filter/i);
|
|
137
137
|
await user_event.click(filterSelect);
|
|
138
|
-
expect(screen.getByRole(
|
|
139
|
-
name:
|
|
138
|
+
expect(screen.getByRole('option', {
|
|
139
|
+
name: 'All objects'
|
|
140
140
|
})).toBeInTheDocument();
|
|
141
|
-
expect(screen.getByRole(
|
|
142
|
-
name:
|
|
141
|
+
expect(screen.getByRole('option', {
|
|
142
|
+
name: 'Prefix filter'
|
|
143
143
|
})).toBeInTheDocument();
|
|
144
|
-
expect(screen.getByRole(
|
|
145
|
-
name:
|
|
144
|
+
expect(screen.getByRole('option', {
|
|
145
|
+
name: 'Tags filter'
|
|
146
146
|
})).toBeInTheDocument();
|
|
147
|
-
expect(screen.getByRole(
|
|
148
|
-
name:
|
|
147
|
+
expect(screen.getByRole('option', {
|
|
148
|
+
name: 'Prefix and tags filter'
|
|
149
149
|
})).toBeInTheDocument();
|
|
150
150
|
});
|
|
151
|
-
it(
|
|
151
|
+
it('disables rule ID input in edit mode', async ()=>{
|
|
152
152
|
const existingRule = {
|
|
153
|
-
ID:
|
|
154
|
-
Status:
|
|
153
|
+
ID: 'test-rule',
|
|
154
|
+
Status: 'Enabled',
|
|
155
155
|
Filter: {},
|
|
156
156
|
Expiration: {
|
|
157
157
|
Days: 30
|
|
@@ -163,91 +163,91 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
163
163
|
existingRule
|
|
164
164
|
]
|
|
165
165
|
},
|
|
166
|
-
status:
|
|
166
|
+
status: 'success'
|
|
167
167
|
});
|
|
168
|
-
renderBucketLifecycleFormPage(
|
|
168
|
+
renderBucketLifecycleFormPage('test-bucket', 'test-rule');
|
|
169
169
|
await waitFor(()=>{
|
|
170
|
-
expect(screen.getByText(
|
|
170
|
+
expect(screen.getByText('test-rule')).toBeInTheDocument();
|
|
171
171
|
});
|
|
172
|
-
expect(screen.queryByRole(
|
|
172
|
+
expect(screen.queryByRole('textbox', {
|
|
173
173
|
name: /rule id/i
|
|
174
174
|
})).not.toBeInTheDocument();
|
|
175
175
|
});
|
|
176
176
|
});
|
|
177
|
-
describe(
|
|
178
|
-
it(
|
|
177
|
+
describe('Form Validation', ()=>{
|
|
178
|
+
it('validates rule ID is required', async ()=>{
|
|
179
179
|
renderBucketLifecycleFormPage();
|
|
180
180
|
const ruleIdInput = screen.getByLabelText(/rule id/i);
|
|
181
|
-
await user_event.type(ruleIdInput,
|
|
181
|
+
await user_event.type(ruleIdInput, 'test');
|
|
182
182
|
await user_event.clear(ruleIdInput);
|
|
183
183
|
await user_event.tab();
|
|
184
184
|
await waitFor(()=>{
|
|
185
185
|
expect(screen.getByText(/rule id is required/i)).toBeInTheDocument();
|
|
186
186
|
});
|
|
187
187
|
});
|
|
188
|
-
it(
|
|
188
|
+
it('validates rule ID uniqueness against existing rules', async ()=>{
|
|
189
189
|
mockUseGetBucketLifecycle.mockReturnValue({
|
|
190
190
|
data: {
|
|
191
191
|
Rules: [
|
|
192
192
|
{
|
|
193
|
-
ID:
|
|
194
|
-
Status:
|
|
193
|
+
ID: 'existing-rule',
|
|
194
|
+
Status: 'Enabled',
|
|
195
195
|
Expiration: {
|
|
196
196
|
Days: 30
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
]
|
|
200
200
|
},
|
|
201
|
-
status:
|
|
201
|
+
status: 'success'
|
|
202
202
|
});
|
|
203
203
|
renderBucketLifecycleFormPage();
|
|
204
204
|
const ruleIdInput = screen.getByLabelText(/rule id/i);
|
|
205
|
-
await user_event.type(ruleIdInput,
|
|
205
|
+
await user_event.type(ruleIdInput, 'existing-rule');
|
|
206
206
|
await user_event.tab();
|
|
207
207
|
await waitFor(()=>{
|
|
208
208
|
expect(screen.getByText(/a rule with this id already exists/i)).toBeInTheDocument();
|
|
209
209
|
});
|
|
210
210
|
});
|
|
211
|
-
it(
|
|
211
|
+
it('disables create button when form is pristine', ()=>{
|
|
212
212
|
renderBucketLifecycleFormPage();
|
|
213
|
-
const createButton = screen.getByRole(
|
|
213
|
+
const createButton = screen.getByRole('button', {
|
|
214
214
|
name: /create/i
|
|
215
215
|
});
|
|
216
216
|
expect(createButton).toBeDisabled();
|
|
217
217
|
});
|
|
218
|
-
it(
|
|
218
|
+
it('disables create button when no lifecycle action is enabled', async ()=>{
|
|
219
219
|
renderBucketLifecycleFormPage();
|
|
220
|
-
await user_event.type(screen.getByLabelText(/rule id/i),
|
|
221
|
-
const createButton = screen.getByRole(
|
|
220
|
+
await user_event.type(screen.getByLabelText(/rule id/i), 'test-rule');
|
|
221
|
+
const createButton = screen.getByRole('button', {
|
|
222
222
|
name: /create/i
|
|
223
223
|
});
|
|
224
224
|
expect(createButton).toBeDisabled();
|
|
225
225
|
});
|
|
226
|
-
it(
|
|
226
|
+
it('enables create button when form is valid and has at least one action', async ()=>{
|
|
227
227
|
renderBucketLifecycleFormPage();
|
|
228
|
-
await fillRequiredFields(
|
|
228
|
+
await fillRequiredFields('valid-rule');
|
|
229
229
|
await waitFor(()=>{
|
|
230
|
-
const createButton = screen.getByRole(
|
|
230
|
+
const createButton = screen.getByRole('button', {
|
|
231
231
|
name: /create/i
|
|
232
232
|
});
|
|
233
233
|
expect(createButton).toBeEnabled();
|
|
234
234
|
});
|
|
235
235
|
});
|
|
236
236
|
});
|
|
237
|
-
describe(
|
|
238
|
-
it(
|
|
237
|
+
describe('Form Submission - Create Mode', ()=>{
|
|
238
|
+
it('submits minimal lifecycle rule with expiration action', async ()=>{
|
|
239
239
|
renderBucketLifecycleFormPage();
|
|
240
|
-
await fillRequiredFields(
|
|
240
|
+
await fillRequiredFields('minimal-rule');
|
|
241
241
|
mockSuccessSubmit(mockMutate);
|
|
242
|
-
await submitForm(
|
|
242
|
+
await submitForm('create');
|
|
243
243
|
await waitFor(()=>{
|
|
244
244
|
expect(mockMutate).toHaveBeenCalledWith(expect.objectContaining({
|
|
245
|
-
Bucket:
|
|
245
|
+
Bucket: 'test-bucket',
|
|
246
246
|
LifecycleConfiguration: {
|
|
247
247
|
Rules: expect.arrayContaining([
|
|
248
248
|
expect.objectContaining({
|
|
249
|
-
ID:
|
|
250
|
-
Status:
|
|
249
|
+
ID: 'minimal-rule',
|
|
250
|
+
Status: 'Enabled',
|
|
251
251
|
Filter: {},
|
|
252
252
|
Expiration: {
|
|
253
253
|
Days: 30
|
|
@@ -258,49 +258,49 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
258
258
|
}), expect.any(Object));
|
|
259
259
|
});
|
|
260
260
|
});
|
|
261
|
-
it(
|
|
261
|
+
it('navigates to bucket lifecycle tab on successful creation', async ()=>{
|
|
262
262
|
renderBucketLifecycleFormPage();
|
|
263
|
-
await fillRequiredFields(
|
|
263
|
+
await fillRequiredFields('success-rule');
|
|
264
264
|
mockSuccessSubmit(mockMutate);
|
|
265
|
-
await submitForm(
|
|
265
|
+
await submitForm('create');
|
|
266
266
|
await waitFor(()=>{
|
|
267
|
-
expect(mockNavigate).toHaveBeenCalledWith(
|
|
267
|
+
expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket?tab=lifecycle');
|
|
268
268
|
});
|
|
269
269
|
});
|
|
270
|
-
it(
|
|
270
|
+
it('displays success toast after rule creation', async ()=>{
|
|
271
271
|
renderBucketLifecycleFormPage();
|
|
272
|
-
await fillRequiredFields(
|
|
272
|
+
await fillRequiredFields('toast-rule');
|
|
273
273
|
mockSuccessSubmit(mockMutate);
|
|
274
|
-
await submitForm(
|
|
274
|
+
await submitForm('create');
|
|
275
275
|
await waitFor(()=>{
|
|
276
276
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
277
277
|
open: true,
|
|
278
|
-
message:
|
|
279
|
-
status:
|
|
278
|
+
message: 'Lifecycle rule created successfully',
|
|
279
|
+
status: 'success'
|
|
280
280
|
});
|
|
281
281
|
});
|
|
282
282
|
});
|
|
283
|
-
it(
|
|
283
|
+
it('displays error toast when creation fails', async ()=>{
|
|
284
284
|
renderBucketLifecycleFormPage();
|
|
285
|
-
await fillRequiredFields(
|
|
286
|
-
mockErrorSubmit(mockMutate,
|
|
287
|
-
await submitForm(
|
|
285
|
+
await fillRequiredFields('error-rule');
|
|
286
|
+
mockErrorSubmit(mockMutate, 'Access Denied');
|
|
287
|
+
await submitForm('create');
|
|
288
288
|
await waitFor(()=>{
|
|
289
289
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
290
290
|
open: true,
|
|
291
|
-
message:
|
|
292
|
-
status:
|
|
291
|
+
message: 'Access Denied',
|
|
292
|
+
status: 'error'
|
|
293
293
|
});
|
|
294
294
|
expect(mockNavigate).not.toHaveBeenCalled();
|
|
295
295
|
});
|
|
296
296
|
});
|
|
297
|
-
it(
|
|
297
|
+
it('appends new rule to existing rules on creation', async ()=>{
|
|
298
298
|
mockUseGetBucketLifecycle.mockReturnValue({
|
|
299
299
|
data: {
|
|
300
300
|
Rules: [
|
|
301
301
|
{
|
|
302
|
-
ID:
|
|
303
|
-
Status:
|
|
302
|
+
ID: 'existing-rule',
|
|
303
|
+
Status: 'Enabled',
|
|
304
304
|
Filter: {},
|
|
305
305
|
Expiration: {
|
|
306
306
|
Days: 90
|
|
@@ -308,25 +308,25 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
308
308
|
}
|
|
309
309
|
]
|
|
310
310
|
},
|
|
311
|
-
status:
|
|
311
|
+
status: 'success'
|
|
312
312
|
});
|
|
313
313
|
renderBucketLifecycleFormPage();
|
|
314
|
-
await fillRequiredFields(
|
|
314
|
+
await fillRequiredFields('new-rule');
|
|
315
315
|
mockSuccessSubmit(mockMutate);
|
|
316
|
-
await submitForm(
|
|
316
|
+
await submitForm('create');
|
|
317
317
|
await waitFor(()=>{
|
|
318
318
|
const call = mockMutate.mock.calls[0][0];
|
|
319
319
|
expect(call.LifecycleConfiguration.Rules).toHaveLength(2);
|
|
320
|
-
expect(call.LifecycleConfiguration.Rules[0].ID).toBe(
|
|
321
|
-
expect(call.LifecycleConfiguration.Rules[1].ID).toBe(
|
|
320
|
+
expect(call.LifecycleConfiguration.Rules[0].ID).toBe('existing-rule');
|
|
321
|
+
expect(call.LifecycleConfiguration.Rules[1].ID).toBe('new-rule');
|
|
322
322
|
});
|
|
323
323
|
});
|
|
324
324
|
});
|
|
325
|
-
describe(
|
|
326
|
-
it(
|
|
325
|
+
describe('Form Submission - Edit Mode', ()=>{
|
|
326
|
+
it('updates existing rule in edit mode', async ()=>{
|
|
327
327
|
const existingRule = {
|
|
328
|
-
ID:
|
|
329
|
-
Status:
|
|
328
|
+
ID: 'update-rule',
|
|
329
|
+
Status: 'Enabled',
|
|
330
330
|
Filter: {},
|
|
331
331
|
Expiration: {
|
|
332
332
|
Days: 30
|
|
@@ -338,30 +338,30 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
338
338
|
existingRule
|
|
339
339
|
]
|
|
340
340
|
},
|
|
341
|
-
status:
|
|
341
|
+
status: 'success'
|
|
342
342
|
});
|
|
343
|
-
renderBucketLifecycleFormPage(
|
|
343
|
+
renderBucketLifecycleFormPage('test-bucket', 'update-rule');
|
|
344
344
|
await waitFor(()=>{
|
|
345
|
-
expect(screen.getByText(
|
|
345
|
+
expect(screen.getByText('Edit Lifecycle Rule')).toBeInTheDocument();
|
|
346
346
|
});
|
|
347
347
|
const statusSelect = screen.getByLabelText(/status/i);
|
|
348
348
|
await user_event.click(statusSelect);
|
|
349
|
-
await user_event.click(screen.getByRole(
|
|
350
|
-
name:
|
|
349
|
+
await user_event.click(screen.getByRole('option', {
|
|
350
|
+
name: 'Disabled'
|
|
351
351
|
}));
|
|
352
352
|
mockSuccessSubmit(mockMutate);
|
|
353
|
-
await submitForm(
|
|
353
|
+
await submitForm('save');
|
|
354
354
|
await waitFor(()=>{
|
|
355
355
|
const call = mockMutate.mock.calls[0][0];
|
|
356
356
|
expect(call.LifecycleConfiguration.Rules).toHaveLength(1);
|
|
357
|
-
expect(call.LifecycleConfiguration.Rules[0].ID).toBe(
|
|
358
|
-
expect(call.LifecycleConfiguration.Rules[0].Status).toBe(
|
|
357
|
+
expect(call.LifecycleConfiguration.Rules[0].ID).toBe('update-rule');
|
|
358
|
+
expect(call.LifecycleConfiguration.Rules[0].Status).toBe('Disabled');
|
|
359
359
|
});
|
|
360
360
|
});
|
|
361
|
-
it(
|
|
361
|
+
it('displays update success toast in edit mode', async ()=>{
|
|
362
362
|
const existingRule = {
|
|
363
|
-
ID:
|
|
364
|
-
Status:
|
|
363
|
+
ID: 'edit-rule',
|
|
364
|
+
Status: 'Enabled',
|
|
365
365
|
Filter: {},
|
|
366
366
|
Expiration: {
|
|
367
367
|
Days: 30
|
|
@@ -373,31 +373,31 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
373
373
|
existingRule
|
|
374
374
|
]
|
|
375
375
|
},
|
|
376
|
-
status:
|
|
376
|
+
status: 'success'
|
|
377
377
|
});
|
|
378
|
-
renderBucketLifecycleFormPage(
|
|
378
|
+
renderBucketLifecycleFormPage('test-bucket', 'edit-rule');
|
|
379
379
|
await waitFor(()=>{
|
|
380
|
-
expect(screen.getByText(
|
|
380
|
+
expect(screen.getByText('Edit Lifecycle Rule')).toBeInTheDocument();
|
|
381
381
|
});
|
|
382
382
|
const statusSelect = screen.getByLabelText(/status/i);
|
|
383
383
|
await user_event.click(statusSelect);
|
|
384
|
-
await user_event.click(screen.getByRole(
|
|
385
|
-
name:
|
|
384
|
+
await user_event.click(screen.getByRole('option', {
|
|
385
|
+
name: 'Disabled'
|
|
386
386
|
}));
|
|
387
387
|
mockSuccessSubmit(mockMutate);
|
|
388
|
-
await submitForm(
|
|
388
|
+
await submitForm('save');
|
|
389
389
|
await waitFor(()=>{
|
|
390
390
|
expect(mockShowToast).toHaveBeenCalledWith({
|
|
391
391
|
open: true,
|
|
392
|
-
message:
|
|
393
|
-
status:
|
|
392
|
+
message: 'Lifecycle rule updated successfully',
|
|
393
|
+
status: 'success'
|
|
394
394
|
});
|
|
395
395
|
});
|
|
396
396
|
});
|
|
397
|
-
it(
|
|
397
|
+
it('disables save button when form is not dirty', async ()=>{
|
|
398
398
|
const existingRule = {
|
|
399
|
-
ID:
|
|
400
|
-
Status:
|
|
399
|
+
ID: 'unchanged-rule',
|
|
400
|
+
Status: 'Enabled',
|
|
401
401
|
Filter: {},
|
|
402
402
|
Expiration: {
|
|
403
403
|
Days: 30
|
|
@@ -409,25 +409,25 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
409
409
|
existingRule
|
|
410
410
|
]
|
|
411
411
|
},
|
|
412
|
-
status:
|
|
412
|
+
status: 'success'
|
|
413
413
|
});
|
|
414
|
-
renderBucketLifecycleFormPage(
|
|
414
|
+
renderBucketLifecycleFormPage('test-bucket', 'unchanged-rule');
|
|
415
415
|
await waitFor(()=>{
|
|
416
|
-
expect(screen.getByText(
|
|
416
|
+
expect(screen.getByText('Edit Lifecycle Rule')).toBeInTheDocument();
|
|
417
417
|
});
|
|
418
|
-
const saveButton = screen.getByRole(
|
|
418
|
+
const saveButton = screen.getByRole('button', {
|
|
419
419
|
name: /save/i
|
|
420
420
|
});
|
|
421
421
|
expect(saveButton).toBeDisabled();
|
|
422
422
|
});
|
|
423
423
|
});
|
|
424
|
-
describe(
|
|
425
|
-
it(
|
|
424
|
+
describe('Rule Data Loading', ()=>{
|
|
425
|
+
it('loads rule with prefix filter correctly', async ()=>{
|
|
426
426
|
const rule = {
|
|
427
|
-
ID:
|
|
428
|
-
Status:
|
|
427
|
+
ID: 'prefix-rule',
|
|
428
|
+
Status: 'Enabled',
|
|
429
429
|
Filter: {
|
|
430
|
-
Prefix:
|
|
430
|
+
Prefix: 'documents/'
|
|
431
431
|
},
|
|
432
432
|
Expiration: {
|
|
433
433
|
Days: 90
|
|
@@ -439,22 +439,22 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
439
439
|
rule
|
|
440
440
|
]
|
|
441
441
|
},
|
|
442
|
-
status:
|
|
442
|
+
status: 'success'
|
|
443
443
|
});
|
|
444
|
-
renderBucketLifecycleFormPage(
|
|
444
|
+
renderBucketLifecycleFormPage('test-bucket', 'prefix-rule');
|
|
445
445
|
await waitFor(()=>{
|
|
446
446
|
const prefixInput = screen.getByLabelText(/prefix/i);
|
|
447
|
-
expect(prefixInput).toHaveValue(
|
|
447
|
+
expect(prefixInput).toHaveValue('documents/');
|
|
448
448
|
});
|
|
449
449
|
});
|
|
450
|
-
it(
|
|
450
|
+
it('loads rule with single tag filter correctly', async ()=>{
|
|
451
451
|
const rule = {
|
|
452
|
-
ID:
|
|
453
|
-
Status:
|
|
452
|
+
ID: 'tag-rule',
|
|
453
|
+
Status: 'Enabled',
|
|
454
454
|
Filter: {
|
|
455
455
|
Tag: {
|
|
456
|
-
Key:
|
|
457
|
-
Value:
|
|
456
|
+
Key: 'env',
|
|
457
|
+
Value: 'prod'
|
|
458
458
|
}
|
|
459
459
|
},
|
|
460
460
|
Expiration: {
|
|
@@ -467,18 +467,18 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
467
467
|
rule
|
|
468
468
|
]
|
|
469
469
|
},
|
|
470
|
-
status:
|
|
470
|
+
status: 'success'
|
|
471
471
|
});
|
|
472
|
-
renderBucketLifecycleFormPage(
|
|
472
|
+
renderBucketLifecycleFormPage('test-bucket', 'tag-rule');
|
|
473
473
|
await waitFor(()=>{
|
|
474
|
-
expect(screen.getByDisplayValue(
|
|
475
|
-
expect(screen.getByDisplayValue(
|
|
474
|
+
expect(screen.getByDisplayValue('env')).toBeInTheDocument();
|
|
475
|
+
expect(screen.getByDisplayValue('prod')).toBeInTheDocument();
|
|
476
476
|
});
|
|
477
477
|
});
|
|
478
|
-
it(
|
|
478
|
+
it('loads rule with expiration days correctly', async ()=>{
|
|
479
479
|
const rule = {
|
|
480
|
-
ID:
|
|
481
|
-
Status:
|
|
480
|
+
ID: 'expiration-rule',
|
|
481
|
+
Status: 'Enabled',
|
|
482
482
|
Filter: {},
|
|
483
483
|
Expiration: {
|
|
484
484
|
Days: 365
|
|
@@ -490,20 +490,20 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
490
490
|
rule
|
|
491
491
|
]
|
|
492
492
|
},
|
|
493
|
-
status:
|
|
493
|
+
status: 'success'
|
|
494
494
|
});
|
|
495
|
-
renderBucketLifecycleFormPage(
|
|
495
|
+
renderBucketLifecycleFormPage('test-bucket', 'expiration-rule');
|
|
496
496
|
await waitFor(()=>{
|
|
497
|
-
const expirationToggle = findToggleByLabel(
|
|
497
|
+
const expirationToggle = findToggleByLabel('Expiration current version');
|
|
498
498
|
expect(expirationToggle).toBeChecked();
|
|
499
499
|
const daysInput = screen.getByLabelText(/^days$/i);
|
|
500
500
|
expect(daysInput).toHaveValue(365);
|
|
501
501
|
});
|
|
502
502
|
});
|
|
503
|
-
it(
|
|
503
|
+
it('loads rule with noncurrent version expiration correctly', async ()=>{
|
|
504
504
|
const rule = {
|
|
505
|
-
ID:
|
|
506
|
-
Status:
|
|
505
|
+
ID: 'noncurrent-rule',
|
|
506
|
+
Status: 'Enabled',
|
|
507
507
|
Filter: {},
|
|
508
508
|
NoncurrentVersionExpiration: {
|
|
509
509
|
NoncurrentDays: 90,
|
|
@@ -516,11 +516,11 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
516
516
|
rule
|
|
517
517
|
]
|
|
518
518
|
},
|
|
519
|
-
status:
|
|
519
|
+
status: 'success'
|
|
520
520
|
});
|
|
521
|
-
renderBucketLifecycleFormPage(
|
|
521
|
+
renderBucketLifecycleFormPage('test-bucket', 'noncurrent-rule');
|
|
522
522
|
await waitFor(()=>{
|
|
523
|
-
const noncurrentExpirationToggle = findToggleByLabel(
|
|
523
|
+
const noncurrentExpirationToggle = findToggleByLabel('Expiration noncurrent version');
|
|
524
524
|
expect(noncurrentExpirationToggle).toBeChecked();
|
|
525
525
|
const noncurrentDaysInput = screen.getByLabelText(/noncurrent days/i);
|
|
526
526
|
expect(noncurrentDaysInput).toHaveValue(90);
|
|
@@ -528,10 +528,10 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
528
528
|
expect(keepVersionsInput).toHaveValue(3);
|
|
529
529
|
});
|
|
530
530
|
});
|
|
531
|
-
it(
|
|
531
|
+
it('loads rule with abort incomplete multipart upload correctly', async ()=>{
|
|
532
532
|
const rule = {
|
|
533
|
-
ID:
|
|
534
|
-
Status:
|
|
533
|
+
ID: 'mpu-rule',
|
|
534
|
+
Status: 'Enabled',
|
|
535
535
|
Filter: {},
|
|
536
536
|
AbortIncompleteMultipartUpload: {
|
|
537
537
|
DaysAfterInitiation: 7
|
|
@@ -543,25 +543,25 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
543
543
|
rule
|
|
544
544
|
]
|
|
545
545
|
},
|
|
546
|
-
status:
|
|
546
|
+
status: 'success'
|
|
547
547
|
});
|
|
548
|
-
renderBucketLifecycleFormPage(
|
|
548
|
+
renderBucketLifecycleFormPage('test-bucket', 'mpu-rule');
|
|
549
549
|
await waitFor(()=>{
|
|
550
|
-
const mpuToggle = findToggleByLabel(
|
|
550
|
+
const mpuToggle = findToggleByLabel('Expire incomplete multipart upload');
|
|
551
551
|
expect(mpuToggle).toBeChecked();
|
|
552
552
|
const mpuDaysInput = screen.getByLabelText(/days after initiation/i);
|
|
553
553
|
expect(mpuDaysInput).toHaveValue(7);
|
|
554
554
|
});
|
|
555
555
|
});
|
|
556
|
-
it(
|
|
556
|
+
it('loads rule with transition correctly', async ()=>{
|
|
557
557
|
const rule = {
|
|
558
|
-
ID:
|
|
559
|
-
Status:
|
|
558
|
+
ID: 'transition-rule',
|
|
559
|
+
Status: 'Enabled',
|
|
560
560
|
Filter: {},
|
|
561
561
|
Transitions: [
|
|
562
562
|
{
|
|
563
563
|
Days: 30,
|
|
564
|
-
StorageClass:
|
|
564
|
+
StorageClass: 'GLACIER'
|
|
565
565
|
}
|
|
566
566
|
]
|
|
567
567
|
};
|
|
@@ -571,44 +571,44 @@ describe("BucketLifecycleFormPage", ()=>{
|
|
|
571
571
|
rule
|
|
572
572
|
]
|
|
573
573
|
},
|
|
574
|
-
status:
|
|
574
|
+
status: 'success'
|
|
575
575
|
});
|
|
576
|
-
renderBucketLifecycleFormPage(
|
|
576
|
+
renderBucketLifecycleFormPage('test-bucket', 'transition-rule');
|
|
577
577
|
await waitFor(()=>{
|
|
578
|
-
const transitionToggle = findToggleByLabel(
|
|
578
|
+
const transitionToggle = findToggleByLabel('Transition current version');
|
|
579
579
|
expect(transitionToggle).toBeChecked();
|
|
580
580
|
});
|
|
581
581
|
});
|
|
582
582
|
});
|
|
583
|
-
describe(
|
|
584
|
-
it(
|
|
583
|
+
describe('Navigation', ()=>{
|
|
584
|
+
it('navigates back to bucket lifecycle tab when cancel is clicked', ()=>{
|
|
585
585
|
renderBucketLifecycleFormPage();
|
|
586
|
-
const cancelButton = screen.getByRole(
|
|
586
|
+
const cancelButton = screen.getByRole('button', {
|
|
587
587
|
name: /cancel/i
|
|
588
588
|
});
|
|
589
589
|
fireEvent.click(cancelButton);
|
|
590
|
-
expect(mockNavigate).toHaveBeenCalledWith(
|
|
590
|
+
expect(mockNavigate).toHaveBeenCalledWith('/buckets/test-bucket?tab=lifecycle');
|
|
591
591
|
});
|
|
592
|
-
it(
|
|
592
|
+
it('disables cancel button when mutation is pending', ()=>{
|
|
593
593
|
mockUseSetBucketLifecycle.mockReturnValue({
|
|
594
594
|
mutate: mockMutate,
|
|
595
595
|
isPending: true
|
|
596
596
|
});
|
|
597
597
|
renderBucketLifecycleFormPage();
|
|
598
|
-
const cancelButton = screen.getByRole(
|
|
598
|
+
const cancelButton = screen.getByRole('button', {
|
|
599
599
|
name: /cancel/i
|
|
600
600
|
});
|
|
601
601
|
expect(cancelButton).toBeDisabled();
|
|
602
602
|
});
|
|
603
|
-
it(
|
|
603
|
+
it('disables submit button when mutation is pending', async ()=>{
|
|
604
604
|
mockUseSetBucketLifecycle.mockReturnValue({
|
|
605
605
|
mutate: mockMutate,
|
|
606
606
|
isPending: true
|
|
607
607
|
});
|
|
608
608
|
renderBucketLifecycleFormPage();
|
|
609
|
-
await fillRequiredFields(
|
|
609
|
+
await fillRequiredFields('test-rule');
|
|
610
610
|
await waitFor(()=>{
|
|
611
|
-
const createButton = screen.getByRole(
|
|
611
|
+
const createButton = screen.getByRole('button', {
|
|
612
612
|
name: /create/i
|
|
613
613
|
});
|
|
614
614
|
expect(createButton).toBeDisabled();
|