From 8dcd2a14d1fd0c01a28b13acb990d2ca9b04fb23 Mon Sep 17 00:00:00 2001 From: YanJin Date: Mon, 6 May 2024 14:48:27 +0200 Subject: [PATCH] ARTESCA-12108: Disable the version toogle for Veeam bucket and adding a tooltip of explaination --- src/js/mock/S3Client.ts | 1 + src/js/mock/S3ClientMSWHandlers.ts | 23 +++++- .../databrowser/buckets/details/Overview.tsx | 30 ++++++-- .../details/__tests__/Overview.test.tsx | 72 +++++++++++-------- 4 files changed, 87 insertions(+), 39 deletions(-) diff --git a/src/js/mock/S3Client.ts b/src/js/mock/S3Client.ts index 0aae044e9..f02fe5551 100644 --- a/src/js/mock/S3Client.ts +++ b/src/js/mock/S3Client.ts @@ -174,6 +174,7 @@ export const bucketInfoResponseVersioningDisabled: BucketInfo = { ObjectLockEnabled: 'Disabled', }, }; + export class MockS3Client implements S3ClientInterface { listBucketsWithLocation() { return Promise.resolve({ diff --git a/src/js/mock/S3ClientMSWHandlers.ts b/src/js/mock/S3ClientMSWHandlers.ts index a9edc1856..f73a97f36 100644 --- a/src/js/mock/S3ClientMSWHandlers.ts +++ b/src/js/mock/S3ClientMSWHandlers.ts @@ -66,18 +66,21 @@ export function mockBucketOperations( slowdown = false, forceFailure = false, isVeeamTagged = false, + isObjectLockEnabled = true, }: { location?: string | ((bucketName: string) => string); isVersioningEnabled?: boolean | ((bucketName: string) => boolean); slowdown?: boolean; forceFailure?: boolean; isVeeamTagged?: boolean | ((bucketName: string) => boolean); + isObjectLockEnabled?: boolean; } = { location: '', isVersioningEnabled: false, slowdown: false, forceFailure: false, isVeeamTagged: false, + isObjectLockEnabled: true, }, ) { return rest.get( @@ -152,14 +155,28 @@ export function mockBucketOperations( } if (req.url.searchParams.has('object-lock')) { - return res( - ctx.xml(` + if (isObjectLockEnabled) { + return res( + ctx.xml(` Enabled `), - ); + ); + } else { + return res( + ctx.status(404), + ctx.xml( + ` + + ObjectLockConfigurationNotFoundError + + 771ff09e6b408a3e5ed8 + `, + ), + ); + } } if (req.url.searchParams.has('tagging')) { diff --git a/src/react/databrowser/buckets/details/Overview.tsx b/src/react/databrowser/buckets/details/Overview.tsx index 0982335ed..96e960ec6 100644 --- a/src/react/databrowser/buckets/details/Overview.tsx +++ b/src/react/databrowser/buckets/details/Overview.tsx @@ -93,7 +93,13 @@ const workflowAttachedError = (count: number, bucketName: string) => ( ); -function VersionningValue({ bucketInfo }: { bucketInfo: BucketInfo }) { +function VersionningValue({ + bucketInfo, + isVeeamBucket, +}: { + bucketInfo: BucketInfo; + isVeeamBucket: boolean; +}) { const dispatch = useDispatch(); const accountsLocationsEndpointsAdapter = useAccountsLocationsEndpointsAdapter(); @@ -114,6 +120,11 @@ function VersionningValue({ bucketInfo }: { bucketInfo: BucketInfo }) { }, }); }; + const isVersioningToggleDisabled = + locationsStatus === 'idle' || + locationsStatus === 'loading' || + isBucketHostedOnAzureOrGCP || + isVeeamBucket; return ( @@ -130,15 +141,17 @@ function VersionningValue({ bucketInfo }: { bucketInfo: BucketInfo }) { Enabling versioning is not possible due to the bucket being hosted on Google Cloud. + ) : isVeeamBucket ? ( + <> + Enabling versioning is not possible due to the bucket being + managed by Veeam. + ) : null } > Versioning - + Location diff --git a/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx b/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx index 9f54b4ef0..6afff6fcd 100644 --- a/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx +++ b/src/react/databrowser/buckets/details/__tests__/Overview.test.tsx @@ -1,5 +1,4 @@ import { - fireEvent, render, screen, waitFor, @@ -195,17 +194,8 @@ describe('Overview', () => { ); await waitForElementToBeRemoved(() => screen.getByText(/loading/i)); await waitFor(() => { - expect( - screen.getByRole('checkbox', { - name: /inactive/i, - }), - ).toBeInTheDocument(); - }); - const versioningToggleItem = screen.getByRole('checkbox', { - name: /inactive/i, + expect(selectors.inActiveVersioningToggle()).toHaveAttribute('disabled'); }); - //V - expect(versioningToggleItem).toHaveAttribute('disabled'); }); }); @@ -302,6 +292,8 @@ const selectors = { screen.getByRole('generic', { name: /indicate if object lock is enabled/i, }), + inActiveVersioningToggle: () => + screen.getByRole('checkbox', { name: /inactive/i }), }; describe('Overview', () => { @@ -312,32 +304,23 @@ describe('Overview', () => { useUpdateBucketVersioningMock(req.body); return res(ctx.status(200)); }), + mockBucketOperations({ + isVersioningEnabled: false, + isObjectLockEnabled: false, + }), ); - renderWithRouterMatch( + render( , - undefined, - { - ...TEST_STATE, - ...{ s3: { bucketInfo: bucketInfoResponseVersioningDisabled } }, - }, + { wrapper: NewWrapper() }, ); - - const versioningToggleItem = screen - .getByRole('checkbox', { - name: /inactive/i, - }) - .querySelector('input'); - await waitFor(() => { - expect(versioningToggleItem).toBeInTheDocument(); + expect(selectors.inActiveVersioningToggle()).toBeEnabled(); }); - - versioningToggleItem && fireEvent.click(versioningToggleItem); - + await userEvent.click(selectors.inActiveVersioningToggle()); await waitFor(() => { expect(useUpdateBucketVersioningMock).toHaveBeenCalledWith(mockResponse); }); @@ -411,4 +394,35 @@ describe('Overview', () => { expect(selectors.bucketTaggingErorToastQuery()).toBe(null); }); }); + + it('should disable the versioning toggle for Veeam bucket', async () => { + //S + server.use( + mockBucketOperations({ + isVersioningEnabled: false, + isVeeamTagged: true, + isObjectLockEnabled: false, + }), + ); + //E + render( + , + { wrapper: NewWrapper() }, + ); + //V + await waitFor(() => { + expect(selectors.inActiveVersioningToggle()).toBeInTheDocument(); + }); + // toBeDisabled is not working due to + //